Your agent hits the limit. The next one keeps your place.
Baton runs Claude Code, Codex and agy. It watches the five-hour and weekly windows, and at the wall it saves the session, stops the agent, and starts your next option in the same terminal, from where the last one stopped. Nothing is retyped.
npm install -g baton-agentspip install -U context-handoff-bundleThen type baton claude where you would have typed claude. Same session, same flags.
Node 22 or newer. Zero runtime dependencies. 14-day trial, no card; then $79 once. Binds 127.0.0.1 and edits none of your config files.
The handoff, as it happens in the terminal.
A sample session. Every line that begins with [baton] is what Baton prints; the rest is the agent. It plays at reading speed when it scrolls into view.
git diff --stat, dirty files, recent commits, why it stopped.
One word in front of the command you already type.
baton claude --model opus is claude --model opus with Baton alongside. The agent's own prompt and permission flags pass through unchanged. Baton's hooks ride in a separate per-session settings file; your own settings file is never edited.
The first baton <agent> starts the board at http://127.0.0.1:4747 and opens it. Later sessions reuse it.
| command | usage percentages | the wall |
|---|---|---|
| baton claude | Claude Code's own usage endpoint, the same numbers as /usage, polled every 60 seconds | the StopFailure hook with rate_limit |
| baton codex | the rate limits Codex writes to its session rollout file | usage_limit_exceeded in the same file |
| baton agy | none; agy exposes no percentages | RESOURCE_EXHAUSTED in agy's log |
Each tap was read from the CLI's source or documentation and checked on a real machine on 11 September 2026: Claude Code 2.1.268, codex-cli 0.153.4, agy 1.2.0. Nothing is screen-scraped.
One page that knows what every session is doing.
Every Baton session in every terminal is a card on it: agent and account, repo and branch, the task, the files being touched, the 5h and 7d bars, and what has landed on trunk. Two live sessions touching the same file are flagged red on both cards. Buttons: Land, Hand off now, End.
A second session gets its own worktree. Nothing merges.
Start baton codex in a checkout where baton claude is already live and the new session gets its own git worktree, .baton-worktrees/<id> on branch baton/<id>, cut from the branch the checkout has out. The terminal prints one line saying where it is.
The board's second lane is for background cards: work an agent does with no interactive terminal, each in its own worktree. Build stops with the changes sitting in that worktree and merges nothing. Build-land and Factory run the tests and merge on their own. You pick the first agent, and the fallback agents under Advanced options are the same handoff order.
Its card has a Land button: commit what the agent left, rebase onto the base, run the repo's tests, fast-forward the base. When a step fails nothing lands and the card says why: rebase-conflict with the files, tests-red with the end of the output, dirty-trunk when the checkout has local changes the landing would overwrite. Nothing is ever pushed.
Between the warning and the wall, four things happen. You watch them.
85%The card turns amber and the terminal bell rings once. Get to a stopping point, or keep typing.
limitBaton saves the bundle it has been refreshing every two minutes: the task, the last messages, git diff --stat, dirty files, recent commits, and why it stopped.
stopThe agent process is stopped and the terminal is put back the way it was, down to the mouse modes and scroll margins a killed agent leaves behind, so the next agent starts on a clean line under your history. The next option starts in it: another login of the same agent if you added one, otherwise the next agent in your order.
first turnThe new agent reads .baton/RESUME.md, checks git status and git diff, and carries on with the same task.
The order
You set it. Other logins of the same agent come first, then the other agents in the order you saved, each tried once. It is a priority list, not a rotation: put agy at the bottom and agy is the last option from a claude terminal and from a codex terminal alike. Settings holds the default new terminals copy, and Change order on a card changes that one terminal while it runs. An option whose CLI is missing or whose wall has not reset is skipped.
When every option is out
The terminal prints each option with its reset time, soonest first, then stays open with a countdown to the first reset and starts that agent from the bundle when it arrives. Ctrl-C, or End on the card, quits instead.
What is written, and what is never touched.
Subscription logins only. Baton is meant to sit beside tools you already trust, so the list of what it does not do is as exact as the list of what it does.
Never edited
~/.claude/settings.json~/.claude.json~/.codex/config.toml- agy's files, and your repo's settings
- Claude Code gets hooks through a per-session
--settingsfile under~/.baton; codex and agy get nothing injected
Written in your repo
.baton/, the session notes andRESUME.md.context-handoffs/, the bundles.baton-worktrees/, a second session's worktree, plus itsbaton/<id>branch- all three added to
.git/info/exclude; landing fast-forwards your branch and nothing is pushed
Stripped and scrubbed
ANTHROPIC_API_KEY,ANTHROPIC_AUTH_TOKEN,ANTHROPIC_BASE_URL,ANTHROPIC_CUSTOM_HEADERS,OPENAI_API_KEY,OPENAI_BASE_URL,OPENAI_API_BASE,GEMINI_API_KEY,GOOGLE_API_KEY,GOOGLE_GEMINI_BASE_URL,GOOGLE_GENAI_USE_VERTEXAI,GOOGLE_GENAI_USE_ENTERPRISE,GOOGLE_CLOUD_PROJECT,GOOGLE_CLOUD_LOCATION,GOOGLE_APPLICATION_CREDENTIALS,CLAUDECODE,CLAUDE_CODE_*,CLAUDE_EFFORTandCLAUDE_PLUGIN_DATAare removed from every agent's environment;CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MSis set to0for a detached Claude print session- Claude Code's stored login is read for the usage numbers and sent only to
api.anthropic.com; it is never written or printed - the ledger scrubs bearer tokens and key shapes from every line
- the board binds
127.0.0.1;baton share onis the one way to listen elsewhere, with a token per human baton uninstall --yesremoves~/.batonand nothing else
Fourteen days on trial, then one price for one human.
The trial starts the first time you type baton claude. No card, nothing to sign up for, every feature on. When it ends, Baton stops adding itself and the bare agent keeps working as before.
Personal
$79 once
- One human, any number of machines
- The board, usage tracking, the handoff bundle and the handoff itself
- A worktree per second session, and Land
- Every release for 12 months; the version you have keeps working after that
Team
$12 per seat, per month
- Everything in Personal, for each person on the board
baton share on: the board on Tailscale or your LAN, a token per human- Guests see redacted cards and can request a handoff; you approve it
- The key renews with the subscription;
baton license refreshfetches it
A key is a signed token checked on your machine with the public key that ships in Baton; the CLI talks to this site only to renew a Team key. After paying you land on a page with the key and it is emailed to you: baton license activate <key>. Prices are before tax; Stripe adds what your country charges. Fourteen-day refund, reply to the receipt.
Install
Node 22 or newer, git, Python 3 with pip, and at least one logged-in agent CLI.
npm install -g baton-agentspip install -U context-handoff-bundlecd <any repo> && baton claudeVerified live on 11 September 2026 against Claude Code 2.1.268, codex-cli 0.153.4 and agy 1.2.0. 402 tests. Commercial software; the JavaScript ships readable so every claim on this page can be checked in the package.