Tighten the README and document the profile-reset-after-update fix
Adds a troubleshooting entry: Claude's auto-updater relaunches the app with no profile flags, landing in the default profile. Turning off auto-updates via the disableAutoUpdates policy (macOS, Windows, Linux locations) avoids it. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
a740b53627
commit
993f82a714
1 file changed
+56
-111
@@ -1,13 +1,8 @@
|
||||

|
||||
|
||||
Run multiple isolated [**\***](#isolation) Claude profiles on macOS — each one
|
||||
its own Claude Desktop **and** its own paired Claude Code setup — and tell their
|
||||
windows apart at a glance.
|
||||
|
||||
Your normal Claude install is left alone. It stays as it is and keeps working
|
||||
normally; shannoncoat only adds profiles alongside it.
|
||||
|
||||
A menu-bar item allows quick switching and profile management.
|
||||
Run multiple isolated [**\***](#isolation) Claude profiles on macOS from a
|
||||
menu-bar item — each its own Claude Desktop **and** paired Claude Code setup,
|
||||
its windows tagged to tell them apart. Your normal install is untouched.
|
||||
|
||||
---
|
||||
> [!NOTE]
|
||||
@@ -15,142 +10,92 @@ A menu-bar item allows quick switching and profile management.
|
||||
Claude built the GUI app out of it — most of the Swift, the icon, and this
|
||||
README — working from human direction, review, and dogfooding.
|
||||
|
||||
## Requirements
|
||||
|
||||
- macOS 13 or later
|
||||
- Claude Desktop
|
||||
|
||||
## Install
|
||||
|
||||
macOS 13+, Claude Desktop.
|
||||
|
||||
1. Download `shannoncoat.app.zip` from the
|
||||
[latest release](https://github.com/bdeshi/shannoncoat/releases/latest).
|
||||
2. Unzip it and move **shannoncoat.app** to `/Applications` or `~/Applications`.
|
||||
3. Open it. macOS will block the first launch, because the app isn't notarized.
|
||||
Go to **System Settings → Privacy & Security**, find the blocked item, and
|
||||
click **Open Anyway**.
|
||||
4. When prompted, grant **Accessibility**. The window tags are drawn from
|
||||
Accessibility data and won't appear without it.
|
||||
|
||||
## First run
|
||||
|
||||
With nothing running, shannoncoat offers a list of your profiles and starts
|
||||
whichever you tick. You can start several at once.
|
||||
[latest release](https://github.com/bdeshi/shannoncoat/releases/latest),
|
||||
unzip, and move to `/Applications` or `~/Applications`.
|
||||
2. First launch is blocked (not notarized): **System Settings → Privacy &
|
||||
Security → Open Anyway**.
|
||||
3. Grant **Accessibility** when prompted; the tags need it.
|
||||
|
||||
## Everyday use
|
||||
|
||||
The menu bar shows a coloured dot per running profile — dot and name when only
|
||||
one is up, dots alone when there are more (hover for the names).
|
||||
With nothing running, shannoncoat offers a checklist and starts whichever
|
||||
profiles you tick. The menu bar shows a dot per running profile in its colour,
|
||||
plus the name when only one is up; hover for the rest.
|
||||
|
||||
Open the menu and:
|
||||
- **Click a profile** — switch to it; the others are quit, even if it's already
|
||||
running.
|
||||
- **Shift-click** — open it *alongside* them, or focus it if already up.
|
||||
|
||||
- **Click a profile** to switch to it. Every other running profile is quit
|
||||
first, so you end up with just that one — including when the profile you
|
||||
clicked is already up, in which case it's the neighbours that go.
|
||||
- **Shift-click a profile** to open it *alongside* whatever is already running,
|
||||
or to bring its window forward if it's already up, leaving everything else
|
||||
where it is.
|
||||
**Settings → Click a profile to** swaps the two. `⇆` marks the last one you
|
||||
switched to. **Close Profile** quits one, **Quit Claude** all (shannoncoat
|
||||
stays), **Manage Profiles…** opens the main window.
|
||||
|
||||
If you open alongside more often than you switch, **Settings → Click a profile
|
||||
to** swaps the two around.
|
||||
|
||||
A `⇆` marks the profile you last switched to. **Close Profile** quits one
|
||||
profile; **Quit Claude** quits all of them and leaves shannoncoat running.
|
||||
**Manage Profiles…** opens the main window.
|
||||
|
||||
Quitting Claude by hand, from the Dock, or via Force Quit is picked up within
|
||||
about a second — the menu bar always reflects what is actually running.
|
||||
|
||||
## Window tags
|
||||
|
||||
Each managed Claude window carries a small tag in that profile's colour, so two
|
||||
otherwise identical windows are easy to tell apart.
|
||||
|
||||
Drag a tag anywhere on its window; each profile remembers where you put its own.
|
||||
If you'd rather have something smaller, **Settings → Window tag → Colored dot**
|
||||
replaces the name chip with a plain dot.
|
||||
Each managed window carries a tag in its profile's colour — drag it anywhere, and
|
||||
each profile remembers its spot.
|
||||
|
||||
## Profiles
|
||||
|
||||
**default** is your real, untouched Claude install. shannoncoat can start and
|
||||
stop it but never manages it, so it gets no tag and can't be deleted.
|
||||
**default** is your real Claude install: start/stop only, never managed, so it
|
||||
gets no tag and can't be deleted.
|
||||
|
||||
To add a custom isolated profile, open **Manage Profiles… → +** and enter a
|
||||
name. The directories are optional — leave them blank and the profile gets
|
||||
`~/.shannoncoat/data/<name>/app` and `~/.shannoncoat/data/<name>/code`. Point
|
||||
them anywhere you like if you'd rather keep a profile's data with a project.
|
||||
**Manage Profiles… → +** adds one. Directories are optional — blank gives
|
||||
`~/.shannoncoat/data/<name>/{app,code}`. Two profiles may not share a directory;
|
||||
that would silently merge their sessions, so shannoncoat refuses to start and
|
||||
names the collision.
|
||||
|
||||
Selecting a profile shows both paths, ready to copy.
|
||||
|
||||
Each profile is a small JSON file at `~/.shannoncoat/<name>.json`, named after
|
||||
the profile. Two profiles may not share a directory — that would silently merge
|
||||
their Claude sessions, so shannoncoat refuses to start and tells you which files
|
||||
collide.
|
||||
|
||||
Deleting a profile removes only that pointer file. **Its Claude data stays on
|
||||
disk**, so you can recreate the profile later and pick up where you left off. If
|
||||
it's running, it's quit first.
|
||||
Profiles are JSON files in `~/.shannoncoat/`. Deleting one quits it and removes
|
||||
just that file — **the Claude data stays on disk**, so recreating it resumes
|
||||
where you left off.
|
||||
|
||||
## Settings
|
||||
|
||||
- **Launch at Login** — start shannoncoat automatically.
|
||||
- **Click a profile to** — whether plain click switches and Shift-click opens
|
||||
alongside, or the reverse.
|
||||
- **Launch at Login**
|
||||
- **Click a profile to** — switch or open alongside; Shift-click does the other.
|
||||
- **Window tag** — name chip or coloured dot.
|
||||
- **Automatically check for updates** — once a day at most.
|
||||
|
||||
## Updates
|
||||
|
||||
shannoncoat compares its version against the one published on GitHub. The
|
||||
automatic check posts a quiet notification; **Check for Updates…** in Settings
|
||||
reports either way.
|
||||
|
||||
It never replaces itself. When a new version exists, download it from the
|
||||
releases page and swap the app in yourself.
|
||||
- **Automatically check for updates** — once a day at most, against the latest
|
||||
GitHub release, or **Check for Updates…** on demand. It never self-updates;
|
||||
download and swap the app in yourself.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
**The window tags don't appear.** Almost always Accessibility. Check
|
||||
**System Settings → Privacy & Security → Accessibility**.
|
||||
**Tags don't appear.** Almost always Accessibility. If shannoncoat is listed *and
|
||||
ticked* under **Privacy & Security → Accessibility**, remove it with **−** and
|
||||
re-add — a differently-signed build leaves the old entry visible but inert, and
|
||||
toggling won't help.
|
||||
|
||||
If shannoncoat is listed *and already ticked* but the tags still don't show,
|
||||
select it, remove it with **−**, then add it back. This happens after replacing
|
||||
the app with a build that has a different code signature; the old entry stays
|
||||
visible but no longer applies, and toggling it off and on won't fix it.
|
||||
**A profile restarts into the default one.** Claude's auto-updater relaunches
|
||||
the app with no profile flags. Turn auto-updates off with the
|
||||
`disableAutoUpdates` policy, then update by hand and restart from shannoncoat:
|
||||
|
||||
**Claude Desktop can't be found.** shannoncoat looks in `/Applications` and
|
||||
`~/Applications`. If yours is somewhere else, you'll be asked to locate it the
|
||||
first time you start a profile.
|
||||
| OS | Where |
|
||||
| --- | --- |
|
||||
| macOS | `/Library/Managed Preferences/com.anthropic.claudefordesktop.plist` — `<key>disableAutoUpdates</key><true/>` |
|
||||
| Windows | `HKLM\SOFTWARE\Policies\Claude` — `disableAutoUpdates` (DWORD `1`) |
|
||||
| Linux | `/etc/claude-desktop/managed-settings.json` — `{"disableAutoUpdates": true}` |
|
||||
|
||||
**A profile won't quit.** Claude was asked to quit and declined — usually its
|
||||
own "unsaved work" or "still generating" dialog. shannoncoat deliberately waits
|
||||
rather than killing Claude underneath it. Answer the dialog.
|
||||
**A profile won't quit.** Claude declined — usually its "unsaved work" or "still
|
||||
generating" dialog. shannoncoat waits rather than killing it.
|
||||
|
||||
## Build from source
|
||||
|
||||
Local builds require the Xcode Command Line Tools.
|
||||
```
|
||||
xcode-select --install
|
||||
```
|
||||
Needs the Xcode Command Line Tools (`xcode-select --install`).
|
||||
|
||||
Then run the build script
|
||||
```bash
|
||||
./build.sh
|
||||
```
|
||||
|
||||
The app is written to `.build/shannoncoat.app`; copy it to `/Applications` or
|
||||
`~/Applications`.
|
||||
|
||||
One thing worth setting up: an unsigned local build gets a new code identity
|
||||
every time, which silently invalidates its Accessibility grant on each rebuild.
|
||||
`.env.example` walks through creating a self-signed certificate once so the
|
||||
permission survives.
|
||||
Lands in `.build/shannoncoat.app`. Unsigned builds get a new code identity each
|
||||
time, silently voiding Accessibility on every rebuild; `.env.example` covers a
|
||||
one-off self-signed certificate that avoids it.
|
||||
|
||||
## Isolation
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Perfect isolation is not guaranteed. Claude and Claude Code can have functionally
|
||||
> full disk access regardless of which profile it's running from, including access
|
||||
> to default configuration folders.
|
||||
>
|
||||
> Some Claude integrations — skills, plugins, etc — may also hardcode the
|
||||
> `~/.claude` path which may modify content in there.
|
||||
> Isolation isn't perfect. Claude and Claude Code can have effectively full disk
|
||||
> access from any profile, default config folders included, and some integrations
|
||||
> — skills, plugins — hardcode `~/.claude` and write there.
|
||||
Reference in new issue
Block a user