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:
bdeshiandClaude Sonnet 5.5 committed 2026-11-13 14:13:32 +06:00
1 parent a740b53627
commit 993f82a714
1 file changed
+56 -111
+56 -111
View File
@@ -1,13 +1,8 @@
![shannoncoat — which coat will Claude wear today?](docs/hero.png) ![shannoncoat — which coat will Claude wear today?](docs/hero.png)
Run multiple isolated [**\***](#isolation) Claude profiles on macOS — each one Run multiple isolated [**\***](#isolation) Claude profiles on macOS from a
its own Claude Desktop **and** its own paired Claude Code setup — and tell their menu-bar item — each its own Claude Desktop **and** paired Claude Code setup,
windows apart at a glance. its windows tagged to tell them apart. Your normal install is untouched.
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.
--- ---
> [!NOTE] > [!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 Claude built the GUI app out of it — most of the Swift, the icon, and this
README — working from human direction, review, and dogfooding. README — working from human direction, review, and dogfooding.
## Requirements
- macOS 13 or later
- Claude Desktop
## Install ## Install
macOS 13+, Claude Desktop.
1. Download `shannoncoat.app.zip` from the 1. Download `shannoncoat.app.zip` from the
[latest release](https://github.com/bdeshi/shannoncoat/releases/latest). [latest release](https://github.com/bdeshi/shannoncoat/releases/latest),
2. Unzip it and move **shannoncoat.app** to `/Applications` or `~/Applications`. unzip, and move to `/Applications` or `~/Applications`.
3. Open it. macOS will block the first launch, because the app isn't notarized. 2. First launch is blocked (not notarized): **System Settings → Privacy &
Go to **System Settings → Privacy & Security**, find the blocked item, and Security → Open Anyway**.
click **Open Anyway**. 3. Grant **Accessibility** when prompted; the tags need it.
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.
## Everyday use ## Everyday use
The menu bar shows a coloured dot per running profile — dot and name when only With nothing running, shannoncoat offers a checklist and starts whichever
one is up, dots alone when there are more (hover for the names). 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 **Settings → Click a profile to** swaps the two. `⇆` marks the last one you
first, so you end up with just that one — including when the profile you switched to. **Close Profile** quits one, **Quit Claude** all (shannoncoat
clicked is already up, in which case it's the neighbours that go. stays), **Manage Profiles…** opens the main window.
- **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.
If you open alongside more often than you switch, **Settings → Click a profile Each managed window carries a tag in its profile's colour — drag it anywhere, and
to** swaps the two around. each profile remembers its spot.
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.
## Profiles ## Profiles
**default** is your real, untouched Claude install. shannoncoat can start and **default** is your real Claude install: start/stop only, never managed, so it
stop it but never manages it, so it gets no tag and can't be deleted. gets no tag and can't be deleted.
To add a custom isolated profile, open **Manage Profiles… → +** and enter a **Manage Profiles… → +** adds one. Directories are optional — blank gives
name. The directories are optional — leave them blank and the profile gets `~/.shannoncoat/data/<name>/{app,code}`. Two profiles may not share a directory;
`~/.shannoncoat/data/<name>/app` and `~/.shannoncoat/data/<name>/code`. Point that would silently merge their sessions, so shannoncoat refuses to start and
them anywhere you like if you'd rather keep a profile's data with a project. names the collision.
Selecting a profile shows both paths, ready to copy. 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
Each profile is a small JSON file at `~/.shannoncoat/<name>.json`, named after where you left off.
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.
## Settings ## Settings
- **Launch at Login** — start shannoncoat automatically. - **Launch at Login**
- **Click a profile to** — whether plain click switches and Shift-click opens - **Click a profile to** — switch or open alongside; Shift-click does the other.
alongside, or the reverse.
- **Window tag** — name chip or coloured dot. - **Window tag** — name chip or coloured dot.
- **Automatically check for updates** — once a day at most. - **Automatically check for updates** — once a day at most, against the latest
GitHub release, or **Check for Updates…** on demand. It never self-updates;
## Updates download and swap the app in yourself.
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.
## Troubleshooting ## Troubleshooting
**The window tags don't appear.** Almost always Accessibility. Check **Tags don't appear.** Almost always Accessibility. If shannoncoat is listed *and
**System Settings → Privacy & Security → Accessibility**. 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, **A profile restarts into the default one.** Claude's auto-updater relaunches
select it, remove it with **−**, then add it back. This happens after replacing the app with no profile flags. Turn auto-updates off with the
the app with a build that has a different code signature; the old entry stays `disableAutoUpdates` policy, then update by hand and restart from shannoncoat:
visible but no longer applies, and toggling it off and on won't fix it.
**Claude Desktop can't be found.** shannoncoat looks in `/Applications` and | OS | Where |
`~/Applications`. If yours is somewhere else, you'll be asked to locate it the | --- | --- |
first time you start a profile. | 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 **A profile won't quit.** Claude declined — usually its "unsaved work" or "still
own "unsaved work" or "still generating" dialog. shannoncoat deliberately waits generating" dialog. shannoncoat waits rather than killing it.
rather than killing Claude underneath it. Answer the dialog.
## Build from source ## Build from source
Local builds require the Xcode Command Line Tools. Needs the Xcode Command Line Tools (`xcode-select --install`).
```
xcode-select --install
```
Then run the build script
```bash ```bash
./build.sh ./build.sh
``` ```
The app is written to `.build/shannoncoat.app`; copy it to `/Applications` or Lands in `.build/shannoncoat.app`. Unsigned builds get a new code identity each
`~/Applications`. time, silently voiding Accessibility on every rebuild; `.env.example` covers a
one-off self-signed certificate that avoids it.
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.
## Isolation ## Isolation
> [!IMPORTANT] > [!IMPORTANT]
> Perfect isolation is not guaranteed. Claude and Claude Code can have functionally > Isolation isn't perfect. Claude and Claude Code can have effectively full disk
> full disk access regardless of which profile it's running from, including access > access from any profile, default config folders included, and some integrations
> to default configuration folders. > — skills, plugins — hardcode `~/.claude` and write there.
>
> Some Claude integrations — skills, plugins, etc — may also hardcode the
> `~/.claude` path which may modify content in there.