Rivulets puts your Claude Code sessions on one board: what is running, what each session is working on, what is blocked on what, and what waits on you. It watches the sessions and never drives them.
What you see
A tree rooted at your topics. Each conversation is a column with its state, its last message and its tasks under it; the subagents it spawned sit under the task they work on, and a blocker hangs beside the task it holds back. Next to the area button, the needs-you queue lists what waits on you: a permission prompt, a question, a stopped session, a blocker only you can clear, a task you noted and have not started.
How it gets there
Claude Code hooks run riv emit at every prompt, tool call and stop, and
riv writes what changed to the server. An agent can say more with
riv status: the task it is on, what blocks it, when it is done. From the
same hooks riv notices the pull requests a session opens and the tests it
runs. The board follows the server's stream and redraws as rows change.
The clerk
Agents forget to call riv status. After each prompt and each stop the clerk
judges what the turn means for the board and writes the tasks, blockers and topics it
finds, marked as its own. It is opt-in: it sees your prompts and the agent's last message
only with your consent, and it stops at a monthly budget.
Install
On each Mac that runs sessions, in a terminal:
brew install nevyn/tap/riv
In Claude Code:
/plugin marketplace add nevyn/Rivulets
/plugin install rivulets@nevyn-rivulets
Then sign this Mac in with your passkey:
riv login
Optional; keeps the board fresh between sessions:
brew services start riv