{"slug": "claude-fleet", "title": "Claude-Fleet", "summary": "Claude Fleet, an independent, community-built macOS menu bar app, displays all running Claude Code sessions on a Mac and over SSH, grouped by git repo, with a badge counting sessions needing attention. The app, which requires macOS 14+ and Xcode command line tools, highlights sessions stuck at unanswered permission prompts, floating repos with such sessions to the top. It is not affiliated with Anthropic and is published under MIT.", "body_md": "A native macOS **menu bar** app that shows every Claude Code session you have\nrunning — on this Mac and on a remote machine over SSH — grouped by git repo, so\nyou can tell at a glance which one is stuck waiting on you.\n\nThe one thing it exists to tell you: **which session is sitting at an unanswered\npermission prompt right now.** When Claude asks \"can I run this command?\" inside a\nwindow you're not looking at, that session freezes and you have no idea until you\nhappen to switch to it. Claude Fleet puts that in your menu bar — and when a session\nstarts needing you, it jumps to the top.\n\nAn independent, community-built tool. Not affiliated with, or endorsed by, Anthropic.\n\nThis is a personal tool, built for one setup and published as-is under MIT. It reads Claude Code's on-disk files, which are\n\nundocumentedand can change in any Claude Code release — when they do, this breaks until someone fixes it.\n\nI fix what breaks for me.Issues are open but may go unanswered; PRs are welcome but may sit. There is no roadmap and no release cadence. If that's not what you need, fork it — that's what the licence is for.When it does break, it breaks\n\nloudly: the reason lands inSettings → Diagnosticsand in`~/.claude-fleet/last-poll.log`\n\n. Please include that in any issue. See[SUPPORT.md].\n\nSessions. That's it — grouped by the git repo they're in.\n\nNo machine names, no connection status, no error rows, no \"unreachable\" warnings.\nIf the remote machine is off-network the list is simply **empty and calm**.\nAnything the app can't reach, or chooses to hide, is explained only in **Settings →\nDiagnostics** — never in the session list itself.\n\nGrouping is by **git repo**, not by directory: sessions in `acme-web`\n\n,\n`acme-web/services/api`\n\nand `acme-web/worker`\n\ncollapse into one `acme-web`\n\ngroup\nrather than scattering into three. The row shows the path within the repo so you can\nstill tell subfolder sessions apart.\n\n| dot | state | meaning |\n|---|---|---|\n| 🟠 | Needs approval |\nA tool call was issued and nothing has moved since — an unanswered permission prompt. This is the state the app is for. |\n| 🟡 | Your turn |\nClaude finished its turn and is waiting for you to type something |\n| 🟢 | Working |\nA tool call is in flight and the transcript is actively moving |\n| ⚪️ | Idle |\nA \"your turn\" session you walked away from — grey, de-emphasised, uncounted |\n\nRepos containing a **Needs approval** session float to the top, so the thing that\nneeds you is always the first thing you see. The menu bar badge counts only the\nsessions that need you now (**Needs approval** + **Your turn**).\n\nRequires macOS 14+ and the Xcode command line tools (`xcode-select --install`\n\n).\n\n```\ngit clone <this-repo> claude-fleet\ncd claude-fleet\n./build.sh\nopen ~/Applications/ClaudeFleet.app\n```\n\n`build.sh`\n\ncompiles, signs (ad-hoc by default — no Apple account needed), and installs\nto `~/Applications/ClaudeFleet.app`\n\n. It's an `LSUIElement`\n\napp: menu bar only, no Dock\nicon, no app-switcher entry.\n\n**Start at login:** System Settings → General → Login Items → **+** →\n`~/Applications/ClaudeFleet.app`\n\n. (Documented rather than done for you, so nothing\nadds itself to your login silently.)\n\n**On first launch**, macOS asks to allow Claude Fleet to access devices on your local\nnetwork — **click Allow**, or the remote machine can never be reached. See\n[docs/troubleshooting.md](/Shubhamgupta2612/claude-fleet/blob/main/docs/troubleshooting.md) if no prompt appears.\n\nOpen the panel → **Settings**:\n\n**Machine**— an alias from your`~/.ssh/config`\n\n(the same one you already SSH or VS Code Remote-SSH with, so its user, port and key are inherited). Leave blank for this-Mac-only.**Include this Mac**— on by default; turn it off to watch only the remote.** Refresh every**— 5s / 15s / 30s / 1m (default 15s).\n\nThe remote needs nothing installed: the collector is piped over SSH and is\nstdlib-only Python. See [docs/user-guide.md](/Shubhamgupta2612/claude-fleet/blob/main/docs/user-guide.md) for the full setup,\nincluding Windows hosts.\n\n```\nClaudeFleet.app  ──every 15s──▶  python3 collector.py            (this Mac)\n                 ──every 15s──▶  ssh <host> '<py|python3> -' < collector.py   (remote)\n                        │\n                        └─▶  framed JSON  ──▶  repo groups  ──▶  menu bar\n```\n\n`collector.py`\n\nreads two things Claude Code writes on each machine — a per-process\nregistry (`~/.claude/sessions/<pid>.json`\n\n) and a per-session transcript\n(`~/.claude/projects/<slug>/<sessionId>.jsonl`\n\n) — and prints one small JSON document.\nIt is **piped over SSH stdin**, so nothing is ever installed on the remote and nothing\nneeds to be kept in sync there.\n\nThe full design, and the traps that make it non-trivial, are in\n[docs/architecture.md](/Shubhamgupta2612/claude-fleet/blob/main/docs/architecture.md) and [docs/traps.md](/Shubhamgupta2612/claude-fleet/blob/main/docs/traps.md).\n\n— setup, Windows hosts, background agents, the right-click actions[User guide](/Shubhamgupta2612/claude-fleet/blob/main/docs/user-guide.md)— the collector/app split, state derivation, liveness, the security model[Architecture](/Shubhamgupta2612/claude-fleet/blob/main/docs/architecture.md)— the hard-won gotchas: the Store-stub Python, the macOS Local Network deadlock, the SSH control-socket that makes every test lie[Traps](/Shubhamgupta2612/claude-fleet/blob/main/docs/traps.md)— empty list, no prompt, notifications[Troubleshooting](/Shubhamgupta2612/claude-fleet/blob/main/docs/troubleshooting.md)·[Contributing](/Shubhamgupta2612/claude-fleet/blob/main/CONTRIBUTING.md)·[Support](/Shubhamgupta2612/claude-fleet/blob/main/SUPPORT.md)[Licence (MIT)](/Shubhamgupta2612/claude-fleet/blob/main/LICENSE)\n\nOffline preview — rasterises the real panel to a PNG, no screen needed:\n\n```\nswiftc -O -parse-as-library -DPREVIEW -target arm64-apple-macos14.0 \\\n    -o /tmp/cfpreview Sources/*.swift && /tmp/cfpreview fixture.json /tmp/panel.png dark\n```\n\nTests:\n\n```\npython3 -m unittest discover -s tests -t tests   # collector logic\n./swift-tests/run.sh                              # notifier + security checks\n```\n\n`fixture.json`\n\nis a synthetic multi-repo snapshot; the same file drives the app itself\nvia `CLAUDE_FLEET_FIXTURE=/path/to/fixture.json`\n\n, bypassing SSH entirely.", "url": "https://wpnews.pro/news/claude-fleet", "canonical_source": "https://github.com/Shubhamgupta2612/claude-fleet", "published_at": "2026-07-31 23:48:21+00:00", "updated_at": "2026-08-01 00:22:52.008500+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools"], "entities": ["Claude Fleet", "Anthropic", "Claude Code", "macOS"], "alternates": {"html": "https://wpnews.pro/news/claude-fleet", "markdown": "https://wpnews.pro/news/claude-fleet.md", "text": "https://wpnews.pro/news/claude-fleet.txt", "jsonld": "https://wpnews.pro/news/claude-fleet.jsonld"}}