Ditto
Keep work, personal, and client Claude Code and Codex logins apart.
Ditto gives each profile its own authentication, settings, and session history. Pick a profile in the terminal, sign in through the official CLI, then launch Claude Code or Codex. Your existing setup stays available as the default profile.
The name is a nod to the shape-shifting Pokémon: one small tool, whichever coding identity you need.
┌──────────────────── Ditto choose a profile, then a tool ────────────────────┐
├─ Profiles ───────────────┬─ Selected profile ─────────────────────────────────┤
│ default existing │ work Isolated profile │
│› work │ │
│ personal │ Authentication │
│ │ Claude Code ● Signed in │
│ │ Codex ○ Sign in required │
├──────────────────────────┴────────────────────────────────────────────────────┤
│ c open Claude x open Codex l sign in o sign out │
│ ↑/↓ select n new profile r refresh q quit │
└───────────────────────────────────────────────────────────────────────────────┘
Why use it?
Claude Code and Codex both keep user-level configuration and login state in a home directory. That works until you need separate accounts for different jobs. Manually moving auth files around is easy to get wrong, and it is hard to tell which account a new session will use.
Ditto launches each CLI with a profile-specific home directory:
| Tool | Setting used by Ditto |
|---|---|
| Claude Code | CLAUDE_CONFIG_DIR=~/.ditto/profiles/<name>/claude |
| Codex | CODEX_HOME=~/.ditto/profiles/<name>/codex |
No config files are swapped. Profiles remain independent, and switching only affects the process launched by Ditto.
Requirements
Install at least one of the supported CLIs:
Building Ditto requires Rust 1.85 or newer.
Install
From GitHub:
From a local checkout:
Make sure Cargo's binary directory is in your PATH:
Quick start
Open Ditto:
Then:
- Press
nand name the profile, such aswork. - Select it and press
l. - Choose Claude Code with
cor Codex withx. - Complete the official login flow. Ditto returns to the profile screen afterward.
- Press
corxto launch the tool.
Repeat the sign-in step for the other CLI if the profile uses both.
TUI controls
| Key | Action |
|---|---|
↑ / ↓ or k / j |
Select a profile |
c |
Launch Claude Code |
x |
Launch Codex |
l |
Sign in with Claude Code or Codex |
o |
Sign out, with confirmation |
n |
Create a profile |
r |
Refresh authentication status |
q or Esc |
Quit or close a dialog |
The selected profile is remembered for the next run.
Command-line usage
The TUI is optional. Every launch command works directly from the shell:
# Profiles
# Launch a tool
# Pass arguments to the underlying CLI after --
If the profile name is omitted, Ditto uses the last selected profile. Before the first selection it uses default.
You can also call the native authentication commands through a profile:
Where credentials are stored
Ditto does not ask for passwords, parse OAuth tokens, or keep credentials in its state file. The login action runs the installed Claude Code or Codex CLI with the selected profile directory, so each vendor's own authentication flow remains responsible for credential storage.
Codex keeps its auth state under the selected CODEX_HOME. Claude Code uses the selected CLAUDE_CONFIG_DIR; on macOS, sensitive Claude credentials remain in the system Keychain.
Ditto's files are laid out like this:
~/.ditto/
├── state.toml
└── profiles/
├── work/
│ ├── claude/
│ └── codex/
└── personal/
├── claude/
└── codex/
Directories are created with user-only permissions on Unix systems.
The default profile points to ~/.claude and ~/.codex. It exposes your existing setup without copying or migrating anything.
Environment variables
| Variable | Purpose |
|---|---|
DITTO_HOME |
Move Ditto's state and profile directory from ~/.ditto |
DITTO_CLAUDE_BIN |
Override the claude executable |
DITTO_CODEX_BIN |
Override the codex executable |
Example:
DITTO_HOME="/.config/ditto"
ANTHROPIC_API_KEY, ANTHROPIC_AUTH_TOKEN, and OPENAI_API_KEY are inherited by launched tools. They may override a saved subscription login, so Ditto shows a warning when one is set.
Remove Ditto
Uninstall the binary:
Profiles are deliberately left alone. If you no longer need their settings, sessions, or credentials, remove ~/.ditto yourself.
Development
License
Ditto is available under the MIT License.
Ditto is an independent project. It is not affiliated with Anthropic, OpenAI, Nintendo, or The Pokémon Company.