3516 words
18 minutes
Herdr and Parallel Agent Sessions: The Tmux-for-AI-Agents Pattern

A coding agent, running inside one terminal pane, reads a CLI reference, then spins up two more agent panes of its own, hands each a task, and waits on their status before continuing. No human touched the keyboard between the first prompt and the final answer. That is the moment Herdr makes ordinary, and it reframes what a terminal multiplexer is for.

Figure 1 - Diagram of an agent-callable session bus where one Codex pane spawns two child agent panes through a Unix socket and waits on their status

Figure 1 - The agent-callable session bus: A coding agent in one pane calls the Herdr CLI over a local Unix socket to spawn two more agent panes, inject prompts, and wait for each to report done. The session multiplexer becomes a programmable orchestration layer that agents themselves can drive. This is the tmux-as-MCP pattern.


Start with the pain, because everyone running long agent sessions has felt it. You kick off a task that will take 90 minutes. You walk away. You come back to find the agent hit a permission prompt at minute four and sat idle for the other 86, waiting for a keystroke you were never there to give. The work did not fail. It simply never happened, and nothing told you.

Herdr [1] fixes the layer where that failure lives. It is a terminal multiplexer built for AI agent workflows, and it adds the one thing tmux never had: awareness of what the agent inside each pane is actually doing. Panes report status. Blockers raise notifications. A local Unix socket exposes the whole session graph to any process smart enough to call it, including the agents themselves.

We have spent months building multi-agent pipelines on this site, and the session layer underneath them has always been the weakest link. Herdr is the first tool we have seen that treats that layer as a programmable substrate rather than a dumb grid of terminals.

The 86 idle minutes#

The idle-agent problem is structural, not accidental. A long-running agent alternates between two states you care about: it is working, or it is stuck waiting on you. Plain tmux shows you neither. A pane is just a pane. To know whether an agent is grinding through a refactor or frozen on a permission prompt, you have to look, read the scrollback, and interpret it yourself. Across a dozen panes, that is a full-time job, and the whole point of running agents was to not have one.

Figure 2 - Timeline showing a 90 minute agent session where a permission prompt at minute 4 leaves the agent idle for 86 minutes with no notification

Figure 2 - Where the time goes: A 90 minute session collapses to four productive minutes when a permission prompt lands early and nothing surfaces it. The agent is not broken. It is waiting, silently, for attention it has no way to request. This is the exact failure Herdr’s blocker status is built to catch.

The cost compounds when you run agents in parallel. Three agents working three features means three independent chances to stall on a prompt you cannot see. The more you scale out, the more of your day you spend babysitting terminals to confirm they are still moving. Concurrency without visibility is not leverage. It is just more surface area to watch.

KEY INSIGHT: The bottleneck in parallel agent work is not compute, it is attention. Any layer that tells you which panes need you, and which do not, converts babysitting back into leverage.

What Herdr actually is#

Herdr (spelled h-e-r-d-r, no second ‘e’) is a single self-contained binary. It is written in Rust, weighs about 10 megabytes, and ships with zero dependencies [2]. There is no Electron shell, no cloud account, no background service phoning home. You install it with curl -fsSL https://herdr.dev/install.sh | sh, or through brew, mise, or cargo, and you have a working multiplexer in one step [1]. For a category of tool that increasingly means “sign up, install the desktop app, connect your account,” a 10 megabyte static binary is a genuine differentiator.

It is free and open source under AGPL-3.0-or-later, with an optional commercial license [2]. The project is maintained by Ogulcan Celik, and as of July 2026 the repository carries roughly 16,100 GitHub stars across 70 releases, with v0.7.3 shipping on July 7 [2]. The traction is worth citing plainly, because “a promising side project” and “a tool 16,000 engineers have starred” are different risk profiles when you decide what to build a workflow on.

