A master daemon for your Claude Code / Codex dev team — no API tokens, no SaaS. Spawn parallel coding agents in tmux on the healthiest of your subscription accounts, watch every pane on a 2 Hz camera grid, gate every claim with a runtime verifier, and talk to it from the dashboard, Telegram, the CLI, or any /mcp client. Your laptop closes. The work keeps shipping.
Long-running coding agents disappear into tmux. You leave the room, miss the prompt, come back to find a Claude Code blocked on a yes/no question for six hours. No camera. No memory. No supervision.
Context evaporates at compaction. Skills documents help, but you still re-explain the project, the constraints, the naming-conventions, the in-flight roadmap. Tiered memory — profile facts always injected, curated recall hydrated at turn start — fixes this across /clear and across machines.
Anthropic's 5-hour and weekly windows aren't visible until you're already blocked. The subctl dispatcher routes new coding work to the greenest of your subscription accounts and runs the supervisor on local LM Studio so it never eats your weekly cap.
No API tokens. No reimplementation. subctl shells out to your installed claude and codex CLIs and lets them drive their own OAuth into sandboxed per-account config dirs. If you already pay for Claude Pro / Max and ChatGPT Pro, subctl is free leverage on what you already bought.
“subctl is the control plane for OAuth-via-subscription, not API-key auth.”
— providers/openai/auth.sh:6 (subctl source)
Every assistant turn is gated by verifier.ts— five rules that catch unbacked check-in promises, fake team-status claims, host facts, send-message claims, and decision-logged claims. When a coding agent says "I'll check in 15 min" without scheduling it, subctl re-prompts the model the same turn. Gaps land in decisions.jsonl. Nothing in Cursor or raw Claude Code does this.
NVR-style 2 Hz camera grid over every coding-agent tmux pane. Name-addressed dispatch from CLI, HTTP, master tool, MCP client, or Telegram. A team-staleness watchdog runs on a 30 min cadence with a 15 min staleness threshold; a separate idle-pane watchdog ticks every 30 s and is notify-only by default. An account-aware dispatcher picks the greenest of your paid accounts at spawn time. Six paid coding agents in parallel — and you see all six at once.

