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-agents
pip install -U context-handoff-bundle

Then 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.

claude wes@work 5h41% 7d18%
~/acme/api $ baton claude --model opus session claude-a3f8 · claude · board http://127.0.0.1:4747 (started) · next: codex → agy add an idempotency key to the refund path and cover it with tests Editedsrc/refunds/create.ts Editedsrc/refunds/idempotency.ts Rannpm test -- refunds 14 passed, 1 failed Editedtest/refunds/idempotency.test.ts claude hit its usage limit: rate_limit bundle saved: .context-handoffs/20260911-154212-baton-claude-a3f8 starting codex in this terminal from the bundle codex wes@personal · same folder, same branch You are taking over an interactive coding session from claude, which hit its usage limit. Read .baton/RESUME-claude-a3f8.md (the context handoff bundle is at .context-handoffs/20260911-154212-baton-claude-a3f8), check git status and git diff, then continue the work from where it stopped. Do not ask the human to restate the task. Read.baton/RESUME-claude-a3f8.md Rangit status · git diff  The store lookup in idempotency.ts is missing. Adding it and rerunning the failing test. Rannpm test -- refunds 15 passed
The pointer prompt is the one Baton sends; it also appends the task as you first stated it. The bundle carries the rest: the task, the last messages, 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.

beforeclaude --model opus
afterbaton claude --model opus
alsobaton codex -m gpt-5.3-codex-spark
alsobaton agy
commandusage percentagesthe wall
baton claudeClaude Code's own usage endpoint, the same numbers as /usage, polled every 60 secondsthe StopFailure hook with rate_limit
baton codexthe rate limits Codex writes to its session rollout fileusage_limit_exceeded in the same file
baton agynone; agy exposes no percentagesRESOURCE_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.

The board, recreated in HTML from the same sample session as the terminal above. The card anatomy and labels are the real ones; the task is illustrative.

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.

From a live run on 11 September 2026: three claude sessions in a throwaway repo, the second and third in their own worktrees. Land on the second ran the tests and fast-forwarded main; Land on the third bounced and kept its commit on its branch.

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.

limit

Baton 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.

stop

The 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 turn

The 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 --settings file under ~/.baton; codex and agy get nothing injected

Written in your repo

  • .baton/, the session notes and RESUME.md
  • .context-handoffs/, the bundles
  • .baton-worktrees/, a second session's worktree, plus its baton/<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_EFFORT and CLAUDE_PLUGIN_DATA are removed from every agent's environment; CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS is set to 0 for 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 on is the one way to listen elsewhere, with a token per human
  • baton uninstall --yes removes ~/.baton and 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
Buy Personal, $79

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 refresh fetches it
Buy Team, $12 a seat

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-agents
pip install -U context-handoff-bundle
cd <any repo> && baton claude

Verified 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.