How multiple Claude Code and Codex accounts work in Crowsnest
A native conversation cannot simply change to credentials from another account home. Crowsnest keeps that boundary honest for Claude Code and Codex: it quotes a bounded briefing into a new session, records lineage, and leaves the original untouched.
CLAUDE_CONFIG_DIR · CODEX_HOME97% of a provider window usedseparate provider account homeOriginal native state remains unchangedCrowsnest Pro can keep several Claude Code and Codex accounts available, but it does not merge their native histories. Continuing on another account creates a new, attributed conversation with a compact briefing. The default behavior asks first; optional automatic behavior is limited to starting new conversations or continuing after a quota failure when exactly one other signed-in account for that provider is available.
Why this is a fork, not a switch
Both runtimes have an account-home boundary. Claude Code's documentation says CLAUDE_CONFIG_DIR stores settings, credentials, session history, and plugins. OpenAI's Codex documentation says CODEX_HOME stores Codex config, auth, logs, sessions, and other state. Crowsnest gives every registered account its own matching home.
The native mechanics differ: Claude Code resumes a transcript from its account's project tree, while Crowsnest reaches a Codex thread through Codex app-server under the account's CODEX_HOME. The boundary is the same: selecting different credentials does not make the receiving account own the original native history.
Crowsnest therefore treats cross-account continuation as a new branch. It starts the receiving runtime under the selected account's own home, sends attributed context as the first user message, and records a link back to the source. The old conversation stays where it was and remains unchanged. Because the briefing is built from Crowsnest's provider-neutral conversation model, the same handoff rules apply to Claude Code and Codex.
What crosses into the new conversation
The handoff is built locally from Crowsnest's normalized conversation model. It is a mechanical quote, not an extra model-generated summary and not an upload to a summarization service.
Keep the opening task
The first usable turn is retained, but capped so a very long prompt cannot crowd out the latest state.
Fill backward from the end
The newest usable turns are added newest-first until the quoted-body budget is full.
Reduce bulky evidence
Tool commands remain visible. Tool results keep their first line and state how many additional lines were omitted; private reasoning is not transferred.
Name every omission
If the middle does not fit, the briefing includes an explicit omitted-turn count. Truncation is never presented as complete history.
The complete briefing is usually longer than 8,000 characters because the attribution header, source metadata, separators, omission marker, and continuing instruction sit outside the quoted-body budget. The original draft called 8,000 a hard ceiling; the released code does not.
What happens near—or at—a quota wall
Claude Code and Codex expose their allowance state through different native interfaces. Crowsnest keeps the resulting readings attached to the correct provider account and exposes three distinct behaviors instead of calling all of them “automatic switching.”
- Before the wallA warning, not a move
The shipped 90% threshold only appears when the current reading is usable and another account is available. It offers the existing continuation action; it never fires it.
- Manual continuationPreview, then confirm
A supported Claude Code or Codex conversation can be carried over through the continuation action. At a quota failure, either runtime can offer another signed-in account for the same provider. The preview shows exactly what the destination will receive.
- Optional quota continuationAutomatic only when unambiguous
If the operator explicitly enables it and exactly one other account is signed in, Crowsnest can skip the confirmation after a quota failure. With several destinations, the chooser still waits.
The failed turn remains visible because it really did stall. Continuing elsewhere does not repair or erase that event; it starts a new conversation from the bounded briefing.
New conversations can start where more allowance remains
Routing applies only when a new conversation starts, and it ships off. When enabled, Crowsnest ranks the last published usage reading for each account. The fullest reported window is binding, so an account with a nearly exhausted session or weekly allowance does not look healthier because another meter is low.
When headroom is within 15 percentage points, the soonest known reset breaks the tie so expiring allowance is used first. A missing or failed reading is never interpreted as zero usage, and an account at 100% is not automatically selected. If nothing trustworthy is readable, Crowsnest falls back instead of dressing a guess up as a measurement.
Conversation size stops dominating once the budget fills
The app-side draft recorded the generated briefing size across 153 Claude Code transcripts on one machine. The result is directional evidence about the shared briefing builder, not a Claude Code or Codex benchmark: the corpus is not representative, the token column uses the rough four-characters-per-token convention, and no text was sent to a tokenizer service.
| Source conversation | Transcripts | Median briefing | Rough tokens | Turns kept |
|---|---|---|---|---|
| Under 50 KB | 27 | 1,057 chars | 264 | 2 |
| 50–500 KB | 39 | 7,559 chars | 1,889 | 39 |
| 0.5–5 MB | 68 | 8,612 chars | 2,152 | 38 |
| Over 5 MB | 19 | 8,615 chars | 2,153 | 41 |
The large-conversation rows converge because the quoted body is budgeted. Their complete briefings can exceed 8,000 characters through fixed framing, and different model tokenizers can produce different counts from the same text. The briefing becomes the first message of the receiving conversation and may contribute to later input context until the provider caches or compacts it; “one-time token cost” would therefore be misleading.
API-equivalent cost depends on the receiving model, caching, current public pricing, and later context reuse. Provider subscriptions are not billed as simple input-token invoices. The article deliberately leaves out a fixed dollar promise.
A continuation is useful because its limits stay visible
- Not full native context: the destination gets a bounded quote, not every record, tool result, attachment, or hidden provider state.
- Not a repaired failed turn: a quota-stalled turn remains in the source conversation; the new session starts after it.
- Not silent rotation by default: fresh installs ask at a wall, warn at 90%, and leave new-conversation routing off.
- Not a pooled quota: every account keeps its own provider-reported windows and its own native config home.
- Not a credential vault: Crowsnest creates and identifies account homes, then the provider's own CLI performs sign-in. Crowsnest does not upload the transcript to its own service; the selected model provider receives the bounded briefing when the new session starts.
- Not the only provider option: a provider may offer other recovery choices, such as waiting for reset or changing how work is billed; current provider documentation is authoritative.
Provider documentation and released implementation
Provider references: Claude Code environment variables, Claude Code session storage, Claude Code models, usage, and limits, Codex environment variables, and Codex authentication. Crowsnest behavior was checked on August 28, 2026 against the released provider-account registry, handoff, and account-routing implementations.
Published August 27 and source-reviewed August 28, 2026. Provider limits, plans, model tokenizers, and pricing evolve independently; linked first-party documentation is authoritative for current provider behavior.