Live product

operad

operad.stream

Shipped Dev toolingAgent supervision
operad screenshot

operad supervises long-running coding-agent sessions — Claude Code, OpenCode, Codex CLI — across Android/Termux, Linux, macOS and Windows. It boots them in dependency order inside tmux, health-checks them, restarts them, and hands you one web dashboard for every session, skill, memory and CLAUDE.md on the machine. That's the description. The interesting part is what it takes to make that true on a phone.

Android 12 kills background child processes on sight, which is precisely fatal to an agent that thinks for ten minutes. operad's answer is to have the phone open an ADB connection to itself over loopback and disable the phantom-process killer from the inside, along with the doze whitelist, standby bucket and background-execution appop — then verify each one from operad doctor. It refuses to do any of that until it has proven the ADB target is actually this device, by comparing kernel boot UUIDs; an earlier "one device attached, must be me" heuristic turned out to be silently reconfiguring a different handset, so the check now fails closed. The same paranoia runs all the way down: a circuit breaker and a five-process cap around Termux's notification IPC (it hangs, and killing the bash wrapper orphans the grandchild to init forever), LD_PRELOAD re-injection because Bun's runner strips the shim that makes /usr/bin/env resolvable, and a boot watchdog that reads /proc/<pid>/cmdline argument-by-argument instead of grepping — because on this device grep is a shell function, and a substring match let two watchdogs fight each other for weeks.

Underneath the supervisor is a 27-table SQLite brain and machinery that has no business being this rigorous. Installing a marketplace skill is an eight-step transaction across five stores — disk cache, ~/.claude.json, settings.json, in-memory registries, SQLite — with reverse-order rollback, MVCC generation pinning so live readers never see a half-installed skill, and a two-phase tombstone GC with a retention floor. Agents get a real capability model: tools classified by destructive potential, autonomy levels that auto-approve up to a ceiling, goal-scoped leases with execution counts and expiries, and a trust ledger of signed score deltas. Memory gets FTS5 search, hash dedup, time decay, and a consolidation pass that merges and cross-pollinates learnings between agents — but only when you're idle, above 30% battery, and on the charger. 210k lines, 2,598 tests, MIT, npm i -g operadic.

  • Disables Android 12's phantom-process killer by ADB-connecting the phone to itself, gated on a kernel-boot-UUID identity check that fails closed — src/android-engine.ts:377-538
  • Skill installs are an 8-step transaction across 5 stores with reverse-order rollback, MVCC generation pinning for live readers, and a two-phase tombstone GC — src/skills/index.ts:89-133, src/skills/gc.ts:1-26
  • Capability security for agents: 5 tool privilege categories, 4 autonomy levels, goal-scoped tool leases with execution caps and expiries, and a signed-delta trust ledger — src/tools.ts:35-49,467-490, src/memory-db.ts:456-481
  • Circuit breaker (3 strikes, 30 s cooldown) and a 5-process cap around Termux:API, which otherwise spawns 190+ hung processes in seconds at boot — src/platform/android.ts:188-240,286-332
  • Detects agent readiness by regex-scraping tmux pane captures, with pluggable adapters for Claude Code, OpenCode and Codex — src/runtimes/claude.ts:40-64
  • 153 documented REST endpoints plus SSE and a WebSocket command channel, 27 SQLite tables, 67 CLI subcommands, 41 Svelte components, 2,598 tests — docs/api.md, src/memory-db.ts, src/tmx.ts