whosup
Health Pass
- License — License: MIT
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Community trust — 22 GitHub stars
Code Warn
- process.env — Environment variable access in bin/whosup.mjs
- process.env — Environment variable access in scripts/desks.mjs
- process.env — Environment variable access in src/board/context.mjs
- process.env — Environment variable access in src/board/server.mjs
Permissions Pass
- Permissions — No dangerous permissions requested
No AI report is available for this listing yet.
Stop abandoning your agent sessions. One board for every herdr session: what needs input, what finished, what's running. Click to jump to that pane.
English | 한국어 | 日本語 | 中文 | Español
whosup
Stop abandoning your agent sessions. whosup puts every herdr session on one board and shows which pane needs you next.
You run six, ten, fifteen coding agents in herdr panes. Some are working, some finished an hour ago, one is sitting on a permission prompt you never saw. whosup turns every pane of every running herdr session into one browser page: what needs your input, what just finished, what is still running, what went quiet. Click a cell and herdr jumps to that pane.
Quick Start • Why whosup? • What you see • How it works • Features • Settings • Requirements
Quick Start
1. Install the herdr plugin
herdr plugin install fivetaku/whosup --yes
2. Start it (or just restart herdr)
herdr plugin action invoke fivetaku.whosup.start
The board comes up at http://127.0.0.1:4790 and opens in your browser once. From then on it starts with herdr.
3. Open more herdr sessions whenever you like
herdr --session work # any name, any terminal
Every running session shows up on the board by itself. No list to maintain.
Why whosup?
- You stop polling panes. The top band tells you how many panes need input, failed, finished, or are running. The "next" line names the one to look at first and quotes the question it is asking.
- One click, right pane. Click a cell and herdr focuses that pane, in any tab of any session. On macOS it can bring your terminal app forward too.
- Restarts don't lose conversations. After a reboot herdr restores the panes but not the agents. Empty cells get a resume button that finds the newest Claude Code conversation for that folder and runs
AGENT_CMD --resume <id>in the pane. Resume reads Claude Code's conversation history only; with any other agent the pane starts a fresh session. - Colour means something. Black and white everywhere, orange for the one thing to look at next, red for failures. Nothing blinks on a loop.
- It tells you even when you look away. The tab title shows how many panes are waiting, e.g.
(3) whosup, and the favicon lights its orange cell. A pane that just raised its hand gets one short orange ring. The header's sort button switches between by desk and neglected first, which slides the longest-waiting panes to the front of each desk. Turn on alerts in the header for a desktop notification; clicking it jumps to that pane. - Nothing waiting gets lost. A pane that needs you stays on the board until you deal with it — past midnight, after a restart, through a herdr hiccup. seen only snoozes it for 30 minutes; if it still needs you, it comes back. Closed panes stay in a recently closed row for 7 days and panes you stash stay there until you restore them; from that row you can resume or restore them. A stashed pane that starts working again comes back by itself. Pin the panes you always watch to a row at the top.
- It says when it doesn't know. If whosup cannot reach herdr, the header shows disconnected · last collect HH:MM, the tab title turns into
(!) whosup, and the favicon goes grey — instead of a calm board that is quietly out of date. - Light, dark, your language. The header button cycles the mode (auto / light / dark); the settings panel switches the language (English / 한국어). Palettes follow what real IDE themes use, with text contrast kept at WCAG AA.
What you see

