Self-healing dashboard for a fleet of local dev apps.
Register an app once. Local Apps assigns it a port, writes its Caddy reverse proxy and macOS LaunchAgent, health-checks it every 30 seconds, restarts it when it crashes, and exposes it by name over LAN and Tailscale. One page instead of a wall of npm run dev tabs. Apps you are not using stay parked at zero cost until you start them; the monitor itself is 1 Node process with 2 runtime dependencies.
- One page - live status over SSE, with LAN, Tailscale, and production links, plus a QR code for your phone.
- Zero-config onboarding -
POST /api/appswith an id; port,<id>.localhostproxy, and LaunchAgent are provisioned for you. - Self-healing - a down app walks 5 levels: kickstart, port-kill and reload, log-driven fixes, an optional local AI agent, and a circuit breaker that parks a flapping app instead of looping.
- Multi-machine - a hub runs the bots; agent machines only report status.
- Fails closed off-box - loopback is trusted; any other caller is denied mutations and log reads unless it sends
x-local-apps-token.
Node 22 or newer (.nvmrc is set; nvm use picks it up).
git clone https://github.com/bunlongheng/local-apps.git
cd local-apps
npm install
npm run devOpen http://localhost:9875. With no apps.config.json it seeds 2 demo apps. Register your own:
curl -X POST http://localhost:9875/api/apps \
-H "Content-Type: application/json" \
-d '{"id":"hello-app","localPath":"/path/to/hello-app"}'Caddy proxies and LaunchAgents are macOS features (Homebrew Caddy). Elsewhere the dashboard and API run in monitoring mode.
Who opens it, the hub process, the host, the apps it supervises, and the L1 to L5 healing ladder. Click through for the interactive version.
One Node 22 process on node:http, no framework, no build step. server.js serves the vanilla-JS dashboard in public/ and owns the API, backed by SQLite. When an app goes down:
| Level | After | Action |
|---|---|---|
| L1 | detect | launchctl kickstart |
| L2 | 90s | kill the port, full reload |
| L3 | 180s | read the log, npm install, clear stale build cache, restart |
| L4 | 300s | optional: hand it to a local Claude Code CLI agent |
| L5 | 3 flaps in 2 min | circuit breaker: park it OFF, re-arm when healthy |
On the hub role only, 5 routes serve the owner's own workflow rather than the product: /api/tab-colors, /api/consistency, /api/app-profiles, /api/icon-sync, /api/capabilities. They read optional local files and repos; on an agent machine they are not registered.

