Henry Robinson.Back

AI · Project

Claudia Control Plane, my own Claude Code agent harness

A Next.js dashboard that drives a fleet of Claude agents on a Mac mini at home, using my Claude Code subscription instead of API credits. It handles proposals, missions, and an activity feed; the agents do the work. Here is how it fits together.

Claudia Control Plane dashboard
The dashboard.
$0 / moAPI cost — runs on the Claude Code subscription
~$1,500 / mowhat the API-metered equivalent was tracking toward
Human-gatednothing runs until a job is approved

Five layers, left to right: what I see in the browser, the control plane on Vercel, the database, the agent runtime on the Mac mini, and the outside services it talks to. Click any box to see what it does.

Interfaces · browser

  • Dashboard
  • Job console
  • Chat
  • Memory browser

Control plane · Vercel

  • Next.js app + API

Data · Neon

  • Neon Postgres + pgvector
  • Voyage AI embeddings

Agent runtime · Pallas

  • task-router
  • Claude Code CLI
  • email-poller
  • vault-indexer

External services

  • Anthropic API
  • Gmail
  • GitHub
  • 1Password
  • Tailscale
  • Syncthing

Click any box to see what it does. Drag the canvas to pan; the page scrolls normally. Solid rust arrows are the live job loop; dashed lines are the supporting platform.

Every unit of work is a “job” with a lifecycle: draft → pending → approved → running → succeeded. The router on the Mac mini polls for approved jobs, runs them through headless Claude Code, has a cheap model grade the result, and pushes any code changes — on its own, once I approve.

Rendering diagram…

The diagrams show what it is. These are the calls that shaped it — the part that actually matters when someone asks how I think about building systems.

Subscription, not API credits

Drive the heavy agents through the Claude Code CLI on a Claude Max subscription.

WhyThe API-metered equivalent was heading toward ~$1,500/mo for the same volume of work.

Trade-offI run and maintain a machine at home instead of going fully serverless.

A real machine, not serverless

Run the agent runtime as launchd daemons on a Mac mini.

WhyJobs run for minutes and need a filesystem, git, and local tools. Serverless functions time out and start cold.

Trade-offHome-network uptime is on me, and there is no autoscale.

Humans approve before agents act

Every job waits in a pending → approved gate; nothing executes until approved.

WhyAutonomy is a setting, not a default. I decide how much rope each kind of job gets.

Trade-offA beat of latency per job, traded for control.

Fail loud, no fallbacks

A missing secret throws. There is no silent mock, default, or stub.

WhyA silent fallback once meant data could have been unrecoverable with no warning during development.

Trade-offMore upfront wiring; errors surface immediately instead of in production.

Memory is a database, not a prompt

Long-term memory lives in Postgres + pgvector and is retrieved by relevance.

WhyThe agent stays consistent across sessions without stuffing everything into the context window.

Trade-offAn embedding + retrieval step on every relevant call.

Built to be watched

Heartbeats every 60s and daily logs feed the dashboard.

WhyAgent failures are silent and cryptic. A hung or quietly-failing job should show up red, not vanish.

Trade-offExtra plumbing that earns its keep the first time something stalls.

Boring, well-supported pieces wired together carefully.

Next.js 16·React 19·Tailwind 4·Neon Postgres·pgvector·Claude Code CLI·Anthropic API (Haiku · Sonnet)·Voyage AI·1Password·Tailscale·Syncthing·launchd·Vercel