Reference

Keyboard shortcuts

The complete default shortcut reference. The primary modifier is Command on macOS and Ctrl on Windows and Linux, written here as Cmd/Ctrl. Almost every chord can be rebound, scoped to a surface, or edited by hand in a file.

Panels & tools

New terminalCmd/CtrlShiftT
New browserCmd/CtrlShiftB
New editorCmd/CtrlAltE
Open the Panel LibraryCmd/CtrlShiftE
Close the focused panelCmd/CtrlW
Delete the focused panelCmd/CtrlBackspace

Canvas & zoom

Zoom inCmd/Ctrl=
Zoom outCmd/Ctrl-
Reset zoom to 100%Cmd/CtrlShift0
Zoom to fit all panelsCmd/CtrlShift1
Auto-layout the canvasCmd/CtrlShiftL
Toggle the minimapCmd/CtrlShiftM
Toggle the sidebarCmd/Ctrl\
Toggle the file explorerCmd/CtrlShiftX
Toggle the notebookCmd/CtrlJ

You can also zoom by holding Cmd/Ctrl and scrolling, and pan with a two-finger trackpad scroll or a right-click drag. Cmd/CtrlJ summons and folds the notebook on the right of the window; see Notes & the notebook.

Focus & selection

Panel Switcher (jump between open panels)CtrlSpace
Focus next panelCtrl`
Focus previous panelCtrlShift`
Select all panels and regionsCmd/CtrlA
Group selected panels into a regionCmd/CtrlG
Dissolve selected regionsCmd/CtrlShiftG

Workspaces & worktrees

Next workspaceCtrlTab
Previous workspaceCtrlShiftTab
Jump to the 1st to 9th workspace (rail order)Cmd/Ctrl1…9
Jump to the 10th workspaceCmd/Ctrl0
Open the jump overlay (workspaces and worktrees)Cmd/CtrlEnter
Switch Project (the workspace overview, one lane per workspace)Cmd/CtrlShiftP
Open a folderCmd/CtrlO

Inside the jump overlay, Tab cycles the workspace tabs, 1 to 9 jump straight to a worktree, and N cuts a new one. The overview behind Cmd/CtrlShiftP is a meta-canvas: one horizontal lane per workspace, one card per worktree. See Workspaces & the canvas.

Find & command

Command PaletteCmd/CtrlK
Quick open a fileCmd/CtrlP
Search terminal scrollback (in a terminal)Cmd/CtrlF

Searching your project by content happens inside the Command Palette, not in a separate surface. What each source matches, and how the palette’s “ask the agent” mode works, is covered in Command Palette & search.

AI & voice

Open Dex (toggle the chat bar)Cmd/CtrlL
New Dex threadCmd/CtrlT
New agent task draftCmd/CtrlI
Jump to Next Thread Needing YouCmd/CtrlShiftJ
Accept the terminal action-bar suggestionAltEnter

These follow the convention Cursor and VS Code use: Cmd/CtrlL opens the assistant, and Cmd/CtrlT starts a fresh thread the way a browser opens a new tab. If you have used Deska before, Cmd/CtrlT used to open Dex; any chord you rebound yourself survives the update untouched.

Cmd/CtrlShiftJ takes you to the next agent thread that wants something from you, an approval, an answer, a failure or an unseen result, wherever you happen to be working. See Agent threads.

Agent approval cards answer from the keyboard too: Cmd/CtrlEnter approves and Cmd/CtrlBackspace declines. Enter, S, D and Esc keep working as before, and a request that looks destructive still asks for a mouse click to approve.

NoteVoice transcription uses CmdShiftV on macOS and CtrlAltV on Windows and Linux (the Windows/Linux default avoids a clash with the terminal paste chord). It is registered globally, so it works even when Deska is in the background.

The talk key (push to talk)

Talking to Deska is one held key now, borrowed from the best dictation tools. Hold fn on macOS, speak, and release to send. On Windows the talk key is CtrlWin and on Linux it is CtrlSuper, the same chord held the same way, still in beta on both.

The same key does different things depending on where you press it:

In a text field: dictate at the cursor. Anywhere else: talk to DexHold
Start or stop a hands-free conversation with DexDouble-tap
CancelQuick tap
Cancel a dictation in progress (nothing is sent)Esc

Some Macs have no Apple fn key, and third-party external keyboards never send it. For those, open Settings → Keybindings → Push to talk and pick ControlOption as the hold key instead.

On Linux the listener needs an X11 or XWayland session. A native Wayland session does not let apps see global keys, so Deska reports the talk key unavailable there and Settings shows that message.

