Skip to main content

Keyboard and the palette

The app is meant to be driven without the pointer. Everything the pointer can reach is in the palette, the sessions themselves are one digit away, and if you ever can't remember a binding, ⌘⇧/ puts the whole list on screen. The hard part was never a missing chord, it was remembering them.

Customizing shortcuts

Open Settings ▸ Keyboard shortcuts, click an app shortcut, then press its replacement. Every chord needs ⌘, and Saggar refuses one that another app shortcut already uses. Menus, hints, onboarding, the command palette, and the shortcut sheet update to show the current bindings. Each binding, or the whole set, can be restored to its default.

A reserved set can't be taken or rebound:

  • the plain ⌘ chords for the digits and for A, C, G, H, M, N, O, Q, T, V, W, X, Z, comma, equals, and minus — the standard macOS commands, text size, and ⌘1– ⌘9;

  • Saggar's own fixed chords: ⌘⇧A, ⌘⇧C, ⌘⇧G, ⌘⇧N, ⌘⇧O, ⌘⇧T, ⌘⇧[, ⌘⇧], ⌥⌘W, ⌥⇧⌘W, and ⌥⌘1–⌥⌘9.

The palette — ⌘K

An empty palette leads with the ↵ again ghost, the session you last jumped to, one key away. Then come the on-screen session's own verbs — pop it into its own window, add an image, supervise or stop supervising, show its conversation or its terminal, find, run next, queue a prompt, copy the last command's output. Behind those sit the review and clean-up agents, then the verbs that act across every session at once — close all the idle ones, tell every idle agent to continue, accept every waiting prompt, walk the triage queue — and, further down, collect recent errors into the scratchpad.

Everything that opens a session is here too:

  • a plain session, or any model in your agent roster;
  • your own session presets;
  • in a git checkout, each agent again in a fresh worktree, and a bare new session in one — presets get no worktree row;

  • the project's layout, its saved commands, and its scheduled tasks on demand;

  • the newest five sessions it remembers closing, reopened by name with how long ago they went — the most recent sits in the resting list, the rest wait for a needle;

  • an unassigned session, and a quick run.

The git chips are verbs as well — push and pull appear only when the counters have something to move, wearing ↑3 / ↓2 as their subtitle. The rest is the quieter chrome, all findable by name: rename and close, open in your editor, reveal, copy path, view on GitHub, favorite, hide, settings, arming remote control, terminal text size.

Start typing and the sessions join in, fuzzy-ranked against the verbs: jump rows wearing their live status dot, and projects to open. Lead with > to browse the verbs alone. The catalog is longer than the rows it shows, on purpose — the palette shows at most twelve rows, an empty one offers the primary set, and the long tail waits for a needle, because a list you scan should be the handful you would have reached for.

Searching inside terminals

Three or more characters and the palette also matches what is inside your terminals — every session whose buffer or scrollback contains the text, literal and case-insensitive, joins the results as a Found in … row with its freshest matching line as the subtitle. This is the “which one printed that error” case. Name and verb matches keep the top of the list, with four of the twelve rows reserved so a page of name matches can never crowd the content hits out. Buffers are snapshotted once when the palette opens, so the search costs nothing per keystroke.

Every verb

The whole catalog, by what it acts on. Rows appear only when they have something to do: the output verbs need a completed command, restart needs a shell that has ended, and the worktree rows need a git checkout.

Acts onVerbs
The session on screen

Pop this session into its own window · Add image… · Supervise this session / Stop supervising this session · Decide and continue · Show the conversation / the terminal for this session · Find in this terminal · Run next… · Queue a prompt for this session… · Copy the last command's output · Send the last command's output to the scratchpad · Open the last command's output in your editor · Jump to the previous / next prompt · Show a second session beside this one · Move the keyboard between split panes · Collapse the split · Rename this session… · Restart this session · Save this terminal's transcript… · Clear terminal · Reset terminal · Close this session

Every session

Review all open sessions and suggest next steps · Clean up sessions · Close all idle sessions · Tell every idle agent to continue · Accept every waiting agent prompt · Triage: go to the next session that needs you · Send a command to several sessions…

Opening

New session · New session with each agent and model · New session from each preset · New session in a new worktree… · each agent in a new worktree · Open the project's layout · Run each saved command · Run scheduled task … now · Reopen a closed session · New unassigned session · Start a quick run…

The project

Push / Pull · Collect recent errors into scratchpad · the tasks discovered in the project · Open in your editor · Reveal in Finder · Copy path · View on GitHub · Close project · Favorite / Unfavorite · Hide / Unhide

The app

Add a project… · Scan for repos · Open Claude Code on the web · Open Codex Cloud · Show the welcome again · Ports · Keyboard shortcuts · Open settings… · Show remote control pairing instructions · Arm / Disarm remote control · Bigger, smaller, and reset terminal text

Inside one terminal

Find — ⌘F

⌘K says which session said it; ⌘F says where. A small bar floats over the terminal in front of you, searching live as you type with the match scrolled into view, ↵ and ⇧↵ stepping through, and an honest “3 of 14” beside the field. Esc hands the keyboard straight back to the shell, and the query is remembered for the next ⌘F.

