Keyboard Shortcuts
The shipped keybinding table: global shortcuts by context, Cmd+K chords and the command HUD, surface-local gestures, terminal key ownership, and rebinding in Settings > Keyboard.
Daintree ships 116 keyboard actions from a single table that both the app window and the native menu bar read. The renderer seeds its keybinding service from it and the main process derives its menu accelerators from it, so a menu item can never claim a chord the keyboard does not actually fire.
Two surfaces expose those bindings at runtime. The shortcut reference dialog (Command-K, then Command-S, or Command-/ Control-K, then Control-S, or Control-/ Control-K, then Control-S, or Control-/ ) is read-only and shows your effective bindings, including rebinds and anything a plugin contributed. Settings > Keyboard (Command-, Control-, Control-, ) is where you record, unbind, reset, and import or export profiles. This page lists the shipped defaults; the dialog is always the current answer for your install.
Notation and platform mapping
Every shortcut on this site is written for one platform at a time. Pick yours and the whole page follows — including the tables below, and every shortcut on every other page. The choice is remembered, so you only make it once.
- Each platform is written the way it writes itself: macOS uses modifier glyphs in Apple's order with no separators, while Windows and Linux spell the keys out and join them with
+. The Pilot binding is Option-Command-O Control-Alt-O Control-Alt-O either way. - A row showing Control on macOS (Control-Shift-J Control-Shift-J Control-Shift-J ) means the physical Control key, which is a different key from Command. On Windows and Linux it collapses onto the same chord as a Command row — which is why the diagnostics family uses Control rather than a letter already spent.
- A chord is two keystrokes in sequence, shown with a gap between them: Command-K, then Command-G Control-K, then Control-G Control-K, then Control-G means press the first, release, then press the second. Every shipped chord starts with the same first keystroke.
- A pending chord does not time out. It waits until you complete it, cancel it with Escape Escape Escape , blur the window, or change scope. Press Command-K Control-K Control-K on its own and the command HUD lists every completion.
Navigation
| Action | Shortcut |
|---|---|
| Open Quick Switcher | Command-P Control-P Control-P |
| Open command palette | Shift-Command-P Control-Shift-P Control-Shift-P |
| Repeat last action | Shift-Command-. Control-Shift-. Control-Shift-. |
| Focus next region | F6 F6 F6 |
| Focus previous region | Shift-F6 Shift-F6 Shift-F6 |
| Toggle sidebar | Command-B Control-B Control-B |
| Toggle focus mode (hide sidebar and assistant) | Command-K, then Command-F Control-K, then Control-F Control-K, then Control-F |
Repeat last action re-runs the last action you triggered through a palette or shortcut against the same target, without reopening the palette. Focus mode hides the worktree sidebar and the Daintree Assistant together so the panel grid takes the whole window; the same chord brings them back.
F6 F6 F6 is the one bare key that still reaches the app while a terminal has focus: it is the deliberate escape hatch out of a focused terminal for keyboard-only navigation. See terminal key ownership.
Terminals and panels
| Action | Shortcut |
|---|---|
| New terminal | Option-Command-T Control-Alt-T Control-Alt-T |
| Duplicate focused panel | Command-T Control-T Control-T |
| Close focused terminal | Command-W Control-W, or Control-F4 Control-W |
| Reopen last closed terminal | Shift-Command-T Control-Shift-T Control-Shift-T |
| Resume a closed session | Command-K, then Command-R Control-K, then Control-R Control-K, then Control-R |
| Close all terminals | Command-K, then Command-W Control-K, then Control-W Control-K, then Control-W |
| Restart all terminals | Command-K, then Command-A Control-K, then Control-A Control-K, then Control-A |
| Kill focused terminal | Command-K, then Command-Q Control-K, then Control-Q Control-K, then Control-Q |
| Restart focused terminal | Command-K, then Command-E Control-K, then Control-E Control-K, then Control-E |
| Force resume focused terminal | Command-K, then Command-U Control-K, then Control-U Control-K, then Control-U |
| Redraw focused terminal | Command-K, then Command-D Control-K, then Control-D Control-K, then Control-D |
| Rename focused terminal | Command-K, then Command-L Control-K, then Control-L Control-K, then Control-L |
| Toggle watch on focused terminal | Shift-Command-W Control-Shift-W Control-Shift-W |
| Scroll to last activity | Option-Command-L Control-Alt-L Control-Alt-L |
| Stash current input | Shift-Command-S Control-Shift-S Control-Shift-S |
| Restore stashed input | Shift-Command-X Control-Shift-X Control-Shift-X |
| Inject context into focused terminal | Shift-Command-I Control-Shift-I Control-Shift-I |
| Send selection to another terminal | Shift-Command-E Control-Shift-E Control-Shift-E |
| Arm all eligible terminals in the current worktree | Shift-Command-B Control-Shift-B Control-Shift-B |
| Find in focused panel | Command-F Control-F Control-F |
| Open focused panel context menu Or the Menu key | Shift-F10 Shift-F10 Shift-F10 |
Moving focus in the grid
| Action | Shortcut |
|---|---|
| Focus terminal above | Option-Command-Up Arrow Control-Alt-Up Arrow Control-Alt-Up Arrow |
| Focus terminal below | Option-Command-Down Arrow Control-Alt-Down Arrow Control-Alt-Down Arrow |
| Focus terminal to the left | Option-Command-Left Arrow Control-Alt-Left Arrow Control-Alt-Left Arrow |
| Focus terminal to the right | Option-Command-Right Arrow Control-Alt-Right Arrow Control-Alt-Right Arrow |
| Focus terminal 1–9 | Command-1, through Command-9 Control-1, through Control-9 Control-1, through Control-9 |
| Focus next terminal | Control-Tab Control-Tab Control-Tab |
| Focus previous terminal | Control-Shift-Tab Control-Shift-Tab Control-Shift-Tab |
| Toggle focus between current and previously focused panel | Option-Command-` Control-Alt-` Control-Alt-` |
| Switch to next tab in focused panel | Shift-Command-] Control-Shift-] Control-Shift-] |
| Switch to previous tab in focused panel | Shift-Command-[ Control-Shift-[ Control-Shift-[ |
panel.focusIndex action is deliberately pure focus and never maximizes, so an agent asking for "panel 3" gets the same result every time.Moving panels and docking
| Action | Shortcut |
|---|---|
| Toggle maximize terminal | Control-Shift-F Control-Shift-F Control-Shift-F |
| Move terminal left in grid | Option-Shift-Command-Left Arrow Control-Alt-Shift-Left Arrow Control-Alt-Shift-Left Arrow |
| Move terminal right in grid | Option-Shift-Command-Right Arrow Control-Alt-Shift-Right Arrow Control-Alt-Shift-Right Arrow |
| Move terminal up in grid | Option-Shift-Command-Up Arrow Control-Alt-Shift-Up Arrow Control-Alt-Shift-Up Arrow |
| Move terminal down in grid | Option-Shift-Command-Down Arrow Control-Alt-Shift-Down Arrow Control-Alt-Shift-Down Arrow |
| Move terminal to dock | Option-Shift-Command-D Control-Alt-Shift-D Control-Alt-Shift-D |
| Move terminal to grid | Option-Shift-Command-G Control-Alt-Shift-G Control-Alt-Shift-G |
| Toggle focused terminal dock state | Option-Command-M Control-Alt-M Control-Alt-M |
| Toggle all terminals dock state | Option-Shift-Command-M Control-Alt-Shift-M Control-Alt-Shift-M |
| Undo last layout change | Option-Command-Z Control-Alt-Z Control-Alt-Z |
| Redo last layout change | Option-Shift-Command-Z Control-Alt-Shift-Z Control-Alt-Shift-Z |
Other panels
| Action | Shortcut |
|---|---|
| Open panel palette | Command-N Control-N Control-N |
| Toggle portal panel | Command-\ Control-\ Control-\ |
| Toggle notification inbox | Shift-Command-N Control-Shift-N Control-Shift-N |
| Toggle diagnostics dock | Control-Shift-J Control-Shift-J Control-Shift-J |
| Open diagnostics dock to Logs tab | Control-Shift-L Control-Shift-L Control-Shift-L |
| Open diagnostics dock to Problems tab | Control-Shift-M Control-Shift-M Control-Shift-M |
The diagnostics family uses a literal Ctrl on all three platforms and toggles on J, not D. Shift-Command-D Control-Shift-D Control-Shift-D now opens changes for the focused worktree, and off macOS the command modifier is Control — so a diagnostics binding on D would land on that same physical chord, and one of the two would silently shadow the other. See Diagnostics.
(copy) appended to a custom title. With every panel closed it instead seeds a new terminal from the last-closed panel's configuration, and with no history at all it opens a blank terminal. That last-closed snapshot is session-only: it is not written to disk, switching projects clears it, and each close overwrites the previous one. Shift-Command-T Control-Shift-T Control-Shift-T is the different thing — it restores the actual panel from the trash, scrollback and all. See Terminals & Panels.Agents
| Action | Shortcut |
|---|---|
| Open agent quick switcher | Shift-Command-A Control-Shift-A Control-Shift-A |
| Launch Claude Code agent | Option-Command-C Control-Alt-C Control-Alt-C |
| Launch Gemini agent | Option-Command-G Control-Alt-G Control-Alt-G |
| Launch Codex agent | Option-Command-X Control-Alt-X Control-Alt-X |
| Launch OpenCode agent | No default shortcut No default shortcut No default shortcut |
| Launch Cursor agent | No default shortcut No default shortcut No default shortcut |
| Launch Kiro agent | No default shortcut No default shortcut No default shortcut |
| Launch GitHub Copilot agent | No default shortcut No default shortcut No default shortcut |
| Launch Kimi Code agent | No default shortcut No default shortcut No default shortcut |
| Launch terminal in current worktree | Option-Command-N Control-Alt-N Control-Alt-N |
| Launch browser panel in current worktree | Option-Command-B Control-Alt-B Control-Alt-B |
| Jump to next waiting agent | Option-Command-/ Control-Alt-/ Control-Alt-/ |
| Jump to next waiting agent across all projects | Option-Shift-Command-/ Control-Alt-Shift-/ Control-Alt-Shift-/ |
| Jump to next working agent | Option-Command-. Control-Alt-. Control-Alt-. |
| Jump to next waiting dock agent | Shift-Command-/ Control-Shift-/ Control-Shift-/ |
| Cycle to next agent panel | Option-Command-K Control-Alt-K Control-Alt-K |
| Cycle to previous agent panel | Option-Command-J Control-Alt-J Control-Alt-J |
| Launch help agent | Shift-Command-H Control-Shift-H Control-Shift-H |
Only three of the shipped agents carry a default launch shortcut. Every other built-in agent has a registered action with no combo, so it shows in the reference dialog as unbound and is free for you to claim. See AI Agents for the roster and Agent States for what waiting, working, and exited mean — the jump shortcuts above navigate by exactly those states.
+ menu. In that launcher, Option-P Alt-P Alt-P pins the selected row; it has to be modified because the launcher's list is driven by a type-ahead search box where a bare letter is a query.The all-projects jump (Option-Shift-Command-/ Control-Alt-Shift-/ Control-Alt-Shift-/ ) walks projects in sidebar order, switches to the first one holding a waiting agent, and focuses it. It wraps from the bottom back to the top, so repeated presses step through every project without leaving the keyboard.
Fleet
Fleet arming selects a set of agent terminals and broadcasts one action to all of them. See Fleet for the full model.
| Action | Shortcut |
|---|---|
| Toggle arm focused pane ("Join the fleet") | Command-J Control-J Control-J |
| Toggle arm focused pane Worktree grid only, no modifier | X X X |
| Arm all eligible terminals in current worktree | Option-Command-A Control-Alt-A Control-Alt-A |
| Accept all armed waiting agents | Command-Y Control-Y Control-Y |
| Reject all armed waiting agents | Shift-Command-Y Control-Shift-Y Control-Shift-Y |
| Restart all armed agents | Shift-Command-R Control-Shift-R Control-Shift-R |
| Kill all armed terminals | Shift-Command-K Control-Shift-K Control-Shift-K |
| Trash all armed terminals | Shift-Command-Backspace Control-Shift-Backspace Control-Shift-Backspace |
| Interrupt armed agents (within 350 ms) Double-tap Not rebindable | Escape, then Escape Escape, then Escape Escape, then Escape |
The bare X X X arm toggle is scoped to the worktree grid, so it only fires when focus is outside a terminal — inside one it is just the letter X. Both Option-Command-A Control-Alt-A Control-Alt-A and the terminal-category Shift-Command-B Control-Shift-B Control-Shift-B arm every eligible terminal in the current worktree; they are two bindings onto the same effect, kept because the fleet ribbon and the terminal surface each teach their own.
Interrupt is not a rebindable entry in the keybinding table. It is a double-tap handler, because a single binding would collide with the escape stack that dismisses modals. The first bare Esc passes through untouched so xterm still broadcasts a raw escape to every armed agent; the second, within 350 ms, is consumed and translated into the fleet interrupt. Auto-repeat from a held Esc is ignored, and a double-tap inside an ordinary text input belongs to that input. A single Esc still clears a pending fleet confirmation or disarms the fleet.
There is a second way to reach it. Command-Escape Control-Escape Control-Escape is the Fleet exit chord, and it is held for 350 ms before it fires; a second Command-Escape Control-Escape Control-Escape inside that window cancels the exit and interrupts instead. The second press has to carry the modifier — a bare Esc takes the bare-Escape path above and lets the pending exit through. Neither Escape chord is a rebindable entry: both are handled by a dedicated window listener so they can sidestep the escape stack. See Fleet.
Worktrees
| Action | Shortcut |
|---|---|
| Switch to worktree 1–9 | Option-Command-1, through Option-Command-9 Control-Alt-1, through Control-Alt-9 Control-Alt-1, through Control-Alt-9 |
| Switch to next worktree | Option-Command-] Control-Alt-] Control-Alt-] |
| Switch to previous worktree | Option-Command-[ Control-Alt-[ Control-Alt-[ |
| Open worktree palette | Command-K, then Command-O Control-K, then Control-O Control-K, then Control-O |
| Create a new worktree | Command-K, then Command-N Control-K, then Control-N Control-K, then Control-N |
| Toggle worktrees overview | Shift-Command-O Control-Shift-O Control-Shift-O |
| Copy tree context for active worktree | Shift-Command-C Control-Shift-C Control-Shift-C |
| Open changes for focused worktree | Shift-Command-D Control-Shift-D Control-Shift-D |
| Open file browser panel for focused worktree | Option-Command-F Control-Alt-F Control-Alt-F |
See Worktrees, Worktrees Overview, and CopyTree.
Worktree sessions
These act on every session in the active worktree at once.
| Action | Shortcut |
|---|---|
| Dock all sessions in active worktree | Command-K, then Command-M Control-K, then Control-M Control-K, then Control-M |
| Maximize all sessions in active worktree | Command-K, then Command-X Control-K, then Control-X Control-K, then Control-X |
| Reset renderers for all sessions in active worktree | Command-K, then Command-V Control-K, then Control-V Control-K, then Control-V |
Projects and Pilot
| Action | Shortcut |
|---|---|
| View all agents (Pilot overview) | Option-Command-O Control-Alt-O Control-Alt-O |
| Open project switcher | Option-Command-P Control-Alt-P Control-Alt-P |
| Switch to last project | Option-Command-= Control-Alt-= Control-Alt-= |
Pilot sits one step further out than the project switcher beside it: the switcher picks a project, Pilot shows every agent run across every project at once. Switch to last project walks your most-recently-used stack rather than sidebar order — the equivalent of Alt-Tab for projects. There is no forward-cycling counterpart; the earlier Option-Shift-Command-= Control-Alt-Shift-= Control-Alt-Shift-= binding was removed.
Git
| Action | Shortcut |
|---|---|
| Stage all changes | Command-K, then Command-G Control-K, then Control-G Control-K, then Control-G |
| Commit staged changes | Command-K, then Command-C Control-K, then Control-C Control-K, then Control-C |
| Push to remote | Command-K, then Command-P Control-K, then Control-P Control-K, then Control-P |
Portal
Scoped bindings: they resolve only while the portal browser has focus, and they outrank the global bindings that share their combos. See Portal Browser.
| Action | Shortcut |
|---|---|
| New portal tab | Command-T Control-T Control-T |
| Close active portal tab | Command-W Control-W, or Control-F4 Control-W |
| Next portal tab | Control-Tab Control-Tab Control-Tab |
| Previous portal tab | Control-Shift-Tab Control-Shift-Tab Control-Shift-Tab |
Dev preview
| Action | Shortcut |
|---|---|
| Reload dev preview | Command-R Control-R Control-R |
Also scoped: Command-R Control-R Control-R reloads only the dev preview panel that has focus, and does nothing anywhere else.
View
| Action | Shortcut |
|---|---|
| Zoom in | Command-=, or Shift-Command-= Control-=, or Control-Shift-= Control-=, or Control-Shift-= |
| Zoom out | Command-- Control-- Control-- |
| Reset zoom | Command-0 Control-0 Control-0 |
Voice
| Action | Shortcut |
|---|---|
| Toggle voice dictation for the focused panel | Shift-Command-V Control-Shift-V Control-Shift-V |
| Toggle voice dictation in the Daintree Assistant, from anywhere | Option-Shift-Command-V Control-Alt-Shift-V Control-Alt-Shift-V |
| Pause or resume voice dictation | Control-Shift-Space Control-Shift-Space Control-Shift-Space |
The two toggles differ by target, not by mode. Shift-Command-V Control-Shift-V Control-Shift-V dictates into whichever panel input has focus; Option-Shift-Command-V Control-Alt-Shift-V Control-Alt-Shift-V dictates into the Daintree Assistant without needing to focus it first. Pause suspends a session without ending it, so the transcript continues where it left off. See Voice Input.
Help, app, and system
| Action | Shortcut |
|---|---|
| Open keyboard shortcuts reference | Command-K, then Command-S, or Command-/ Control-K, then Control-S, or Control-/ Control-K, then Control-S, or Control-/ |
| Toggle Daintree Assistant panel | Command-L Control-L Control-L |
| Open theme palette | Command-K, then Command-T Control-K, then Control-T Control-K, then Control-T |
| Open settings | Command-, Control-, Control-, |
| Open a new window | Option-Shift-Command-N Control-Alt-Shift-N Control-Alt-Shift-N |
Windows-only additions
Two extra defaults ship on Windows, matching what desktop users there already expect: Ctrl+F4 also closes the focused terminal, and also closes the active portal tab. They are additions, not replacements — the cross-platform bindings still work, and both rows above already show the alternative when Windows is selected.
These two are written out rather than rendered, because they exist on one platform only. A rendered shortcut follows whichever platform you have selected, which would spell this one ⌃F4 on macOS — a chord that does not exist.
AltGraph modifier, so layouts that use AltGr to type €, @, {, or } still produce those characters instead of firing a Ctrl+Alt+letter binding.Surface-local gestures
Not every key in Daintree is a keybinding. A surface-local gesture is a key handled by one panel, tree, or palette while that surface has focus. It is deliberately not a registered action, because the command only means anything in the presence of local state the global registry cannot see — which row is selected, which file is current, which tree owns the cursor. The consequence for you: these do not appear in the shortcut reference dialog, they are not rebindable, and they cannot conflict with a global binding.
| Gesture | Surface | What it does |
|---|---|---|
| Command-I Control-I Control-I | File browser tree | Appends an @file reference for the selected row to the focused agent's input. Only fires while a row is selected and an agent is reachable. The path is relativized against the destination agent's working directory, so a same-worktree reference stays short and a cross-worktree one falls back to absolute. |
| [ / ] | Diff review workspace | Step to the previous / next file in the change set. |
| v | Diff review workspace | Mark the current file viewed. |
| Alt+Left / Alt+Right | Terminal, macOS only | Word jump in the shell line editor. |
| Option-P Alt-P Alt-P | Launcher | Pin the selected row. |
| Shift, then Shift Shift, then Shift Shift, then Shift | Global | Double-tap Shift opens the action palette. Invalidated if any other key is pressed while Shift is held. |
| Command-Enter Control-Enter Control-Enter | Project switcher palette | Open the selected project in a new window. A scratch workspace has no second window, so the chord falls through to a plain switch. |
| Command-Backspace Control-Backspace Control-Backspace | Project switcher palette | Close the selected project. Projects only — it does not target scratch rows, because that would put a reversible close and an irreversible delete on one key. |
| j / k / arrows, Home / End, Enter | Notification inbox | Move and open. e archives the focused row (or permanently deletes it in the Archived tab), u toggles read/unread, h opens the snooze menu on a correlated row. |
| j / k / arrows, PageUp / PageDown, Home / End, Space / Enter | Worktree list | Move and open. Enter or Right reaches a row's toolbar; Alt+Up / Alt+Down reorders. Keyboard drag-and-drop: Space picks a row up, arrows move it. |
| Esc | Any overlay | Dismisses the topmost modal, palette, or popover. Owned by the escape stack rather than the keybinding table, which is why it is last-opened-first-closed and never rebindable. |
Command-I Control-I Control-I is the clearest example of why the distinction exists. The global registry dispatches in the capture phase, before any tree could tell it which row is active, so an action would have to re-infer the focused browser, its worktree, and its base path. The gesture stays with the tree. Shift-Command-I Control-Shift-I Control-Shift-I , one Shift away, is a real global binding that injects context into the focused terminal — the gesture requires Shift and Alt to be absent rather than merely ignoring them, so the two never both fire.
Terminal key ownership
A focused terminal is a program in its own right, and the keys that program needs cannot also be app shortcuts. One shared policy decides this, consulted by both the window's capture handler and xterm's own key handler, so the two layers can never disagree about who owns a key.
While a terminal has focus:
- Shortcuts without a modifier reach the terminal, not the app. F6 F6 F6 region cycling is the deliberate exception, so keyboard-only users always have a way out.
- The readline family is reserved. Bare Ctrl with
a b d e f h j k l n p r t u w ygoes to the PTY. That includes Ctrl+J, Ctrl+L, Ctrl+T, and Ctrl+Y, which are accept-line, clear-screen, transpose, and yank — every bit as load-bearing as the rest. - A pending chord still wins. If you have already pressed Command-K Control-K Control-K , the completion resolves as a shortcut even inside a terminal, because you opened that chord deliberately.
- Tab and Shift+Tab pass through to the PTY for shell completion and TUI navigation. Daintree cancels the browser's native focus traversal but still lets xterm emit the tab sequence, so completion works without focus jumping out of the panel.
- Bare F11 no longer toggles fullscreen. Same mechanism: the DOM path is cancelled so the key cannot reach the window's fullscreen accelerator, and the F11 sequence still reaches the PTY. Use the View menu, or Ctrl+Cmd+F on macOS, to go fullscreen from a focused terminal.
Clipboard keys are where the platforms genuinely part ways.
Terminal copy and paste use Cmd+C and Cmd+V, served by the native Edit menu roles. Nothing extra is reserved: Ctrl+C reaches the shell as an interrupt, which is what you want.
Alt+Left and Alt+Right jump by word in the shell line editor. Daintree substitutes the meta sequences zsh and bash actually bind, because xterm's default modifier-arrow sequence is bound to nothing in a default shell. The rewrite applies only on the normal buffer — a full-screen TUI decodes those arrows itself and is left alone.
Ctrl+Shift+C, Ctrl+Shift+V, and Shift+Insert are reserved for the terminal's own copy and paste, following the usual terminal convention. Plain Ctrl+C reaches the shell as an interrupt.
Because the command modifier is Ctrl here, the reserved readline keys shadow the global Command-J Control-J Control-J , Command-L Control-L Control-L , Command-T Control-T Control-T , and Command-Y Control-Y Control-Y bindings while a terminal has focus. Fleet arming, the assistant toggle, duplicate panel, and fleet accept are all reachable from the palette, the menus, or a rebind onto a shifted combo.
Word jump in the shell line editor is left to the shell: the meta-sequence rewrite is macOS-only.
Ctrl+Shift+C, Ctrl+Shift+V, and Shift+Insert are reserved for the terminal's own copy and paste. Shift+Insert pastes the CLIPBOARD selection, not X11 PRIMARY — the browser clipboard API does not expose PRIMARY. Plain Ctrl+C reaches the shell as an interrupt.
Because the command modifier is Ctrl here, the reserved readline keys shadow the global Command-J Control-J Control-J , Command-L Control-L Control-L , Command-T Control-T Control-T , and Command-Y Control-Y Control-Y bindings while a terminal has focus. Reach those actions from the palette, the menus, or rebind them onto a shifted combo.
Word jump in the shell line editor is left to the shell: the meta-sequence rewrite is macOS-only.
The Cmd+K command HUD
Press Command-K Control-K Control-K and release, and a searchable command HUD opens anchored to the bottom of the window. It lists every completion of that layer — the whole curated power-command set — grouped by category, each row carrying its second key as a chip.
- Type to filter. The query matches both the command's label and its key chip.
- Arrow keys move the selection, Enter runs it, and clicking a row does the same.
- Holding the modifier still completes the chord. Pressing Command-G Control-G Control-G while the HUD is open stages your changes exactly as it would have if you had typed the chord quickly. The HUD is a discovery aid layered onto the chord, not a mode you have to leave.
- Esc cancels and hands focus back to whatever had it — unless the completed chord opened and focused something else, in which case the HUD leaves that alone rather than yanking focus back.
Type the full chord quickly and the HUD never appears, so it stays out of the way once a chord is in your fingers.
The shortcut reference dialog
Open it with Command-K, then Command-S, or Command-/ Control-K, then Control-S, or Control-/ Control-K, then Control-S, or Control-/ ; both run the same action. It is read-only, and it is the surface to trust when this page and your install disagree — it renders your effective bindings, so rebinds, imported profiles, and plugin contributions all show up, and it updates live as you change them in Settings.
Rows are grouped by category, ordered Terminal, Agents, Worktrees, Panels, Navigation, Help, System, then everything else alphabetically. Each row carries the action's description, a scope label when the binding is not global, and the current combo as a chip.
The search field does two things:
- Fuzzy text search across descriptions, keywords, action ids, and categories. Type
committo find the git chord; typeunboundto list every action shipping without a combo, which is how you hunt for a free slot. - Chord-prefix matching when the query looks like a chord. Type
Cmd+Kand the list narrows to every binding starting with it.
Customizing shortcuts
Every binding above can be reassigned, and any action without one can be given a combination. Opening the editor, recording a chord, resolving a conflict, and resetting to defaults are covered at Customize Shortcuts.
How Daintree teaches its shortcuts
Two mechanisms exist so you learn bindings without reading this page.
- Shortcut hints. When you run an action by clicking — a toolbar button, a menu item, a panel control — Daintree shows the keyboard equivalent beside the pointer. It fires on the 1st, 2nd, 4th, 8th, 16th, and 32nd time you use that action and then stops for good, so it teaches on a curve rather than nagging. Hints are suppressed when the action opened a modal that would cover them.
- Undo for a vanishing region. Pressing Command-B Control-B Control-B by accident hides the whole worktree sidebar with nothing on screen connecting the disappearance to what you pressed. When a bare keypress hides a region, Daintree raises a 30-second notice naming the combo that did it and offering an Undo. It appears at most three times for a given action and combo, then assumes the gesture is yours. Only keypresses get this: a menu item or toolbar button names itself at the moment of the click.
Accessibility
Shortcuts are exposed to assistive technology through the W3C aria-keyshortcuts attribute, so NVDA, JAWS, and VoiceOver announce the combo alongside the control's label — formatted Meta+Shift+P on macOS and Control+Shift+P elsewhere.
Chords are deliberately left out of aria-keyshortcuts: the specification has no way to express a sequence of keystrokes, so a chord written into that attribute would be announced as something the user cannot press. Chords stay discoverable through the command HUD and the reference dialog instead.
Tooltips across the toolbar, panel headers, and dock render shortcuts as key chips. The visible chip is marked aria-hidden and a single screen-reader span carries the readable label, so the announcement never doubles.
F6 F6 F6 and Shift-F6 Shift-F6 Shift-F6 cycle focus between the app's regions and are the one bare-key exception to terminal key ownership, so a focused terminal is never a keyboard trap.