Skip to content

Keyboard controls

Keyboard Controls

Action Key Description
Navigate j / k or ↑ / ↓ Move through session list
Jump to first/last gg / G Go to top / bottom
Jump to session 1–9 Switch directly to session N
Switch to session Enter Switch tmux to the selected pane
Row menu m Open the selected row’s (or group header’s) context menu; j/k to move, Enter to run
Copy last response y Open the Copy dialog for the selected row: last response, or up to 20 turns
New session n Open the new-session dialog (agent, placement, prompt, worktree + name; directory derived from the selected row)
Search / Enter fuzzy search mode
Toggle preview P Show/hide the preview panel
Scroll preview Ctrl+D / Ctrl+U Half-page scroll in preview
Resize preview Alt+H / Alt+L Increase/decrease preview width
Focus preview Tab Send keys directly to tmux pane
Restart session r Kill and resume the selected session
Reconnect R Reconnect to the daemon SSE stream
Kill session x Kill the selected session’s process
Kill all X Kill all tracked sessions
Fork session F Branch the conversation into a pane of its own, leaving the original running
Worktrees W Open the Worktrees panel: jump, start an agent, copy a path, review, or prune (multi-select, confirmation)
Start from PR/issue N Open the source picker: every open PR and issue of the repos in scope, filtered, Enter starts work on one
Review and hand back d / D Review with hunk, then offer to send notes to the agent (requires hunk on PATH)
Collapse/expand h / l or Space Toggle group collapsed state
Move group J / K Reorder group down / up (persisted)
Move group top/bottom < / > Pin group to top / bottom
Collapse/expand all zM / zR or - / = Collapse or expand all groups
Hide idle f Toggle hiding idle sessions
Cycle prompt p Prompt display for the summary/prompt cell: inline → own row → off
Cycle group-by b Cycle through group-by modes
Help ? Show keyboard shortcuts overlay
Quit q / Esc Exit the picker
New session dialog keys

Opened with n, or from the row menu (m, or right-click) on a session row or a group header. Every field has a default, so n Enter spawns straight away.

Action Key
Next / prev field Tab / Shift+Tab
Move within a field j / k or ↑ / ↓
Pick by number 1–9
Where it runs 1 This checkout / 2 New worktree
Name the worktree Type on the Name row (worktree destinations only)
Spawn Enter
Cancel Esc

Movement and number keys apply to the focused field, so 2 picks the second agent on the Agent field and the second placement on the Placement field. In the Prompt and Name fields every key is text, so ↑ / ↓ (or Ctrl+P / Ctrl+N) move between fields there instead.

Where picks between this checkout and a new git worktree, whose branch is cut from the main checkout’s current branch. Choosing a different base ref is CLI-only (ccmux spawn --worktree --base <ref>). Moving changes is the one exception: its worktree is cut from the HEAD of the checkout the changes came out of, so the work lands on the history it was written against rather than on whatever the main checkout happens to be on.

Choosing the worktree adds a Name row showing the name it would create, derived from the prompt and updated as you type. Type over it to name the worktree yourself; clear the field to hand the name back to the prompt. The two are not the same request: a derived name that collides with an existing worktree is numbered (-2), which is what the row’s auto · -2 if taken note means, while a name you typed opens that worktree if it is already there. Names are slugified the way ccmux spawn --worktree <name> slugifies them, so Fix Sidebar Flicker becomes fix-sidebar-flicker, and a name is enough on its own — a worktree no longer needs a prompt to be spawnable. A name with nothing to slugify (punctuation, a non-Latin script) is refused when you confirm rather than quietly replaced by the derived one.

Opened from Move changes, the same dialog runs in move mode: the title says so, Where is locked to the new worktree (there is nowhere else the changes can go), the same editable Name row is there, and an Untracked field appears — 1 move, 2 copy to both, 3 leave here. Tab skips the locked field. See Moving Uncommitted Changes.

Opened with F or from Fork it runs in fork mode: the title says so, a Source row names the conversation being continued, and the Agent and Prompt rows are gone — a fork continues the source’s agent and its history, so there is nothing to pick and no first message to write. Where starts on this checkout and Placement on a split, so F Enter forks straight into a pane beside the original. Choose the new worktree instead and the Name row appears, previewing <branch>-fork; where no name can be derived (the source is on a detached HEAD, or on a branch with nothing in it to slugify) the row asks you to type one rather than promising an automatic name. A source outside a git repository has the choice locked to its own checkout. See Forking Sessions.

In a pane too short for every row, the dialog drops what it can spare before anything you act on — the mode note (a move’s, or a fork’s Source row), then the blank line, then the option lists become scrolling windows, and the directory row last; below the height its fields need, it says how many rows it wants instead of drawing over itself, and the number keys go quiet while it does.

The working directory is derived, not typed: a session row uses that session’s directory, a group header uses the group’s, and no selection falls back to where the picker was launched. The picker jumps to the new pane, and a one-shot picker then closes while a --persistent board stays open; the sidebar spawns into the window’s main area without stealing focus.

Search mode keys
Action Key
Navigate results ↑ / ↓ or Ctrl+N / Ctrl+P
Select Enter
Cancel Esc
Preview focus mode

When preview is focused (Tab), keystrokes are forwarded to the tmux pane. These keys still work:

Action Key
Navigate sessions Ctrl+N / Ctrl+P
Resize preview Alt+H / Alt+L
Scroll preview Ctrl+D / Ctrl+U
Exit focus Tab / Esc