Work arrives as a thread.
A push from an agent, a note from you, an item the router placed on a project. However it starts, it becomes one thread carrying one state — and the project's lead is already watching for it.
agent orchestration for one operator (with a life)
Today, walking away means the work stops. Crux gives every project a standing lead that keeps working the threads all night, and reaches your phone only when the call is yours.
18:40 to 06:40, and the laptop is shut for all of it. Five of the six marks below happened without you. The sixth is the one that was allowed to reach your phone.
A push from an agent, a note from you, an item the router placed on a project. However it starts, it becomes one thread carrying one state — and the project's lead is already watching for it.
The lead parks on crux tail: no polling loop, no tokens burned on an empty queue. It wakes on real input, reads the thread, and either answers it or spawns a worker to do the code.
When the call is yours — scope, money, anything client-facing or irreversible — the lead raises a typed block with crux need. That is the one thing that reaches you. A blocked agent stops loudly rather than guessing.
A CLI on your local machine. A phone in your pocket. Everything an agent does to a thread it
does through the crux CLI, and almost none of it is any of your business. Here is one
night on one project, from both sides.
The iOS app is not in the App Store yet — it goes up when it clears App Review. Until then the pocket half is the web: the same threads and the same blocks, answerable from a phone's browser. The push notification is the app's, and it arrives with it.
$ crux tail # one JSON line per event, and nothing at all otherwise. {"topic":"item.created","id":41,"summary":"multi-currency ships thursday"} $ crux accept 41 → #41 is now WORKING $ crux spawn 41 --project-id 3 → worker running headless. it cannot finish silently. {"topic":"activity.created","summary":"dry-run clean, no drift","actor":"thread-41"} $
$ crux need --item 41 --kind decide \ "Eloquent would mail a receipt to all 12,431 customers. Skip the observer?" → #41 is now WAITING ON YOU — and your phone just buzzed. $
Eloquent would mail a receipt to all 12,431 customers. Skip the observer?
crux is not a process supervisor and has no ambition to be one. A lead is started
through an adapter, and the default is
Solo — the
terminal workspace for the long-running processes and agents you already have.
crux swarm up spawns one lead per project straight into it: nothing to
declare first, no repo paths to write down, and each lead lands as a named pane you
can open and read while it works.
Not on Solo? --backend exec takes any command template — tmux, or
anything else with a command line. Reconciliation works the same either way, because
crux reads the OS process table and never asks a backend whether your fleet is alive.
$ crux swarm up # one standing lead per project. nothing to declare first. START acme started lead-acme → Solo START orbit started lead-orbit → Solo START mercury started lead-mercury → Solo 3 started $
→ Every flag above is one the command will not run without. The rest of them — options, a recommendation, who to ask — are in the CLI reference, and the swarm is in Running a swarm.
A spawned worker runs headless, so its final message is its report and its exit is the reap. A run ends in one of three ways, and finishing quietly is not one of them.
The worker finished. The thread gets its final message, verbatim — that report is the process's own output, not a courtesy it chose to send.
It crashed, hung, was killed, or ended having printed nothing at all. The thread says so in as many words, instead of waiting forever on an agent that is already gone.
Worker failed — it exited non-zero.
The lead stopped it on purpose with crux cancel — the brief was wrong, the approach changed. Not a crash, and not reported as one. The thread stays open to re-brief.
An agent that needs you raises a typed block, and the type is the whole point: it says what kind of human you have to be for the next thirty seconds. You can answer from a phone without opening a laptop to find out what is even being asked.
crux spawn --live hands you the running agent, not a transcript of one.
The work carries on without you. You'll hear from it when the call is yours.
[ log in ]