Watch every coding agent in one dashboard

You have six coding agents running in six panes. Five are working and one is blocked on a yes/no question. AIHerd tells you which.

brew install --cask aiherd-dev/aiherd/aiherd

macOS 14 (Sonoma) or newer · Apple Silicon or Intel

The AIHerd app window showing three agent panes side by side, two of them flagged as waiting on a question
Three agents in three different terminal programs, in one window. Two have stopped to ask something; AIHerd pulled their answers out of the screen so you can pick one from here.

What it does

One dashboard over every terminal pane on the machine.

AIHerd watches the PTY devices your terminals are attached to, notices which ones have a CLI coding agent on them — claude, codex, agy, grok and a dozen others — and reads what is on each screen. A small classifier compiled into the binary scores every screen for "is this waiting on a human?", so a pane that has stopped to ask permission surfaces immediately instead of sitting unnoticed behind three other windows.

It works across terminal programs: iTerm2, Terminal, tmux and cmux panes.

Features

Spots the pane that is waiting on you

An embedded question classifier scores each screen; panes that are blocked on a prompt are called out. Nothing is sent anywhere — the model ships inside the aih binary and runs locally.

Answer without switching windows

Type a reply, send a keypress, scroll, or click straight into any pane from the dashboard. The pane behaves exactly as if you had focused its terminal and typed there, because that is what happens underneath.

Nudge a stalled agent

Toggle nudging on a pane and AIHerd answers the routine prompts for you, so an agent that would have blocked on a confirmation keeps going.

Plain-language summaries

Once a pane goes quiet, an LLM running in-process writes a short summary of what happened there. No Python, no uv, no venv: the model runs inside aih itself, on Metal on Apple Silicon.

Semantic search across every session

Screens are indexed as you work, so you can search months of scrollback by meaning rather than exact string — and jump to the matching point in the stitched history of that pane. The search model is compiled in too.

Start new agents from the dashboard

Pick an agent and a working directory and AIHerd opens a pane for it.

Reachable from your phone

By default AIHerd binds only a Unix socket, so it takes no TCP port at all. Pass -p 8080 and the same dashboard is available in any browser on your network.

Screenshots

One session, three agents, three different terminal programs: claude in a cmux pane, codex in iTerm2 and grok in Terminal.

The same three panes in the browser dashboard, with one-line summaries across the top
The same session in a browser, from aih serve -p 8080. The chips along the top are one line per pane, so you can read the state of every agent at a glance.
A single pane opened full width, with a command input and key-send buttons
One pane, full width. Type into it, send arrow keys or Enter, turn on nudging, or click straight into the screen.
Search results ranked by score, each judged by an LLM that explains why the session matches or does not
Search is two passes. Embeddings rank the candidates on the left; then an LLM reads each one and says why it matches — here it accepts the grok session at 98% and quotes the line that earned it, while rejecting a Kubernetes session at 5% for having nothing to do with directory trust. That second pass is what stops a lexically-plausible hit from wasting your time.
A pane showing stitched history, scrolled to the moment the search matched
Click a hit and it opens that pane's whole saved history stitched into one document, positioned at the moment the match happened — not at the top, where you'd have to hunt for it.
The snapshot pager showing snapshot 1 of 2 with older and newer arrows
Or step through the saved snapshots one at a time. Scrolling past the top of a screen pages back to the previous one, so a pane's history reads like a scrollback that outlives the process.

Mouse support

Wheel and clicks go through to the real terminal, so a pane's own TUI responds as if you were sitting in front of it.

Scrolling up a claude pane from the dashboard. Once the screen is at its top edge the wheel stops scrolling the view and is forwarded to the terminal instead — the ↑ scroll sent badge marks each tick that went through, and claude's own scrollback moves.
And clicks land too: pressing the pane's own Jump to bottom control snaps it back to the live tail.

This one is terminal-specific. cmux forwards mouse events; iTerm2 and Terminal don't, and AIHerd says so on the button rather than letting you click into nothing. Everything else on this page works the same everywhere.

Usage

Open AIHerd.app and it starts aih serve itself over a Unix socket. Everything below is for driving it from a terminal instead.

aih                          # serve on the Unix socket (the default)
aih serve -p 8080            # also serve on a TCP port, for a phone or browser
aih serve claude             # only panes running a matching executable
aih find-terminals --no-monitor   # print the panes AIHerd can see, and their TTYs

Narrowing to specific panes

Pass --tty to pin the dashboard to an exact set of panes and ignore every other terminal on the machine. Useful for a demo or a screenshot, where you want four known agents on screen and nothing else:

# find the panes you care about
aih find-terminals --no-monitor

# then show only those
aih serve -p 8080 --tty ttys002,ttys004,ttys007,ttys009

It takes bare names or /dev/ paths, repeats (--tty ttys002 --tty ttys004) as well as comma-separated lists, and overrides pinned panes — so the set you name is exactly the set you get.

Everything the dashboard knows, on stdout

Search, summaries and the question list all read the running server over that same Unix socket. So they work while the app is open, take no port, and cost nothing to start — the models are already loaded over there rather than being spun up per command.

aih summaries                                  # what every pane is working on
aih questions                                  # panes waiting on input, with their answer options

aih search "sentry crash"                      # live screens + history, each with its summary
aih search "sentry crash" --live                # only what's on screen right now
aih search "trust prompt" --vector              # only stored history, by meaning
aih search "trust prompt" --judge-tty ttys017   # ask the LLM if one pane is relevant, and why

aih summaries --json | jq -r '.[].topic'        # --json on any of them

Point any of them at a different server with --url — a socket path, or http://host:port for one started with -p.

The summarizer

Summaries need Apple Silicon with 16 GB or more. On first use the model (~2.5 GB) downloads into ~/Library/Application Support/aiherd/models, and the dashboard shows the progress on the pane that triggered it. Everything else works offline and without it.

AIHERD_SUMMARIZEREffect
offNo LLM at all.
unsloth/Qwen3-14B-GGUFA bigger judge. Any Hugging Face GGUF repo works; without a filename, <repo>-Q4_K_M.gguf is assumed.
unsloth/Qwen3-14B-GGUF:Qwen3-14B-Q5_K_M.ggufAn explicit file in that repo.

What it installs

PathWhat
/Applications/AIHerd.appNative SwiftUI dashboard, universal binary.
/usr/local/bin/aihThe CLI.

Uninstall

brew uninstall --cask aiherd         # app, CLI and bundled assets
brew uninstall --zap --cask aiherd   # also the text index, settings and logs

Stop hunting for the blocked pane

One command, and every agent on the machine is in one window.

brew install --cask aiherd-dev/aiherd/aiherd