Brings ai-authorship note above the fold, and adds a note about imperfect isolation guarantee. Signed-off-by: bdeshi <bdeshi@bdeshi.space>
151 lines
5.7 KiB
Markdown
151 lines
5.7 KiB
Markdown

|
||
|
||
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.
|
||
|
||
---
|
||
> [!NOTE]
|
||
> shannoncoat started as the shell script in the first commit, written by hand.
|
||
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
|
||
|
||
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.
|
||
|
||
## 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).
|
||
|
||
Open the menu and:
|
||
|
||
- **Click a profile that isn't running** to switch to it. Every other running
|
||
profile is quit first, so you end up with just that one.
|
||
- **Click a profile that is already running** to bring its window forward,
|
||
leaving everything else where it is.
|
||
- **Shift-click a profile** to open it *alongside* whatever is already running.
|
||
|
||
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
|
||
|
||
**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.
|
||
|
||
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.
|
||
|
||
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.
|
||
|
||
## Settings
|
||
|
||
- **Launch at Login** — start shannoncoat automatically.
|
||
- **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.
|
||
|
||
## Troubleshooting
|
||
|
||
**The window tags don't appear.** Almost always Accessibility. Check
|
||
**System Settings → Privacy & Security → Accessibility**.
|
||
|
||
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.
|
||
|
||
**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.
|
||
|
||
**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.
|
||
|
||
## Build from source
|
||
|
||
Local builds require 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.
|
||
|
||
## 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.
|