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 on | Verbs |
|---|---|
| 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
⌘Ksays which session said it;⌘Fsays 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 pullyou 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.⌘⇧Mis 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
| Key | Does |
|---|---|
| ⌘1–⌘9 | Go 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 |
| ⌘⇧R | Run next — queue a follow-on command behind the focused session |
| ⌘⇧E | Open Queue prompt… for the focused live session (customizable) |
| ⌘J | Triage the next session that needs you |
| ⌘T | New session in the current project — the type you last picked from + |
| ⌘⇧T | The same, as an unassigned session with no project |
| ⌃⌘T | Reopen the last closed session (customizable) |
| ⌥⌘T | Open new session options |
| ⌘N / ⌘⇧N | The plain pair — just a shell, in the project or outside one |
| ⌘K | Command palette |
| ⌘P | Quick run |
| ⌘⇧M | Monitor — a persistent, docked ⌘P |
| ⌘D | Show a second session beside the current one |
| ⌘] | Move the keyboard between split panes |
| ⌘⇧W | Collapse the split |
| ⌘I | Add an image to the focused agent session |
| ⌃⌘I | Annotate a file's lines and add the comments to the focused agent session |
| ⌘F | Find in this terminal |
| ⌘⇧J | Browse this terminal's prompt history |
| ⌘⇧↑ / ⌘⇧↓ | Jump to the previous / next prompt |
| ⇧PageUp / ⇧PageDown | A 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 |
| ⌘L | Filter the project menu |
| ⌥⌘N | Create a project |
| ⌘⇧O | Add a project |
| ⌘⇧G | View the current project on GitHub |
| ⌥⇧⌘W | Worktree 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 |
| ⌥⌘W | Close this project |
| ⌥⌘1–⌥⌘9 | Choose 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 |
| ⌘⇧I | Show Sessions |
| ⌥⌘I | Show Passport |
| ⌘⇧/ | The whole list, on screen |
| ⌘, | Settings |
| ⌘Q | Hold to quit — with a warning while anything is still running |