ADR 009: Every operation is a command; keybindings are user data

Date: 2026-09-10. Status: accepted.

Decision#

  • A command is { id, title, description, category, when, defaultKeys, run }. Core registers every user-facing operation; plugins register theirs, declaratively in the manifest so they appear before code loads.
  • Keybindings are a synced setting (keybindings.json: { key, command, when }) with a UI that lists commands, shows conflicts, records chords, and supports platform variants.
  • The command palette searches commands and pages; the slash menu shows editor-context commands and inserts; the mobile keyboard toolbar and long-press menus show the same commands.

Why#

Tana's "every command is named and rebindable" and Logseq's palette are the parts users keep; a single registry means the palette, slash menu, toolbar, keymap UI, and plugin contributions never drift apart.