A basic orchestrator for your installed claude and codex CLIs — no API tokens, no SaaS. Spawn parallel coding agents in tmux on the healthiest of your Claude Code and Codex subscriptions, watch every pane on a 2 Hz camera grid, and gate every claim with a runtime verifier. 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. Tier-1 memory + the vault fix this — across /clear and across machines.
Anthropic's 5-hour and weekly windows aren't visible until you're already blocked. subctl routes new coding work to the greenest of your Claude Code / Codex subscriptions 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, or Telegram. A 3-min watchdog that auto-prunes dead sessions (every 3 min · 15-min staleness threshold). An account-aware dispatcher that picks the healthiest of 6+ Claude Code / Codex subscriptions at spawn. Six paid coding agents running 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, or scheduled self-prompts.
Master picks the healthiest Claude Code or Codex 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 coding agent boots with doctrine baked in.
Tier 1: user.md + memory.mdalways injected into the master's system prompt (~3.5k char budget). Tier 2: claude-mem semantic search over every dev-team observation. Tier 3: Obsidian vault for 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.
Master ticks every 3 min. Coding agents silent past 15 min get a corrective nudge; dead sessions are auto-pruned. Auto-compact runs every 5 min, compacting transcript when it crosses 90% of the supervisor's loaded context.
Dashboard chat (SSE), Telegram (bidirectional with auto-relay), CLI prompt, scheduled self-prompts, inbox events from workers. 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.
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 if you want to answer from your phone.
| Raw Claude / Codex | subctl harness | |
|---|---|---|
| Persistent orchestrator | none | ✓ subctl master daemon |
| Memory across /clear | skills file only | ✓ 3-tier (md · mem · vault) |
| Multi-account isolation | env vars by hand | ✓ automatic per-alias |
| 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 |
| Local model first | no | ✓ LM Studio default |
| Cost | your time | ✓ free, MIT |
~/.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.