NoteOn macOS the talk key needs the Accessibility permission to be heard while other apps have focus; Settings shows a Grant access button until it is given. And if tapping fn opens the emoji picker, tell macOS to let it go: System Settings → Keyboard → set “Press globe key to” to Do Nothing (the globe is printed on the fn key).
TipThe old voice chords AltSpace (hold to talk) and ShiftOptionSpace (conversation toggle) are retired; the talk key replaces both. CmdShiftV (macOS) and CtrlAltV (Windows and Linux) remain the system-wide dictation toggle that works even when Deska is unfocused.

Editing & history

Save the active fileCmd/CtrlS
UndoCmd/CtrlZ
RedoCmd/CtrlShiftZ

Undo, redo and save are context-aware: when a text editor has focus they apply to the editor; otherwise they act on the canvas.

NoteCmd/CtrlEnter means three things depending on where you are: app-wide it opens the jump overlay (workspaces and worktrees), in the commit box it commits, and in a thread composer it steers the running turn with what you typed.

Chords inside a surface

A few chords belong to one surface and fire only there. The app shows them next to the control they drive:

Line break (thread composer)ShiftEnter
Steer the running turn (thread composer)Cmd/CtrlEnter
Toggle plan mode (thread composer)ShiftTab
Back and forward in a browser panel (macOS)Cmd[ / Cmd]
Back and forward in a browser panel (Windows and Linux)AltLeft / AltRight
Quick-pick a row in popovers that show digit hintsAlt1…9

App & windows

Open SettingsCmd/Ctrl,
New windowCmd/CtrlShiftN
Close windowCmd/CtrlShiftW

Customizing shortcuts

Open Settings → Keybindings to rebind any action: click a row, press the chord you want, and confirm. Bare keys are accepted, so a single function key is a valid binding. The one exception is Start Voice Transcription, which Deska registers with the operating system and which therefore has to carry at least one modifier. If your new chord is already taken by an action that could fire at the same moment, the two actions swap bindings, so nothing is ever left unbound. Every row has its own reset, plus a button that restores all the defaults at once.

A handful of chords are reserved and the recorder refuses them, because a hardcoded handler or a menu accelerator already owns the keystroke:

  • Panel Library (Cmd/CtrlShiftE) and Open Folder (Cmd/CtrlO).
  • New Window (Cmd/CtrlShiftN) and Close Window (Cmd/CtrlShiftW).
  • Zoom In, including its hidden menu aliases on the + key.
  • Delete Selection, which owns a bare Backspace or Delete, with or without Shift. The Cmd/Ctrl variants stay free and are where Delete Panel lives.
  • Switch Workspace, the number keys Cmd/Ctrl1 through Cmd/Ctrl0.

Where a shortcut applies

Every rebindable action carries a context as well as a chord. The context decides which surface has to hold focus before the chord fires, and you pick it from the dropdown next to each row in Settings → Keybindings:

  • Anywhere is the default for every shipped binding. It fires wherever you are in the app.
  • Canvas, Terminal, Editor and Chat fire only while a panel of that kind has focus.

Because only one surface ever holds focus, the same chord bound in Terminal and in Editor is not a conflict, and Deska will not ask you to resolve it. You are warned only when two bindings share a chord and could be live at the same moment. That makes scoping a good way to reclaim a chord: bind it to one thing in a terminal and to something else in an editor.

NoteStart Voice Transcription and Push to talk are always Anywhere and show no scope picker. The first is registered with the operating system, and the talk key is watched by the voice center’s own hold and double-tap listener, so there is no focused panel to test a context against.

The keybindings file

Settings writes your bindings to a plain JSON file that you are free to open and edit yourself. Settings → Keybindings → Open keybindings file reveals it, or you can go straight to it:

  • macOS: ~/Library/Application Support/Deska/keybindings.json
  • Windows: %APPDATA%\Deska\keybindings.json
  • Linux: ~/.config/Deska/keybindings.json

Each entry maps an action id to one binding. A binding is a key plus the modifiers you want: command, shift, option and control, all defaulting to false, plus an optional when holding the context (global, canvas, terminal, editor or chat).

command is the platform-primary modifier: Command on macOS, Ctrl on Windows and Linux. control is the physical Ctrl key on macOS and folds onto that same Ctrl key elsewhere. Only the actions you actually changed need to appear in the file: anything absent keeps Deska’s default, which is why shipped defaults keep improving across updates for every action you never touched.

Heads upSave the file and Deska picks the change up immediately, because it watches it. If the JSON cannot be parsed, Deska keeps the bindings it already has and shows a warning in Settings rather than overwriting your file, so fixing the syntax and saving again is enough.
💡 Ideas+🐛 BugsSuggest a feature or report a bug