How to Run Two Claude Desktop Accounts on One Mac (With Separate Dock Icons and Shared Context)
I run my daily operations and recurring routines inside Claude Desktop's Code tab: morning check-ins at 08:45, weekly planning, Telegram community digests, and weekly SEO and AEO checks for this blog. Running everything
I run my daily operations and recurring routines inside Claude Desktop's Code tab: morning check-ins at 08:45, weekly planning, Telegram community digests, and weekly SEO and AEO checks for this blog.
Running everything on a single account has a structural flaw. Paid Claude plans have a session limit that resets every five hours, plus weekly limits. When a heavy coding or video-rendering session burns through that session limit in 45 minutes, every scheduled task on that account hits the same wall and stalls.
I wanted two Claude accounts running in parallel on the same Mac mini:
- Account 1 (Routines): my existing account, left completely untouched, so all scheduled tasks, mail connectors and morning check-ins keep running on autopilot.
- Account 2 (Engineer): a second account dedicated to hands-on coding, debugging and content work.
And I needed two things most multi-account guides skip: the two accounts had to share the same project memory and skills without duplicating scheduled tasks, and they needed different icons in the macOS Dock so I wouldn't click the wrong window twenty times a day.
Short answer
You don't need to log out and back in, and you don't need to migrate your existing scheduled tasks. Leave your original Claude.app untouched for routines, and launch a second instance for daily work by passing both --user-data-dir (which isolates the Electron desktop app) and CLAUDE_CONFIG_DIR (which isolates the Claude Code engine). To give the second window its own teal Dock icon and an "Engineer" label without breaking Apple's code signature, launch an unmodified APFS clone (cp -cR) at ~/Applications/Engineer.app through a small launcher, and symlink only skills, agents and projects between the two config folders.
Why --user-data-dir alone isn't enough
Most guides for running multiple Claude accounts focus either on the terminal CLI or on the chat window. If you use the Code tab inside Claude Desktop, two separate layers store your login and state:
| Layer | Setting | What it isolates |
|---|---|---|
| Claude Desktop (Electron) | --user-data-dir |
Desktop login, claude_desktop_config.json (MCP servers), the sidebar session list |
| Claude Code engine | CLAUDE_CONFIG_DIR |
Code tab credentials (a macOS Keychain entry), scheduled-tasks/, projects/, settings.json
|
Where each account keeps them:
| Layer | Account 1 (Routines) | Account 2 (Engineer) |
|---|---|---|
| Claude Desktop | ~/Library/Application Support/Claude |
~/Library/Application Support/Claude-Work |
| Claude Code |
~/.claude (variable left unset) |
~/.claude-work |
If you only pass --user-data-dir, the Desktop window opens a new account, but the Code tab inside it still uses ~/.claude and bills your original account. To isolate both, you have to pass both.
One macOS Keychain trap: leave CLAUDE_CONFIG_DIR unset for your original account. Pointing it at ~/.claude explicitly can make Claude Code look up a different Keychain entry than the default, so your existing login seems to disappear. Only set the variable for the second account.
What didn't work: editing Info.plist, and a plain AppleScript launcher
Before landing on the working setup, I hit two dead ends that come up in almost every forum thread on this:
-
Dead end 1: editing
Info.plistand re-signing the app. Some guides suggest duplicatingClaude.app, changingCFBundleNameandCFBundleIdentifierinInfo.plist, replacing the binary with a wrapper script, and runningcodesign. On recent macOS and Electron builds, modifying any file inside the signed bundle strips Anthropic's entitlements. The app crashes on launch withEXC_BREAKPOINT (SIGTRAP)insideElectron Framework. -
Dead end 2: a plain AppleScript launcher pointing at
/Applications/Claude.app. Anosacompileapplet that runsopen -n -a "/Applications/Claude.app"works without crashing. But even if you paste a custom icon onto the launcher in Finder, the launcher exits in a tenth of a second and/Applications/Claude.appis what stays in the Dock. You end up with two identical orange Claude icons in the Dock and in window switchers.
The fix: an unmodified APFS clone, a launcher and a recolored icon
The trick is to separate the launcher from an unmodified APFS clone:
- Copy
/Applications/Claude.appto~/Applications/Engineer.appwithcp -cR. On APFS this creates a clone: it finishes instantly, uses no extra disk space, and leaves every file insideContents/untouched, so Gatekeeper and Electron never complain. - Attach a custom icon to the outside of the bundle with macOS's
NSWorkspaceAPI. Finder stores custom icons in an extended attribute (com.apple.FinderInfoand anIcon\rfile), outside the code-signing seal. - Create a tiny launcher at
/Applications/Engineer.appthat starts~/Applications/Engineer.appwith--env "CLAUDE_CONFIG_DIR=..."and--args "--user-data-dir=...".
Because the running process is ~/Applications/Engineer.app, the Dock shows its custom icon and Engineer as the tooltip.

