---
title: "rexboard: An Attention Board for My Coding Agents"
url: "https://vanducng.dev/2026/10/31/rexboard-an-attention-board-for-my-coding-agents/"
date: "2026-10-31"
series: "agentic-ai"
categories: ["AI"]
tags: ["agentic-coding","tui","rexboard","rust","developer-tools"]
---

# rexboard: An Attention Board for My Coding Agents

> **Sources**: the [rexboard repo](https://github.com/vanducng/rexboard) (README, docs, ADRs and the [CHANGELOG](https://github.com/vanducng/rexboard/blob/main/CHANGELOG.md) up to v0.20.0), my own mission notes for the build, and the tools I compared it with: [Fleet](https://github.com/nicknisi/fleet), [Agent Deck](https://github.com/asheshgoplani/agent-deck), [cc-pane](https://github.com/miya-masa/cc-pane), [Muxbell](https://muxbell.com/) and [Mux Beacon](https://github.com/Lukeesec/mux-beacon).

On a normal day I have somewhere around 70 agent panes open across three machines. Most of them are fine. A few are stuck on a permission prompt, one has finished and is waiting for me, and one hit an error twenty minutes ago and I have no idea which. I kept losing time hunting for those panes, so I built a board that finds them for me.

That board is [rexboard](https://github.com/vanducng/rexboard). It went from v0.1.0 to v0.20.0 in about a week. This post covers what it is, why it works the way it does, where it stands, and what I want to add next.

<video src="/videos/rexboard-promo.mp4" controls muted playsinline width="100%"></video>

## What it is

rexboard is a Rust CLI and TUI (ratatui) for the coding agents running in [Rex](https://www.superlogical.com/rex/docs) panes. The intent line in my project spec says it plainly:

> One list of every coding agent pane on every Rex host, ordered by who needs you, with time in state and a key that jumps to the pane.

You run `rexboard`, and you get one list grouped into NEEDS YOU, WORKING, QUIET and UNREPORTED. Blocked, errored, and done-but-not-seen rows sit on top. `enter` jumps to the pane, even on another host. `space` watches it live, `a` answers a prompt from the board, `x` sends a message, and `p` shows a live preview strip of the selected pane.

```bash
brew install vanducng/tap/rexboard
rexboard
rexboard hooks install --dry-run   # see what it would change first
rexboard hooks install
```

It knows Claude Code, Codex, pi and grok. Since v0.18.0 it also shows MODEL, CTX, TOK, COST and the 5-hour usage window per row, on remote hosts too.

## How it works

A small daemon, `rexboard serve`, starts on first run. On this host and every host in `rex hosts`, it runs an `observer.lua` script through `rex do`, which streams NDJSON back. Serve keeps state on disk, holds the harness adapters, runs extensions and answers the board and the CLI over a unix socket.

A few decisions shaped the rest. Each one has an ADR in [docs/decisions](https://github.com/vanducng/rexboard/tree/main/docs/decisions):

- **Reach Rex only through the `rex` CLI.** No private APIs.
- **The agent tells Rex, rexboard shows it.** No screen scraping and no transcript reading. Agents report state through hooks, and rexboard ships those hooks.
- **The CLI is the API.** Everything the board shows is also a command with `--json`, like `rexboard ls --json`.
- **Extensions, not a built-in core.** An extension is a process with JSON in and fields out. My OpenRig extension adds PROJECT and RIG columns and a `send` action this way.
- **Acting on panes is guarded.** rexboard writes only to a pane you picked: a jump, an answer, or a close.
- **Seen means you acted.** A done row stays in NEEDS YOU until you actually touch it.

The scope ADR is just as useful for what it refuses: no Rex layout writes, no themes, no user-defined views, no extension registry, no Windows.

## How I built it

I did not write most of this code by hand. The build ran as missions split into slices, one slice per PR, each with a spec, a progress log and a proof file. A dev agent implemented, a review agent and a PM agent scored, and I made the calls: which mockup, which scope, when to release. The v2 mission alone is past 75 slices.

Some of the work that took the most rounds was not UI at all. Making serve restart cleanly after a `brew upgrade` took four review rounds. A whole run of slices went to flaky tests under load. And the status coverage problem (21 of 37 rows had no status at one point) turned out to be seats relaunched with `--resume` that had no `TMUX` or `TMUX_PANE`, so the hook gate exited early.

## Where it stands

As of v0.20.0 (31 October 2026):

- Shipped: the list-first board with row numbers (`1`-`99` selects), live preview, card grid, answer mode, send from the board, extension actions, remote usage through Rex, Homebrew install and `rexboard upgrade`.
- Running on my Mac, a second Mac and a Linux box.
- Open draft PRs: an EFFORT column with `[models]` aliases ([#129](https://github.com/vanducng/rexboard/pull/129)), extension column widths that fit their values ([#128](https://github.com/vanducng/rexboard/pull/128)), and a batch of test flake fixes.
- Deferred by me: a 1W weekly quota column, since my proxy setup does not expose it easily.

## What is next

I looked at what the closest tools do. [Fleet](https://github.com/nicknisi/fleet) is the nearest match: a tmux dashboard grouped by urgency with a clickable status row. [cc-pane](https://github.com/miya-masa/cc-pane) sends OSC 9 alerts on approval prompts. [Muxbell](https://muxbell.com/) and [Mux Beacon](https://github.com/Lukeesec/mux-beacon) are macOS menu-bar inboxes. [Agent Deck](https://github.com/asheshgoplani/agent-deck) goes further into orchestration, cost dashboards and Telegram or Slack control.

None of them work across Rex hosts, which is the reason rexboard exists. But they point at gaps worth closing. In rough order:

1. **A notification when a row enters NEEDS YOU.** My scope ADR already lists this as deferred, not refused. OSC 9 like cc-pane is the smallest version.
2. **A summary strip.** Fleet's `N need you · N working` header. I want the count before I read rows.
3. **Clear all seen done rows at once.** Fleet has a clear chip for this.
4. **Finish EFFORT and model aliases**, already in a draft PR.
5. **State stats from `transitions.jsonl`.** The data is already on disk. How long did each agent wait on me today is the number I actually care about.
6. **Turn durations.** Mux Beacon treats one prompt as one turn with one alert and one duration, even when subagents wake it up. That would make QUIET and done rows easier to trust.
7. **NEEDS YOU off the laptop.** Agent Deck does Telegram and Slack. For me this should be an extension, not core.

I will write about each one as it lands. If you run a lot of agents in Rex, try it and tell me which row on that list you would want first.

## References

- [rexboard on GitHub](https://github.com/vanducng/rexboard)
- [rexboard decisions (ADRs)](https://github.com/vanducng/rexboard/tree/main/docs/decisions)
- [Rex docs](https://www.superlogical.com/rex/docs)
- [Fleet](https://github.com/nicknisi/fleet)
- [Agent Deck](https://github.com/asheshgoplani/agent-deck)
- [cc-pane](https://github.com/miya-masa/cc-pane)
- [Muxbell](https://muxbell.com/)
- [Mux Beacon](https://github.com/Lukeesec/mux-beacon)
