Dev.to AI πŸ€– Ai πŸ‘ 2 πŸ“– 8 min read

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

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 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:

  1. Account 1 (Routines): my existing account, left completely untouched, so all scheduled tasks, mail connectors and morning check-ins keep running on autopilot.
  2. 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.plist and re-signing the app. Some guides suggest duplicating Claude.app, changing CFBundleName and CFBundleIdentifier in Info.plist, replacing the binary with a wrapper script, and running codesign. On recent macOS and Electron builds, modifying any file inside the signed bundle strips Anthropic's entitlements. The app crashes on launch with EXC_BREAKPOINT (SIGTRAP) inside Electron Framework.
  • Dead end 2: a plain AppleScript launcher pointing at /Applications/Claude.app. An osacompile applet that runs open -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.app is 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:

  1. Copy /Applications/Claude.app to ~/Applications/Engineer.app with cp -cR. On APFS this creates a clone: it finishes instantly, uses no extra disk space, and leaves every file inside Contents/ untouched, so Gatekeeper and Electron never complain.
  2. Attach a custom icon to the outside of the bundle with macOS's NSWorkspace API. Finder stores custom icons in an extended attribute (com.apple.FinderInfo and an Icon\r file), outside the code-signing seal.
  3. Create a tiny launcher at /Applications/Engineer.app that starts ~/Applications/Engineer.app with --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 original orange Claude app icon next to the teal Engineer clone icon, labeled routines and hands-on work
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:

macOS Dock with the teal Engineer icon and its Engineer tooltip, next to the orange Claude icon
Hovering over the teal icon: Engineer.

macOS Dock with the orange Claude icon and its Claude tooltip, next to the teal Engineer icon
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:

  1. Quit your original Claude app (Cmd + Q).
  2. Open Engineer from /Applications and sign in with your second Claude account (or use the email verification code instead of clicking the magic link).
  3. Switch to the Code tab inside Engineer and confirm that /status shows 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 symlinking scheduled-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. Symlinking projects/ lets either account resume or search conversations started by the other.
  • Project-level context (CLAUDE.md and AGENTS.md): because both accounts open the same project folders on disk, shared files like CLAUDE.md, Now.md and 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:

  1. 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.
  2. 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.
  3. Lock the pairing once. With both Chrome profiles open, type /chrome inside 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

  1. Launch order matters (Claude.app first, Engineer.app second). Both apps share the same internal CFBundleIdentifier, so clicking the stock orange Claude.app icon while Engineer is already running tells macOS LaunchServices to focus the running Engineer window instead of starting a new process. Always start your main Claude.app first (it runs your background routines anyway, so it stays open all day), then launch Engineer.app. Because the Engineer launcher passes open -n, it always opens its own window.
  2. After a Claude Desktop update, refresh the clone. When /Applications/Claude.app auto-updates, your APFS clone at ~/Applications/Engineer.app stays on the previous build until you re-run the cp -cR and icon commands above.

Checklist

  1. Keep Account 1 (scheduled tasks and routines) on the default /Applications/Claude.app and ~/.claude.
  2. Create an unmodified APFS clone at ~/Applications/Engineer.app and a launcher at /Applications/Engineer.app that passes both --env "CLAUDE_CONFIG_DIR=$HOME/.claude-work" and --args "--user-data-dir=$HOME/Library/Application Support/Claude-Work".
  3. Run the CoreImage one-liner to give Engineer a teal Claude icon in the Dock and window switcher.
  4. Quit the main app once, sign in to Account 2 inside Engineer, then reopen the main app.
  5. Symlink skills, agents and projects from ~/.claude to ~/.claude-work, copy claude_desktop_config.json, and leave scheduled-tasks unlinked.
  6. 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.

πŸ“° Read the original article on Dev.to AI

Originally published by Dev.to AI. Aggregated on AIWithGhost for educational purposes β€” full credit and traffic to the original publisher.