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
|
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.
|
|
||||||
Reference in new issue
Block a user