# 21 — Quick-add registry ## Goal A single global `+` button on the dashboard (and a `cmd+k` palette anywhere) that lists actions contributed by modules. ## Depends on - 20 ## Scope - `QuickAddAction` type: `{ id, label, icon?, shortcut?, run: () => void | Promise }`. - Modules register via manifest. Registry exposes a sorted list. - UI: floating `+` on dashboard opens a sheet of actions; `cmd/ctrl+k` opens a command-palette-style modal (use `cmdk` package). - Default actions: New event, Add to shopping, Add to tasks, New note. ## Out of scope - Fuzzy search across data (search adapter is a later concern). - Action history / recents. ## Acceptance criteria - [x] Adding a new module that registers a quick-add appears in both the FAB sheet and the cmd-k palette without touching core. - [x] Keyboard navigation works in the palette (arrows + enter + escape). ## Implementation notes - `QuickAddAction` gained a `url: string` field; `action` made optional (future inline modals). - `SerializedQuickAddItem` strips the non-serializable `action` fn so it can cross the server→client RSC boundary as props to `QuickAddProvider`. - `getQuickAdds()` in the registry returns one `SerializedQuickAddItem` per registered quick-add, enriched with `moduleId` / `moduleName` for grouping. - Root layout calls `getQuickAdds()` and passes the result to `` which wraps the whole app. `` and `` live inside the provider and read from context. - `cmdk` installed for the command palette; keyboard shortcut (cmd/ctrl+k) wired via `useEffect` in the provider. - `.claude/**` added to ESLint ignores to prevent stale worktree `.next` build artifacts from failing lint.