long-running Claude Code agents

Wire up
your crew.

Each agent is a persistent Claude Code session. Patch one agent to another to let them talk — run a cable, write the condition. No cable, no message. You build the team; crew enforces the wiring.

crew · 3 modules patched
✕ not patched leads finds businesses w/ no site › scanning prospects… › 14 qualified today OUT builder builds demo sites › npm run build › deployed ✓ IN sales books the call › emailing owner… › call booked fri 2pm IN when a lead is qualified when a demo is ready
the patch

Agents are modules. Relationships are cables.

The old way is one fixed shape — a manager hands tasks to workers. crew hands you an empty rack and the cables. Wire any team you want: a leads agent into a builder, a builder into sales, a reviewer into just the two modules it reviews.

drop in a module

+ Agent

Add an agent and it boots a real Claude in its own tmux session and home directory, with an identity.md that says who it is.

run a cable

Drag to connect

Drag from one module's jack onto another and write the cable's label: what each side does, and the condition the source watches for.

take the controls

Click the screen

Click a module to open its live terminal — a real tmux attach in your browser. Type into it like any session.

the rule

Signal only flows down a cable you've run.

Messaging isn't a suggestion in the UI — it's the wiring. crew message <peer> reaches a peer only if a cable connects them, checked the instant it's sent.

● patched · leads → builder
# inside the leads session
$ crew message builder "Acme Plumbing, no site"
[crew] sent to 'builder'
✕ no cable · leads → sales
$ crew message sales "hey"
[crew] BLOCKED: 'leads' has no
relationship to 'sales' — patch
a cable first.

A cable is directed by default — leads → builder lets leads call builder, not the reverse. Make it two-way if you want. The condition you wrote rides along the cable so the agent knows when to send.

identity

Every module keeps its own identity.

A Claude session is disposable; a crew agent isn't. Each is a persistent identity — one home directory, one tmux session, and an identity.md spec sheet. Restart it and it reads the sheet to remember who it is and which cables it has.

# ~/crew/leads/identity.md
# Identity: leads
Role: finds businesses with no website

You may message ONLY these agents (anyone else is blocked):
  • builder — builds demo sites
    message when: a qualified lead with contact info is found

One agent per directory, no nesting. crew won't drop an agent inside another's home or share one — so two crew members never overwrite each other's work.

under the hood

A patchbay with a memory.

the wiring · MorphDB

Modules & cables, stored

Agents and edges live in MorphDB. An edge is a real object carrying its condition and direction, so the gate is a single index-backed query — edge?source=A&target=B.

the screens · tmux

Live, not scraped

Each module's screen is a true tmux attach client in a PTY, streamed to xterm.js — native scrollback, resize, and input. Pure Python stdlib server, no build step.

start

Run your first crew.

# the wiring's memory (morphdb.pages.dev)
$ morphdb start

# schema + dashboard → http://127.0.0.1:8788
$ crew init

# drop in two modules (each boots a claude session)
$ crew spawn-agent leads   --role "finds businesses with no website"
$ crew spawn-agent builder --role "builds demo sites"

# run a cable — and say when leads should call builder
$ crew connect leads builder --when "when a qualified lead is found"

# open the rack, click a module, watch them work
$ crew dashboard open