Herdr

A Rust terminal multiplexer built for coding agents. Sessions survive a closed lid, and every pane says whether the agent is working, blocked or idle.

29 Aug 2026 Herdr is tmux rebuilt around the fact that the thing in the terminal is now an agent, not a person. It runs as a background server that owns the terminals, so an agent keeps working when you close the laptop, lose the network, or restart the machine. Every pane carries a status: working, blocked, or idle. And agents can drive Herdr themselves through the same CLI and socket API you use, which means one agent can spawn a pane, prompt another, and wait until that one is genuinely stuck.

Dark title card with the Herdr sheep logo, the label THE AGENT RUNTIME, and the line Run them anywhere. Leave them running., marked Apache 2.0

Made by Herdr, Inc., backed by Y Combinator
Language Rust, one binary, no Electron
Licence Apache-2.0
Platforms macOS, Linux, Windows
Created 27th March 2026
Current version v0.8.2 when written; v0.9.1 since 16th September 2026, plus daily preview builds
Traction 33,261 stars, 2,413 forks, 256 open issues

The four claims

  • Always running. The server holds the terminals, not your shell. Detach with ctrl+b q, reattach by typing herdr, from the same machine or over SSH.
  • Never hunt for the stuck one. Panes are marked working, blocked or idle, so a run that is waiting on a question announces itself instead of sitting silent behind three other tabs.
  • Agent-native. Agents spawn panes, prompt each other and block on each other through the socket API. There is an agent skill so the agent knows how to use it.
  • Runs what you already run. It owns the terminal of an existing agent CLI rather than wrapping or replacing it.

Keyboard and mouse are both first-class: tmux-style prefix keys, and click, drag and split. The prefix is ctrl+b, so tmux muscle memory carries over.

The DHH connection

This is not a loose association. Omarchy ships Herdr as a bundled tool with its own hotkeys. In DHH's distribution, Super + Ctrl + Return launches Herdr and it is labelled "agent manager", while Super + Ctrl + K shows the Herdr bindings, sitting alongside Super + K for the main bindings and Super + Alt + K for tmux.

Three key combinations reserved for one third-party tool is a strong statement in a distribution whose whole premise is opinionated defaults.

Omarchy

Supported agents

The site claims 21 agent CLIs. The documentation names these:

Anthropic and friends Claude Code, Codex, Cursor Agent CLI, GitHub Copilot CLI, Amp
Model vendors Grok CLI, Qwen Code, Kimi Code CLI, Antigravity CLI
Agent products Devin CLI, Droid, OpenCode, Kilo Code CLI, Qoder CLI, MastraCode, Kiro CLI, Hermes Agent
Others Pi, OMP

Status detection works two ways, and the difference matters. Where an agent exposes lifecycle hooks, Herdr uses them and the status is reliable. Where it does not, Herdr falls back to a screen manifest, meaning it reads the terminal output and pattern-matches. That second path is a heuristic, and it will drift when an agent changes how it prints.

Install and run

curl -fsSL https://herdr.dev/install.sh | sh
# or
brew install herdr
# or
mise use -g herdr

Then start it where the work lives:

herdr

Run your agents, split panes, walk away. ctrl+b q detaches; herdr brings it back. There is a Homebrew formula, a Windows PowerShell installer, and prebuilt binaries on the releases page. A plugin marketplace extends panes and workflows.

Keyboard shortcuts

21 Sep 2026 the complete default keymap, from the official configuration reference for v0.9.1. My install runs v0.9.0, and its 62 bindings are identical. My config.toml holds no custom keys, so this is exactly what's live on my machine.

How to read them. prefix is ctrl+b. prefix+c means press ctrl+b, let go, then press c. prefix+? shows every active binding, and / inside that help filters it. That one is the only binding worth memorising on day one.

Herdr is mouse-native, so none of this is required. Click panes, tabs, workspaces and agents, drag split borders, right-click for menus.

Start with these 5

Action Keys
New tab prefix+c
Split right / down prefix+v / prefix+minus
Move between panes prefix+h/j/k/l
Workspace navigation prefix+w
Detach, leave everything running prefix+q

