Getting started¶
Loom ships as a single Node CLI distributed via GitHub Releases (no npm registry), and as a container image on the GitHub Container Registry. Either way it runs as a single process backed by SQLite.
Requirements¶
- Node.js ≥ 20 — or just Docker, which bundles everything
- A modern OS that can build / run
better-sqlite3(Linux, macOS, Windows) - An API key from at least one upstream LLM provider
Install¶
Loom runs as a single Node process backed by SQLite, or as a container.
Linux and macOS. Detects bun or npm, verifies your Node version, and
installs the latest release:
Options go after -s --:
No Node install, no config — a master key and admin password are generated into the volume on first start:
docker run -d --name loom -p 3000:3000 -v loom-data:/data \
ghcr.io/hspk/loom:latest
docker logs loom # first-run admin password
See Docker deployment for volumes, secrets, backups, and reverse proxies.
Pre-built tarballs are attached to every GitHub Release. Re-run the same command to upgrade.
All the CLI routes add the loom binary to your $PATH. No lifecycle scripts
run on tarball install — Loom recreates its install-time symlinks at CLI
startup, so the package works identically on bun, npm, pnpm, and yarn without
any trust prompts or --allow-scripts flags.
Docker users can skip ahead
The container runs loom start for you and bootstraps its own config.
Jump straight to Your first request.
Initialize¶
Run the interactive wizard:
It collects:
- Where the config file should live — project dir, user home, or a custom path
- Admin username + password (or a reference to
${LOOM_ADMIN_PASSWORD}) - Your first provider (OpenAI / Azure OpenAI / Azure AI Foundry / skip)
- Port + hostname
- Whether to start the server immediately
A loom.config.yaml is written with chmod 600 and a freshly generated master_key.
Non-interactive variants¶
# Write a default template
loom init --yes --force
# Print the template to stdout
loom init --print > loom.config.yaml
Start¶
The default URL is http://localhost:3000. Log in with the admin credentials you set during init.
Your first request¶
- Visit
/settings/api-keysand create a key (sk-loom-...) - Make sure at least one provider has a valid
api_key
curl http://localhost:3000/api/v1/chat/completions \
-H "Authorization: Bearer sk-loom-..." \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": "Hello"}],
"stream": true
}'
Or use any OpenAI SDK:
from openai import OpenAI
client = OpenAI(base_url="http://localhost:3000/api/v1", api_key="sk-loom-...")
print(client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Hello"}],
).choices[0].message.content)
Next steps¶
- Deploy with containers, volumes, and a reverse proxy — see Docker
- Add more providers and tweak per-model defaults — see Providers
- Wire in MCP tools — see MCP integration
- Explore the playground — see Playground
- Use the request log for forensics — see Request logs