DryDock
Case study · Tech & fun
A shipyard for coding agents — dispatch, isolate, verify, from a phone
- What
- A personal orchestrator that dispatches Claude Code and Gemini CLI runs into any project, each task isolated in its own git worktree.
- Stack
- Next.js 15 + better-sqlite3 + Node subprocess spawn; SSE streaming to a mobile-first PWA over a Cloudflare Tunnel.
- Status
- In Progress
- Dates
- Published May 2026 · Updated August 2026
- Links
- Source code
Background
Can a phone in your pocket safely run a fleet of coding agents on the Mac at home?
DryDock started life as a lightweight deployment framework — "a shipyard for containerized apps." Then the agents moved in. It's now an orchestration platform: type a prompt on your phone, and a Claude Code or Gemini CLI subprocess spins up on the Mac, works inside an isolated git worktree in the target repo, streams its output live to a home-screen PWA, and gets its work checked by a quality gate before anything merges.
There are no API keys anywhere in the system. Dispatch rides the CLIs' own subscription logins, and the remote door fails closed: every non-local request needs Cloudflare Access or a token, and the origin server only binds loopback.
A Look Inside
Each view shown on mobile and desktop — captured from a local instance seeded with demo projects. Tap any image to open the source on GitHub.
How It Works
One Next.js app owns the whole loop — capture, dispatch, isolation, verification, and accounting:
- Dispatch: a free-form prompt against a chosen project becomes a task with per-run model and autonomy overrides, behind a concurrency cap and queue with cancel.
- Isolation: every task gets its own
git worktree, so an agent can't touch main — and a quality gate runs the project's tests the moment the agent exits. - Live streaming: agent output parses from
stream-jsoninto an SSE feed the PWA renders in real time, with token counts and cost captured per run. - Budget awareness: usage windows across Claude, Codex, and Gemini aggregate into a budget pill, so you know what a dispatch costs against subscription limits before sending the next one.
- Fail-closed security: loopback-only bind, Cloudflare Access or token auth for anything remote, per-caller MCP tool allowlists, and an optional local-dispatch-only paranoid mode.
- Grown-in extras: a cross-project backlog with Apple Notes sync, a capture inbox fed by Siri and iMessage, and a GitHub Issues mirror.