The two icons I keep in the Dock: the original Claude app for routines, and the recolored Engineer clone for hands-on work. Both icons are taken from the apps on my Mac.
In the real Dock, hovering over each icon shows its own name:

Hovering over the teal icon: Engineer.

Hovering over the orange icon: Claude.
Step 1: Create the isolated Engineer app and launcher
Open Terminal and run:
mkdir -p "$HOME/Applications" "$HOME/.claude-work" "$HOME/Library/Application Support/Claude-Work" &&
rm -rf "$HOME/Applications/Engineer.app" "/Applications/Engineer.app" &&
cp -cR "/Applications/Claude.app" "$HOME/Applications/Engineer.app" &&
osacompile -o "/Applications/Engineer.app" \
-e 'do shell script "open -n -a \"$HOME/Applications/Engineer.app\" --env \"CLAUDE_CONFIG_DIR=$HOME/.claude-work\" --args \"--user-data-dir=$HOME/Library/Application Support/Claude-Work\""'
Step 2: Recolor the original Claude icon to teal
Instead of hunting for a third-party PNG, you can use macOS's built-in CoreImage (CIHueAdjust) from Terminal. It takes Claude's official icon, keeps the transparent rounded corners and the white starburst, rotates the orange background 180 degrees to teal, and applies it to both Engineer.app bundles:
osascript -l JavaScript -e 'ObjC.import("Cocoa"); ObjC.import("CoreImage"); var ws = $.NSWorkspace.sharedWorkspace; var orig = ws.iconForFile("/Applications/Claude.app"); orig.setSize($.NSMakeSize(512, 512)); var ci = $.CIImage.imageWithData(orig.TIFFRepresentation); var f = $.CIFilter.filterWithName("CIHueAdjust"); f.setValueForKey(ci, "inputImage"); f.setValueForKey(3.14159, "inputAngle"); var rep = $.NSCIImageRep.imageRepWithCIImage(f.valueForKey("outputImage")); var img = $.NSImage.alloc.initWithSize($.NSMakeSize(512, 512)); img.addRepresentation(rep); ws.setIconForFileOptions(img, "/Applications/Engineer.app", 0); ws.setIconForFileOptions(img, ObjC.unwrap($.NSHomeDirectory()) + "/Applications/Engineer.app", 0);' && killall Dock Finder
If you prefer emerald green instead of blue, change 3.14159 to 2.1.
Step 3: Sign in to the second account without the deep-link mix-up
Claude Desktop signs in through your browser and passes the login back through a claude:// deep link. If two Claude instances are open at the same time, macOS often hands that callback to the wrong window.
For the first login only:
- Quit your original Claude app (
Cmd + Q). - Open Engineer from
/Applicationsand sign in with your second Claude account (or use the email verification code instead of clicking the magic link). - Switch to the Code tab inside Engineer and confirm that
/statusshows your second account.
Keeping both accounts in sync (without duplicating scheduled tasks)
Two isolated folders mean the new account starts empty: none of your installed skills, subagents, MCP servers or conversation transcripts are there.
The key is selective symlinking:
ln -sfn "$HOME/.claude/skills" "$HOME/.claude-work/skills" &&
ln -sfn "$HOME/.claude/agents" "$HOME/.claude-work/agents" &&
ln -sfn "$HOME/.claude/projects" "$HOME/.claude-work/projects" &&
cp "$HOME/Library/Application Support/Claude/claude_desktop_config.json" \
"$HOME/Library/Application Support/Claude-Work/claude_desktop_config.json"
Here is why this split works:
-
What stays separate (
scheduled-tasks/and credentials): local scheduled tasks live under~/.claude/scheduled-tasks/<task-name>/SKILL.md. By not symlinkingscheduled-tasks/, all routines stay on Account 1. If you symlinked that folder, both open apps would fire every scheduled task twice. -
What is shared on disk (
skills/,agents/,projects/): Claude Code stores session transcripts and per-project auto memory (MEMORY.md) under~/.claude/projects/, grouped by working directory, regardless of which account paid for the tokens. Symlinkingprojects/lets either account resume or search conversations started by the other. -
Project-level context (
CLAUDE.mdandAGENTS.md): because both accounts open the same project folders on disk, shared files likeCLAUDE.md,Now.mdand project logs are read and updated by both accounts in real time.
Pairing each Claude account with its own Chrome profile
Several of my scheduled tasks read signed-in pages in Chrome through the Claude in Chrome extension. If two Claude instances try to share a single Chrome profile, they fight over the connection.
A Claude Desktop instance connects to Chrome through Anthropic's bridge and only sees Chrome extensions signed in to the same Claude account. That makes isolating browsers straightforward:
- Leave your original Chrome profile as it is. Its Claude in Chrome extension is already signed in to Account 1 (Routines). Keep the web sessions your scheduled tasks read (Search Console, Bing Webmaster Tools, Telegram Web, analytics dashboards) logged in there.
- Create a second Chrome profile for Engineer. Install the Claude in Chrome extension in the new profile and sign the extension in to Account 2.
-
Lock the pairing once. With both Chrome profiles open, type
/chromeinside an Engineer Code session (or ask it to switch browser) and approve the connection in the new Chrome window. Claude remembers the paired browser for future sessions.
Two gotchas to keep in mind
-
Launch order matters (
Claude.appfirst,Engineer.appsecond). Both apps share the same internalCFBundleIdentifier, so clicking the stock orangeClaude.appicon while Engineer is already running tells macOS LaunchServices to focus the running Engineer window instead of starting a new process. Always start your mainClaude.appfirst (it runs your background routines anyway, so it stays open all day), then launchEngineer.app. Because the Engineer launcher passesopen -n, it always opens its own window. -
After a Claude Desktop update, refresh the clone. When
/Applications/Claude.appauto-updates, your APFS clone at~/Applications/Engineer.appstays on the previous build until you re-run thecp -cRand icon commands above.
Checklist
- Keep Account 1 (scheduled tasks and routines) on the default
/Applications/Claude.appand~/.claude. - Create an unmodified APFS clone at
~/Applications/Engineer.appand a launcher at/Applications/Engineer.appthat passes both--env "CLAUDE_CONFIG_DIR=$HOME/.claude-work"and--args "--user-data-dir=$HOME/Library/Application Support/Claude-Work". - Run the CoreImage one-liner to give Engineer a teal Claude icon in the Dock and window switcher.
- Quit the main app once, sign in to Account 2 inside Engineer, then reopen the main app.
- Symlink
skills,agentsandprojectsfrom~/.claudeto~/.claude-work, copyclaude_desktop_config.json, and leavescheduled-tasksunlinked. - Sign a second Chrome profile's Claude extension in to Account 2 and pair it with
/chrome.
If you're building AI-native workflows around your business, or want a hand setting up a system like this without breaking your existing tools, get in touch.
Originally published on my blog.
Originally published by Dev.to AI. Aggregated on AIWithGhost for educational purposes β full credit and traffic to the original publisher.