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 has 58 commands in 8 groups. 45 of them are listed by the command
palette and 27 carry a keystroke. A command the palette does
not list says so in the table below, in the words the catalogue itself uses; the full reasons are
under Not in the palette.
Keystrokes here are the macOS bindings. Both platforms are on the keyboard shortcuts
reference.
| Command |
What it does |
Keystroke |
In the palette |
| New query tab |
Open an empty SQL editor on the current database |
⌘N |
Yes |
| Open query file |
Load a .sql file from disk |
⌘O |
Yes |
| Close tab |
Close the tab in front |
⌘W |
Yes |
| Save query |
Write the active editor back to its file |
⌘S |
Yes — needs a query tab in front |
| Save query as |
Write the active editor to a new file |
⇧⌘S |
Yes — needs a query tab in front |
| Command |
What it does |
Keystroke |
In the palette |
| Export results |
Write the rows on screen to a file |
⇧⌘X |
Yes — needs results on screen |
| Execute query |
Run everything in the active editor |
⌘E |
Yes — needs a query tab in front |
| Execute selection |
Run only the highlighted SQL |
⇧⌘↩ |
Yes — needs a query tab in front |
| Cancel query |
Stop the run in progress |
⌘. |
Yes — needs a query tab in front |
| Query history |
Search everything this app has executed |
⇧⌘H |
Yes |
| Inspect row |
Open the row-detail rail on the focused row |
— |
Yes — needs results on screen |
| Snippet library |
Save, search and insert reusable SQL |
⌥⌘S |
Yes |
| Show execution plan |
Ask the engine how it runs this statement — on SQL Server that runs it, and you are asked first |
— |
Yes — needs a query tab in front |
| Insert snippet |
Paste a saved snippet into the active editor |
— |
No — carries the SQL to insert |
| Command |
What it does |
Keystroke |
In the palette |
| Find in editor |
Open Monaco’s find widget |
⌘F |
Yes — needs a query tab in front |
| Find and replace |
Open Monaco’s replace widget |
⌥⌘F |
Yes — needs a query tab in front |
| Format SQL |
Re-indent the active editor for its engine |
⇧⌘F |
Yes — needs a query tab in front |
| Convert SQL to SQL Server |
Rewrite the editor’s SQL in T-SQL |
— |
Yes — needs a query tab in front |
| Convert SQL to PostgreSQL |
Rewrite the editor’s SQL for Postgres |
— |
Yes — needs a query tab in front |
| Convert SQL to MySQL |
Rewrite the editor’s SQL for MySQL |
— |
Yes — needs a query tab in front |
| Toggle comment |
Comment or uncomment the selected lines |
⌘/ |
Yes — needs a query tab in front |
| Copy |
Copy the selection, or the selected grid cells |
⌘C |
No — a claim protocol for the ⌘C keystroke, not an action |
| Cursor moved |
The editor telling the status bar where the caret is |
— |
No — a notification from the editor to the status bar |
| Command |
What it does |
Keystroke |
In the palette |
| Show welcome tab |
Open the start page |
— |
Yes |
| Toggle sidebar |
Show or hide the object explorer |
⌘\ |
Yes |
| Toggle assistant |
Show or hide the AI side panel |
⇧⌘I |
Yes |
| Open assistant as a tab |
A full-width chat in the dock, with its own conversation |
— |
Yes |
| Toggle results panel |
Collapse or restore the rows below the editor |
⇧⌘\ |
Yes — needs a query tab in front |
| Toggle output panel |
Show or hide the app’s own log |
⌘J |
Yes |
| Next tab |
Move one tab to the right |
⇧⌘] |
Yes |
| Previous tab |
Move one tab to the left |
⇧⌘[ |
Yes |
| Find database object |
Fuzzy-search tables, views, procedures and functions |
⌘P |
Yes — needs a live connection |
| Docker containers |
Start, stop and create local database containers |
— |
Yes |
| Open ERD diagram |
Entity-relationship diagram for the current database |
— |
Yes — needs a live connection |
| Reveal in explorer |
Expand the tree down to a named object and scroll to it |
— |
No — carries a target the palette cannot supply |
| Command |
What it does |
Keystroke |
In the palette |
| New connection |
Set up a new server connection |
⇧⌘N or ⇧⌘C |
Yes |
| Disconnect |
Close the focused server connection |
— |
Yes — needs a live connection |
| Refresh explorer |
Re-read databases and the selected node |
⌘R |
Yes — needs a live connection |
| Server properties |
Version, edition and collation of the focused server |
— |
Yes — needs a live connection |
| Manage connections |
Edit, connect and delete saved profiles |
— |
Yes |
| Edit connection |
Open the editor on a saved profile |
— |
No — carries a target the palette cannot supply |
| Connect to this container |
Open the connection editor with the container’s host and port filled in |
— |
No — carries a target the palette cannot supply |
| Command |
What it does |
Keystroke |
In the palette |
| New database |
Create a database on the focused server |
— |
Yes — needs a live connection |
| Back up database |
Write a backup of the current database |
— |
Yes — needs a live connection |
| Restore database |
Restore a backup file into a database |
— |
Yes — needs a live connection |
| Database properties |
Size, collation and file layout of the current database |
— |
Yes — needs a live connection |
| Compare database schemas |
Generate a query that compares two databases’ tables, views, routines and indexes |
— |
Yes — needs a live connection |
| New database on this server |
Create a database on a named server |
— |
No — carries a target the palette cannot supply |
| Back up this database |
Back up a named database |
— |
No — carries a target the palette cannot supply |
| Restore into this server |
Restore a backup into a named server |
— |
No — carries a target the palette cannot supply |
| Rename this database |
Rename a named database |
— |
No — carries a target the palette cannot supply |
| Delete this database |
Drop a named database |
— |
No — carries a target the palette cannot supply |
| Compare schemas from here |
Generate a comparison query with this database as the source |
— |
No — carries a target the palette cannot supply |
| Object properties |
Columns, keys and indexes of a named object |
— |
No — carries a target the palette cannot supply |
| Command |
What it does |
Keystroke |
In the palette |
| Settings |
Appearance, editor, query and grid preferences |
⌘, |
Yes |
| Set up AI |
Choose a provider, save its API key, pick the model |
— |
Yes |
| Command |
What it does |
Keystroke |
In the palette |
| Start the guided tour |
A walk through the workbench, one surface at a time |
— |
Yes |
| Keyboard shortcuts |
Every binding this app has, in one sheet |
⇧⌘/ |
Yes |
13 commands are absent from the palette, for 4 reasons, each stated in the app’s source
beside the commands it covers. Most of them carry a target the palette cannot supply — a palette
entry is a phrase, not a node. Most of those have a target-free twin the palette offers instead; the
rest are registered for surfaces that have not shipped, and have no entry point anywhere yet.
| How many |
Why the palette does not list them |
| 1 command |
a claim protocol for the ⌘C keystroke, not an action — the palette cannot be the thing with the selection, because opening it took the focus |
| 1 command |
a notification from the editor to the status bar |
| 1 command |
carries the SQL to insert — the snippet library is the surface that chooses which, and the palette opens THAT (open-snippets) |
| 10 commands |
carries a target the palette cannot supply — a palette entry is a phrase the user typed, not a node |
The palette carries 5 entries that are not commands. Each changes one thing in the window and
needs no other surface, so it is held by the palette itself rather than dispatched through the
command bus.
| Action |
What it does |
Group |
| Theme: System |
Follow the operating system |
Settings |
| Theme: Ivory |
The light canvas |
Settings |
| Theme: Ink |
The dark canvas |
Settings |
| Close all tabs |
Close every open tab |
File and tabs |
| Close other tabs |
Keep the tab in front and close the rest |
File and tabs |
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: 5ff4b67fb600 — 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 |
| The command table, its groups and their order |
packages/renderer/src/commands/catalogue.ts:110-133, 272-803 |
| A command that carries a payload cannot be a palette entry, and each one states why |
packages/renderer/src/commands/catalogue.ts:219-270 |
| The three palette preconditions the “needs …” column reports |
packages/renderer/src/commands/catalogue.ts:196-207, features/command-palette/palette-model.ts:98-115 |
| A row that cannot run right now is disabled with its reason, never hidden |
packages/renderer/src/features/command-palette/palette-model.ts:11-25, 131-154 |
| The palette’s local actions, and why they are not commands |
packages/renderer/src/features/command-palette/palette-actions.ts:1-32, 72-95 |
| Theme names come from the status bar’s own table, so both surfaces say Ink and Ivory |
packages/renderer/src/shell/status-bar.tsx:127-134 |