One command to flip your Claude Code, Codex, Gemini CLI, or Antigravity from your work account to your personal one, and back. No re-login, no browser, no copying tokens around. 100% local. Never touches the network.
If you run Claude Code, Codex, Gemini CLI, or Antigravity under more than one account -- a work seat and a personal subscription, a client's org and your own -- switching means logging out and back in every time. swapdex snapshots each logged-in account once, then swaps between them in place: the running CLI picks up the new account on your next message.
It is a switcher, not a rotator. It manages accounts you already own for distinct purposes. It has no feature for cycling accounts to get around a rate limit -- see What it will not do.
Safety is the design center: swapdex captures the live login before it swaps, so a switch can never lose or clobber an account, and it only ever hands the official CLI its own credentials -- no wrapper, no proxy, no client spoofing.
- Profile -- a named, point-in-time snapshot of a live login (the credential
files, captured with
add). It is a copy, not a live link. - Account -- the redacted identity a profile resolves to (email, tier,
expiry). Shown by
lsandstatus; never a token. - Switch --
usewrites a profile's snapshot back into place atomically, backing up the current login first. One account is active per tool at a time.
# crates.io (Rust)
cargo install swapdex
# Homebrew (macOS / Linux)
brew install youdie006/tap/swapdex
# npm (downloads the prebuilt binary)
npm install -g @youdie006/swapdex
# or the one-liner (prebuilt binary -> ~/.local/bin)
curl -fsSL https://raw.githubusercontent.com/youdie006/swapdex/main/install.sh | shLinux / WSL first; on macOS, Codex works today and Claude-via-Keychain is issue #1. Requires the Claude Code and/or Codex CLI already installed and logged in. Full command, exit-code, and environment reference: docs/COMMANDS.md.
# Save the account you're currently logged in as
swapdex add work # snapshots Claude + Codex, whichever is logged in
swapdex add personal --tool claude
# See what you have and who's active
swapdex ls
swapdex status
# Switch (takes effect on your next message -- no restart)
swapdex ui # full-screen picker: switch, then open a
# conversation right there (resume or new)
swapdex use work --tool claude --open --dir ~/proj # switch + launch in one
swapdex login personal --tool claude # sign in to a NEW account and save it
swapdex use personal
swapdex use - # toggle back to the previous profile
swapdex use w # a unique prefix is enough
swapdex use work --tool codex
swapdex use work --dry-run # show what would change, write nothing
# Sessions grouped by the account active when they ran (needs sessionwiki)
swapdex sessions
# Recent local token usage per tool (5h/7d) -- tells you when to switch
swapdex usage
# Made a bad switch? Put back the login that was live before it
swapdex restore
# Anything off? Every finding comes with its fix
swapdex doctorstatus shows the live account per tool, matched back to a saved profile:
claude-code: you@work.com [max] (profile 'work')
codex: you@personal.com [chatgpt] (profile 'personal')
The active account is always read from the live login, so if you /login
directly in the CLI, swapdex reports the truth rather than a stale guess.
For your shell prompt or statusline, status --short prints one compact line:
$ swapdex status --short
claude:work codex:personale.g. in a starship prompt: command = "swapdex status --short" in a
custom module, or in PS1
via $(swapdex status --short).
It also drops straight into Claude Code's own status line, so the active
account is always visible inside the tool you are switching
(~/.claude/settings.json):
{
"statusLine": { "type": "command", "command": "swapdex status --short" }
}usage reads your local session logs (no network) to gauge how heavily you've
been using each tool lately, so you know when to switch to a fresher account:
Local usage - this machine, approximate (not the billed quota):
claude-code 5h: 8.2M tok / 12 sess 7d: 61.4M tok / 88 sess
@work 5h: 6.0M tok 7d: 40.1M tok
@personal 5h: 2.2M tok 7d: 19.3M tok
Once a switch history exists, tokens are attributed to the profile active at
each event's timestamp (the same honest join sessions uses); anything before
your first switch stays untagged. Still deliberately a hint, not a
quota-dodging auto-rotator.
Each CLI keeps its login in a small on-disk file:
- Claude Code:
~/.claude/.credentials.jsonplus theoauthAccountblock inside~/.claude.json - Codex:
~/.codex/auth.json - Gemini CLI:
~/.gemini/oauth_creds.jsonplus~/.gemini/google_accounts.json - Antigravity:
~/.gemini/antigravity-cli/antigravity-oauth-token
add copies the current login into a private store at
~/.local/share/swapdex. use writes a saved snapshot back into place
atomically, backing up the current login first. For Claude, only the
oauthAccount block of ~/.claude.json is swapped -- your projects, MCP
servers, and settings in that file are never touched.
- Every credential file swapdex writes is
0600; the store directory is0700. - Writes are atomic (temp file created
0600, then renamed) so an interrupted switch can never leave a half-written credential that bricks the CLI. - Symlinked credential paths and running as root are refused.
usewrites a backup of the current login (fsynced, or the switch aborts; exception: an unreadable/corrupt live file is skipped with a warning -useis exactly the command that can replace a corrupt login) before overwriting anything, andswapdex restorebrings it back in one command if the switch was a mistake. The store keeps the last 2 backups per tool, andusewarns when the outgoing login is not saved as a profile -- so save accounts you care about withadd.- No token, refresh token, or home path is ever printed.
The store holds plaintext refresh tokens. Protect ~/.local/share/swapdex
like ~/.ssh, and do not sync it across machines (it is single-machine,
single-user by design).
These are structural properties, not promises -- the code is built so they cannot happen:
- No network, ever. The switching binary has no HTTP client in its dependency graph (CI asserts this on every commit). swapdex cannot phone home or exfiltrate a token.
- No auto-rotation. There is no
--auto,--next, or--when-rate-limitedflag.useonly ever switches to a name you type. - No token export. There is no command that prints a saved credential.
- No wrapper, no client spoofing. swapdex swaps the credential file that the
official
claude/codexbinary already reads, then gets out of the way. It never sits between the CLI and the API, never proxies requests, and never presents itself as the official client. Your traffic is the real CLI's traffic. (Launching the official tool once, on your explicit pick -login's sign-in flow,ui's session resume - is a hand-off, not a wrapper: swapdexexecs and is gone.)
Anthropic and OpenAI both permit multiple accounts for genuinely different purposes but forbid using multiple accounts to get around a single workload's rate limit, and forbid routing subscription OAuth tokens through third-party tools or spoofing the official client. swapdex is built for the former and structurally cannot do the latter -- it only ever hands the real CLI its own credentials. See Anthropic Usage Policy and OpenAI Usage Policies.
swapdex mcp runs a read-only MCP server exposing whoami and list_accounts
so an agent can see which account is active. There is deliberately no switch
tool -- an agent can never change your account.
claude mcp add swapdex -s user -- swapdex mcpswapdex is the accounts layer of a small local AI-CLI stack:
- sessionwiki -- index, search, and
resume your AI coding sessions.
swapdex sessionsgroups them by account, and after a switch inswapdex uiyou get that account's recent sessions with asessionwiki resume <id>hint -- switch, land back in your work. - prodex -- share one logged-in ChatGPT Pro session across agents. swapdex coexists with it without touching its auth.
Good tools exist in this space; they make different trade-offs (each line from that project's README, July 2026):
- claude-swap -- Claude Code only, a TUI with live usage bars, and optional auto-switching near your limit. If you want auto-rotation, use it -- swapdex deliberately refuses to have that feature.
- aisw -- cross-tool including Gemini, OS-keyring storage, Windows support. More features, bigger surface.
- caam -- cross-tool with a shell wrapper and automatic rotation on rate limits; the philosophical opposite of swapdex.
Pick swapdex if you want the smallest thing that switches Claude Code and
Codex together, can always undo (restore), diagnoses itself (doctor),
and structurally cannot rotate, proxy, or touch the network.
- Claude Code on macOS (Keychain). On macOS, Claude Code keeps its login in the Keychain rather than a file; swapdex detects this and refuses honestly instead of half-switching, but switching it is not supported yet. Design and constraints: issue #1 -- contributions from macOS users welcome (Codex already works on macOS).
Being considered, explicitly opt-in and advisory-only:
- Per-directory hints (cross-tool). Bind a directory to a profile and have
swapdex resolve <dir>suggest the right account ("this directory is bound towork-- runswapdex use work"). It would cover both Claude (CLAUDE_CONFIG_DIR) and Codex (CODEX_HOME) in one binding. It will never be a shell wrapper, never auto-switch, and never let anything but an explicitswapdex usechange the active account -- that bright line is what keeps swapdex a switcher, not a rotator.
MIT

