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.

The server binds loopback by default and refuses to bind to a non-loopback host without a token — pass --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: