Docs
Everything you need to run roam — self-hosted or hosted.
01Quickstart
Grab the binary and run your first agent in 60 seconds:
curl -fsSL https://github.com/javimosch/roam/releases/latest/download/roam-x86_64-linux -o roam
chmod +x roam
export ANTHROPIC_API_KEY="sk-ant-..."
./roam send --local --provider anthropic --allow-shell --confirm \
--goal "list files in this directory and summarize the project"
./roam status last # JSON snapshot
./roam attach last # stream the journal live
For remote dispatch over SSH:
./roam send --to my-vm --provider anthropic --allow-shell --confirm \
--goal "check disk usage and clean up logs older than 30 days"
./roam attach my-vm
./roam approve my-vm # let the parked rm proceed
./roam stop my-vm # cancel the agent
02How it works
roam send --localorroam send --to <host>creates a job.- The agent runs a tool loop:
read_file,write_file,run_shell(gated by--allow-shell),finish. - Destructive commands (
rm,git push --force,DROP TABLE…) park for approval. - You approve, deny, steer, or stop — from the terminal, the web panel, or a phone tap.
- The worker ends in
done,halted,stopped, orerror.
03Providers
--provider anthropic(default) — Anthropic Messages API. Key fromANTHROPIC_API_KEYorROAM_API_KEY.--provider openai— any OpenAI-compatible endpoint (OpenRouter, etc.) via--api-base.--provider debri— delegates to the devin CLI (SWE-1.x models) via debri. Subscription-based, no per-token cost.
04Hosted hub
The hosted hub at roam.intrane.fr handles API keys, billing, and worker coordination. Workers hold no model keys — every LLM call goes through the hub's metered proxy.
Start a worker
roam worker --hub https://hub.roam.intrane.fr --token rhw_... \
--label gpu=true --name gpu-box-01
Trigger a run
curl -X POST https://hub.roam.intrane.fr/t/<agent_id>/<secret> \
-H "content-type: application/json" -d '{}'
Auto-provision a tenant
# any bearer token auto-creates a tenant — no signup needed
curl https://hub.roam.intrane.fr/v1/whoami \
-H "authorization: Bearer my-random-token"
# attach an email for recovery + billing
curl -X POST https://hub.roam.intrane.fr/app/claim \
-H "authorization: Bearer my-random-token" \
-H "content-type: application/json" \
-d '{"email":"you@company.com"}'
05Worker routing
Route specific agents to specific workers within a single tenant using selectors and labels.
Selector
Set a selector on the agent: comma-separated key=value pairs. Empty = any worker.
"selector": "gpu=true,docker=true"
Labels + name
Start the worker with matching labels and a name. The hub only hands runs whose selector is satisfied.
roam worker --hub ... --token ... \
--label gpu=true \
--label docker=true \
--name gpu-box-01
Matching rules
- Empty selector = any worker (backward compatible)
- Worker with no labels = only gets runs with empty selector (backward compatible)
- All key=value pairs in the selector must be present in the worker's labels
- The
claimedjournal event includes the worker name when provided
Multiple workers
N workers can poll the same hub with the same rhw_ token. Each gets a different run from the queue — the hub's atomic claim guard prevents double-claiming. This is horizontal scaling: more workers = more parallel runs, all billed through one peage wallet.
06Billing
€0.01 flat + token_cost × 1.3 per run. No monthly fee. A typical coding task costs €0.02–€0.10.
The hub proxies every LLM call, meters exact tokens from the upstream response, and charges your peage wallet. Top up with a card via Stripe. Self-hosting is free — bring your own API key.
07Trust layer
- Hard budgets —
--max-itersand--tokensfreeze the run (status: halted) when hit. - Confirm-gate —
--confirmparks destructive commands for async approval. - Deny budget —
--max-denials(default 3) auto-halts an agent that keeps re-parking. - Goal-verify —
--verifysendsfinishto an independent judge that checks evidence. - Workdir sandbox — file tools confined to
~/.roam/work/<jobid>/;..and absolute paths refused. - Append-only journal — every model turn, tool call, result, and token cost recorded.
08Worker failure handling
If a run has no worker activity for 15 minutes, the hub puts it back in the queue for another worker to pick up. After one reclaim attempt, the run is declared lost and billed only for what it actually metered. Your webhook (if set) receives the loss event.
09Self-hosting
The CLI is MIT-licensed. The approval panel is roam-panel — self-hostable with optional SSO via Portier. Bring your own Anthropic/OpenAI key, run workers on your own machines, approve from the panel or your terminal.
10Agent-first CLI
roam guide # structured JSON: model, loop, concepts, examples
roam guide --human # readable Markdown
roam help-json # machine-readable commands, flags, exits
roam version # version info
roam telemetry # inspect opt-in telemetry state
roam update --check # check for updates
roam feedback "..." # send feedback
Controller errors use typed JSON on stderr and semantic exits: 80-89 for invalid input, 90-99 for missing resources or auth, 100-109 for remote/external failures.
11Telemetry
roam reports nothing unless you run roam telemetry --telemetry-on. A fresh install makes zero outbound connections beyond the work you asked it to do. If enabled, it sends version, os/arch, which verb ran and whether it failed — never prompts, keys, output, hostnames or paths.
12Hub API reference
For the full hub API (agents, runs, webhooks, LLM proxy, whoami, claim), see the Hub API reference.