Multi-account switcher for Claude Code
Project description
claude-swap
Multi-account switcher for Claude Code. Easily switch between multiple Claude accounts without logging out. Works with both the Claude Code CLI and the VS Code extension.
Installation
Using uv (recommended)
uv tool install claude-swap
Using pipx
pipx install claude-swap
From source
git clone https://github.com/realiti4/claude-swap.git
cd claude-swap
uv sync
uv run cswap --help
Updating
uv tool upgrade claude-swap
# or
pipx upgrade claude-swap
Usage
Add your first account
Log into Claude Code with your first account, then:
cswap --add-account
Add more accounts
Log in with another account, then:
cswap --add-account
Switch accounts
Rotate to the next account:
cswap --switch
Or switch to a specific account:
cswap --switch-to 2
cswap --switch-to user@example.com
Note: Restart Claude Code (or close and reopen the VS Code extension tab) after switching for the new account to take effect.
Refresh expired tokens
If an account's token expires, log back into Claude Code with that account and re-run:
cswap --add-account
This will update the stored credentials without creating a duplicate.
Interactive TUI
If you don't want to remember flags, launch the arrow-key menu:
cswap --tui
Add an account from a raw OAuth token
If you only have a long-lived setup-token (e.g., produced by claude setup-token)
and you don't want to log in via the browser flow first — useful on headless
servers or when receiving a token from another machine — register it directly:
cswap --add-token sk-ant-oat01-... --email user@example.com
cswap --add-token sk-ant-oat01-... --email user@example.com --slot 3
cswap --add-token - --email user@example.com # read token from stdin
cswap --add-token --email user@example.com # prompt securely (no echo)
--email is required so cswap's metadata stays aligned with the rest of the
accounts. No Anthropic API calls are made.
Other commands
cswap --list # Show all accounts with 5h/7d usage and reset times
cswap --status # Show current account
cswap --add-account --slot 3 # Add account to a specific slot (prompts before overwrite)
cswap --remove-account 2 # Remove an account
cswap --purge # Remove all claude-swap data
Tips
- Continuing sessions after switching: You can resume the same Claude Code session after switching accounts. Close Claude Code or the VS Code extension tab, run
cswap --switchin any terminal, then reopen and select your previous session. Note that the first message on the new account may use extra usage as the conversation cache rebuilds for that account.
How it works
- Backs up OAuth tokens and config when you add an account
- Swaps credentials when you switch accounts
- Account credentials stored securely using platform-appropriate methods
Data locations
| Platform | Credentials | Config backups |
|---|---|---|
| Windows | Windows Credential Manager | ~/.claude-swap-backup/ |
| macOS | macOS Keychain | ~/.claude-swap-backup/ |
| Linux / WSL | File-based (inside the backup directory, under credentials/) |
${XDG_DATA_HOME:-~/.local/share}/claude-swap/ |
On Linux/WSL the location follows the XDG Base Directory Specification. Set XDG_DATA_HOME to override; otherwise it defaults to ~/.local/share/claude-swap/. Existing installs with data under ~/.claude-swap-backup/ are migrated automatically on the first run. If both the legacy and new paths exist, cswap refuses to start and asks you to remove the stale one manually.
Backup and migration
Move account data between machines or back it up:
cswap --export backup.cswap # All accounts to a file
cswap --export backup.cswap --account 2 # One account
cswap --export backup.cswap --full # Include full local ~/.claude.json (same-PC backup)
cswap --import backup.cswap # Skips accounts that already exist
cswap --import backup.cswap --force # Overwrite existing
The export file is plaintext JSON. If you need encryption, pipe through your tool of choice (e.g. cswap --export - | gpg -c > backup.gpg).
Uninstall
Remove all data:
cswap --purge
Then uninstall the tool:
uv tool uninstall claude-swap
# or
pipx uninstall claude-swap
Requirements
- Python 3.12+
- Claude Code installed and logged in
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file claude_swap-0.10.0.tar.gz.
File metadata
- Download URL: claude_swap-0.10.0.tar.gz
- Upload date:
- Size: 86.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2eef4584e7bf6ecd77fd94219f4556078db6254c95f15750daf9f42817c5f5f6
|
|
| MD5 |
80ae0d3edb3e4c684b42ad6cedf0943b
|
|
| BLAKE2b-256 |
18664ed2bc1c91185ea34f736f2134814da56f3c67aa64dd5c42a6c25ee258ee
|
Provenance
The following attestation bundles were made for claude_swap-0.10.0.tar.gz:
Publisher:
publish.yml on realiti4/claude-swap
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
claude_swap-0.10.0.tar.gz -
Subject digest:
2eef4584e7bf6ecd77fd94219f4556078db6254c95f15750daf9f42817c5f5f6 - Sigstore transparency entry: 1417630056
- Sigstore integration time:
-
Permalink:
realiti4/claude-swap@9f282c52d06a8a889500e0c6eb079b59693180b0 -
Branch / Tag:
refs/tags/v0.10.0 - Owner: https://github.com/realiti4
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@9f282c52d06a8a889500e0c6eb079b59693180b0 -
Trigger Event:
release
-
Statement type:
File details
Details for the file claude_swap-0.10.0-py3-none-any.whl.
File metadata
- Download URL: claude_swap-0.10.0-py3-none-any.whl
- Upload date:
- Size: 44.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
079312930edc9c8d535ac5f433d7fd2144b6a0cb72ffb16ac35c6c4f76a8086b
|
|
| MD5 |
8548ac4beaf507281f0089cecd0e1c7b
|
|
| BLAKE2b-256 |
3c12b4cf9dda0eb3c667615c97977e196658f6412d387907c963a276d8ae39eb
|
Provenance
The following attestation bundles were made for claude_swap-0.10.0-py3-none-any.whl:
Publisher:
publish.yml on realiti4/claude-swap
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
claude_swap-0.10.0-py3-none-any.whl -
Subject digest:
079312930edc9c8d535ac5f433d7fd2144b6a0cb72ffb16ac35c6c4f76a8086b - Sigstore transparency entry: 1417630077
- Sigstore integration time:
-
Permalink:
realiti4/claude-swap@9f282c52d06a8a889500e0c6eb079b59693180b0 -
Branch / Tag:
refs/tags/v0.10.0 - Owner: https://github.com/realiti4
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@9f282c52d06a8a889500e0c6eb079b59693180b0 -
Trigger Event:
release
-
Statement type: