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.


| 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 typingherdr, 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.
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+[ |
Navigate mode
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.

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
$icontoken, 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.tomlgets 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:
- Run
herdr plugin unlink nic.space-icons. - Restore the pre-change config backup to
~/.config/herdr/config.toml. - 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:
- 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.
- 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.
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 | shinstall. 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

