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

> 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…

Source: https://nooklet.danielalder.cz/decisions/009-commands-and-keybindings

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.
