Skip to content

Keyboard shortcuts

Generated page — every table below is read out of the app’s own source when this site is built. Do not edit this file by hand: pnpm run check and pnpm run build regenerate it and fail when what is committed here disagrees with the source.

Joinery binds 27 of its 58 commands to a keystroke. With the 2 keystrokes that belong to a surface rather than to a command — Command palette and Toggle tab-focus mode — that is 29 rows, the same set the in-app cheat sheet shows under ⇧⌘/.

The keyboard shortcuts sheet in the app: bindings in two columns under group headings such as File and tabs, Query, Editor and View, each row giving a command name, its source — Menu, App or Editor — and its keystroke.

Every binding is listed, not only the primary one: New connection answers to two menu items, and a table that showed one of them would be wrong about the other.

The Bound by column is the one that answers “why does this key work here but not there”.

Bound by What holds the keystroke
Menu An Electron menu item. The keystroke never reaches the page at all.
App A key listener in the window. It must avoid every registered menu accelerator.
Editor Monaco, and only while the caret is in a SQL editor. Either the menu shows the key without binding it, or no menu item carries it at all.

The keyboard shortcuts guide explains what follows from that, and why the snippet library is on ⌥⌘S rather than ⇧⌘S.

Keys (macOS) Keys (Windows) Command What it does Bound by
⌘N Ctrl+N New query tab Open an empty SQL editor on the current database Menu
⌘O Ctrl+O Open query file Load a .sql file from disk Menu
⌘W Ctrl+W Close tab Close the tab in front Menu
⌘S Ctrl+S Save query Write the active editor back to its file Menu
⇧⌘S Ctrl+Shift+S Save query as Write the active editor to a new file Menu
Keys (macOS) Keys (Windows) Command What it does Bound by
⇧⌘X Ctrl+Shift+X Export results Write the rows on screen to a file Menu
⌘E Ctrl+E Execute query Run everything in the active editor Editor
⇧⌘↩ Ctrl+Shift+E Execute selection Run only the highlighted SQL Menu
⌘. Alt+Break Cancel query Stop the run in progress Menu
⇧⌘H Ctrl+Shift+H Query history Search everything this app has executed Menu
⌥⌘S Ctrl+Alt+S Snippet library Save, search and insert reusable SQL App
Keys (macOS) Keys (Windows) Command What it does Bound by
⌘F Ctrl+F Find in editor Open Monaco’s find widget Menu
⌥⌘F Ctrl+H Find and replace Open Monaco’s replace widget Menu
⇧⌘F Ctrl+Shift+F Format SQL Re-indent the active editor for its engine Menu
⌘/ Ctrl+/ Toggle comment Comment or uncomment the selected lines Menu
⌘C Ctrl+C Copy Copy the selection, or the selected grid cells Menu
⌃M Ctrl+M Toggle tab-focus mode Switch Tab between indenting and moving focus out of the SQL editor Editor
Keys (macOS) Keys (Windows) Command What it does Bound by
⌘\ Ctrl+\ Toggle sidebar Show or hide the object explorer Menu
⇧⌘I Ctrl+Shift+I Toggle assistant Show or hide the AI side panel Menu
⇧⌘\ Ctrl+Shift+\ Toggle results panel Collapse or restore the rows below the editor Menu
⌘J Ctrl+J Toggle output panel Show or hide the app’s own log App
⇧⌘] Ctrl+Tab Next tab Move one tab to the right Menu
⇧⌘[ Ctrl+Shift+Tab Previous tab Move one tab to the left Menu
⌘P Ctrl+P Find database object Fuzzy-search tables, views, procedures and functions App
Keys (macOS) Keys (Windows) Command What it does Bound by
⇧⌘N or ⇧⌘C Ctrl+Shift+N or Ctrl+Shift+C New connection Set up a new server connection Menu
⌘R Ctrl+R Refresh explorer Re-read databases and the selected node Menu
Keys (macOS) Keys (Windows) Command What it does Bound by
⌘, Ctrl+, Settings Appearance, editor, query and grid preferences Menu
Keys (macOS) Keys (Windows) Command What it does Bound by
⇧⌘/ Ctrl+Shift+/ Keyboard shortcuts Every binding this app has, in one sheet Menu
⌘K or ⇧⌘P Ctrl+K or Ctrl+Shift+P Command palette Everything this app can do, by name App

Most bindings are the macOS binding with Ctrl in place of ⌘, and ⌥⌘S becomes Ctrl+Alt+S by the same rule. 5 are a different key entirely — the rows above where the two columns name different keys rather than the same key in local modifier names.

Note — the Windows column is the key you press. The app writes its accelerators with the CmdOrCtrl modifier, which Electron resolves to Control on Windows and Linux and to Command on macOS; the in-app cheat sheet makes the same substitution when it prints a binding, so a key written CmdOrCtrl+N reads there as Ctrl+N off macOS, exactly as it does here.

docs-site/scripts/generate-reference.mjs reads these files and writes this page:

  • packages/renderer/src/commands/catalogue.ts
  • packages/renderer/src/features/command-palette/palette-actions.ts
  • packages/renderer/src/utils/platform.ts
  • packages/renderer/src/shell/status-bar.tsx

It does not import the renderer. Each module is compiled with the TypeScript compiler and run inside an isolated node:vm context whose module resolver is declared up front: the files it may reach are resolved for real, lucide-react resolves to an inert marker, and anything else throws rather than pulling the app’s dependency tree into the docs build. The command table is loaded twice, once with a macOS user agent and once with a Windows one, so both keystroke columns come from the app’s own formatter rather than from a second table kept here.

Data digest: fd4b0daf65f3 — a fingerprint of exactly the values rendered above. It changes when what the app ships changes, and not when an unrelated comment in one of those files does.

Regenerate from docs-site/ with pnpm run generate:reference.

Where this page's facts come from
Claim Source
Every row is derived from the command table and the surface-shortcut list packages/renderer/src/commands/catalogue.ts:272-803, features/command-palette/palette-actions.ts:121-146
A surface shortcut names what binds it, so ⌃M reads Editor and the palette opener reads App packages/renderer/src/features/command-palette/palette-actions.ts:105-146, features/shortcuts-dialog/shortcuts-dialog.tsx:95-108
The in-app cheat sheet is ⇧⌘/ and renders the same two lists packages/renderer/src/features/shortcuts-dialog/shortcuts-dialog.tsx:69-108, 117-125
A test compares these accelerators with what menu.ts registers packages/renderer/src/commands/catalogue.ts:31-45, commands/catalogue.spec.ts
Alternates are real bindings, and New connection has two packages/renderer/src/commands/catalogue.ts:158-172, 274-283
What Menu, App and Editor mean, and that App bindings must dodge menu accelerators packages/renderer/src/commands/catalogue.ts:134-157
Keystrokes are formatted by the app’s own formatter, per platform packages/renderer/src/commands/catalogue.ts:865-914, utils/platform.ts:18
Five bindings name a different key off macOS; the sixth platform-specific one is ⌥⌘S / Ctrl+Alt+S packages/renderer/src/commands/catalogue.ts:349, 413, 421, 574, 582 and :639
The non-macOS branch prints Ctrl for CmdOrCtrl, CommandOrControl and Control; bare Cmd is left alone, being macOS-only packages/renderer/src/commands/catalogue.ts:852-863, 884-891
Electron maps CmdOrCtrl to Command on macOS and Control elsewhere Electron accelerator reference