General

Action Keys
Keybinding help prefix+?
Settings prefix+s
Session navigator (goto) prefix+g
Toggle sidebar prefix+b
Jump to the current notification's target prefix+o
Reload config.toml prefix+shift+r
Detach prefix+q
Send a clipboard image to a remote session ctrl+v

Workspaces

Action Keys
New workspace prefix+shift+n
Rename workspace prefix+shift+w
Close workspace prefix+shift+d
Workspace navigation prefix+w
New Git worktree from the workspace prefix+shift+g

Tabs

Action Keys
New tab prefix+c
Next / previous tab prefix+n / prefix+p
Jump to tab 1 to 9 prefix+1..9
Rename tab prefix+shift+t
Close tab prefix+shift+x

Panes

Action Keys
Split right, side by side prefix+v
Split down, stacked prefix+minus
Focus left / down / up / right prefix+h/j/k/l
Swap with left / down / up / right prefix+shift+h/j/k/l
Next / previous pane prefix+tab / prefix+shift+tab
Zoom the focused pane prefix+z
Rename pane prefix+shift+p
Close pane prefix+x
Open the pane's scrollback in $EDITOR prefix+e
Resize mode prefix+r
Copy mode prefix+[

Opens with prefix+w. Plain keys, no prefix, and they win over any general binding on the same key while the mode is open.

Action Keys
Workspace up / down up / down
Pane left / down / up / right h/j/k/l, left and right arrows always work too

Copy mode

Opens with prefix+[. The pane keeps running while you're in it, and output stays live.

Action Keys
Move h/j/k/l
Word / big word w/b/e / W/B/E
Paragraph { / }
Page PageUp / PageDown, ctrl+f, ctrl+u / ctrl+d
Search forward / backward / / ?, then n or N to repeat
Start a selection v, Space or V
Copy y or Enter
Leave without copying q or Esc

Search is case-insensitive unless the query holds a capital. With the default prefix, ctrl+b in copy mode enters prefix mode rather than paging up. Mouse drag-select copies without entering copy mode at all.

Text fields

Emacs-style editing in Herdr's own inputs: naming dialogs, worktree branch names, filters, copy-mode search. Not in the shell or agent inside a pane.

Action Keys
Move a character left / right, ctrl+b / ctrl+f
Start / end of field home / end, ctrl+a / ctrl+e
Move a word alt+b / alt+f
Delete previous / next character backspace or ctrl+h / delete or ctrl+d
Cut to start / end ctrl+u / ctrl+k
Cut previous / next word ctrl+w or alt+backspace / alt+d
Paste the last cut ctrl+y

Cut text stays inside the field, it never reaches the system clipboard. The alt chords need the terminal to send Option as Meta. This section first appears in the v0.9.1 docs, so if a key does nothing on 0.9.0, herdr update first.

Actions with no default key

They exist, they just ship unbound:

Action Config key
Previous / next workspace previous_workspace / next_workspace
Jump to workspace 1 to 9 switch_workspace
Previous / next agent previous_agent / next_agent
Focus agent 1 to 9 focus_agent
Last focused pane, across tabs and workspaces last_pane
Move tab left / right move_tab_previous / move_tab_next
Resize without entering resize mode resize_pane_left/down/up/right
Open / remove a worktree open_worktree / remove_worktree

The indexed ones take a 1..9 range, as in the docs:

[keys]
switch_workspace = "prefix+shift+1..9"
focus_agent = "prefix+alt+1..9"

focus_agent is the one I'd bind first. With several agents running, jumping straight to agent 3 beats cycling to it.

Changing keys and going prefix-free

Every binding is configurable, the prefix included:

[keys]
prefix = "ctrl+a"

A binding can also be a direct chord with no prefix. The docs map the defaults of 10 terminals plus GNOME and KDE, and recommend ctrl+alt as the one family almost nothing claims. Their example keeps the prefix bindings and adds chords on top:

[keys]
focus_pane_left = ["prefix+h", "ctrl+alt+h"]
focus_pane_down = ["prefix+j", "ctrl+alt+j"]
focus_pane_up = ["prefix+k", "ctrl+alt+k"]
focus_pane_right = ["prefix+l", "ctrl+alt+l"]
previous_tab = ["prefix+p", "ctrl+alt+["]
next_tab = ["prefix+n", "ctrl+alt+]"]
new_tab = ["prefix+c", "ctrl+alt+c"]
split_vertical = ["prefix+v", "ctrl+alt+d"]
split_horizontal = ["prefix+minus", "ctrl+alt+shift+d"]
zoom = ["prefix+z", "ctrl+alt+z"]

Chords taken elsewhere, per the docs:

Chord Owned by
ctrl+alt+arrows GNOME workspace switching, Ghostty and Konsole
ctrl+alt+t Launch terminal on Ubuntu and Fedora
ctrl+alt+l / ctrl+alt+a KDE lock screen / attention window
ctrl+alt+s / ctrl+alt+u Konsole
ctrl+alt+f1..f12 Linux virtual consoles

โš ๏ธ WARNING: on my Mac, plain ctrl+alt (Ctrl+Opt) is free, but add Shift and it collides with my window manager. Ctrl+Opt+Shift+Left/Right throws windows between Spaces, which is the exact chord the docs suggest for direct pane resizing, and Ctrl+Opt+Shift+H/L swaps screens. Keep Herdr chords to Ctrl+Opt without Shift, and check ~/ai/me/kb/keyboard-shortcuts.md before adding one.

If a chord does nothing, the terminal or the desktop ate it before Herdr saw it. Free it on that side, or pick another one.

My sidebar setup

22 Sep 2026 out of the box, every agent row in the sidebar says "claude", which tells me nothing when a dozen or more are running. I changed the sidebar so each row shows where the agent lives, what it's doing and what it's called.

Herdr in Ghostty: the sidebar lists spaces and agents, each row with a status icon, a space emoji and a white name, beside a Claude Code session in the main pane

The pattern, with example names:

spaces
 ร— ๐Ÿ’ผ ยท ka
 โœ“ ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป ยท me

agents
 โณ ๐Ÿ’ผ ยท Research
 ๐Ÿ”ด ๐Ÿ’ผ ยท Master
 โœ… ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป ยท Notes
 ๐Ÿ’ค ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป ยท IT

Each agent row carries 3 things: the agent's status, the emoji of its space, and the tab name in white. The spaces list uses the same emoji, so an agent's home is visible at a glance.

Status Meaning
โณ Working
๐Ÿ”ด Blocked, waiting for my approval or answer
โœ… Done, and I haven't looked yet
๐Ÿ’ค Idle, ready for input
โ” Herdr can't tell

How it works

2 parts: a small local Herdr plugin, and 4 settings in the Herdr config.

The plugin lives in ~/ai/_shared/herdr-space-icons/ and is linked to Herdr as nic.space-icons:

File What it does
spaces.toml The emoji for each space and the status emoji. The file to edit
space_icons.py Writes the emoji into Herdr
herdr-plugin.toml Tells Herdr when to run the script
README.md Setup, changes and removal
  • It gives each space an $icon token, which the spaces rows display.
  • It writes the status emoji and the space emoji into each agent's state labels, such as โณ ๐Ÿ’ผ, so a single token on the agent row shows both.
  • Herdr runs it on startup, when it detects an agent, when a pane moves, and when a space is created or renamed.
  • Herdr forgets these values when its server restarts. The same hooks put them back as each agent returns.
  • A new space missing from spaces.toml gets an emoji from a fallback list.

The config changes in ~/.config/herdr/config.toml:

Setting Value Why
ui.sidebar_width 32 Long tab names show in full
ui.sidebar.agents.rows Status and space emoji, then the tab name in white 1 line per agent, no "claude" line
ui.sidebar.spaces.rows Status, space emoji, space name in white The same emoji as on the agent rows
theme.custom.active_row_bg #3e4451, dark grey White text stays readable on the selected row

The last one needs explaining. The one-light theme draws names in grey and highlights the selected row in light grey. On a dark Ghostty background the grey names were hard to read, and white names on a light grey row would have been unreadable, so the selected row went dark grey.

How it got there

Version Change Why
1 An emoji per agent, picked from its tab name, plus status emoji Every row said "claude"
2 An emoji per space, white names, a dark selected row The emoji should say which space an agent is in
3 A blue โœณ for the Kaltura space, standing in for its favicon The sidebar can't show images
4 ๐Ÿ’ผ for Kaltura work, ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป for personal projects Plain emoji read better than the blue symbol

Limits I hit

  • Text only. The sidebar can't show images, so a real favicon is impossible. Emoji and text characters are the ceiling.
  • A fixed separator. Herdr puts ยท between tokens and no setting removes it. Only a space's status icon has no separator after it.
  • Trailing spaces get trimmed. When a text symbol such as โœณ needs padding to line up with emoji, the plugin adds an invisible Braille blank, U+2800, which Herdr doesn't trim.
  • Wide emoji are fine. Herdr treats ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป as one emoji, the same width as ๐Ÿ’ผ, so names stay aligned.
  • Config edits are mine to run. My Claude Code permissions block edits inside ~/.config, so config changes arrive as copy commands I run myself.

Maintaining it

To change a space's emoji, edit spaces.toml, then:

herdr plugin action invoke nic.space-icons.refresh

To preview what the plugin will pick before applying it:

python3 ~/ai/_shared/herdr-space-icons/space_icons.py --dry-run

To remove the whole setup:

  1. Run herdr plugin unlink nic.space-icons.
  2. Restore the pre-change config backup to ~/.config/herdr/config.toml.
  3. Run herdr server reload-config.

When I create a new space, I add it to spaces.toml if the fallback emoji doesn't fit.

The 6-minute version

If you want the whole thing demonstrated rather than described, Jilles covers it end to end in 6 minutes and 37 seconds. Published 29th June 2026, 115,000 views.

Setup is 3 steps, not 1

Installing the binary is the easy part. He flags 2 things to do before Herdr behaves as advertised:

  1. Add the integrations. In the quick start, under Integrations, enable one per agent CLI you actually use. Without this the status detection has nothing good to work with.
  2. Install the agent skill globally. npx skills add <repo>, select every coding agent, and choose the global install so all sessions can use Herdr, not just the project you happened to be in.

The 4 concepts

The interface is 4 nested ideas, and he introduces them in this order:

Concept What it holds
Workspace One project. ctrl+b shift+N, or just click new
Agent A running agent CLI inside a workspace, with its state badge
Tab A second agent or shell in the same workspace
Pane A split for the things that are not agents, like a dev server

Splits are prefix plus - for horizontal and the vertical equivalent, ctrl+b x to close. ctrl+b ? lists everything.

Mouse support is the practical difference from tmux, and he says so directly. Click to create a workspace, click to close a pane, click to cycle between agents. The keyboard bindings are all still there; you just are not forced into them.

The states, in use

He runs 3 agents across 2 workspaces: Pi and Claude Code in one, Pi in the other. Then he gives each one work and lets the badges do their job.

  • One goes working.
  • One goes blocked, and clicking it shows why: the agent is waiting on a permission prompt. He answers it, then flips that agent to auto mode so it stops asking.
  • One fires an audible done notification while he is looking at a different workspace.

That is the entire pitch demonstrated in about 40 seconds, and it is more convincing than the feature list.

Closing the window proves the point

He closes the whole terminal window. Everything appears to be gone. He types herdr and all 3 agents, both workspaces, the tabs and the dev server come back exactly as they were.

The sub-agent demo

The best part, and the bit that changed my mind slightly. Pi has no sub-agents natively. With the Herdr skill installed, he asks Pi to spawn 2 Herdr panes with an agent in each, one costing out a migration to Python, the other to Rust.

Pi loads the skill, spawns both panes, and the 2 child agents work in parallel for about a minute. Then the parent agent reads both panes and answers which migration is less work.

So the skill does not just let an agent open panes. It gives sub-agent capability to an agent that does not have it, and lets the parent collect the results. That is a concrete use, not an abstraction.

Named sessions

Not covered anywhere else in this note, and useful. The session you get by default is called default. herdr session attach work gives you a separate one with its own workspaces and agents. Detach, type herdr, and you are back in default with nothing lost. He keeps work and personal projects apart this way.

What this changes for me

2 things.

  • The agent skill is a global install, not a per-project one. I had read it as something you add where you need it. Installing it once for every agent is the right default.
  • My scepticism about agent-to-agent was too broad. The parent-spawns-children-then-reads-their-panes pattern is legible: you can watch both panes, and the synthesis step is a normal agent turn. It is the open-ended version I still want to leave alone.

The status detection also just worked for Pi and Claude Code throughout the video, which is a small point in favour against the screen-manifest caveat.

The crash course

Alejandro AO, a developer advocate at Hugging Face, published a 17-minute walkthrough on 27th August 2026. His framing is worth repeating because it says something about the pace of the project: "I tried it first 2 months ago, didn't like it. Tried it again 10 days ago, I love it and can't stop using it."

Fourteen chapters, and four things in it are not obvious from the documentation.

Notifications are off by default. The whole selling point is being told when an agent is blocked, and out of the box it will not tell you. Open settings with ctrl+b s and turn them on, then pick where they land: a toast inside Herdr, a terminal notification, or a system notification.

--remote is the flag that matters. Installing Herdr on a VPS and running it over SSH works, but the interface renders on the server and streams back, so it feels laggy. Instead:

herdr --remote <ssh-identity>   # UI runs locally, processes run on the box
herdr session list              # see sessions across machines
herdr remote <name>             # reconnect to one

The interface stays on your machine while every process runs on the remote host. First connection offers to install Herdr there for you. Turn your computer off and the work continues.

The prefix key is not an inconvenience, it is the design. Without it the multiplexer cannot tell its own shortcuts from the agent's, and ctrl+d would close your coding agent rather than a pane. ctrl+b ? lists every binding, which is the only one to memorise.

The agent skill is official. Herdr exposes its API through the CLI, so teaching an agent to spawn workspaces, tabs and panes is a matter of installing the skill from the docs, either through npx skills or by copying it into your skills directory.

He also demonstrates Tau, his own agent with local model support through llama.cpp. That part is his project rather than Herdr's, so treat it as a plug rather than a recommendation.

Where it fits for me

I run Claude Code sessions constantly, and the two problems Herdr names are both real. Long runs die when the machine sleeps. And when several sessions are open, the one that stopped to ask a question is invisible until I go looking. A pane that flags itself as blocked fixes the second problem outright.

The persistence argument gets stronger with a second machine, and --remote is what makes it practical. If the Mini ends up running Omarchy headless, herdr --remote from the Studio puts the interface on my desk while every process runs on the Mini. Turn the Studio off and the work continues. That is the same thread as the remote-console question, and for driving agents it is a better answer than a KVM: no video capture, no 4K@30 ceiling, just the processes where they belong.

The agent-to-agent part I am less sure about. Agents prompting agents and waiting on each other is a real orchestration primitive, but it is also the point where a run stops being something you can follow. I would use the multiplexer first and leave that alone until the rest is habit.

Autonomous Agents

Caveats

  • Pre-1.0 with 256 open issues. v0.8.2, and preview builds ship most days. Fast movement is good, and it also means the surface changes under you.
  • Screen-scraped status is fragile. For any agent without lifecycle hooks, the working/blocked/idle badge depends on parsing output that the agent's authors are free to change.
  • curl | sh install. Read the script or take the Homebrew route.
  • The business model is not public. Apache-2.0 today, a Y Combinator company behind it, and an enterprise contact address. Nothing wrong with that, but the licence is the only guarantee you have about what stays free.
  • It is another layer under your agents. When something hangs, you now have the agent, the terminal, and Herdr between you and the answer.

Further reading

NicAI
Written by NicAI, Nic's AI assistant, for his personal knowledge base. Researched and drafted by the model, not hand-written by Nic. Verify anything you plan to act on.