Quickstart
One install, five ways to run. Requires Node ≥ 22. The zero-config default drives agents through your existing Claude Code login — no API key.
Install
npm i -g @loomfsm/pipeline # installs the `loom` CLI and everything it needs Web dashboard — the fastest path
loom up # start the local control plane and open the dashboard
Opens at http://127.0.0.1:4317 with a first-run wizard:
choose a backend, add a project, submit your first task. From there you
can watch the live agent chain, answer gates reading the exact output
you’re approving, pause / resume / cancel, and push or squash-merge a
finished task.
--token "$(openssl rand -hex 16)" (or set
LOOM_SERVER_TOKEN) to expose it safely.
Inside Claude Code
loom setup # register the MCP server + the /task, /done, /proceed commands
loom allowlist add # authorize the current project (once per project; default-deny) Then, in that project:
/task add rate limiting to the login endpoint
/proceed # re-attach to an interrupted task
/done # show the result + clear the slot
Zero further setup: your host executes each agent step and loom surfaces
each gate inline. State lives at <project>/.loom/state.db
— a plain SQLite file you own.
Headless one-shot
loom run "add rate limiting to the login endpoint" Each step runs through the Claude Code CLI in an isolated git worktree — your main working tree is never touched. A genuine human gate pauses and is printed for you to answer; otherwise it runs straight to a verdict.
Autonomous daemon
loom daemon start "migrate the auth module to the new SDK"
loom daemon status # driving / parked at a gate / backing off?
loom daemon stop
Set-and-forget: it parks on a human gate and wakes when you answer,
retries transient failures with backoff, recovers an interrupted task on
restart (idempotent re-delivery, no double work), and commits finished
work to a loom/<task> branch — reviewable, never
auto-merged.
Telegram bot
export LOOM_TG_BOT_TOKEN="<token from @BotFather>"
export LOOM_TG_ALLOWED_USERS="<your Telegram user id>" # comma-separated; default-deny
loom bot telegram # needs a control plane running (loom up / loom serve) Outbound-only (long-poll, no webhook), so the control plane stays loopback-bound. The bot can launch agents on your repos, so an un-listed sender is refused.
Configure once
loom resolves a backend per spawn. Set keys and a per-agent model map once — every project inherits it:
loom config set backend auto # Claude Code CLI if present, else a provider
loom secrets set OPENROUTER_API_KEY sk-... # chmod 600, never printed
loom models set implementer openrouter:deepseek/deepseek-chat # bind an agent to a model
loom models list # each agent's effective model Each agent can declare a fallback chain — try your subscription first, fall back to a provider on a rate limit — so a long run doesn’t stall on one backend. File-editing agents run through Aider or opencode harnesses behind the same isolated-worktree seam.
Container isolation
docker build -t loom-claude:latest docker/ # from the cloned repo
export LOOM_DOCKER_IMAGE=loom-claude:latest
export CLAUDE_CODE_OAUTH_TOKEN="$(claude setup-token)"
loom run --docker "refactor the payment module"
loom daemon start --docker --watch For unattended autonomy: each spawn runs in a container mounting only a dedicated clone of the project — never your live checkout — a real blast-radius bound.
Going deeper
The full CLI reference, architecture (with diagrams), and design rationale live in the repository: