Header, filter bar (toggled with /), workspace list left, peek rail right, status bar and footer at bottom.
- **Header.** Repo name, count chip.
- **Filter bar.** Hidden until ++slash++, narrows title, branch, agent.
++esc++ clears.
- **Workspace list.** Row: status glyph, title, agent, branch, stat strip,
state (`▶ working`, `◑ waiting`), and
[task phase](features-status.md#the-third-axis-task-phase).
- **Peek rail.** Summary, then linked tickets, then transcript and terminal
tabs, with Stream for a native workspace ([detail](features-activity.md#the-peek-rail)).
- **Status bar.** Fleet left, workspace right, coloured by state.
- **Footer.** Global and selection keys.
## Keybindings
Global keys work anytime. Selection keys act on the highlighted row.
| Key | Action |
|-----|--------|
| ++n++ | Create a workspace. |
| ++d++ | Open the [Activity Dashboard](features-activity.md). |
| ++shift+p++ | Switch project. |
| ++r++ | Refresh. |
| ++slash++ | Filter. Type to narrow, ++esc++ clears. |
| ++question++ | Help modal, key reference. |
| ++q++ | Quit. |
| Key | Action |
|-----|--------|
| ++enter++ / ++a++ | Attach. |
| ++m++ | Steer without attaching. |
| ++e++ | Edit title and description. |
| ++s++ | Browse recorded sessions. |
| ++x++ | Remap to a live or recovered session, e.g. after `/clear` rotates the id ([`remap_session.py`](repo:src/grove/tui/screens/remap_session.py)). |
| ++p++ | Pause, removes worktree, keeps branch. |
| ++shift+r++ | Resume, recreates worktree, restarts tmux. |
| ++o++ | Respawn an OFFLINE workspace. |
| ++k++ | Kill, removes worktree and tmux, deletes Grove-created branches. |
PAUSED dims attach and pause, OFFLINE lights respawn, ORPHANED leaves only
kill ([`list.py`](repo:src/grove/tui/screens/list.py)).
## Activity Dashboard
Press ++d++: every workspace, one tile each, grouped by project.
- Tiles size by urgency: quiet is compact, working, waiting, blocked, or
erroring gets a taller tile with a live terminal tail.
- Each tile: branch, agent, model, diff, ahead-behind, tokens, summary.
| Key | Action |
|-----|--------|
| ++l++ | Cycle lens: all, needs attention, active. |
| ++g++ | Toggle grouping: by project, or flat. |
| ++r++ | Refresh. |
| ++d++ / ++esc++ / ++q++ | Back to the list. |
Tile meaning: [activity and sessions](features-activity.md).
## Project switcher
Press ++shift+p++ to hop repositories.
- Lists every repository with its workspace count. Filter holds focus,
++enter++ switches, ++esc++ cancels.
- A cheap, instant chooser, not a dashboard. ++d++ for live status.
## Steering an agent
Press ++m++, type a follow-up, ++enter++ to steer.
- Delivery follows the agent: local gets it typed into tmux, remote over
the remote API.
- ++m++ lights up only for a running agent, else Grove flashes why.
## The sessions browser
Press ++s++ to browse recorded sessions.
- Each row: state, turn count, model, who started the agent.
- Highlight a session: its turns fill the right pane, tool calls collapsed
into groups.
| Key | Action |
|-----|--------|
| ++t++ | Toggle tool detail, collapsed or expanded. |
| ++r++ | Refresh the session list. |
| ++esc++ / ++q++ | Back to the list. |
Recorded history reads from disk, not live: transcripts outlive their
worktrees.
## Modals
### Create
++n++ opens a nine-step modal.
1. **Agent.** Radio list of agents the cascade resolved.
2. **Native session.** A checkbox for Claude Code, Codex and OpenCode. It starts at the entry's mode and chooses a Grove-owned native session instead of the terminal.
3. **Runtime.** Host or Container (`container.enabled` default).
4. **First-turn brief.** Cascade default, On, or Off (`--brief` on
[CLI](use-cli.md)).
5. **Model** (blank = default). Free text like `sonnet`, unvalidated,
forwarded verbatim ([`create.py`](repo:src/grove/tui/screens/create.py)).
6. **Title.** Free text, pre-fills from branch name.
7. **Branch source.** *Auto*, *New named*, *Existing local*, *Track remote*,
or *Root*: [root workspaces](features-workspace-lifecycle.md#root-workspaces),
[branch provenance](features-branch-provenance.md).
8. **Skip init script.** Skips the [init script](configure-init-scripts.md),
default checked under *Root*.
9. **Confirm** with ++enter++, ++esc++ cancels.
### Edit
++e++ edits title and description, metadata only.
### Kill confirmation
++k++ opens a confirm modal with a `branch_provenance` deletion toggle:
GROVE_CREATED deletes, USER_ATTACHED keeps, either flippable. Remote
deletion needs `git push --delete`.
### Pause confirmation
++p++ opens a smaller confirm modal naming the retained branch.
### Help
++question++ opens a read-only key reference. Any key dismisses.
### Pairing
A new [web dashboard](use-webapp.md) pairing request pops a modal with a
device label and code. Approve with ++a++, deny with ++d++. See
[authentication & pairing](use-auth.md).
## Every screen
One gallery rather than a screenshot under each heading. It walks the tour in
page order, and the arrows loop.
Filter bar (/): matched substring-style across title, branch and agent.
Activity Dashboard (d): one tile per workspace, sized by how much it needs you.
Project switcher (Shift+P): type to narrow, ↑ and ↓ to move, Enter to switch, current repo tagged.
Steer modal (m): a quick redirect to a running agent, no attach required.
Sessions browser (s): sessions left, the selected session's turns right.
Create modal (n): branch source on the left, agent picker, title input.
Edit modal (e): title and description are metadata, worktree path and session name stay fixed.
Kill confirm (k): checkbox default reflects whether Grove created the branch.
Pause confirm (p): Grove refuses a dirty worktree, commit or stash first.
Help modal (?): pulled from the same DEFAULT_BINDINGS tuple the footer reads.
## Theme
Grove ships `dark`, `light`, and `auto` (follows the terminal's polarity).
Overrides land at `${user_config_dir}/grove/themes/.toml`, referenced
by `ui.theme`.
## Mouse vs keyboard
Both work. Clicking selects a row, hover outlines it, every action has a
keybinding.