See what every AI coding agent is doing, and answer the one that needs you, from one board.
dot and other web chats report by hand: you merge their block into the progress file (how).
You have Claude Code on one project, Codex on another and Antigravity on a third, and when one of them stops to ask you something, you only find out when you happen to switch back. Agent Board puts that question in front of you the moment it's asked, with a button for each answer. It runs on your computer and keeps everything in one Markdown file.
Major changes in 0.24.3. In an agent, /agent-board opens the live page ($agent-board in Codex); the plain terminal command below opens the terminal board or page. The live page replaces the old static HTML and the plain text board for people; Claude Code keeps its /progress pane. Agents use the JSON read (--json). Old board commands and --chat still work in this version; running setup again refreshes the installed commands. Send works where there is a delivery path; other surfaces can still require Copy.
With Node.js 22+, in any terminal:
npx @wenyuchiou/agent-board setup
npx @wenyuchiou/agent-boardThe first command finds the agents on this computer, shows what setup would change, and asks once: Set these up? [Y/n]. A yes writes the files, approves the board's hooks in Codex and Hermes Agent, and installs the Claude Code plugin when Claude Code is on this computer; a no writes nothing. Without a terminal to answer in, such as in an agent's chat, setup only previews: setup --apply then writes the files and lists the approval and plugin commands to run yourself. The second command opens the live terminal board over SSH or in an interactive terminal without a display, and the page otherwise. In an agent's chat, /agent-board opens the same page. If nothing is set up yet, the second command alone asks the same question first. To stop the board's page, run npx @wenyuchiou/agent-board stop. To start the page without opening a browser window, add --no-open (npx @wenyuchiou/agent-board --no-open). For the shorter agent-board command, install it once with npm install -g @wenyuchiou/agent-board. To set up one agent only, add --agent and its name, such as --agent codex. To remove touched agent setups in one go, run npx @wenyuchiou/agent-board remove (or setup --remove); see Update and uninstall. More in the setup guide. An agent that needs the board's status reads agent-board --json; the Board JSON reference describes its versioned, redacted fields.
The board follows your system language when it is Traditional or Simplified Chinese, and English otherwise. To choose one, add --lang en, --lang zh-TW or --lang zh-CN to the setup command; the board, its page and stop then use it. An account connected through the Claude Code plugin uses /progress lang instead. A language picked in Settings on the board's page wins over both; its Automatic follows the system language.
Scan the QR code from npx @wenyuchiou/agent-board --lan with a phone on the same Wi-Fi. Use it only on a network you trust: the link is not encrypted and anyone who has it can open the page. Details: the board's page.
Then:
- Start a new session of each agent: a session that was already open is not connected.
- Claude Code connects through its plugin instead, which a yes to setup installs. If setup only previewed:
claude plugin marketplace add WenyuChiou/agent-board, thenclaude plugin install agent-board@agent-board. - Codex: a yes to setup trusts its hooks. If setup only previewed, trust them in
/hooks(how). - OpenCode, OpenClaw: reload their plugins.
- dot and other web chats: paste the last section of AGENTS.md into the agent's instructions, then save each block it writes and merge it into the progress file as Remote reporters shows.
In the new session, open the board with its entry:
- I use Claude Code:
/agent-board - I use Codex:
$agent-board - I use Antigravity:
/agent-board(checked in a synthetic home, not run live yet) - I use OpenCode:
/agent-board
To add a task of your own, write a ### title with - [ ] step lines in progress.md (a fresh install uses ~/.agent-board/progress.md; the format). With the Claude Code plugin, you can instead type + project: title; step; step in the pane's box, or /progress add … in Claude Code's chat.
Without npm: install from a checkout
To install from a clone of this repository instead, with Node.js 18+:
git clone https://github.com/WenyuChiou/agent-board.git
cd agent-board
node scripts/setup-agent.mjs
node scripts/setup-agent.mjs --applysetup-agent.mjs takes the same options as npx @wenyuchiou/agent-board setup, such as --agent codex. On Windows, use the exact paths it prints. What each one writes: setup guide.
Let an agent install it
Paste this into the agent you already use:
Install Agent Board from https://github.com/WenyuChiou/agent-board on this computer.
Read its AGENTS.md, README and setup guide. Identify my current host and the other installed coding agents, then preview the common installer: node scripts/setup-agent.mjs.
Preserve existing settings and the shared progress path. Follow my approval requirements for persistent changes, then apply the applicable hooks, plugins and board command. Do not require or call another AI product to bootstrap this one.
Complete any required scoped host trust, read the settings back, and have this session report its own real task progress. Open the interactive board.
Verify actual hook events separately for CLI, desktop App and IDE. Installed files, transport acceptance and an ACK are different from a working progress connection.
Tell me which existing sessions need reload and which adapters remain unsupported or unverified. Never scan private conversations or silently skip a blocker.
In the Claude desktop app, when its Code tab shows no pane, the footer shows the waiting count and /agent-board opens the board. /agent-board starts the live board page and replies with its link, where you can answer questions and archive work; it works in every Claude Code session and leaves the pane as it is. When the pane cannot be placed, /progress does the same. If the live page cannot start, both explain why and show the command that starts it. The board page needs the board script that /progress connect installs, or the next session start updates.
In the Claude desktop app the agent can open the board too: ask it to open the board and it starts the same page and gives you the same link.
| Where | Command |
|---|---|
| A terminal or desktop | node "$HOME/.agent-board/agent-board.mjs" (terminal board over SSH or without a display, page otherwise) |
| A phone on the same Wi-Fi | node "$HOME/.agent-board/agent-board.mjs" --lan (scan the QR code it prints) |
| An agent reading the board | node "$HOME/.agent-board/agent-board.mjs" --json (field reference) |
| Check one agent's setup | node "$HOME/.agent-board/agent-board.mjs" --codex-doctor --agent codex |
Keys on the terminal board
In a terminal, --watch works like the pane:
| Key | Does |
|---|---|
| ↑ ↓, Enter | Pick a line, open it |
x |
Tick the next step of your own task; it goes into the work log |
d |
Confirm one of your own tasks, or a stopped session's work, done |
a |
Archive one of your own tasks, or a stopped session's block |
1–9, y / n |
Copy the answer to another agent's question, to paste in that agent |
c |
Copy a command, or the command that reopens the session that asked |
h, u |
Mark another agent's question already answered: hidden on this computer, nothing sent; show the hidden ones again |
i |
Show or fold the tasks idle more than 7 days |
o, q |
Open the browser view; quit |
Finished work leaves the board by itself. The board writes progress.md as carefully as the pane does, and leaves other sessions' blocks alone unless you archive one that has stopped or confirm it done.
| Agent | Runs in | On the board | Reply from the board | |
|---|---|---|---|---|
| Claude Code | CLI | Its own pane: every task and turn | In the pane; Send to a connected CLI session from the page | |
| Codex | CLI, App | Seven hooks, closing questions and reported steps | Send to a running CLI turn; CLI next-prompt delivery is implemented and awaits a live check; App falls back to Copy | |
| Antigravity | CLI, App, IDE | Four hooks, CLI closing questions and reported steps | Send to a connected CLI; next-prompt mailbox awaits a live check; Copy without a connection | |
| OpenCode | CLI | Session events, closing questions and steps from its progress tool | Copy | |
| Cursor | IDE, CLI | Hooks and CLI closing questions | Queue for when a chat opens; delivery on reopening a chat still needs a live check; Copy without a connection | |
| Grok Build | CLI | Four hooks and closing questions | Copy; --allow-resume once a session ended |
|
| Muse Code | CLI | Two reporting hooks (stop, end) | Next-prompt mailbox implemented; live delivery untested; Copy without a connection | |
| Hermes Agent | Chat | Four shell hooks, closing questions and reported steps | Copy | |
| OpenClaw | Chat | Its plugin's session events | Copy | |
| DeepSeek Harness | TUI, Web | Its plugin's session events | Send when idle: verified on Web; TUI not tested live | |
| dot, other web chats | Web | A block you merge | Answer in its chat |
Hooks say whether a session is working or waiting; task steps and when it is done come from the agent's own reports. The closing questions above reach Needs you as hook-owned steps. Antigravity CLI's hooks carry no reply text, so the board reads the last reply from its own transcript file; that format is undocumented and was checked on agy 1.5.2. Only the closing question is kept. Gemini CLI is still a target (--agent gemini) for paid and enterprise use: see setup.
Generated from receiver records by node scripts/messaging-matrix.mjs --write. Progress reporting is separate. Verified requires a <date>-<host>-live.md file for that surface; synthetic tests only establish Implemented. Unconnected targets use Tier 4 / [P5] Copy fallback, not a native receiver. Unknown means the roadmap names no primitive for this surface.
| Host | Surface | Tier | Primitive | Status | Live run | Receiver |
|---|---|---|---|---|---|---|
| Antigravity | 2.0 Desktop App | 3 | Unknown | Implemented | Not tested | hooks/receivers/hook-mailbox-antigravity.ts |
| Antigravity | agy TUI | 3 | Unknown | Implemented | Not tested | hooks/receivers/hook-mailbox-antigravity.ts |
| Antigravity | Exclusive-owner Stream CLI (stdin) | 1 | Unknown | Implemented | Earlier run, not counted: docs/validation/2026-10-19-native-hooks.md | scripts/antigravity-session-connector.mjs |
| Antigravity | IDE | 3 | Unknown | Implemented | Not tested | hooks/receivers/hook-mailbox-antigravity.ts |
| Claude Code | CLI | 1 | [P1] | Implemented | Not tested | hooks/receiver-record.ts |
| Claude Code | Desktop Code | 4 | [P5] | Proposed | Not tested | None |
| Claude Desktop | Chat | 4 | [P5] | Proposed | Not tested | None |
| Codex | CLI | 3 | Unknown | Implemented | Not tested | hooks/receivers/hook-mailbox-codex.ts |
| Codex | Daemon | 4 | [P5] | Proposed | Not tested | None |
| Codex | Desktop App | 4 | [P5] | Proposed | Not tested | None |
| Codex | Exclusive-owner app-server | 1 | [P1] | Implemented | Earlier run, not counted: docs/validation/2026-10-19-native-hooks.md | scripts/codex-session-connector.mjs |
| Codex | Existing-owner proxy (active turn only) | 2 | Unknown | Verified | docs/validation/2026-11-04-codex-cli-proxy-live.md | scripts/codex-message-connector.mjs |
| Cursor | cursor-agent CLI | 3 | Unknown | Implemented | Not tested | hooks/receivers/hook-mailbox-cursor.ts |
| Cursor | IDE (Composer) | 3 | Unknown | Implemented | Not tested | hooks/receivers/hook-mailbox-cursor.ts |
| DeepSeek Harness | Cordis CLI | 4 | [P5] | Proposed | Not tested | None |
| DeepSeek Harness | Desktop | 4 | [P5] | Proposed | Not tested | None |
| DeepSeek Harness | TUI | 1 | [P1] | Implemented | Not tested | hooks/receivers/deepseek.ts |
| DeepSeek Harness | Web | 1 | [P1] | Verified | docs/validation/2026-11-08-deepseek-harness-live.md | hooks/receivers/deepseek.ts |
| dot / Web Chats | ChatGPT | 4 | [P5] | Proposed | Not tested | None |
| dot / Web Chats | Claude.ai | 4 | [P5] | Proposed | Not tested | None |
| dot / Web Chats | DeepSeek Web | 4 | [P5] | Proposed | Not tested | None |
| dot / Web Chats | dot | 4 | [P5] | Proposed | Not tested | None |
| dot / Web Chats | Grok Web | 4 | [P5] | Proposed | Not tested | None |
| Gemini | Web | 4 | [P5] | Proposed | Not tested | None |
| Gemini CLI | CLI | 3 | Unknown | Implemented | Not tested | hooks/receivers/hook-mailbox-gemini.ts |
| Grok Build | CLI | 4 | [P5] | Proposed | Not tested | None |
| Hermes Agent | Chat Gateway | 4 | [P5] | Proposed | Not tested | None |
| Hermes Agent | CLI | 4 | [P5] | Proposed | Not tested | None |
| Muse Code | CLI | 3 | Unknown | Implemented | Not tested | hooks/receivers/hook-mailbox-muse.ts |
| OpenClaw | Desktop Control UI | 4 | [P5] | Proposed | Not tested | None |
| OpenClaw | Gateway | 4 | [P5] | Proposed | Not tested | None |
| OpenClaw | WebChat | 4 | [P5] | Proposed | Not tested | None |
| OpenCode | CLI TUI | 4 | [P5] | Proposed | Not tested | None |
| OpenCode | Desktop App | 4 | [P5] | Proposed | Not tested | None |
| OpenCode | Web UI | 4 | [P5] | Proposed | Not tested | None |
How each agent was checked
| Agent | Checked |
|---|---|
| Claude Code | Claude Code 2.1.301 in CI |
| Codex | 0.163.0-alpha.10.2 app-server (record); CLI in the 0.23.5 live run; App untested |
| Antigravity | CLI on Windows (record); the App opens the board but does not report a question yet (#285); IDE untested |
| OpenCode | Plugin SDK 1.19.3 (record) |
| Cursor | checked in a synthetic home, not run live yet |
| Grok Build | 1.0.62 with a mock model |
| Muse Code | checked in a synthetic home, not run live yet |
| Hermes Agent | 0.19.0 with a mock model |
| OpenClaw | Source contract and synthetic callbacks (record); app untested |
| DeepSeek Harness | Plugin loader (record); app untested |
| dot, other web chats | Untested |
"With a mock model" means the real agent ran against a stand-in model. A live run of 0.23.5 in each app is in the parity record: there a question from Codex CLI or OpenCode did not reach the board (fixed after 0.23.5, #213), and neither did one from the Antigravity app (#285).
- Answer the one that is waiting. A question from any agent sits at the top, with a button for each answer. With messaging on and that session connected, Send queues your answer, and a confirmation from that session means it was received; otherwise press Copy and paste it into that chat.
- Check the others are still moving. Each agent's task shows its current step and when it last reported. Work nobody has touched for a week folds into one N idle 7+ days line.
- Clear what is finished or dead. Finished work moves to a monthly archive by itself. A session that stopped halfway can be archived, confirmed done or taken over.
- Tell an agent something without going there. With messaging on and the session connected, type in the reply box and send it; otherwise press Copy and paste it there.
The terminal board, showing Codex's question under Needs you and a Claude Code task in progress.
Claude Code's pane, beside the chat: the same board, with the question's answers as buttons.
Both pictures are drawn by the board's own code from synthetic data. Native hook evidence is recorded separately.
The commands above open the board in your browser. If the agent cannot open a window, it gives you a link. Run the same command again to reopen the page. On the page you can:
- Answer a question: Send it when messaging is on and the session is connected, or Copy the reply. The LAN page has no messaging.
- Settings at the foot of the page changes the language, look and notifications, and sets up or removes an agent without going back to a terminal.
- Tick your next step, archive a task, or Archive now to clear everything finished.
- Already answered, hide a question you answered in its own chat: hidden on this computer until that session asks something new; nothing is sent. This button is also visible directly on the card after Send. The Hidden notice offers Show again to restore that question.
The page listens on 127.0.0.1 only, and its address carries a random key: anything on this computer that has the link can use it. It keeps running after you close the tab; Close the board, the red power button, stops it. Add --lan to the same command to open it on a phone on the same Wi-Fi: that link is plain HTTP and anyone who has it can use the page, so use it only on a network you trust. Details and limits are in the guide.
Each agent's hooks write what its session is doing into its own block of one local progress.md (a fresh install uses ~/.agent-board/progress.md). Task steps come from the agent's own reports; supported hooks also read the last reply and keep only its closing question. The board reads the file without calling a model; the optional Claude plugin can sum up turns with Claude's model, as the guide says. You can read and edit the file too: the file format. In English, 繁體中文 and 简体中文.
- One Markdown file: every agent's progress goes into one plain progress.md that you can read and edit; no database.
- Every agent on one board: Claude Code, Codex, Antigravity, Cursor, OpenCode and the other connected agents, side by side.
- Questions first: the questions your agents are waiting on come first, and you answer them from the board; a connected session receives the answer.
For architectural positioning and coexistence with memory tools, see the Architecture Positioning Guide.
Start with the doctor. It checks what the installer wrote for one agent and changes nothing:
node "$HOME/.agent-board/agent-board.mjs" --codex-doctor --agent codexUse the agent's own name after --agent (the doctor keeps its old name for every agent). It prints whether the files are in place, what is wrong and one next step. Only a new session that shows up on the board proves the connection. With --json, installed says the files are in place and ready that the agent has a status adapter; connected stays unverified.
| You see | Try |
|---|---|
| Start without a browser window | Pass --no-open: npx @wenyuchiou/agent-board --no-open (or agent-board --no-open). |
| An agent is not on the board | Start a new session of it; one that was already open is not connected. For Codex, preview npx @wenyuchiou/agent-board --codex-trust --codex-bin "<path-to-codex>" --json with Codex's full path; the plain doctor prints the command when it can reach Codex. Review the preview, then add --apply only if you approve. Codex CLI also offers /hooks. |
| Nothing changed after installing | Run npx @wenyuchiou/agent-board setup again without --apply (from a checkout: node scripts/setup-agent.mjs). Read the conflicts and Next steps; edited files are left alone and listed there. |
| An old version is still running | A running session keeps the version it loaded: start a new one. To update, see the guide. |
| An agent shows up twice | It may be connected both ways: by the Claude plugin's /progress connect and by setup. /progress connect status lists what the plugin connected; remove one with /progress connect remove or --codex-remove --agent <name>. |
| A question will not go away | Answer it in its own chat, then press Already answered, hide (h). After 3 days it moves into Earlier unanswered questions, and after 7 days into Older unanswered questions. |
More answers are in the guide's FAQ and Troubleshooting. Found a bug? Open an issue with the bug form, paste the doctor's output, and follow the guide's safe-report steps: no session ids, home-folder paths or tokens.
Colours and marks
The pane follows Claude Code's theme (/config, then Theme); the page follows your computer's light or dark mode until you pick Light or Dark. On the board's page, Settings is next to Close the board (the red power button): it opens Language, Look and Notifications. Changes apply at once. Language offers Automatic, English, 繁體中文 and 简体中文. Look offers Light, Dark and Automatic, then the progress bar's three styles, Ink (the default), Blue and Green. Notifications start off; turning them on asks the browser's permission and alerts you once for each waiting question or approval. The progress bar shows one cell per step beside the count, such as ━━━━╸── 5/7; the style you pick shows on the page, the pane and the terminal board alike (/progress style blue in the pane, s on the terminal board). The button sits at the bottom of the expanded sidebar, or below the tasks on a narrow screen or when the sidebar is collapsed. Every mark has its own shape, so it reads without colour; the page draws a step still to do as a small dot rather than a ring, so it does not look like a button:
| Mark | Means | Mark | Means | |
|---|---|---|---|---|
| ● | Waiting on you | ◐ | Running, or waiting on someone else | |
| ▸ | Doing now | ! | Stuck | |
| ○ • | To do (a ring in the pane, a small dot on the pages) | ⚑ | Due within two weeks | |
| ✓ | Done | – | Cancelled |
| Read | For |
|---|---|
| This README | The first five minutes |
| Guide | Daily use, keys, the page, update and uninstall, FAQ, troubleshooting |
| Setup | What the installer writes for each agent |
| Codex · Messaging · File format · Local exchange · Remote reporters | Reference |
| AGENTS.md · Contributing · Security | Working on the code; how a non-Claude agent reports by hand |
MIT. Agent logos are from Simple Icons (CC0) and Lobe Icons (MIT) and belong to their owners; an agent without a logo is shown by its initial.
Latest stable version: 0.24.2 · Changelog