Our Loop board (the list of research, ship and publish items the fleet works through) used to reach Claude Code one way: pasted into context at session start, then left to go stale. Claude Code now has mods, plugins that run inside the app and can draw on screen. We wrote one in about 160 lines of JavaScript. The board's counts sit in a band above the prompt, refresh every minute, and cost no tokens to look at.
What we did
A mod is a set of event handlers. Claude Code calls them when something
happens, such as a tool call or a part of the screen being drawn, and the
handler can watch, change or take over that event. Ours, called
status-band, uses four:
- On session start it runs a feed command and starts two timers: the feed every 60 seconds, the subagent list every 2.
- When the band above the prompt is drawn it draws one line:
LOOP research 37 ship 0 publish 1 blocked 9 overdue 0 │ agents 1 running · 0 done. Anything flagged as an alert goes red. - When a subagent starts it redraws straight away instead of waiting for the next poll.
/bandrefreshes the feed and prints the full board into the transcript. It runs at once, even while Claude is mid-task, and never starts a Claude turn.
The feed is any command that prints a small JSON object (a title, some
labelled numbers, and a longer detail block). For us that is one new
function in our board script. The repo ships a second feed with no
dependencies that shows your git branch, uncommitted files and unpushed
commits. We checked it three ways: 8 tests through Claude Code's own test
kit, a /band run in a headless session against the live
board, and a real terminal session where we watched the band go from
agents 1 running · 0 done to 0 running · 1 done
as a subagent finished.
Why it was worth doing
Anything you paste into context is a snapshot the model pays to read
every turn and nobody refreshes. A band is the opposite: live, free, and
for the human at the screen, not the model. The subagent count answers
the question we keep asking a busy session, "is it still doing
something?", without typing a word. And the mod declares exactly what it
can reach. claude plugin validate lists every call it makes:
one process (your feed), the subagent list, one environment variable, the
clock and the screen. No network, no file writes, no model calls.
What's still off
Mods only draw in an interactive terminal, the Desktop app or VS Code.
Headless runs (claude -p) and cloud sessions run the handlers
but show nothing, and much of our fleet runs headless, so this helps when
a person is watching and nowhere else. Our band's "overdue" count also
disagrees with the number in our status line, because the two count
blocked items differently. We have not settled which is right. Mods are
not sandboxed either. They run with your permissions, so read one before
you load it. Ours is short on purpose. It is not switched on for every
session yet. For now it loads with --plugin-dir, one session
at a time.
Code, tests and both feeds: github.com/workloftai/ships/tree/main/code/183-status-band.