1.8 KiB
id, title, theme, status, created, date_source, order
| id | title | theme | status | created | date_source | order |
|---|---|---|---|---|---|---|
| shell/all-keyboard-shortcuts-configurable | All keyboard shortcuts configurable | shell | open | 2026-08-22 | stated | 3 |
All keyboard shortcuts configurable. Stated 2026-08-22 as coming soon. Every binding in the app should be something the owner sets, not something the code decides.
There is nothing central to configure today. Nine separate keydown listeners are registered across
the app — the code editor, the file browser and its grid and dialogs, the terminal, the chat launcher,
the embeddable chat, the file viewer's editor, and Spotlight — each owning its own keys, in its own
component, with no registry and no way to see the set at once. So the first half of this is an
inventory, and the second is a registry the bindings are read FROM rather than written INTO the
components.
Spotlight is the cautionary tale and it is already written down in Spotlight.tsx:14: the launcher went
ctrl-space → shift-space → alt-space, three changes in a day, because each chord turned out to
collide with something — shift-space types a space, which is why that version needed a focus check
that alt-space does not. A hard-coded chord costs a code change and a release every time it is
wrong, which is the argument for this item in one sentence.
Worth deciding with the config format: a binding that conflicts with another must be refused or flagged at the moment it is set, since the failure otherwise is silent and shows up as "that key does nothing". And a browser cannot claim every chord — some are the browser's or the window manager's — so the UI has to be able to say a binding was rejected by something above it.
Storage lands on todo/settings/ — this is exactly the kind of preference that should be a portable
file rather than a row.