One Brain, Two Wallets: Two Claude Code Accounts on One Machine A developer created a setup to run two Claude Code subscriptions on one machine by using separate config directories and symlinks, allowing seamless switching between accounts while sharing skills, MCP servers, and settings. The solution includes aliases, symlinks for shared resources, and a shell shim to route session resumes to the correct account. I hit my Claude Code usage limit mid-week. I have a second subscription, but switching accounts the naive way — /logout , /login , repeat — is miserable, and it turns out "switching accounts" in Claude Code silently means switching everything : skills, MCP servers, settings, hooks, memory, session history. All of it. What I actually wanted: one brain, two wallets. Same skills, same MCP servers, same muscle memory — just a different subscription getting billed. Here's the setup that got me there. ~20 minutes, fully reversible. Claude Code keeps all its state in a config directory — ~/.claude by default — and honors a CLAUDE CONFIG DIR env var to point elsewhere. That's the whole trick: ~/.zshrc Claude Code multi-account aliases alias claude-work='CLAUDE CONFIG DIR=~/.claude claude' alias claude-personal='CLAUDE CONFIG DIR=~/.claude-personal claude' mkdir ~/.claude-personal source ~/.zshrc claude-personal prompts OAuth login for the second account — one time Credentials land in whichever dir is active. Bare claude still defaults to ~/.claude , so nothing about your existing workflow changes. .claude.json moves when you set the env var Claude Code's user-level config file ~/.claude.json — MCP servers, folder trust, onboarding state lives next to ~/.claude , not inside it. But when CLAUDE CONFIG DIR is set, it's read from inside the config dir instead. So claude-work — even though it points at the same ~/.claude you've always used — creates a fresh, empty ~/.claude/.claude.json and suddenly has zero MCP servers. Fix: symlink it to the master, since it's the same account: ln -s ~/.claude.json ~/.claude/.claude.json Now bare claude and claude-work are byte-for-byte identical. The second account starts as a blank slate. Since only billing should differ, symlink everything shareable from the main dir: cd ~/.claude-personal ln -s ~/.claude/skills skills ln -s ~/.claude/CLAUDE.md CLAUDE.md ln -s ~/.claude/settings.json settings.json hooks, permissions, env ln -s ~/.claude/settings.local.json settings.local.json ln -s ~/.claude/plugins plugins One source of truth: add a skill or tweak a hook once, both accounts see it. MCP servers need more care. They live in .claude.json , which also holds the account identity oauthAccount — so you can't symlink the whole file across accounts. Merge just the mcpServers block: jq --slurpfile mcp < jq '.mcpServers' ~/.claude.json \ '.mcpServers = $mcp 0 ' ~/.claude-personal/.claude.json \ /tmp/merged.json && mv /tmp/merged.json ~/.claude-personal/.claude.json --resume doesn't know about accounts Session transcripts live at