Features

Everything between your agents, handled.

Eight mechanisms, all shipped, all local. The card grid is the tour; the detail below each is the machinery — with the real command or store it runs on.

Features

Everything between your agents, handled.

Knowledge graph

Your repo, indexed into a queryable graph. Agents navigate instead of grepping.

Session handoff

One markdown file carries the whole session: objective, plan, checklist, cost estimate.

---
objective: SSE reconnect backoff
remaining_tasks: 3
est_cost_usd: 0.05
---

Worktree isolation

Every agent gets its own git worktree. No clobbered branches, ever.

Live edit signals

See who's editing what, in real time. Overlaps warn before they conflict.

src/server/sse.ts
src/ui/StatusPanel.tsx
src/shared/events.ts

Evidence-anchored memory

Shared facts pinned to commits and content hashes. Stale facts get withheld — agents can't hallucinate from them.

auth uses JWT, not sessions⚓ 4f2c91a
db client is knexwithheld

Installable skills

Ten agent playbooks, installed into each agent's own config. bug-fix won't touch a line until an independent skeptic corroborates the root cause at 95% — and you approve.

.claude/skills
.cursor/rules
10 skills

Model routing

Every task scored by severity, then routed into a tier — no LLM call, deterministic, and it tells you why. The bottom tier runs a local model, so it costs nothing at all.

heavy · opus
standard · cursor
light · codex
local · ollama
~0×

Cost arbitrage

Agents read the graph's repo map instead of raw files.

repo map · ~824 tokens
raw files · ~248k tokens

Each one, in detail.

Worktree isolation

One agent, one branch, one working directory.

Every task gets its own branch (baton/my-task) and an isolated git worktree at .baton/wt/my-task. Agents never share a checkout, so there is no checkout juggling and no in-session clobbering — and because worktrees are standard git, removing Baton leaves your repo untouched.

baton new my-task --agent claude → .baton/wt/my-task
Live edit signals

Who is editing what, answered before it becomes a conflict.

Editor hooks record every file touch into a local SQLite store; the daemon reconciles those signals against what git actually says is dirty, then streams them over server-sent events. Two agents drifting toward one file flashes an overlap warning — and agents can ask check_files over MCP before touching a path.

edit_signals (SQLite, WAL) → SSE → dashboard + check_files
Session handoff

A session becomes one markdown file another agent can pick up.

baton pass distills a session into HANDOFF.md: objective, plan, remaining checklist, and an estimated cost to finish. baton take prints the execution prompt for the receiving agent — and if commits landed after the brief was written, a stale-brief warning tells the receiver to trust git over the brief.

baton pass my-task --to cursor · baton take my-task
Evidence-anchored memory

Shared facts that are withheld the moment they might be wrong.

Facts are pinned to a commit and to content hashes of the files they describe. When an anchored file changes, the fact is withheld instead of served — an agent can be told nothing, but it cannot be told something stale. Facts saved without file anchors age out on commit distance rather than living forever.

fact ⚓ commit + file hashes — stale → withheld, not served
Knowledge graph

Agents navigate a map instead of re-reading the repo.

The repo — or a whole multi-repo hub — is indexed into a queryable graph plus a ~2k-token CODEBASE.md map. Agents answer 'where does X live' with a targeted query instead of grepping raw files, which is the difference between ~824 tokens and ~248k for the same question.

baton kb rebuild → graph + CODEBASE.md (~2k tokens)
Model routing

Each task scored and routed into a tier — no LLM call deciding.

Deterministic severity scoring sends every task into a tier: heavy, standard, light, or local. It is instant, free, and it tells you why. The local tier runs on Ollama through aider or opencode, so routine work costs exactly nothing.

baton route "update the readme wording" → aider (ollama)
Installable skills

The same playbooks, in every agent's own config format.

Ten skills — bug-fix discipline, handoff etiquette, routing awareness — install into .claude/skills, .cursor/rules, and the rest from one source. The bug-fix skill will not let an agent touch a line until an independent skeptic corroborates the root cause at 95% confidence and you approve the plan.

baton skills install → .claude/skills · .cursor/rules · …
Local-first daemon

Zero dependencies, loopback only, nothing leaves your machine.

The daemon is raw node:http bound to 127.0.0.1, with Origin and Host-header guards on every request and writes disabled unless you pass --write. There is no hosted service and no telemetry — the dashboard on localhost:7077 is the whole surface.

node dist/cli.js serve --write → localhost:7077
Dashboard

Watch the relay live.

localhost:7077
Activity
claudecommittedsrc/server/sse.ts12s
cursoreditingsrc/ui/StatusPanel.tsxnow
claudepinned factmemory/auth-jwt1m
codextook handofffix-flaky-tests3m
cursoropened worktree.baton/wt/my-task4m
claudepassedmy-task → cursor5m
Conflicts · 1
src/shared/events.ts
claude + cursor editing — warned both
tmux · claude
4 tests passing
watching src/server …
tmux · cursor
resuming from HANDOFF.md
worktree clean

A realtime dashboard on localhost:7077. Activity, conflicts, terminals, memory, the graph.

See the relay run end to end.