Jump to prompt — ⌘⇧↑ / ⌘⇧↓

Walk the terminal command by command. Every prompt records where it landed, and the jump puts the previous or next one at the top of the viewport — the head of a long build's output in one press instead of fifty wheel turns. ⌘⇧↓ past the last prompt lands back on the live bottom.

Quick run — ⌘P

The git pull you would otherwise open a whole terminal for while an agent holds the one you're in. Type one command and it runs in a live panel floated over the corner, in the selected terminal's exact directory, worktree and all. The panel never takes focus and the selection never moves. It runs as a one-shot, so a clean finish ends with a real exit code and the panel folds itself away after a readable beat; a failure leaves a live prompt sitting in its own output, ready to click into and keep as an ordinary terminal. Fire a second before the first has folded and they stack up the edge rather than stealing each other's spot. ⌘⇧M is the persistent sibling — see the monitor dock.

Escape and text fields

Esc closes the frontmost panel before anything reaches the shell, in this order: create project, new session options, the shortcut sheet, the away summary, ports, worktree cleanup, then the image composer. The palette and the find bar take Esc themselves.

When a text view has the keyboard — the scratchpad, a notes field — the editor keeps ⌘F, ⌘↑ / ⌘↓, ⌘← / ⌘→, ⌘⇧↑ / ⌘⇧↓, ⌥⌘↑ / ⌥⌘↓, ⇧PageUp / ⇧PageDown, and ⌘Home / ⌘End, so they edit text rather than move sessions or scrollback.

Finding a listening process

⌘⇧P maps ports back to the session that started them, including processes left behind after a session closed. From there you can return to a live owner or explicitly release an orphan. See Project workspace for the ownership and safety rules.

Switching sessions

⌘1–⌘9 land on a session by its place in the menu. That order is stable unless Settings ▸ Notifications ▸ Move a waiting session to the top is on, which is off by default. Either way, hold ⌘ on its own for a second and each session's digit is drawn on its row, and on the panes on screen, so you read the number instead of remembering it. A chord is not a hold, so a second modifier, any keystroke, or ⌘-tabbing away takes the numbers straight back down, and ⌘K never flashes them.

Past nine, ⌘⇧] and ⌘⇧[ step through the whole menu, wrapping at both ends.

Every binding

KeyDoes
⌘1–⌘9Go to a session by its place in the menu (hold ⌘ to see the numbers)
⌘↓ / ⌘↑Next / previous session (⌘⇧] / ⌘⇧[ also work)
⌘← / ⌘→Back to the session you were last on / forward again
⌘↩Answer the session in front of you
⌘⇧A

Supervise this session — toggles supervision; passes to the shell when the focused session isn't an agent

⌘⇧RRun next — queue a follow-on command behind the focused session
⌘⇧EOpen Queue prompt… for the focused live session (customizable)
⌘JTriage the next session that needs you
⌘TNew session in the current project — the type you last picked from +
⌘⇧TThe same, as an unassigned session with no project
⌃⌘TReopen the last closed session (customizable)
⌥⌘TOpen new session options
⌘N / ⌘⇧NThe plain pair — just a shell, in the project or outside one
⌘KCommand palette
⌘PQuick run
⌘⇧MMonitor — a persistent, docked ⌘P
⌘DShow a second session beside the current one
⌘]Move the keyboard between split panes
⌘⇧WCollapse the split
⌘IAdd an image to the focused agent session
⌃⌘IAnnotate a file's lines and add the comments to the focused agent session
⌘FFind in this terminal
⌘⇧JBrowse this terminal's prompt history
⌘⇧↑ / ⌘⇧↓Jump to the previous / next prompt
⇧PageUp / ⇧PageDownA page of scrollback
⌥⌘↑ / ⌥⌘↓

The top / bottom of the scrollback (⌘Home / ⌘End also work)

⌘⇧C

Copy the last command's output — only once a command has completed under shell integration; otherwise the chord passes to the shell

⌘⇧K

Clear this terminal — screen and scrollback, since ⌘K is the palette here

⌘LFilter the project menu
⌥⌘NCreate a project
⌘⇧OAdd a project
⌘⇧GView the current project on GitHub
⌥⇧⌘WWorktree cleanup — prune the project's stale worktrees
⌘W

Close what's in front: the Sessions, Automations, or Passport page, then the Getting started tab, then a system terminal, then the focused session — and the window when none of those is open

⌥⌘WClose this project
⌥⌘1–⌥⌘9Choose an option on the top attention card
⌘/Toggle the scratchpad beside the session
⌃⌘S

Overlay the project menu — an edge you reach for rather than keeping it docked, at any window width

⌘= / ⌘- / ⌘0

Terminal text size — the app's own size is a separate dial in Settings ▸ Appearance

⌘⇧P

Ports — what's listening, and the processes that outlived their terminal

⌘⇧IShow Sessions
⌥⌘IShow Passport
⌘⇧/The whole list, on screen
⌘,Settings
⌘QHold to quit — with a warning while anything is still running