An agent collaboration engine — hand work to your agents, from anywhere.
A persistent server holds the shared collaboration state: workspaces → projects
→ requirements (R-N) → tasks (T-N). Workers (W-N) — machines running a
coding agent against a real repo — register themselves and pick up work as
sessions, each executing in its own git worktree. Humans reach the same
sessions from the web UI, DingTalk, or Feishu; the name is the relay-baton
metaphor: work handed from node to node.
web UI ─┐
DingTalk ┼──▶ server (Hono + SQLite) ◀──SSE── workers (baton CLI + agent)
Feishu ┘ baton.example.com sessions in git worktrees
- Collaboration dimension only — specs, docs and code live in git; baton stores references, never copies content.
- Light GitHub sync — issues mirror into requirements as number + title + status + link; bodies and discussion stay on GitHub.
- Share links — every session has an unguessable
/s/:tokenpage; anyone with the link can read and write into the conversation. - Delegation — a session can list workers and open a session on any other
worker by its global
W-Nhandle (seeskills/delegate).
| package | what |
|---|---|
packages/server |
API + state (Hono, Prisma/SQLite, SSE) |
packages/web |
SPA (React, Vite, Tailwind) |
packages/cli |
@lesscap/baton-cli — worker daemon + management commands |
packages/shared |
domain types shared by all of the above |
packages/dingtalk / packages/feishu |
chat bridges (long-connection bots) |
skills/ |
agent skills (baton workflow, GitHub sync, delegation) |
docker/ |
compose stack for the server + bridges, and a containerized worker |
# server + web (dev)
pnpm install
pnpm --filter @baton/server db:migrate
pnpm --filter @baton/server dev # api on :3280
pnpm --filter @baton/web dev # SPA on :5280, proxies /api
# a worker, on any machine with a coding agent installed
npm i -g @lesscap/baton-cli
baton worker register --url <server-url> --project <id> --name <name>
baton worker runpnpm check # biome + typecheck + tests, all packages