--- id: shell/all-keyboard-shortcuts-configurable title: "All keyboard shortcuts configurable" theme: shell status: open created: 2026-08-22 date_source: stated order: 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.