herdr – The Runtime Your Coding Agents Live On

🐑 herdr – The Runtime Your Coding Agents Live On

If you run more than one AI coding agent at a time — multiple Claude Code sessions side by side, or Claude Code in one project and Codex in another, maybe a third one grinding through a refactor — you quickly run into a boring but real problem: where do all these terminals live, and which one is actually waiting for me?

I used to solve this with screen (see my earlier post) or tmux. That works, but a multiplexer doesn't know what an agent is. It can't tell you that the pane in the corner has been blocked on a yes/no question for the last twenty minutes.

That's the gap herdr fills.


🚀 What is herdr?

herdr is a terminal multiplexer written in Rust, designed around coding agents instead of generic shells. It runs a background server that owns your terminals; the client you look at is just a view on top of it.

The headline features:

  • Detach without stopping work — close the client or lose your SSH connection, and your agents keep running in the background server. Reattach later with herdr.
  • Agent status at a glance — every pane is marked working, blocked, done or idle. When an agent stops and needs an answer, the sidebar tells you so. No more hunting for the stuck one.
  • Several machines, one window — local work and saved SSH machines live together, with one combined agent list and independent reconnects.
  • Agent-native — agents can drive herdr through its CLI and socket API: spawn panes, prompt each other, and wait until another agent is genuinely blocked.
  • Runs what you already run — Claude Code, Codex, Cursor, OpenCode, and the rest. herdr doesn't wrap or replace them; it just owns their terminals.
  • Keyboard and mouse, both first-class — tmux-style prefix keys and click, drag, split, right-click menus.
  • One Rust binary, no Electron — runs inside whatever terminal you already use.

🛠️ Installation

Linux / macOS:

curl -fsSL https://herdr.dev/install.sh | sh

Or via a package manager:

brew install herdr
# or
mise use -g herdr

Windows (PowerShell):

powershell -ExecutionPolicy Bypass -c "irm https://herdr.dev/install.ps1 | iex"

Prebuilt binaries are on the releases page.


▶️ Getting started

Start it from any project directory:

herdr

herdr launches (or attaches to) your default background session and opens a workspace — a project-level container for tabs, panes and agents. Give each project its own workspace so the agent list in the sidebar stays readable.

Then just start an agent in a pane:

claude

Or codex, opencode, or any other supported agent. herdr detects it automatically and starts tracking its state.


⌨️ Keyboard basics

If you know tmux you'll feel at home. The prefix is ctrl+b:

Action Key
Split right prefix + v
Split down prefix + -
New tab prefix + c
Next / previous tab prefix + n / prefix + p
Workspace navigation prefix + w
New workspace prefix + shift+n
Copy mode prefix + [
Show all bindings prefix + ?
Detach prefix + q

The keyboard is optional though: everything can also be done with the mouse. Drag borders to resize, right-click for split/tab menus, drag-select to copy.


🔌 Detach, reconnect, restart

The workflow I care about most:

  1. SSH into the box, run herdr, start a couple of agents.
  2. Close the laptop. Agents keep working in the background server.
  3. Come back, run herdr again — same layout, same panes, and the sidebar shows which agents finished and which are blocked waiting for me.

After a server or machine reboot herdr restores the saved layout and can resume supported agent sessions (the original processes themselves don't survive a reboot, of course). Details in the session state docs.


🧠 Why I like it

  • It replaces a screen/tmux habit with something that understands what I'm actually running.
  • The blocked indicator alone is worth it when you juggle three agents.
  • It's a single binary, so it's trivial to put on every machine.
  • Plugins and a socket API mean it can grow into an orchestration layer if you want it to — but you don't have to.

If you're running multiple coding agents and still alt-tabbing between terminal windows to find the one that's asking a question, give herdr a try.