Rivulets

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.

The board: topics as pills, a column per conversation, tasks under each, blocker bubbles beside 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