On platform support, be precise. Mac and Linux are the stable targets, which is expected given the Unix socket at the core of the design. A Windows beta preview installer now exists as well (irm https://herdr.dev/install.ps1 | iex), added after the tool’s earliest demos, so the older “Unix-only, no Windows” framing is out of date [1]. Treat Windows as a beta preview rather than a peer platform, and treat WSL as unconfirmed until the docs say otherwise.

AI-aware status: idle, working, blocker#

The feature that earns Herdr its “tmux for AI agents” label is per-pane status. Every pane running a coding agent carries one of three states [4]:

  • Idle, the agent is waiting for input.
  • Working, the agent is actively processing.
  • Blocker, the agent has surfaced a question or permission prompt that needs you now.

When an agent finishes, Herdr fires a desktop notification so you can come back and continue. When an agent hits a decision point mid-run, it raises a blocker and pings you separately. You stop polling terminals and start responding to signals. The 86 idle minutes become an 86-second gap between the prompt landing and the notification pulling you back.

Figure 3 - Diagram of the idle, working, and blocker status lifecycle with a desktop notification firing when a pane raises a blocker

Figure 3 - The status lifecycle: Each agent pane moves between idle, working, and blocker. A finished run and a raised blocker both trigger desktop notifications, so a human is pulled in exactly when a pane needs attention and left alone the rest of the time. Attention becomes event-driven instead of poll-driven.

How Herdr knows a pane’s status matters, and this is where the demos have been misread. Herdr detects status two ways [4]. The first is lifecycle hooks, where the agent reports its own state directly to the socket. The second is a screen manifest, a set of TOML rules matched against a snapshot of the pane’s output. Per Herdr’s own agent docs, both Claude Code and Codex are screen-manifest detected, alongside GitHub Copilot CLI, Droid, Qoder, Cursor Agent, and OpenCode. The hook-based agents, the ones Herdr calls lifecycle authorities, are Pi, OMP, Kimi Code CLI, Hermes, and MastraCode [4].

That distinction kills a tempting but wrong story. In some early recordings, Codex status synced cleanly while Claude Code lagged, and the easy conclusion was “Codex has hooks, Claude does not.” It does not. Both are detected the same way, by reading the screen. Any difference on a given day was a rules-and-recording artifact between two screen-detected agents, not an architectural gap between the two tools. For Claude Code specifically, idle and working are detected reliably, while blocker detection is deliberately strict and can lag a few seconds before it fires [4]. Knowing that keeps you from chasing a phantom integration problem.

KEY INSIGHT: When a tool infers state by reading the screen, treat status timing as a detection heuristic, not a contract. Design your orchestration to tolerate a few seconds of lag on a blocker rather than assuming the signal is instant.

Where tmux stops and Herdr starts#

None of this makes tmux obsolete. tmux remains an excellent general-purpose multiplexer, and Herdr borrows its keyboard-first, prefix-key model directly. The gap Herdr fills is narrow and specific: tmux has no idea that the process in a pane is an AI agent, so it cannot tell you whether that agent is working or stuck. Everything AI-aware is the addition.

CapabilitytmuxHerdr
AI status tracking (idle / working / blocker)NoYes [4]
Programmatic pane controlVia the tmux CLIVia the herdr CLI and socket [3]
Remote attach without a manual SSH loginNoYes, herdr --remote <host> [1]
Built-in browser for visual agent contextNoNo
Persistence across terminal restartsYesYes
Windows supportYesBeta preview installer; Mac and Linux stable [1]

Figure 4 - Side by side comparison of tmux and Herdr highlighting that Herdr adds AI-aware status and a programmable socket on top of the same multiplexer model

Figure 4 - The delta, not a replacement: tmux and Herdr share the multiplexer core. Herdr’s additions cluster in one place: it knows a pane is running an agent, tracks that agent’s status, and exposes the session graph over a socket that programs can drive.

The honest caveat is that Herdr has no built-in browser, so agents that need visual context still reach for MCP tools or separate browser tooling. You can run Herdr inside tmux to borrow tmux’s browser, but doing so breaks Herdr’s own detach-and-attach persistence. Pick one model and commit to it.

The Unix socket as a programmable bus#

Under the status layer sits the feature that changes the architecture: a local Unix socket that speaks newline-delimited JSON. Any process on the machine, including a running coding agent, can reach that socket through the Herdr CLI and drive the session [3]. This is the substrate that turns a multiplexer into an orchestration layer.

The command surface is broad and documented. From the socket API reference [3]:

  • herdr workspace create|list|get|focus|rename|move|close manages workspaces.
  • herdr tab create|list|get|focus|rename|move|close manages tabs.
  • herdr pane split|run|read|resize|swap|zoom manages panes. For example, herdr pane split w1:p1 --direction right splits a pane, herdr pane run w1:p2 "npm test" runs a command in one, and herdr pane read w1:p2 --source recent --lines 50 reads output back.
  • herdr agent list|get|send|wait|start controls agents at the agent level.
  • herdr wait agent-status w1:p1 --status done blocks until a pane’s agent reaches a state, with --status blocked as the other common target.
  • herdr session attach <name> and herdr session list manage the detach-and-attach persistence layer.

Beneath the CLI, the socket exposes more than 70 raw methods, including pane.send_keys, pane.send_text, pane.wait_for_output, and events.subscribe [3]. The three verbs that matter for orchestration are spawn, inject, and wait: create a pane, send it a prompt, and block until it reports a result. Those three are enough to build a control loop.

Figure 5 - Diagram of a local Unix socket exposing spawn, inject, and wait operations that any process on the machine can call to drive session panes

Figure 5 - Spawn, inject, wait: The Herdr socket reduces to three orchestration primitives. A caller creates a pane, injects a prompt or command, and waits on the pane’s status. Any process that can open the socket, a shell script or a coding agent, can compose those primitives into a pipeline. That composability is the whole architecture.

A word of discipline on commands. The exact keystrokes shown in Herdr’s demos are demo artifacts, and command names have shifted across releases. Trust the socket API docs for canonical command and flag names, and treat any string you saw typed in a video as illustrative, not authoritative.

The wow moment: agents spawning agents#

Put the socket and the CLI together and you get the demonstration that made Herdr circulate. A driver instructed a Codex agent to read the Herdr CLI documentation, then use herdr pane to spawn two more Codex instances, hand each one a lookup task, and wait on their results before answering [3]. The demo worked, imperfectly. A workspace mix-up spawned an extra instance, but the correct answers came back. The imperfection is the point: this is real, and it is early.

The architectural claim underneath the demo is the durable part. A coding agent in one pane can use the Herdr CLI to create additional panes, inject prompts, and monitor status. The agent is not just running in the session. It is programming the session. Herdr becomes an agent-callable bus, and the pattern generalizes: pane isolation with programmatic control, reachable from inside any agent that can shell out. We have called this tmux-as-MCP, because the session multiplexer starts to behave like a tool surface an agent invokes rather than a window manager a human arranges.

KEY INSIGHT: The unlock is not that agents can run in parallel panes. It is that an agent can create and coordinate those panes itself, over a socket, turning the session layer into a tool it calls rather than an environment a human sets up.

Substrate versus orchestrator#

The temptation, once you see agents spawning agents, is to make the session layer do everything. Resist it. The clean architecture keeps two responsibilities separate. Herdr is the substrate: persistent, isolated panes with status and a socket. The orchestrator is a layer above it that decides which specialists to spawn, hands them work, polls their status, and assembles their output.

For our own pipelines, the recommended orchestrator is the Dotzlaw bootstrap framework running on top of Herdr. The orchestrator lives in one pane. It calls herdr pane split to launch specialist worker panes, one per role, each a separate coding agent with its own context and its own tool connections. It injects each specialist’s brief, then polls herdr wait agent-status on each pane and reads results back over the socket when a pane reports done or blocked. Herdr guarantees the isolation and the signaling. The bootstrap framework owns the routing and the sequencing. Prior art exists for this shape, and existing orchestration frameworks occupy the same layer, but the division of labor is the lesson: substrate below, orchestrator above.

Figure 6 - Architecture diagram showing a bootstrap orchestrator pane spawning specialist worker panes on the Herdr substrate and polling their status over the socket

Figure 6 - Two layers, two jobs: Herdr is the session substrate that provides isolated panes, status, and a socket. The bootstrap framework is the orchestrator above it, spawning one specialist pane per role and polling each pane’s status to drive the pipeline. Keeping the layers distinct keeps both replaceable.

That separation is what the context-isolation guarantee buys you. Each pane is a separate process, so a specialist working one domain cannot pollute the context of a specialist working another. They are siblings in the session graph, not threads sharing a window. It is the same clean-handoff principle we argued for in Multi-Agent Pipelines in Claude Code [6], now pushed down into the session layer itself.

Wrap the CLI in a skill#

The demo also carried a piece of advice worth taking literally. Rather than teaching an agent the Herdr CLI fresh every time, have it read the documentation once and package the spawn-and-wait procedure as a skill, so you have a repeatable primitive to spin up panes on demand. Once that skill exists, every orchestration run reuses it instead of rediscovering the command surface.

Figure 7 - Diagram showing the Herdr CLI spawn and wait sequence wrapped as a reusable skill that the orchestrator calls as a single primitive

Figure 7 - A skill as a spawn primitive: Wrapping the Herdr spawn-inject-wait sequence in a skill turns a multi-step CLI dance into one callable primitive. The orchestrator invokes the skill instead of reconstructing the commands, which makes the spawn behavior consistent, versioned, and reviewable across runs.

This is the same skill-packaging discipline we apply everywhere in the harness. A raw CLI is powerful and fiddly, a skill wrapping that CLI is powerful and repeatable. When your orchestrator’s most important move is “spawn a specialist and wait for it,” that move deserves to be a named, tested primitive rather than a string of commands the agent guesses at each time.

Remote attach across machines#

The session layer extends past one machine. herdr --remote <hostname> reads your SSH host config and attaches to an existing Herdr session on a remote box without making you run a manual SSH login first [1]. Start a multi-hour run on a headless Linux server at home, leave, connect from a laptop elsewhere, and resume the live session with one command.

Figure 8 - Diagram of remote attach where a laptop connects to a persistent Herdr session running on a remote headless server via herdr remote host

Figure 8 - One session, many front ends: A persistent Herdr session runs on a remote server. herdr --remote <host> attaches to it from any machine without a manual SSH handshake, so the same long-running agent session follows you between devices. The work lives on the server; the terminal you attach from is disposable.

The field test: a raw-tmux fleet at scale#

Herdr is young, so the most useful stress test of the pattern comes from someone who built it the hard way. Kyle Jaejun Lee, an engineer at KRAFTON, runs a personal fleet of Claude Code agents across three machines, a MacBook plus two always-on headless Linux boxes, using plain tmux and a custom harness rather than Herdr [5]. He is clear in the talk that this is his own daily-driver side project, not a KRAFTON product and not a demo assembled for the stage. That makes his account a first-person record of what breaks when you push a raw tmux session bus past a single machine, which is exactly the ground Herdr is trying to pave.

Three of his failures are worth recording, because they map directly onto what a purpose-built substrate has to solve [5]:

  • tmux capture-pane degrades under pane overcrowding. As managers spawned more worker panes into one window, the panes shrank until capture-pane, the exact tool he used to read a pane’s output programmatically, could no longer pull anything meaningful out. The orchestration model held. The tooling hit a hard limit on how many live panes one window can carry before programmatic reads break down.
  • Cross-workspace git-credential collision. The plan was a clean one-to-one mapping of credential to workspace. In practice credentials crossed over and bound to the wrong workspace. The fix was a fully separated environment per workspace, with no shared credential state at all.
  • OOM and swap exhaustion from stacked agent and MCP processes. As sessions piled up on one machine, memory filled, swap filled, and in his words “the sessions just stacked up until the machine couldn’t breathe” [5]. That is a hard resource ceiling on how many concurrent agent-plus-MCP stacks one box can hold, independent of whatever session software sits on top.

Figure 9 - Diagram of raw tmux fleet failure modes across three machines including capture-pane overcrowding, credential collision, and memory exhaustion

Figure 9 - What breaks at fleet scale: A raw tmux agent fleet across three machines surfaces three concrete failures: capture-pane reads degrade as panes overcrowd a window, git credentials collide across workspaces, and stacked agent-plus-MCP processes exhaust memory and swap. Each is a resource, isolation, or coordination limit a purpose-built substrate must own.

Two coordination details round out the account. Lee routed all review requests and status through Discord, one bot per machine, turning his phone into the remote control for the whole fleet [5]. To move context between machines, he pushed the context files over git, then used tmux send-keys over SSH to poke the destination session into pulling. Two machines writing to one shared directory produced silent divergence, which he fixed by binding state to per-machine directories and letting shared state change only through a pull request [5]. His closing framing is that these are the questions Kubernetes already answers, and his direction is to build an orchestration manager on top of that layer instead of reinventing it.

KEY INSIGHT: Every failure mode of a raw multi-machine agent fleet is a resource, isolation, or coordination problem that infrastructure engineering already named. The session substrate should own isolation and signaling so your orchestrator can spend its attention on routing, not on reinventing credential scoping and memory limits.

Conclusion#

The session layer under your agents has been invisible, and invisible layers are where time quietly disappears. Herdr makes that layer legible. Per-pane status turns silent stalls into desktop notifications, a self-contained Rust binary keeps the tool out of the cloud-account trap, and a documented Unix socket turns the multiplexer into something an agent can program, which is the shift that matters most.

The architecture to carry forward is two clean layers. Herdr is the substrate: isolated panes, AI-aware status, and a socket that exposes the session graph. Your orchestrator, the bootstrap framework in our case, sits above it, spawning specialists and polling their status over that socket, with the spawn-and-wait move wrapped in a skill so it stays repeatable. Kyle Lee’s raw-tmux fleet shows what you inherit if the substrate does not carry its weight: overcrowded pane reads, credential collisions, and machines that cannot breathe. When the layer that runs your agents becomes a layer your agents can drive, orchestration stops being something you supervise and starts being something the system does on its own.


The Series#

This is the opening article of the Session Bus & Orchestration Substrate thread, a single-part sub-series for now:

  1. Herdr and Parallel Agent Sessions: The Tmux-for-AI-Agents Pattern (this article). How an AI-aware multiplexer with a programmable Unix socket becomes the session substrate that agent orchestrators run on top of.

References#

[1] Herdr, “Herdr: one terminal for the whole herd,” Official site, 2026. https://herdr.dev/

[2] O. Celik, “ogulcancelik/herdr,” GitHub, 2026. https://github.com/ogulcancelik/herdr

[3] Herdr, “Socket API,” Herdr Documentation, 2026. https://herdr.dev/docs/socket-api/

[4] Herdr, “Agents,” Herdr Documentation, 2026. https://herdr.dev/docs/agents/

[5] K. J. Lee, “I Run a Fleet of AI Agents Across Three Machines. Here’s What Broke,” AI Engineer, Jul 2026. https://www.youtube.com/watch?v=4kYl2_mqmnQ

[6] G. Dotzlaw, K. Dotzlaw, and R. Dotzlaw, “Multi-Agent Pipelines in Claude Code: Researcher, Architect, Developer, Reviewer,” 2026. /insights/claude-code-03-multi-agent-pipelines/

Herdr and Parallel Agent Sessions: The Tmux-for-AI-Agents Pattern
https://dotzlaw.com/insights/claude-code-13-herdr-parallel-agent-sessions/
Author
Gary Dotzlaw, Katrina Dotzlaw, Ryan Dotzlaw
Published at
2026-07-23
License
CC BY-NC-SA 4.0

Building production AI, or modernizing a legacy system?

That is the kind of work we do at Dotzlaw Consulting. Book a free 20-minute intro call and tell us what you are trying to build, or what is slowing you down.

← Back to Insights