Keyboard reference
Keyboard shortcuts for Smalti on every platform. This page is generated from docs/keymap.md in the app repository.
The keymap tracks the development version of the app. Some commands listed here, such as the command palette, Places and Navigate Mode, may not be in the current release yet.
This is the source of truth for every Smalti platform: macOS, iPadOS and iOS with a hardware keyboard, and Windows. The Mac app's command registry (Sources/Smalti/Keymap.swift) generates the menu bar, the command palette and the ? overlay, and a test checks that every command and chord in the registry appears in this file. Change both together.
Principles
- One palette teaches the rest.
⌘Kfinds every command, panel, session, file and host, and shows each command's shortcut beside it. Commands without a shortcut have a short palette alias (typeclthen Return for Claude Here). You only need to learn⌘Kon day one. - The terminal keeps its keys. Ctrl, Alt/Option and Esc always reach the shell, vim, tmux and Claude Code. Every Smalti chord on Apple platforms includes
⌘, which never reaches a PTY. The only bare keys Smalti reads are inside its own UI (palette, session list, Navigate Mode), never while a terminal has focus. - Few modifiers, one grammar.
⌘is Smalti.⌘⌥plus a direction is about panels: it moves focus. Add⇧to carry the panel with you. Directions are the arrows orh j k l. - Nothing moves under you. A new panel lands beside the focused one, or in its project's region, and never pushes other panels. Only Arrange by Project rearranges, and only when asked.
Platform mapping
| Mac / iPad | Windows | Notes |
|---|---|---|
| ⌘ + key | Ctrl+Shift + key | Ctrl+letter belongs to the shell on Windows; Ctrl+Shift is the Windows Terminal and VS Code convention for "app, not shell". |
| ⌘⌥ + arrow or digit | Alt + arrow or digit | Matches Windows Terminal's pane focus keys. Ctrl+Alt+arrow is avoided because some drivers rotate the screen. |
| ⌘⌥ + h j k l | none | Mac and iPad only. Alt+letter is Meta in a Windows terminal. Use the arrows there. |
| ⌘⌥ + other letter | Ctrl+Shift+Alt + letter | |
| Esc in Smalti's own UI | Esc | The iPad Magic Keyboard has no Esc key: ⌘. works everywhere Esc does. |
Avoided on purpose: ⌘Space, ⌘Tab, ⌘H, ⌘M, ⌘Q, ⌘⇧3, ⌘⇧4, ⌘⇧5 (system screenshots, which is why Places are ⌘1..9 and not ⌘⇧1..9), Globe-key combos on iPad, and anything with Win on Windows. ⌥⌘H is normally Hide Others; Smalti drops that menu item so the h of h j k l works.
The seven to learn first
| Action | Mac / iPad | Windows |
|---|---|---|
| Command Palette | ⌘K | Ctrl+Shift+K |
| Next Item Needing You | ⌘J | Ctrl+Shift+J |
| Focus Panel Left / Right / Up / Down | ⌥⌘← ⌥⌘→ ⌥⌘↑ ⌥⌘↓ | Alt+Arrows |
| Move Panel (add Shift) | ⌥⇧⌘← and friends | Alt+Shift+Arrows |
| Zoom to Panel or Back | ⌘↩ | Ctrl+Shift+Enter |
| Overview (Zoom to Fit) / Go to Place 1 to 9 | ⌘0 / ⌘1 to ⌘9 | Ctrl+Shift+0 / Ctrl+Shift+1..9 |
| New Terminal / Close Panel | ⌘T / ⌘W | Ctrl+Shift+T / Ctrl+Shift+W |
Full keymap
General
| Command | Mac / iPad | Windows | Palette alias |
|---|---|---|---|
| Command Palette | ⌘K | Ctrl+Shift+K | |
| Next Item Needing You | ⌘J | Ctrl+Shift+J | nx |
| Show Keymap | ⌘/ (or ? when no text field or terminal has focus) | Ctrl+Shift+/ | ? |
| Navigate Mode | ⇧⌘space | Ctrl+Shift+Space | nv |
| Tell the Conductor | ⌘I (one line to the Conductor; opens the Mission panel) | Ctrl+Shift+I | tc |
| New Factory | palette (opens the Mission panel on the page's New factory form; docs/factories.md) | Mac only | nf |
| Switch Factory | palette (a menu of the Conductor's factories; the ⌘I bar and voice talk to the one shown) | Mac only | sf |
| Talk to the Factory | palette, or the mic in the ⌘I bar (hands-free voice with the factory shown; say "stop" to stop it) | Mac only | tf |
| Open Folder | ⌘O | Ctrl+Shift+O | of |
| Getting Started Tour | palette (a short tour of the app, shown once on first run; docs/tour.md) | palette | gs |
| Detachable Terminals On or Off | palette (off by default; with smaltid, agents run in its terminals and survive a quit) | palette | dt |
| Run in the Background | palette (smaltid and the Conductor as login agents from the app bundle) | Mac only | bg |
| Install Claude Code Hooks | palette (shows the settings.json change before applying it) | Mac only | hk |
| Pair a Phone | palette (QR code for the iPhone and iPad app; also offered on first run) | Mac only | pp |
| Add a Machine | palette, or + under Machines (a join code for a shard, docs/shard.md) | Mac only | am |
| Sounds On or Off | palette (on by default; also silent when macOS interface sounds are off) | palette | snd |
| Menu Bar Icon On or Off | palette (on by default; the Smalti mark with the Needs you count and a menu) | Mac only | mb |
| Hold New Agent Launches | palette | palette | hl |
| Release Held Launches | palette | palette | rl |
Panels
| Command | Mac / iPad | Windows | Palette alias |
|---|---|---|---|
| New Terminal | ⌘T (beside the focused panel, first free side of right, below, left, above) | Ctrl+Shift+T | nt |
| New Terminal Right | ⌘D | Ctrl+Shift+D | sr |
| New Terminal Below | ⌥⌘D | Ctrl+Shift+Alt+D | sb |
| New Terminal Left | palette | palette | sl |
| New Terminal Above | palette | palette | sa |
| Claude Here | ⌘L (a terminal running claude in the focused panel's directory) | Ctrl+Shift+L | cl |
| Resume Selected Session | ⌘R | Ctrl+Shift+R | rs |
| New Browser | ⌘B | Ctrl+Shift+B | nb |
| New Note | ⇧⌘N | Ctrl+Shift+N | nn |
| New Graph Panel | palette | palette | ng |
| New CI Panel | palette | palette | ci |
| Show Mission | palette (the Conductor's mission view; opens one if none) | palette | ms |
| Show Changes | palette (cwv2 merge queue, changesets and reviews; listed only when CW2_URL is set) | palette | ch |
| Show Decisions | palette (a decision timeline for the focused panel's project) | palette | dg |
| Close Panel | ⌘W | Ctrl+Shift+W | x |
Focus
| Command | Mac / iPad | Windows |
|---|---|---|
| Focus Panel Left | ⌥⌘← or ⌥⌘H | Alt+Left |
| Focus Panel Right | ⌥⌘→ or ⌥⌘L | Alt+Right |
| Focus Panel Up | ⌥⌘↑ or ⌥⌘K | Alt+Up |
| Focus Panel Down | ⌥⌘↓ or ⌥⌘J | Alt+Down |
| Focus Panel 1 to 9 | ⌥⌘1 to ⌥⌘9 | Alt+1..9 |
Focus picks the nearest panel in that direction. A panel counts only if it lies past the focused panel's centre and edge on that side. Distance along the direction costs 1, sideways offset costs 2, and a panel that overlaps sideways has no sideways cost, so the panel directly beside you wins over a nearer diagonal one. Panels are numbered in reading order (rows top to bottom, then left to right) and the number shows in each title bar.
Move and resize
| Command | Mac / iPad | Windows |
|---|---|---|
| Move Panel Left | ⌥⇧⌘← or ⌥⇧⌘H | Alt+Shift+Left |
| Move Panel Right | ⌥⇧⌘→ or ⌥⇧⌘L | Alt+Shift+Right |
| Move Panel Up | ⌥⇧⌘↑ or ⌥⇧⌘K | Alt+Shift+Up |
| Move Panel Down | ⌥⇧⌘↓ or ⌥⇧⌘J | Alt+Shift+Down |
| Make Panel Wider | Navigate Mode ⌥→ | same |
| Make Panel Narrower | Navigate Mode ⌥← | same |
| Make Panel Taller | Navigate Mode ⌥↓ | same |
| Make Panel Shorter | Navigate Mode ⌥↑ | same |
A move or resize step is one grid cell (24 points), then the magnets pull the moving edge onto a neighbour's edge or one gap away from it, if that is within half a step. A magnet never undoes the step.
View
| Command | Mac / iPad | Windows |
|---|---|---|
| Zoom to Panel or Back | ⌘↩ | Ctrl+Shift+Enter |
| Overview (Zoom to Fit) | ⌘0 | Ctrl+Shift+0 |
| Zoom In | ⌘= | Ctrl+Shift+= |
| Zoom Out | ⌘- | Ctrl+Shift+- |
| Toggle Graph View | ⇧⌘G (Esc also leaves the full-window graph while it has focus) | Ctrl+Shift+G |
Sidebar
| Command | Mac / iPad | Windows |
|---|---|---|
| Focus Files | ⇧⌘E | Ctrl+Shift+E |
| Focus Sessions | ⇧⌘S | Ctrl+Shift+S |
| Filter Sessions | ⌘F | Ctrl+Shift+F |
In the session list: j / k or the arrows move, Return resumes (or focuses the panel already running it), / jumps to the filter, and Esc returns focus to the canvas.
Places
| Command | Mac / iPad | Windows |
|---|---|---|
| Arrange by Project | ⇧⌘A | Ctrl+Shift+A |
| Arrange as Grid | palette | palette |
| Arrange in a Row | palette | palette |
| Arrange in a Column | palette | palette |
| Go to Place 1 to 9 | ⌘1 to ⌘9 | Ctrl+Shift+1..9 |
| Save Place 1 to 9 | ⌥⇧⌘1 to ⌥⇧⌘9 | Alt+Shift+1..9 |
A Place is a saved camera plus the frame of every panel at the time. Going to a Place moves the camera back, puts saved panels back where they were, and reopens saved panels that were closed since. Panels opened later stay where they are.
Arrange by Project groups panels by project (the repository or folder of their working directory), packs each group into a block, and lays the blocks out in rows, so each project keeps one region. Arrange as Grid gives every panel the same size (the average panel) in a grid shaped like the window. Arrange in a Row or in a Column keeps sizes. On the Mac all four also sit beside Fit in the zoom controls, shown when the pointer is over them. Like Arrange by Project, they act on the selection when two or more panels are selected, else on every panel.
Navigate Mode
⇧⌘space enters a sticky key table, shown by an accent border around the canvas. Bare keys act while it is on, and terminals do not receive them.
| Key | Action |
|---|---|
| Arrows or h j k l | focus |
| ⇧ + direction | move the panel |
| ⌥ + direction | resize the panel (right and down grow, left and up shrink) |
| z | Zoom to Panel or Back |
| a | Arrange by Project |
| t | New Terminal |
| x | Close Panel |
| Return, Esc, ⌘. or ⇧⌘space | leave |
| any other ⌘ chord | leave, then run that chord |
Session graph
With the graph focused (click it, or open the full-window graph): arrows or h j k l pan, = and - zoom, f fits, Tab and ⇧Tab step through sessions newest first, Return opens the selected session, and Esc leaves the full-window graph.
Decision timeline
A graph panel switches between the session graph and Decisions. Decisions shows one project's human steering events (goal, redirect, interrupt, denial, answer, plan approval) left to right in time, one lane per session, with superseded decisions dimmed and dashed arcs from a decision to the one that replaced it. With the timeline focused:
| Key | Action |
|---|---|
| j / k (or right / left) | next or previous decision in time |
| h / l (or up / down) | nearest decision in the lane above or below |
| g / G | first or last decision |
| Return or o | open the conversation around it as a note |
| r | resume that session |
| Esc | clear the selection |
Palette
⌘K searches everything at once. A prefix narrows it:
| Prefix | Searches |
|---|---|
| > | commands |
| # | panels on the canvas |
| @ | Claude sessions |
| / | files under the open folder |
| ! | SSH hosts from ~/.ssh/config (opens a terminal running ssh host) |
Matching is fuzzy: the letters must appear in order, and matches at the start of the text, at word starts and in runs score higher. A typed alias that exactly matches a command's alias always ranks that command first. With an empty query the palette lists commands, then panels, then recent sessions. Up and Down (or ⌃N / ⌃P) move, Return runs, Esc closes.
Mouse and trackpad: canvas
| Input | Action |
|---|---|
| Drag empty space, or scroll | Pan |
| Middle-button drag | Pan from anywhere, including over a panel |
| Pinch, or ⌘/⌃ scroll | Zoom, between 10% and 300% |
| Double-click empty space | Zoom to fit |
| Double-click a title bar | Zoom to that panel |
| Drag a title bar | Move the panel, or every selected panel |
| Drag the bottom-right corner | Resize the panel, or every selected panel by the same amount |
| ⇧ click a title bar | Add the panel to the selection, or remove it |
| ⇧ drag empty space | Select panels with a marquee |
Mouse and trackpad: graph
| Input | Action |
|---|---|
| Hover a node | Highlight it and its neighbours; details appear in the status line |
| Click a session | Select it here and in the sidebar |
| Double-click a session | Open it in a terminal |
| Drag a node | Move it; the layout reheats around it |
| Drag empty space, scroll, or middle-button drag | Pan |
| Pinch, or ⌘/⌃ scroll | Zoom |
| Double-click empty space | Return to the automatic fit |