{"slug": "i-built-outerloop-manage-your-macs-as-a-claude-code-fleet-from-one-dashboard", "title": "I built Outerloop – manage your Macs as a Claude Code fleet from one dashboard", "summary": "Developer Phyo Lim launched Outerloop, an open-source tool that turns Macs into a fleet of Claude Code workers managed from a single web dashboard. The system lets users file coding tickets from any device, which are then executed by agents on remote machines, with automated code review and manual merge approval. Outerloop addresses the problem of not having the right development machine at hand by enabling asynchronous, agent-driven coding workflows.", "body_md": "Outerloop turns the Macs you already own into a small fleet of Claude Code workers,\nmanaged from one web dashboard. One always-on Mac is the **hub**: it holds the ticket\nqueue, the scheduler, and the dashboard. Any other Mac joins as a **worker**. A single\nMac is a complete fleet — the hub does its own work too.\n\nThe problem it solves: the machine that can do the work is usually not the machine in front of you. The desk Mac has Claude Code logged in, the repos cloned, git/gh configured. When you think of a fix from your phone or another laptop, the options were remoting in — screen sharing or SSH into an interactive session, slow and awkward from a phone — or writing it down to copy-paste later. With outerloop you file a ticket from wherever you are and a capable machine at home picks it up. You come back to a PR.\n\nThe unit of work is a ticket, and the ticket is also the record: an agent writes code on a branch using the ticket as context, a second agent reviews it (author and reviewer are separate; the reviewer cannot merge), and the PR references the ticket. Merges require manual approval in the dashboard, and failing CI blocks a merge even after approval.\n\nMachines find each other on your LAN by Bonjour, or through an outbound SSH tunnel to a cheap VPS when you're away. No VPN, no OAuth, no cloud service.\n\nEverything happens in the web dashboard at `http://<hub>.local:8765`\n\n:\n\n**Inbox**— your home. Whatever is waiting on you (approvals, questions, failures) sits at the top; what the fleet is doing right now is below it.**Board**— every ticket, Jira-style. Create tickets here (press`c`\n\n), filter by status, drill into any ticket's thread.**Fleet**— your machines: online/offline, what each is running, pause/resume, pairing, budget.** Activity**— the full log; every action is recorded with a why.\n\nA coding ticket walks this path on its own:\n\n```\nyou file it → triaged & prioritized → agent writes code on a branch\n→ a second agent reviews it (≤3 rounds) → PR opens once it's stable\n→ you approve the merge → merged, done\n```\n\nAlong the way the agent may pause to **ask you a question** — answer in the ticket\nthread and work resumes with your answer. At the **merge gate** you see the PR link,\ndiff stat, and CI status; **Approve & merge**, **Request changes** (your note goes\nstraight to the agent for another pass), or **Reject** to stop. You can also add a note\nto any ticket at any time to steer its next run.\n\n**You approve every merge.** Agents only propose; the decision queue is the sole path to anything irreversible. Failing CI blocks a merge even after you click approve.**The author never reviews its own work**, and the reviewer has no way to merge.** Nothing runs away.**Per-ticket and fleet-wide token budgets, per-run timeouts, a hard cap on review rounds, and a one-click** kill switch**that stops all new work.** Get pinged, not surprised.**Set a notify URL (`outerloop config notify_url https://ntfy.sh/<topic>`\n\n) and your phone buzzes for every decision, failure, and junk-parked ticket.- A LAN-exposed hub always locks itself: worker auth on, and a dashboard password\n(self-generated and shown once if you don't set one —\n`outerloop status`\n\nrecalls it).\n\nInstall the menu-bar app — it's the smoothest way in. It's signed + notarized, and it does the whole setup for you (dashboard password, service start, pairing):\n\n```\nbrew tap phyolim/tap\nbrew trust phyolim/tap                # one-time, required for the cask\nbrew install outerloop               # CLI + service\nbrew install --cask outerloop-app    # the menu-bar app\n```\n\nOpen **Outerloop** from the menu bar and pick what this Mac is:\n\n**Hub + Worker**— the usual choice on your first or only Mac: it holds the queue and dashboard*and*does coding work itself.**Worker**— every other Mac. Its popover lists hubs on your network — click** Join**, it shows a 6-character code, type that code on the hub's** Fleet**page. Paired.** Hub**— rare: a hub that only coordinates and never codes.\n\nThat's it. The dashboard opens from the menu bar, or at `http://<hub>.local:8765`\n\n.\n**One hub, any number of workers.**\n\nAny Mac doing coding work also needs `claude`\n\n(Claude Code CLI, logged in), `gh`\n\n(authed), and `git`\n\n(commit identity set) — the app checks all of it on first launch.\nPython ≥ 3.9 (the built-in `/usr/bin/python3`\n\n) is enough; zero pip installs.\n\n## Prefer the terminal? (headless hubs, no GUI)\n\nSkip the cask; after `brew install outerloop`\n\n, tell the Mac its role yourself:\n\n```\n# first / only Mac — hub that also codes:\nouterloop setup-both && brew services start outerloop   # `setup-hub` = coordinate-only\n\n# every other Mac — a worker:\nouterloop local role worker\nouterloop local hub_url http://<hub>.local:8765\nbrew services start outerloop\n```\n\n`outerloop status`\n\nprints the dashboard password; `outerloop doctor`\n\nchecks the\n`claude`\n\n/`gh`\n\n/`git`\n\ntoolchain. Pair a CLI worker from the hub: `outerloop token <worker-name> <secret>`\n\n, then on the worker `outerloop local worker <worker-name>`\n\nand\n`outerloop local token <secret>`\n\n, and restart it.\n\nInstall the app on it, pick **Worker**, and use its **Join** button (above) — that's the\nwhole pairing. What each worker is allowed to work on is set by its **capabilities**,\nedited live on the hub's Fleet page.\n\nThe hub can dial out to a cheap VPS over SSH so you can reach the dashboard from\nanywhere (HTTPS + password) — no port opened at home. That walkthrough, plus the\nzero-touch `.pkg`\n\ninstallers for a managed fleet, lives in\n** deploy/README.md**.\n\n-\n**Models:** cheap models do the trivial work, capable ones the deep work (triage → Haiku, review → Sonnet, author → Opus). Override with`--models \"author=opus\"`\n\nor`OUTERLOOP_MODEL_<ROLE>`\n\n. -\n**Personas:** give agents identities and specialties — like staffing a team. Drop a markdown file in the hub's`agents/`\n\ndata dir (\"a fintech-savvy author for`banking-*`\n\nprojects\", \"a food-delivery UX reviewer for`food-*`\n\n\") and tickets route to the matching specialist by project. See`prompts/agents/README.md`\n\n. -\n**State** lives in`~/Library/Application Support/outerloop`\n\n— one store shared by the CLI, the daemon, and the app. Run**one hub per machine**, and don't mix a brew-services hub with a`.pkg`\n\nhub on the same box. -\n**Upgrade:** the menu-bar app updates itself; for the CLI/service,`brew upgrade outerloop && brew services restart outerloop`\n\n. -\n**Uninstall:**\n\n```\nbrew services stop outerloop\nbrew uninstall outerloop\nbrew uninstall --zap --cask outerloop-app\nrm -rf ~/Library/Application\\ Support/outerloop   # state — only if you want it gone\n```\n\nFAKE mode — the default from a clone — simulates the agents and GitHub, so the whole loop runs end to end with nothing installed but a Mac's own Python:\n\n```\ngit clone https://github.com/phyolim/outerloop && cd outerloop\npython3 -m outerloop init\npython3 -m outerloop serve            # dashboard at http://127.0.0.1:8765\npython3 -m outerloop tick             # advance the loop (second shell; run repeatedly)\n```\n\nFile a ticket, tick a few times, watch it reach the merge gate, approve it, tick again — merged. That's the whole product in miniature.", "url": "https://wpnews.pro/news/i-built-outerloop-manage-your-macs-as-a-claude-code-fleet-from-one-dashboard", "canonical_source": "https://github.com/phyolim/outerloop", "published_at": "2026-07-08 21:25:54+00:00", "updated_at": "2026-07-08 21:42:48.034680+00:00", "lang": "en", "topics": ["developer-tools", "ai-agents", "ai-tools"], "entities": ["Phyo Lim", "Outerloop", "Claude Code", "Mac"], "alternates": {"html": "https://wpnews.pro/news/i-built-outerloop-manage-your-macs-as-a-claude-code-fleet-from-one-dashboard", "markdown": "https://wpnews.pro/news/i-built-outerloop-manage-your-macs-as-a-claude-code-fleet-from-one-dashboard.md", "text": "https://wpnews.pro/news/i-built-outerloop-manage-your-macs-as-a-claude-code-fleet-from-one-dashboard.txt", "jsonld": "https://wpnews.pro/news/i-built-outerloop-manage-your-macs-as-a-claude-code-fleet-from-one-dashboard.jsonld"}}