Herding AI agents from the tab bar
You don't run one coding agent any more — you run five, in five tabs, and you've become their secretary. This page explains the herd model that herdr pioneered, distils it to three pillars, and shows how rbterm builds all three into a terminal you'd use anyway.
Agents scale, your attention doesn't
Three conditions, one undifferentiated wall of text. That is the whole failure.
A coding agent spends most of its life in one of three conditions: grinding away, finished, or stuck waiting for you — a permission prompt, a clarifying question, a failed command it wants guidance on. The terminal shows all three as the same thing: a wall of text you aren't reading. So you alt-tab in a loop, polling your own tabs like a human cron job. The moment you stop polling, an agent sits blocked for forty minutes on a yes/no question.
The fix is not a better agent. It's a terminal that understands agent state — one that can tell "producing output" apart from "needs an answer" and "exited non-zero", and can surface that difference at a glance.
What herdr is
Credit where it's due — the tool that named the pattern.
herdr ("Run them anywhere. Leave them running.") is an open-source Rust runtime from Herdr, Inc. that keeps coding agents running continuously — on a laptop, desktop, or rented server. Its sessions survive network drops and machine restarts; its UI shows each agent as working, blocked, or idle; and the same socket API a human uses to drive it is available to the agents themselves, so they can split panes, start each other, and wait on genuine blocking events. It manages the terminals of Claude Code, Codex, Cursor and a dozen other agents without wrapping or replacing them.
Distilled, that's a three-pillar model — and the pillars are worth having in any terminal:
Pillar 01Persistence
Agents outlive the window that spawned them. Closing the UI, crashing it, or walking away must not kill the herd.
Pillar 02Semantic status
Every agent has a machine-readable state — working, blocked, done — surfaced where you can see all of them at once, without opening anything.
Pillar 03A control plane
The same API humans use to inspect and drive sessions is available to the agents and to shell scripts — so automation can read states, answer prompts, and wait on other agents.
How rbterm implements the model
Same pillars, built into a regular terminal — nothing extra to run.
| Pillar | rbterm mechanism |
|---|---|
| Persistence | Local shells live in a background daemon (shelld), not in the window. Quit rbterm, relaunch it, and every tab reattaches with its scrollback — an agent that was mid-task keeps running the whole time. Each pane's stable id (RBTERM_PANE_ID) survives the restart too, so automation keeps addressing the same pane. |
| Semantic status | rbterm derives a per-pane status — running, done, failed, attention, idle — from what actually happens in the pane: OSC 133 prompt marks give command start/finish plus exit code, the bell and OSC 9 notifications (how Claude Code says "I need you") latch attention, and agents can declare a state explicitly with status=working|waiting|done|failed. The most urgent status is badged on the tab; viewing the tab clears it. Maps to herdr's working / blocked / idle almost one-to-one. |
| Control plane | rbterm @ — a kitty-style remote-control client over a Unix socket (or an in-pane escape sequence that works across SSH). ls reports every pane with its status; a boolean match engine targets panes by state:, id:, title: and more; send-text/send-key answer prompts; launch/split spawn panes; match-count is the wait primitive. Agents inherit the environment to drive it, exactly like herdr's socket. |
The badges above are the whole idea compressed into one strip — visible from the tab bar of the terminal you already had open.
- Spinner
- Working — the pane is producing output.
- Yellow
! - Blocked on you — the agent asked a question.
- Green dot
- Finished clean.
- Red dot
- Failed.
A day with the herd
The workflow, end to end.
Morning: three Claude Code sessions in three tabs (wired up as on the Claude page — the terminal-bell setting or the hooks preset), plus a long build in a fourth. You work in your own tab. The herd reports to the tab bar:
# who's doing what, from anywhere: rbterm @ ls | jq -r '.data.windows[].tabs[] | .name + " -> " + .panes[0].status' shell -> idle claude: auth api -> running claude: tests -> attention # the yellow ! — it asked a question build: linux -> done deploy: staging -> failed # answer the blocked agent without switching tabs: rbterm @ send-text -m 'state:attention' 'y\n'
And the herd can mind itself. An agent (or a plain shell script) that must wait for another agent's task polls the wait primitive — this is the "wait on genuine blocking events" piece of the model:
# block until pane 3 finishes, then react to its result:
until rbterm @ match-count -m 'id:3 and (state:done or state:failed)' \
| grep -q '"count":[1-9]'; do sleep 2; done
A finished-but-unviewed command reports done/failed (not idle) precisely so these loops have something to grab: the state means "there is a result you haven't seen". When an agent produces something visual, it can push the image straight into its own tab with rbterm @ display-image — closing the loop without a file manager.
Where the philosophies differ
herdr is a dedicated runtime; rbterm makes the model ambient.
Agents firstherdr
A purpose-built runtime you deploy for the herd — including on a remote server you rent, with sessions that survive network drops and machine reboots. If you run big always-on fleets, that's its home turf.
Terminal firstrbterm
A terminal you'd use anyway, where the herd features are ambient — no extra daemon to learn, no wrapper around your agents. Persistence covers app quits and crashes (shells live in shelld); for remote machines you open SSH tabs, and the bell-driven attention badge crosses SSH natively.
Not just agentsAnything long-running
Because the states derive from ordinary terminal signals (prompt marks, exit codes, the bell), the same badges mind anything long-running: builds, test suites, deploys, tail -f. An agent is just the noisiest tenant.
herdr is a trademark of Herdr, Inc.; rbterm is unaffiliated — just inspired.