live capture · 127.0.0.1:8787 · Dashboard tab
subctl master runs as a launchd daemon on your machine. The supervisor talks to a local LM Studio model by default (qwen, gpt-oss) — so it never eats your Claude Pro / Max weekly window. Cloud is escalation only. Always-on. Survives laptop close. Answers from dashboard chat, Telegram, CLI, MCP, or scheduled self-prompts.
The master picks the healthiest provider account you already pay for and spawns a real coding agent in tmux against your repo. The baseline subctl, autonomy, and orchestrator-mode skills are symlinked into every config dir — every worker boots with doctrine baked in.
Five layers, named by what they do. Profile: always-injected operator facts (~3.5k char budget). Observation: raw turn-by-turn capture with FTS recall. Curated: hydrated into the supervisor prompt at turn start; survives /clear. Graph: multi-hop reasoning over your operator history. Vault: long-form decisions, specs, and RESUME files rendered in-page with wikilinks and embeds.
After every assistant turn the runtime scans for claim triggers — future check-in times, asserted team statuses, sent messages, decision-logged claims. Anything not backed by a tool call this turn fires a synthetic [verifier] correction prompt. Capped at 2 corrections; on giveup the gap lands in decisions.jsonl.
50+ master tools across 13 families — spawn / message / kill coding agents, read transcripts, schedule follow-ups, write to memory and the vault, capture pane screenshots, run radar, send to Telegram, ask yes/no, attach documents, swap personality. Every tool call is logged to decisions.jsonl with rationale.
Seven presets out of the box — straight-shooter, witty, sarcastic, robotic, arnold, elon, hilarious. Adjusts tone without touching the master's contract or tool-use protocol. CLI + dashboard tile + Telegram command.
Every active coding-agent tmux pane shown as a live tile, polling at 2 Hz. Click a tile to expand to a full pane with the last 500 lines. No coding agent works in the dark, no daemonized work you can't see.
The team-staleness watchdog runs on a 30 min cadence with a 15 min staleness threshold; on detection it nudges via HMAC-signed directive, holds 30 min, then escalates. The idle-pane watchdog ticks every 30 s and is notify-only by default. Auto-compact runs every 5 min, compacting the transcript when it crosses 90% of context.
Dashboard chat (SSE), Telegram (bidirectional with auto-relay), CLI prompt, the MCP server at /mcp, scheduled self-prompts, inbox events from worker teams. All routed through the same supervisor loop.
Bound to 127.0.0.1:8787. No phone-home. No account creation. Your bot token, your inbox, your vault, your data, your machine. ./uninstall.sh restores everything it touched.
Master spawns the right coding agent on the right Claude Code or Codex account, watches it, escalates a yes/no question to your phone when it needs you, and resumes when you tap. The transcript and decision log survive every /clear and compaction.
The verifier catches unbacked promises. The watchdog catches silent panes and prunes dead ones. The auto-compact catches context bloat. You watch the camera grid and intervene on demand — the harness handles the rest.
Each client gets a coding agent on a dedicated Claude Code account, with its own vault folder, its own RESUME file, and its own decision log. All driven from one master with one phone-as-pager.
Symlinks bin/subctl into PATH, wires the Claude statusline + Stop hook, symlinks baseline skills, drops launchd plists for master + dashboard, mints an MCP bearer token.
One-time browser login per account. Master comes up under launchd. Dashboard service is installed alongside.
Open the dashboard chat or talk from the CLI. Same conversation, same memory. Pair the Telegram bot for phone access, or point Claude Desktop at /mcp.
ping · state_snapshot · notify (tier 1 — protocol probes) · send_message · recent_messages · recent_decisions · list_notifications · watchdog_state (tier 2 — talk + read) · list_teams · team_inbox · team_msg · team_kill (tier 3 — supervise) · memory_search · memory_timeline (tier 4 — recall).
| Raw Claude / Codex | subctl harness | |
|---|---|---|
| Persistent orchestrator | none | ✓ subctl master daemon |
| Memory across /clear | skills file only | ✓ tiered memory: profile / observation / curated / graph / vault |
| Multi-account isolation | env vars by hand | ✓ automatic per-alias · dispatcher picks greenest |
| Worker supervision | tail tmux yourself | ✓ watchdog + camera view |
| Claim verification | trust the model | ✓ runtime verifier |
| Self-scheduling | you remember | ✓ schedule_followup tool |
| Mobile escalation | none | ✓ bidirectional Telegram |
| MCP server | none | ✓ /mcp + /.well-known/mcp · 14 tools · bearer auth |
| Local model first | no | ✓ LM Studio default |
| Cost | your time | ✓ free, MIT |
/mcp with discovery at /.well-known/mcp and 14 tools across four tiers (protocol probes, talk + read, supervise worker teams, recall tiered memory). Auth is Bearer + X-Caller-Id. Multi-client coexistence is built in — each session gets its own McpServer + transport, so Claude Desktop, claude.ai-web, and a dev curl smoke-test can all attach at the same time. The bearer token is minted automatically by subctl install.~/.claude-<alias>/ (or ~/.codex-<alias>/) — exactly where the official CLIs put them. subctl just points the right *_CONFIG_DIR env var at the right one.[verifier]correction. It's how the master stops making unbacked promises like "I'll check in 15 minutes" without actually scheduling a follow-up. Capped at 2 corrections per turn./api/master/* to the master daemon. Binds to 127.0.0.1 only — SSH-tunnel for remote access.~/.claude/ is treated as just another account. Existing sessions, projects, and credentials are untouched. Baseline skills are symlinked in, not copied — so updating subctl updates them.One command. Five minutes. The coding agents you already pay for, on one agentic coding harness.