The runtime your coding agents live on
Go to file
Ogulcan Celik bfe2f84f4f feat: add system toast delivery 2026-05-15 01:37:57 +03:00
.githooks chore: enable clippy linting 2026-05-09 23:16:24 +03:00
.github ci: avoid caching cargo binaries 2026-05-14 02:58:58 +03:00
.pi feat: add system toast delivery 2026-05-15 01:37:57 +03:00
.zed chore: disable zed rust lsp for herdr 2026-05-12 16:51:26 +03:00
assets docs: update demo video link and remove unused gif 2026-04-06 01:36:05 +03:00
scripts fix: preflight running servers before update 2026-05-10 14:06:53 +03:00
src feat: add system toast delivery 2026-05-15 01:37:57 +03:00
tests feat: add tmux-style mouse capture config 2026-05-14 02:50:00 +03:00
vendor build: update libghostty-vt vendor 2026-05-07 18:29:21 +03:00
website feat(website): credit moshi ssh client in mobile section 2026-05-14 17:48:24 +03:00
.gitignore docs: clarify local planning and release rules 2026-05-13 15:05:47 +03:00
AGENTS.md feat: add system toast delivery 2026-05-15 01:37:57 +03:00
CHANGELOG.md release: v0.5.8 2026-05-12 16:19:50 +03:00
CONFIGURATION.md docs: remove unreleased config options 2026-05-14 19:41:19 +03:00
CONTRIBUTING.md chore: use approve command for contributor gate 2026-04-26 00:09:26 +03:00
Cargo.lock feat: render kitty graphics in local panes 2026-05-13 14:15:26 +03:00
Cargo.toml feat: render kitty graphics in local panes 2026-05-13 14:15:26 +03:00
INTEGRATIONS.md fix: improve claude subagent hook lifecycle 2026-04-27 21:13:14 +03:00
LICENSE
README.md docs: document pi ghostty shift-enter keybinds 2026-05-14 13:59:14 +03:00
SKILL.md feat: add ansi pane read format 2026-05-09 22:07:52 +03:00
SOCKET_API.md feat: add optional pane border labels 2026-05-11 23:34:20 +03:00
build.rs build: update libghostty-vt vendor 2026-05-07 18:29:21 +03:00
clippy.toml chore: enable clippy linting 2026-05-09 23:16:24 +03:00
justfile chore: add next-release docs mirror 2026-05-15 01:06:23 +03:00

README.md

herdr

herdr

herdr.dev · install · quick start · supported agents · integrations · configuration · socket api


https://github.com/user-attachments/assets/043ec09f-4bdd-41d5-aee0-8fda6b83e267

agent multiplexer that lives in your terminal.

workspaces, tabs, panes. mouse-native: click, drag, split. every agent at a glance: blocked, working, done. detach and reattach, agents keep running. no gui app, no electron, no mac-only native wrapper. you see the agent's own terminal, not someone's interpretation of it.


install

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

or download the binary from releases. requires linux or macos.

update

herdr notifies you when a new version is available. run manually to update:

herdr update

quick start

herdr

by default herdr launches or attaches to one background session server. ctrl+b q detaches the client. agents keep running. use herdr server stop to stop the default server. use --no-session for the old single-process mode.

named sessions are runtime/socket namespaces for separate persistent herdr servers. they do not replace workspaces; each named session has its own panes, tabs, workspaces, sockets, and session state while sharing the same global config file.

herdr session list
herdr session attach work
herdr session attach side-project
herdr session stop work
herdr session delete side-project
  1. press n to create a workspace
  2. run an agent in the root pane
  3. press ctrl+b to enter navigate mode
  4. use v or - to split panes, or c to create a new tab
  5. watch the sidebar for blocked, working, and done states

on first run herdr opens a short onboarding flow. after that, restored sessions land in terminal mode; fresh sessions start in navigate mode.

how it compares

tmux gui managers herdr
persistent sessions
detach / reattach
panes, tabs, workspaces
agent awareness
lives in your terminal
real terminal views
mouse-native
lightweight binary
agents can orchestrate ? ?

tmux gives you persistence and panes, but it was built before agents existed. gui managers show agent state, but they make you leave your terminal and use their wrapped view. herdr is persistence and awareness in one tool that stays out of your way.

persistence

start herdr on your desktop or server. run your agents, split panes, do your work. press ctrl+b q to detach. close your terminal, close your laptop; your agents keep running. open a new terminal, run herdr, you're back. same session, same panes, same agents.

from anywhere

need to check on your agents from your phone? just ssh in and run herdr. any ssh client works. no app to download, no account to create.

ssh you@yourserver
herdr

or attach from your local terminal through ssh:

herdr --remote workbox
herdr --remote ssh://you@yourserver:2222

for repeat targets, use your ssh config:

