diff --git a/README.md b/README.md index fb69b6d..91deeb3 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,8 @@ ![shannoncoat — which coat will Claude wear today?](docs/hero.png) -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//app` and `~/.shannoncoat/data//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//{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/.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` — `disableAutoUpdates` | +| 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.