# Session board

One list of what your coding sessions are doing right now, on every machine and in the cloud, with the ones waiting for you first. It answers "which session needs me?" without opening each terminal.

## See it

- The dashboard's **Now** page, which refreshes every few seconds while the tab is open.
- `0b sessions`, with `--state needs-you`, `--machine` and `--repo` to narrow it, and `0b sessions watch` to refresh it every 5 seconds.
- Any connected AI: `bridge__sessions_status` answers "what needs me?" with a header line such as `2 need you · 3 working · 5 idle` and one line per session. Chat apps get it too; the directory listing's client doesn't.

## The states

| State | Means |
|---|---|
| Working | You submitted a prompt and the agent is on it |
| Needs you | The agent is waiting for a permission or an answer |
| Idle | The turn is done |
| Ended | The session closed |
| Error | The turn ended in an error |

A session that says working or needs you but has sent nothing for 30 minutes is marked stale, in case the machine went to sleep. Needs you flips back to working when the transcript grows again. There is no per-token streaming: the board changes when a hook fires, so it is a few seconds behind, not live to the word.

## What a session that needs you waits on

Each waiting session says which of three it is, when its hook saw it, and how long ago:

| Shown as | Means |
|---|---|
| Needs you, pending approval | A permission prompt the agent reported as one: Claude Code's typed `permission_prompt` notice, or a permission request that names its tool (`Bash: npm test`). A task started from 0bridge waiting on its prompt is one too, whatever its session's hooks last said: 0bridge holds that prompt, and it never shows as unconfirmed |
| Needs you, waiting for input | A question (AskUserQuestion), an MCP server asking for input, or a worker that needs input |
| Unverified | A permission notice 0bridge can't vouch for: one with no type that only says "permission", or a request that names no tool. From a session running with permissions skipped (`--dangerously-skip-permissions`, `permission_mode: bypassPermissions`) it says so too. A typed notice or a request naming its tool stays a pending approval in that mode: Claude Code sends those only for a dialog on screen |
| Unconfirmed since … | Its machine stopped being able to tell: it watches a waiting session's transcript for 10 minutes, and a transcript that can't be read can't be watched. If the board hears nothing more from that machine for 12 minutes (its 0b was stopped, the machine went off, or its updates fail), the board marks it unconfirmed itself. It is not known to be answered, nor still waiting |

The header counts them apart: `2 need you (1 unverified or unconfirmed)`. A notification for an unverified one says "may need you". These lines are what the hook reported, not what the terminal shows now, so nothing on the board approves anything: a task's prompt is answered by its request id ([Your agents from your phone](/docs/remote-control)), and a session you started in a terminal is answered there. A machine whose 0b predates this shows its waits without a kind.

## Which tools report what

0bridge adds one small entry per event to each tool's hook settings, next to whatever is already there. The entry is silent, finishes in well under a quarter of a second and never uses the network: it writes a note, and a background worker sends the update.

| Tool | Reports | Not reported |
|---|---|---|
| Claude Code | Working, needs you (permission or input), idle, ended. Needs you comes from Claude Code's notification and permission hooks, not yet seen on a live session (2026-10-01) | A turn that fails on an API error shows as working until it goes stale |
| Codex | Working, needs you (a permission), idle, ended | A question in the chat: Codex has no notification hook. The events are the ones Codex 0.157 lists for hooks; not yet seen on a live session (2026-10-01). With Codex hooks off (no hooks.json, the `notify` fallback), only idle |
| Cursor | Working, idle, and error when a turn fails | Needs you: Cursor has no permission hook |
| Claude Code on the web | The same as Claude Code, once `0b project cloud` has put the hook in the repo: [Cloud agents](/docs/cloud-agents) | |

The board comes on when `0b history hooks on` or `0b sessions on` installs those hooks. If your history hooks went in before the board existed, run one of them again to turn it on. `0b sessions off` stops posting from this machine and removes the hooks if history doesn't need them; after that, `0b history hooks on` leaves the board off until `0b sessions on`. Codex asks you to trust each new hook the first time it would run it: allow 0bridge's.

## What is sent

Each update carries the tool, the session id, the state, the repo, the branch, the last two parts of the folder path, the machine's name, a title (the name the agent gave the session, else your first prompt's first line) and up to two short lines of text (at most 200 characters each): your prompt's first line while it works, the agent's notice when it needs you, and the last line of its answer when it is idle.

- The title and lines are hidden from values in your vault and key-shaped text on your machine, and again on the server. Claude Code on the web has no vault there, so its lines are hidden only where they look like keys.
- **When history is end-to-end, no title or lines are kept.** The server drops them and tells your machines, which stop sending them from then on (the first update after you switch may still carry them). The board then shows state, repo and age only.
- Chat apps see the title and lines only with Chat history on. A token with no history access never gets them. A project's own token, and the agents of a strict project, see only that project's sessions.
- Finished sessions leave the board by themselves: ended ones after a day, idle ones after 3 days, anything after 7. **Dismiss** removes one earlier.

## Get a notification

Under Settings → AI apps, **Tell me when a session needs me** is off by default. When it is on, a session that starts waiting sends one notification through your ntfy topic or email, at most one per session every 2 minutes. It names the tool and the machine and carries the agent's one-line notice. It links to the Now page and has no approve button: [Your agents from your phone](/docs/remote-control) explains how approvals work.

## Answer from here

If you use agent control, a task started from a chat app shows on the board too, and you can answer it with `bridge__agent_send` or on its task page. A session you started in a terminal is shown, not controlled: you answer it in that terminal. `bridge__agent_send` can name such a session by its `0b:` ref, but its machine takes that only in a repo you allowed there, and in a terminal it types the text and presses Enter, which answers whatever prompt is showing. `dryRun: true` tells you first, without sending, whether the machine would take it and how.
