Real-time SSE, not polling.
A launchctl subscription fans out over Server-Sent Events. Status changes land in the browser in under 50ms — faster than you can alt-tab to a terminal.
Launch Pilot is a local-first control console for macOS launchd. Every LaunchAgent, every restart loop, every log line — streaming to a browser tab over SSE, running on your laptop, touching no cloud, asking no permissions you haven't already given launchctl.
Why
Three hundred services run on a fresh macOS install. You inherited thirty more when you said yes to Docker, Homebrew, Rectangle, and that Python installer from 2021.
When one fails, you read plist XML, grep Console.app, and pray /var/log/system.log still has the window. Launch Pilot replaces that ritual with a real-time console — one tab, every agent, full log tail, zero kernel extensions.
Without Launch Pilot
With Launch Pilot
How it works
A single Go binary, no Electron, no background services it didn't ship with. The formula is public and auditable — read the bottle, read the source.
$ brew install launch-pilot/tap/launch-pilotThe CLI boots a local web server on 127.0.0.1, opens a browser tab, and subscribes to launchctl events through the native bootstrap APIs. Nothing leaves your machine.
$ launch-pilot open --port 7331Every service is a row. Green means healthy, amber means thrashing, red means bring-it-back-up. Click a row for tail logs, exit codes, the plist that defined it, and a one-click restart button.
Live stream
A single SSE channel multiplexes stdout, stderr, and launchd status emissions. Server-side filtering keeps the payload small; the browser renders deltas, not full frames.
Features
A launchctl subscription fans out over Server-Sent Events. Status changes land in the browser in under 50ms — faster than you can alt-tab to a terminal.
Exit codes, signal names, and a rolling buffer of the last 500 log lines per service. When something dies at 3am, the evidence is waiting when you wake up.
LaunchAgent plists are XML pretending to be dictionaries. Launch Pilot parses them into typed forms — ProgramArguments, KeepAlive, StartInterval — with inline validation and diff-on-save.
Standard out, standard error, and launchd's own emission — merged, timestamp-aligned, searchable. Filter by level without losing context.
Everything runs on 127.0.0.1. No analytics, no crash reporter, no call-home update check. You'd hear about a new release from Homebrew, like every other local tool.
⌘K opens command palette. j/k moves between services. r restarts. l opens logs. Esc closes. Designed for someone who types faster than they click.
Install · 4 seconds
One tap, one binary, one browser tab. No daemon-for-the-daemons, no elevated privileges beyond what launchctl already has.
$ brew install launch-pilot/tap/launch-pilot==> Fetching launch-pilot ==> Pouring launch-pilot-0.3.1.arm64_sonoma.bottle.tar.gz 🚀 /opt/homebrew/Cellar/launch-pilot/0.3.1: 11 files, 8.9MB
$ launch-pilot open▶ launch-pilot v0.3.1 ✓ launchctl subscription (313 services indexed) ✓ SSE bus on 127.0.0.1:7331 ✓ opening http://127.0.0.1:7331/ in your browser$
/stat 01
313
services indexed on a fresh macOS 15 install
on this M2 MacBook Air, right now
/stat 02
< 50ms
SSE round-trip from launchctl event to DOM update
95th percentile, local loopback
/stat 03
0
System Preference panes opened to diagnose a crash
this has been a System Preference-free quarter
/stat 04
8.9MB
single static Go binary, arm64 + x86_64
smaller than the average launch-screen video
FAQ
No kernel extensions. System-level daemons appear in a read-only overview; agent-level services in your own user domain can be started, stopped, and restarted. The privilege model mirrors launchctl — if launchctl can do it, so can Launch Pilot.
Nothing. The binary binds only to 127.0.0.1, there is no analytics SDK, no crash reporter, no phone-home update check. Updates come through Homebrew on your schedule.
Yes. The Homebrew bottle ships both arm64 and x86_64 slices, built against macOS 12+ SDK. Sonoma and Sequoia are the primary targets; Ventura works and is tested in CI.
Yes. The same SSE stream the UI consumes is available at /api/events, and there is a JSON REST surface under /api/services for list/start/stop/restart. Use it with curl, Bruno, or whatever you script with.
Those are paid macOS apps for editing plists. Launch Pilot is a free, open, local web console focused on the observability side — real-time status, logs, crash-loop detection — with plist editing as a secondary surface, not the headline.
Install
Four seconds of Homebrew and one browser tab. That's the whole setup. The next daemon that dies will announce itself.
then: launch-pilot open