Beyond herdr¶
Parity with herdr comes first. This is the full list of what taw does that herdr does
not, or does differently: each row says what herdr does and why a user wants taw's way.
docs/PARITY.md carries the same list as a ledger against herdr's own
capabilities.
| Addition | Why |
|---|---|
What needs you: blocked, or finished and not yet looked at; each row drawn in its own state's colour, counted on the border by kind, and the first group Tab and prefix + O walk (see "Next up") |
herdr's agent panel lists agents in workspace order unless you set agent_panel_sort = "priority", which puts blocked first, then done, then working, then idle, the newest change first within each. That key is the state and the time it changed, so a blocked agent you have looked at sits among the ones you have not, and a finished agent you have looked at (idle) sits below every working one. Here the flat list sorts by attention unless you set otherwise: a blocked agent you have not looked at comes before one you have, and idle comes above working; in either layout the border counts what needs you and Tab walks it. The popup exists to answer "who needs me" |
Tab / Shift-Tab and prefix + O are one rule, next up: walk what needs you while anything does, else every agent, while the border counts what needs you by kind (⏸1 ✓2 need you) |
with the order right, walking it is the whole interaction: no reading, no counting. One rule for the key and for Tab means each goes where the other would. herdr has next_agent and previous_agent keys that step through its agent list, unbound by default |
| Numbered sessions: one key jumps to any of the first nine | herdr's goto picker (prefix + g) is a list you search or filter, and its one-key jump to a workspace, switch_workspace (for example prefix+shift+1..9), is bound to nothing until you set it. Here the nine keys work from the start (in the default modal preset), each session shows its number, and the number is tmux order, so it never changes under the filter or an agent's state; see "Keys" |
| The cursor is where you are and stays through depth changes | Here the cursor moves only when you move it, so the eye can follow it, and Tab takes it to the next agent when you want that |
| Agent rows carry the agent's own pane title (Claude Code writes its task there; any agent that sets one is shown) | herdr's default agent row names the agent's kind, so eight Claude Code rows show claude under their workspace and tab until you add terminal_title to [ui.sidebar.agents] rows; here the title is on the row from the start: tmux's own pane_title, which any agent may set, and falls back to the kind when none has (tmux titles a pane no program has titled with the host name, which counts as none here and in every other place taw shows or passes a pane's title) |
| One tree of sessions, panes and closed worktrees | herdr's sidebar has two panels, one of workspaces and one of agents. A pane belongs to a session, so splitting them put "where was I" in one panel and "who needs me" in the other |
| Plain panes and closed worktrees are rows too | herdr's sidebar lists workspaces and agents only (its goto picker lists plain terminals too, in a list of its own), so the sidebar cannot answer "what else is open here" |
/ filter with fzf syntax over the whole tree |
herdr searches in its goto picker, a list of agents and terminals that opens over the screen (/ to search, b, w, i, d for a state); its sidebar has no filter. Here you type over the tree you are already looking at, and any row, a session, a pane or a closed worktree, can match |
| The prefix chord inside the popup | tmux hands the raw prefix bytes to an open popup instead of running the binding, so without this prefix + O is simply dead while the popup is up. herdr owns its own input and never has the problem |
A popup sized to leave the status line visible, which shows taw's bar while the popup is open (taw ui open, width/height as caps; @agent-wizard-popup-title/-border style a capped popup's frame, as a full-size one has none) |
a herdr-delivery toast is the status line here. A popup covering it would silence every notification you opened the popup to act on |
[ui.toast] done_delay_seconds (default 5) |
agents routinely continue after a turn ends (Claude Code with a background shell running, for one), and herdr's single delay_seconds (default 1, for done and blocked toasts alike) fires a "done" toast into any gap longer than that |
Detection supplements ([detection] supplements, default on): seven extra rules layered on herdr's manifests, six for Claude and one for Codex |
herdr's Claude rules (2026.10.11.1, the version taw bundles) do not know Claude Code's ● spinner, its vim-mode footer, its background-shell line, its stop-hook phase, the ✳ frame of its wait for background agents, or that its main agent goes quiet while its sub-agents keep working; where Claude's title shows no spinner, a working pane reads idle and you get a false "done". herdr's Codex rules also leave a Codex that only its launch hint names at unknown at its empty composer where its terminal title says nothing: a Codex that sets none (tmux gives such a pane the host name, which taw reads as no title) or one just after another agent handed the pane over. herdr's title rule osc_title_idle covers a Codex that has a title, in the Codex manifest taw bundles (herdr's 2026.10.11.1, from its master); v0.9.3's own Codex manifest has no idle rule and reads a Codex at rest unknown. The rules are additive and never edit herdr's vendored manifests, see below |
Package entries of Claude Code and Gemini CLI, and the options of bash that take a value: what the verbs that type read of the job in front of a pane also knows @anthropic-ai/claude-code/cli.js and @google/gemini-cli/dist/index.js (the npm, pnpm and bun installs run node on them), that --rcfile and --init-file take a file, not a script, and that a shell's -O, +O and +o take the name of an option |
herdr's identification of a foreground job knows the entries of some npm packages (Pi's, Kimi's, Qwen's, Letta's and MastraCode's among them) and not these two; it reads bash --rcfile <dir>/bin/claude as a script called claude, and bash -O extglob <dir>/bin/claude as a script called extglob. Here the two entries name their agent, and those options' values are never taken for the script |
Agents in containers: an agent started inside Docker, Podman, nerdctl, Apple's container or sbx from a pane is recognised from the runtime's arguments, and its state is read from its screen (see "Agents in containers") |
herdr reads the agent from the pane's program, and a container leaves docker (or another runtime) there, which names no agent: herdr knows the agent only when HERDR_AGENT=<agent> is set on that command. Here an agent you run in a container, by hand or from a shell function, has its row and its toasts with nothing set |
Agents in a sandbox: taw sandbox, typed in a pane, runs any agent in a container there through a profile, a plain script (taw ships one, default); 📦 marks it in the popup, and restore brings it back inside its sandbox, never outside, and in its conversation once the agent's hook is installed (see "Agents in a sandbox") |
herdr has no sandbox of its own. In a container, an agent you let run without its permission prompts can do less harm by accident. Here one command starts it there, 📦 shows which agents run that way, and restore can bring its conversation back: in a container of your own making, the conversation's id stays inside, where no restore can read it |
taw open, taw session open, the project picker, naming modes, the collision suffix, create hooks, zoxide, project_dirs, and the filter's directories ([ui] projects_in_filter) |
one key covers every session question, including "take me to a project", which herdr does not do at all: a new herdr workspace starts in the folder its new_cwd setting picks, and nothing lists your projects |
[keys] presets (modal, search) |
herdr has a [keys] table but one keymap. The two presets cover both mental models (mnemonic letters, or type-to-search), and herdr's action names are accepted as aliases so a herdr config still means what it meant |
taw notification open-target walks next up (the same rule as Tab, in tmux order) and reports the group of the pane it went to |
herdr's key for it (open_notification_target, prefix + o) focuses the notification on screen, so once that one is gone the key has nowhere to go. Here it goes on to the next agent that needs you, or, with none, the next agent of any kind, so it always has somewhere to go while an agent exists |
Hooks ([hooks]): a command of yours on any taw event (sessions, windows, panes, worktrees, an agent going blocked, working, idle or done), on every notification, and two that can refuse a close or a worktree removal; taw hooks list, test and log |
tmux-session-wizard has two create hooks, and herdr runs a command on an event through plugins, packages with a manifest (its example cookbook has a Telegram notifier), or a script of yours that subscribes to its socket; its own toasts stay on the machine you are on: off, in the app, the terminal's own notification or the OS's. A one-line notification hook is all a phone needs, and it fires only when a toast would, so you are not pinged for what you are looking at |
Old watchers are marked, and one command starts them again: taw watch status says which watchers run a taw that has been replaced since they started, and taw watch attach-all --restart starts each of them again on the one installed (see Troubleshooting) |
herdr's update lists the servers still on the old version, with the commands to restart each. Here the processes that outlive an update are the pane watchers, which keep the taw they started with after every rebuild, and nothing else tells you which of them are old |
The preview pane, and the #{@agent_wizard_status} status-line token |
the popup hides the panes it is describing, so the preview shows the one under the cursor; and tmux has no always-on sidebar like herdr's, so the token puts a summary in the status line |
A new tmux server keeps the old layout, and a plain taw session restore finds it: a save that replaces a layout taken before the server started copies it into session-snapshots/ first, with no 15-minute wait, and a restore with no --name goes back to the newest layout taken before this server started when default.json has nothing to make (one layout, never further; see "Save and restore"), adds the agent windows of that layout to the open sessions of the same names, and with no server running starts one |
herdr never meets this: its server restores its layout as it starts, before it first saves, and its docs recover an older snapshot by hand. A tmux server has no such order: after a crash, the new server's first autosave would replace the only layout with its one session, and the old layout would be left only in the history, for someone who knew to look. herdr never restores an older snapshot by itself; neither does taw unless you run the restore, and only one layout back |
taw keeps the crash report of a tmux that crashed, and says where (macOS): when the plugin loads on a new tmux server and the one before it on the same socket is gone, taw copies that server's crash report from ~/Library/Logs/DiagnosticReports into <state>/tmux-crashes/ and tells you once, with the time of the crash and the path, and that taw session restore brings back what it had (see "Save and restore") |
herdr's panes live in its own server, as tmux's do in the tmux server; either can crash under every agent in it. macOS can remove its crash report later, so taw keeps its own copy. Nothing is kept for a server that was killed or that ended normally, and the report is copied only when it is the last server's by its pid |
Machines you do not sit at: [machines] lists other machines in the app and the popup, over your ssh |
herdr saves a machine with herdr machine add. Here a machine is a line of config.toml, added with taw machine add, and a header says how long ago it was last seen when it is not connected. Its rows stay, dim, after the connected ones and count for nothing in the numbers, and one app at a time holds the lease that speaks its toasts (see "Remote machines") |