← Apps

Agent orchestration · Developer infrastructure

Exocortex

A local-first control plane for persistent AI project agents: durable sessions, explicit authority boundaries, memory, review gates, and recovery paths instead of disposable chat tabs.

Exocortex agent coordination interface.
Credit
In progress
Role
Creator and lead architect
Status
Running as my working system · reliability and lifecycle features in active development
Stack
BunReact 19ViteZustandMCPtmux

From disposable chats to durable project work

A chat session is a poor place to keep the state of a software project. Context runs out, workers finish at different times, and a new session has to reconstruct what happened. I built Exocortex to give AI-assisted work continuity outside the conversation.

The system turns terminal AI tools into persistent project agents with their own roles, memory, handoffs, and scoped responsibilities. I designed the architecture, implemented the runtime and product surfaces, and made the operational decisions; names such as Thread, Amber, and Manfred identify software roles and agent profiles, not human collaborators.

A control plane built from simple primitives

I chose tmux sessions, MCP tools, a Bun API, and filesystem-backed state rather than a heavyweight agent framework. The active distribution monorepo holds four substantive packages plus installable system assets:

  • Exocortex Thread is the human-facing surface. A React 19/Vite/Zustand PWA with login and setup gates brings Thread dashboards, project views, chat, Forge progress, planning, notifications, and operational status into one interface.
  • The Bun API owns the control plane. It serves authentication, files, project state, notifications, agent control, Forge progress, dashboards, and runtime integration.
  • MCP layers drive the runtime. The macx-tmux package spawns, reads, messages, sleeps, kills, lists, and registers persistent sessions; a separate ccsession package adds Claude Code session awareness.

Project orchestrators turn briefs into specifications and implementation plans, then dispatch specialist execution agents. Plan files, queue state, session registries, diaries, and handoffs keep operational state outside any single conversation.

Diagram: Exocortex Thread, a React 19 PWA, sits on a Bun API that owns the control plane. MCP layers drive the runtime: macx-tmux spawns, reads, messages, sleeps, kills, lists and registers sessions, and ccsession adds Claude Code session awareness. Persistent tmux sessions run orchestrators and specialist agents. Filesystem-backed state (plan files, queue state, session registries, diaries, handoffs) sits alongside.
The control plane is built from tmux sessions, MCP tools, a Bun API and filesystem-backed state.

Delegate execution, retain review

  1. A project brief becomes a scoped specification and implementation plan.
  2. An orchestrator starts specialized sessions with a work directory, profile, and bounded capabilities.
  3. Workers report progress, questions, and failures through signals and notifications; the orchestrator reads output, sends follow-up context, or puts a session into cooperative sleep instead of polling.
  4. Human gates pause decisions that need review; approved work continues without losing the running session.
  5. Diffs, tests, browser checks, and explicit handoffs provide review evidence before work is accepted.
Diagram: five steps. A brief becomes a scoped plan; an orchestrator dispatches sessions with a work directory, profile and bounded capabilities; workers signal states such as COMPLETE, QUESTION, NEED_HELP, TEST_FAILED, TYPE_ERROR, DONE and WORKING; a human gate pauses decisions for review while the session keeps running; diffs, tests, browser checks and handoffs provide review evidence. Plan files, queue state, session registries, diaries and handoffs are kept as durable records outside the chat.
Execution is delegated; review gates and durable records keep the human in the loop.

The runtime classifies session output into actionable states — COMPLETE, QUESTION, NEED_HELP, TEST_FAILED, TYPE_ERROR, DONE, WORKING — so an orchestrator can tell a worker waiting on a decision from one still making progress. Waiting is a runtime operation, and memory is durable project records, not a promise that a model will remember.

The operational failures shaped the architecture

Running the system on real work surfaced coordination and lifecycle problems that a longer prompt could not solve: tmux tilde paths dispatching sessions into the wrong directory, Codex sessions displaying pasted prompts without submitting them until a delay separated paste from Enter, a launchd-started bridge poisoning the tmux server's environment for every later session, and a session monitor that labeled a real agent an orphan because it only searched direct children of a tmux → shell → model process tree.

I consolidated the fragmented system into a single distribution monorepo with an installer, setup flow, API, PWA, and runtime tools. Installer testing exposed interactive port collisions, IPv4/IPv6 localhost behavior, stale service-worker caching, and configuration read from the wrong location — fixes that made installation and upgrades deterministic rather than treating a successful script exit as proof of a usable system.

Working infrastructure, honest limits

Exocortex is the engineering and evaluation infrastructure behind my product work: persistent runtime management, memory and handoff protocols, review surfaces, and recovery-oriented observability. A persistent runtime needs cooperative sleep, wake-on-message, handoffs, liveness checks, and a clear policy for dead sessions — the system keeps a failed worker's task context available for retry and review rather than discarding it.

It is an actively evolving internal system, not an open-source product, a consumer launch, or a claim of fully autonomous reliability. Lifecycle behavior, watchdogs, and some always-on ideas remain iterative; human gates, verification, and handoffs remain part of how it operates.