Host workbox
  HostName yourserver
  User you
  Port 2222

same session, same agents, same state.

agent awareness

the sidebar shows which agents are blocked, working, or done. workspaces roll up to their most urgent state so you can scan the full list at a glance.

states:

  • 🔴 blocked — agent needs input or approval
  • 🟡 working — agent is actively running
  • 🔵 done — work finished, you have not looked at it yet
  • 🟢 idle — done and seen

detection works by reading foreground process and terminal output. zero config, no hooks required. for agents that expose hooks, the socket api integration gives more robust state reporting.

lives in your terminal

not a gui window, not a web dashboard, not electron. herdr runs inside whatever terminal you already use. single rust binary, no dependencies. works inside tmux.

what you get

  • workspaces — organized around git repos or folder names, each with its own tabs and panes
  • tabs — first-class in the socket api and cli
  • mouse-native — click panes/tabs/workspaces/agents, drag borders, select text to copy, right-click menus; not keyboard-only
  • notifications — sounds and toasts for background events; tab-aware suppression
  • 10 built-in themes — catppuccin (default), tokyo night, dracula, nord, gruvbox, one dark, solarized, kanagawa, rosé pine, vesper
  • session persistence — pane processes survive client detach; sessions restore after full restart

agents can use herdr too

the local unix socket lets agents create workspaces, split panes, spawn helpers, read output, and wait for state changes.

# create a workspace and tab
herdr workspace create --cwd ~/project --label "api"
herdr tab create --label "logs"

# split a pane and run
herdr pane split 1-1 --direction right
herdr pane run 1-2 "npm test"

# wait for an agent
herdr wait agent-status 1-1 --status done

# read output
herdr pane read 1-2 --source recent --lines 50

# read a rendered ANSI snapshot for TUI feedback loops
herdr pane read 1-2 --source visible --ansi

full reference: SOCKET_API.md and SKILL.md.

supported agents

automatic detection works out of the box. process name matching plus terminal output heuristics.

agent idle / done working blocked
pi partial
claude code
codex
droid
amp
opencode

detected but not fully tested: gemini cli, cursor agent, cline, kimi, github copilot cli.

for agents outside the built-in list, herdr still works as a terminal multiplexer with workspaces, panes, and tiling. custom integrations can report agent labels over the socket api. see SOCKET_API.md.

direct integrations

the built-in pi, claude code, codex, and opencode integrations forward semantic state to herdr over the socket api. install with:

herdr integration install pi
herdr integration install claude
herdr integration install codex
herdr integration install opencode

see INTEGRATIONS.md for setup details.

keybindings

press ctrl+b to enter navigate mode.

key action
n new workspace
shift+n rename workspace
shift+d close workspace
c new tab
v / - split pane
x close pane
b toggle sidebar
f fullscreen pane
r resize mode
q detach (quit client)

resize mode: h/l resize width, j/k resize height, esc exit.

custom command keybindings can launch detached shell helpers or temporary panes from prefix mode:

[[keys.command]]
key = "g"
type = "pane" # "shell" or "pane"
command = "lazygit"

mouse is supported throughout. full reference: CONFIGURATION.md.

configuration

config file: ~/.config/herdr/config.toml

herdr --default-config   # print full default config

in-app settings screen for theme, sound, and toast preferences. full reference: CONFIGURATION.md.

logs

herdr writes logs under ~/.config/herdr/.

common files:

~/.config/herdr/herdr.log
~/.config/herdr/herdr-client.log
~/.config/herdr/herdr-server.log

in persistent session mode, the client and server logs are usually the useful ones. logs rotate automatically and keep a few older files like .1 and .2.

for issue reports, include the relevant current log plus rotated siblings if they exist. default logs are metadata-focused and avoid pane contents by default.

use a higher log level only when needed:

HERDR_LOG=herdr=debug herdr

full logging and environment variable details: CONFIGURATION.md.

docs

building from source

git clone https://github.com/ogulcancelik/herdr
cd herdr
cargo build --release
./target/release/herdr

testing

just test        # unit tests
just test-all   # full local test suite

license

AGPL-3.0: free to use, modify, and distribute. modified versions must be open-sourced under the same license.

pi, ghostty, and shift+enter

herdr does not require or install terminal keybinds for pi.

ghostty does not ship a default shift+enter=text:\n or shift+enter=text:\x1b\r keybind. if those lines exist in your ghostty config, they were added by user config or another tool, commonly claude code. they collapse shift+enter into legacy bytes, so downstream programs cannot reliably distinguish shift+enter from ctrl+j or alt+enter.

if shift+enter behaves differently in pi inside herdr, first remove those custom terminal keybinds and retest. do not file this as a herdr keyboard encoding bug unless it reproduces with a clean terminal config.

related context: #78, #81, #106, and earendil-works/pi#1872.

mandatory star history

Star History Chart