Caleb Lanting
Dispatch

A team of agents that stays on

Dispatch is how I run a team of always-on agents. I chat with each one like a teammate, from a Mac app called Studio or from a native iPhone app. Routines run on their own, and when something needs me it lands on a waiting-on-you board.

A double charge for Pip, then Allow once, then done.
Role
Product, specs, and review
When
September 8, 2026 to now
Built with
TypeScript, Node, SQLite, Swift, Electron, Claude Agent SDK
Commits
1,771 in 30 days, Sept 8 to Oct 7
Studio on a Mac, bakery agents as blobs showing idle, working, error, and sleeping, Juniper's chat about yesterday, and Waiting on you choice cards.
Studio, blob moods on the team and choices waiting on you.
An agent's Routines settings, with each job's schedule, last outcome, and next run, from the weekday 8:00 summary to Friday pickup reminders.
Standing routines, each with a schedule and a last outcome.
Crumb & Co. Bakery's Agents tab on iPhone shows each blob, name, last message, and mood, with Rye working, Pip done, Fennel error, Biscuit waiting, Juniper idle, and Sesame sleeping.
The bakery's agents on the phone, blob and mood for each.
The iPhone Waiting on you tab, Maple asking 7:00 or 8:30 for Sunday's issue and Juniper asking which photo leads the homepage, both with lettered answers.
On the phone, Maple's send time and Juniper's homepage photo.
Pip's iPhone thread, with a native Run a command card showing what it does, the command itself, Deny and Allow, and a line that says Pip is working.
Pip's phone thread, a command card while Pip is working.
A sheet of blobs, one for each mood, and each one labeled with the mood and the agent's name.
The blob cast, each mood labeled with an agent's name.

Try it

Dispatch

How it works

Reproduce, then prove the fix

The bug report
ReproduceOne agent
FixAnother agent
Prove the fixA separate one runs the original report again, before it reads the fix notes.
The original reportFAILCONDITIONALPASSBack to the fix
The bug report
ReproduceOne agent
FixAnother agent
Prove the fixA separate one runs the original report again, before it reads the fix notes.
The
original
report
FAILCONDITIONALPASSBack to the fix

A TrackR beta bug

The card stopped taking taps after you logged a ride. The verifier tried five ways to close it.

First check
Swipe
CONDITIONAL

Only swiping worked. Three paths were still dead, and one hadn't been retested.

A second fault was a flag set too early, which locked the card.

Two builds later
PASS

Only then did it count as fixed.

Details

What a day looks like

I talk to a team the way I'd talk to people, in a thread. Each agent has a blob mascot, and its mood shows what it's doing: working, waiting, done, error, or sleeping. Memory carries across days, so I'm not re-explaining the project every morning. Routines run on a schedule without me. Questions that need me show up on the waiting-on-you board, and I can answer from the iPhone app. Studio on the Mac speaks the same protocol.

Reproduce, then prove the fix

One agent reproduces a bug. Another fixes it. A separate one proves the fix by running the original report again, before it reads the fix notes. On a TrackR beta bug, the card stopped taking taps after you logged a ride. The verifier tried five ways to close it. Only swiping worked. Three paths were still dead, and one hadn't been retested, so the verdict was conditional, not pass. A second fault was a flag set too early, which locked the card. Two builds later all five paths passed. Only then did it count as fixed.

Fix what let it through

One night a builder cleared a stuck test by killing every process that matched a pattern. That included the reviewer's session, and eight hours of overnight work never ran. Now a test fails the build if anyone kills by pattern, and a watchdog with no model in it restarts stopped work. Another time my screen filled with 232 delivery errors that a fix had already solved. The running engine was older than the fix, and nothing compared the two. Now the engine reports when it's stale.

Evals that have to fail

15 eval cases run on real models. I don't trust one until it fails on the buggy code and passes on the fix. The first test for a queue bug passed on the broken code, because a steady queue never hit the failing branch. The rewrite adds agents while the queue drains. That version fails on the old code, which is what I wanted.

Want to build together?

I'm looking for a full-time team doing AI automation and agentic engineering. Email is the fastest way to reach me.