| Area | Meaning |
|---|---|
| State band | Counts for needs input · failed · finished · running · idle · panes, plus today's attention events and how many were handled within 3 minutes. Click a number to filter. |
| Next line | The single pane to look at first and why: the pending question, the failure, or the finished answer. |
| Desks | One row (desk) per herdr session, one cell per pane in pane order. Cell header: label · git branch (the session name when there is no branch) · state, with a number 1–9 on the first nine waiting panes in the shared order (e.g. needs input 3; press 3 to jump there) · time waiting (for running and idle panes, time since your last request) · tags for the failure kind (e.g. usage limit) and unreachable. Below it, one line of context. |
| Cell line | The question the agent is asking (permission box, trust prompt, A-or-B), its last sentence, or your last request, whichever matters for that state. |
| resume | On empty panes after a restart: continue the newest conversation for that folder. |
| + new pane | Pick a session and a folder; whosup opens a tab there, starts your agent, and focuses it. |
How it works
herdr sessions (main, side, …)
└─ pane list + agent list, every 3 s ──► whosup collector ──► SQLite (node:sqlite)
│
browser ◄── http://127.0.0.1:4790 ◄── board server ◄─────────────┘
│
└─ click ──► pane.focus over herdr's socket ──► the pane
One Node process, no build step. herdr's startup hook is a one-shot command: when herdr starts, it launches whosup as a background server and returns. The server then keeps running on its own — herdr does not supervise or stop it — so use the stop action to shut it down. Pane state comes from herdr's agent detection (working / blocked / done / idle); the question text is read from the pane screen; the last request comes from Claude Code's conversation history (~/.claude/projects, or CLAUDE_PROJECTS_DIR). Panes running other agents show no last request, and resume starts them fresh. The collector also listens to herdr's events, so a pane that changes state is collected right away instead of waiting for the next 3 s pass, and open board tabs are updated at once. Without the event stream the 3 s pass still runs.
Trust model. The server listens on 127.0.0.1 only and has no login. Browser requests from other sites that try to change something are refused (a change must come from the board's own address and be sent as JSON), but any program running on the same computer can use its API — including changing settings such as AGENT_CMD, the command whosup types into a pane for resume and new panes. Do not expose the port to other people. The server also answers 403 local only to any request whose Host header is not 127.0.0.1, localhost or [::1], so tunnels that forward a public hostname (Tailscale Serve, cloudflared, ngrok) cannot open the board at all. To watch from another machine of yours, use a port forward that keeps a localhost host, such as ssh -L 4790:127.0.0.1:4790 <host> and then http://localhost:4790, and run the server with WHOSUP_READONLY=1. Read-only blocks changes, not viewing: it does not list folders under your home, but everything on the board stays visible — pane folder paths in the cell tooltips, last request text, question text — and GET /api/settings still returns agent_cmd.
Features
| Feature | Description |
|---|---|
| Auto-discovery | Every running herdr session and pane, no configuration |
| Attention states | needs input · failed · finished · running · idle · empty |
| Question extraction | Permission boxes, trust-folder prompts, and "A or B?" questions are shown verbatim |
| Jump | Click → pane.focus, and on macOS the terminal window showing that session comes forward. The terminal app is found automatically; when no window shows the session, a new one opens (Ghostty and Terminal) |
| Where a click goes | settings → Clicking a pane opens: terminal window (default), web address, or both, saved per browser. Web address opens the pane in a web terminal for herdr in a new tab, with {session} and {pane} filled in; each herdr session can have its own address (a web terminal usually runs one server per session, on its own port), and a Herdr app row opens on the web only when it has an address of its own. The tab is reused per row, so it stays linked to the board that opened it: set only the address of a web terminal you trust. Pick it when you use the board from another device. The board must not be read-only for this: read-only mode blocks every click |
| Herdr app terminals | When herdr-core (the terminals of the Herdr desktop app) is running on this machine, each of its terminals is a card too: one row per space of the app, with the status and the question text the core reports. A click jumps to that pane in the Herdr app and brings the app forward; when the app is not open the terminal opens in a terminal window (hc attach). Close, resume, new pane and turning a row off and on work as they do for herdr sessions. Nothing to configure, and whosup never starts a core that is not running. An agent stopped at its trust-folder prompt, which the core does not report, is read from the screen and shown as needing input; no other state is guessed from the screen |
| Resume | The pane's own conversation, else the newest one in its folder that is not live in another pane → AGENT_CMD --resume; the board shows which one before you click. Claude Code conversations only; other agents start fresh |
| New pane | Session + folder picker, runs your agent command |
| Desks (optional) | Declare sessions and panes per monitor in desks.json; the desks-apply action creates what is missing, idempotently |
| i18n | English by default, 한국어 on request (settings panel, ?lang=ko) |
| Theme | auto / light / dark (header button, ?theme=), researched IDE palettes |
| Read-only mode | WHOSUP_READONLY=1 hides the action buttons and + new pane, blocks clicks, Enter, 1–9, n, alert clicks and settings changes (the settings panel shows only the language choice), and does not list folders. It blocks changes, not viewing — see the trust model |
| Seen = snooze | seen on any waiting cell hides it for 30 min; unsee brings it back now |
| Pin | Pinned panes sit in a row above every desk, in both sort modes |
| Stash & recently closed | Stash an idle pane; closed panes stay under recently closed for 7 days, stashed panes until you restore them; a stashed pane that starts working again comes back by itself |
| One order | The next line, Enter, keys 1–9, alerts and the neglected sort all use the same order: failed → needs input → finished, oldest first |
| Keyboard | n (or ㅜ with a Korean layout) opens new pane · Tab moves between panes and Enter or Space opens the focused one · with no pane focused, Enter jumps to the next pane, or saves/opens in an open panel · 1–9 jump to the numbered pane · Esc closes the panel. n and 1–9 are ignored while you type in a field |
| Re-alerts | A pane left waiting is alerted again every 15 min, up to 4 times; alerts close when the pane is handled |
| macOS alerts (optional) | The server can send macOS notifications even with the tab closed — off by default |
| Split screen (optional, macOS) | Clicking a pane puts the board on the left part of the screen and the terminal on the rest (split_pct) — off by default, needs Accessibility permission |
| Honest state | Last collect time in the header; disconnected when collects stop; panes in an unreachable session are kept and marked |
| Settings panel | settings in the header: snooze, re-alert interval and limit, closed-after, disconnect warning, keep days, stale days, macOS alerts, unreachable timeout, split screen, agent command, where a click goes (this browser only), terminal app. In read-only mode it shows only the language choice |
Plugin actions
| Action | What it does |
|---|---|
fivetaku.whosup.start |
Start the board (also runs at herdr startup) |
fivetaku.whosup.stop |
Stop it |
fivetaku.whosup.status |
URL (port) and PID |
fivetaku.whosup.open |
Open the board in the browser |
fivetaku.whosup.desks-apply |
Create sessions/panes from desks.json |
fivetaku.whosup.desks-status |
Declared vs existing panes |
Settings
Put KEY=value lines in .env inside the plugin config dir (herdr plugin config-dir fivetaku.whosup; ~/.config/whosup when run outside herdr). The file is read only when start launches the server, so after a change run the stop action and then start. The desks-apply action does not read .env; it takes the agent command from agent_cmd in desks.json.
| Key | Default | Meaning |
|---|---|---|
PORT |
4790 | next free port is used if taken |
OPEN_BROWSER |
1 | open the tab once when herdr starts |
AGENT_CMD |
claude | command used by resume and new pane — put your wrapper here; the settings panel can override it |
FRONT_APP |
auto | macOS terminal app to bring forward on jump, e.g. Ghostty. When unset, the app showing herdr is detected, and Terminal opens a new window if there is none. The settings panel changes it without a restart |
STALE_DAYS (or WHOSUP_STALE_DAYS) |
3 | quiet days before a pane is an archive candidate |
WHOSUP_READONLY |
0 | 1 = read-only view: no changes, no folder list |
WHOSUP_SEEN_SNOOZE_MIN · WHOSUP_RENOTIFY_MIN · WHOSUP_RENOTIFY_MAX · WHOSUP_GONE_MISSES · WHOSUP_STALE_COLLECT_SEC · WHOSUP_CLOSED_KEEP_DAYS · WHOSUP_OS_NOTIFY · WHOSUP_UNREACHABLE_TTL_H · WHOSUP_SPLIT_PCT |
30 · 15 · 4 · 3 · 30 · 7 · 0 · 24 · 0 | starting values; the settings panel in the header overrides them per computer |
WHOSUP_INTERVAL |
3 | seconds between collects |
CLAUDE_PROJECTS_DIR |
~/.claude/projects |
where resume and the last request look for Claude Code conversations |
HERDR_BIN_PATH (or HERDR_BIN) |
auto | path to the herdr binary; otherwise whosup tries /opt/homebrew/bin, /usr/local/bin, ~/.local/bin, then PATH |
WHOSUP_RUNTIMES |
auto | what to read: auto (herdr sessions and herdr-core terminals, whichever is there), herdr, or herdr-core |
HC_SOCKET |
auto | herdr-core socket; otherwise taken from the core's own core.lock (follows HC_SESSION and XDG_STATE_HOME) |
HERDR_APP_BIN · HERDR_APP_NAME · HC_BIN |
herdr-app · Herdr · hc |
the Herdr app command (jump, new tab, close a space), the app to bring forward on macOS, and the command used to open a herdr-core terminal in a terminal window |
Desks (optional)
If you like a fixed layout — say one herdr session per monitor — describe it once and let whosup create it:
{ "agent_cmd": "claude",
"desks": [
{ "session": "main", "note": "left monitor", "agent": true,
"panes": [ { "label": "api", "cwd": "~/src/api" }, { "label": "web", "cwd": "~/src/web" } ] },
{ "session": "side", "panes": [ { "label": "notes", "cwd": "~/notes" } ] }
] }
Save it as desks.json in the plugin config dir (herdr plugin config-dir fivetaku.whosup; ~/.config/whosup when run outside herdr) and run herdr plugin action invoke fivetaku.whosup.desks-apply. It only adds what is missing. Open a terminal per session wherever you like (herdr --session main).
Agent restore
herdr can restart agents itself after a reboot ([session] resume_agents_on_restore). If you launch agents through a wrapper, set that to false and use whosup's resume instead, so the wrapper is used.
Requirements
- herdr 0.9.0 or newer. Terminals of the Herdr desktop app (herdr-core) are picked up as well when it is running; either one is enough
- Node.js 22.13 or newer (
node:sqlitewithout a flag); no bun, no build - curl (the
start,statusandopenactions use it for health checks) - macOS or Linux
Not whosup
Terminal mirroring, chat, and typing from a phone: ovis. Kanban-driven agents: herdr-board. whosup only looks and jumps.
License
MIT — see LICENSE.
Look once. Jump to the one that needs you.
Reviews (0)
Sign in to leave a review.
Leave a reviewNo results found