Keyboard shortcuts
Dashboard-wide reference dialog listing keyboard shortcuts, grouped by Actions and Sections. Opens with ⌘K (or ? when not typing). Filterable via the search input at the top: rows update live as you type. Composes Dialog + cmdk + the Kbd atom.
Live preview
The provider is already mounted at the app root, so ⌘K (or Ctrl+K on Windows / Linux) opens the dialog from anywhere in the kit. You can also open it via the useKeyboardShortcuts hook.
import { useKeyboardShortcuts } from "@/components/organisms/keyboard-shortcuts-dialog";
function OpenShortcutsButton() {
const { setOpen } = useKeyboardShortcuts();
return <Button variant="outline" onClick={() => setOpen(true)}>Show shortcuts</Button>;
}Current shortcuts
v2 sequence-chord system (2026-08-28). Every Action is C/P/D then a letter; every Section is G then a letter. Zero browser collisions across Chrome / Firefox / Safari / Edge on Mac + Windows + Linux, and zero conflict with AltGr on Windows international keyboards. Data lives in src/lib/shortcuts.ts.
- Create payment linkCthenL
- Invite memberCthenI
- Create routeCthenR
- Create risk ruleCthenE
- Add providerCthenP
- New subscriptionCthenB
- Create recipientCthenT
- Add webhookCthenW
- Create API keyCthenA
- Publish routePthenR
- Publish checkoutPthenK
- Publish stylingPthenS
- Duplicate route versionDthenR
- Duplicate checkoutDthenK
- Go to HomeGthenH
- Go to InsightsGthenI
- Go to OperationsGthenO
- Go to Operations > PaymentsGthenOthenP
- Go to Operations > TransactionsGthenOthenT
- Go to Operations > Fraud screeningsGthenOthenF
- Go to Operations > PayoutsGthenOthenY
- Go to ReconciliationGthenR
- Go to ConnectionsGthenC
- Go to Connections > ProvidersGthenCthenP
- Go to Connections > Certificates & DomainsGthenCthenD
- Go to RoutingGthenT
- Go to Routing > ExploreGthenTthenE
- Go to Routing > Your routesGthenTthenY
- Go to CheckoutGthenK
- Go to Checkout > Payment method settingsGthenKthenP
- Go to Checkout > StylingGthenKthenS
- Go to Checkout > Custom checkoutsGthenKthenC
- Go to InstallmentsGthenN
- Go to Risk conditionsGthenS
- Go to Risk conditions > OverviewGthenSthenO
- Go to Risk conditions > RulesGthenSthenR
- Go to Risk conditions > Protection presetsGthenSthenP
- Go to Risk conditions > BlocklistsGthenSthenB
- Go to Risk conditions > AllowlistsGthenSthenA
- Go to Risk conditions > Held paymentsGthenSthenH
- Go to MarketplaceGthenM
- Go to Marketplace > RecipientsGthenMthenR
- Go to Marketplace > TransfersGthenMthenT
- Go to Banking connectivityGthenB
- Go to Banking connectivity > EntitiesGthenBthenE
- Go to Banking connectivity > TransfersGthenBthenT
- Go to Alerts & disputesGthenA
- Go to Alerts & disputes > DisputesGthenAthenD
- Go to Alerts & disputes > AlertsGthenAthenA
- Go to Alerts & disputes > OverviewGthenAthenO
- Go to SubscriptionsGthenU
- Go to Payment linksGthenL
- Go to Payments ConciergeGthenY
- Go to NOVAGthenV
- Go to API ReferenceGthenF
- Go to Audit logsGthenX
- Go to Audit logs > DashboardGthenXthenD
- Go to Audit logs > WebhooksGthenXthenW
- Go to Audit logs > MonitorsGthenXthenM
- Go to DevelopersGthenD
- Go to Developers > HealthGthenDthenH
- Go to Developers > AuthenticationGthenDthenA
- Go to Developers > Webhook endpointsGthenDthenW
- Go to Developers > API logsGthenDthenL
- Go to Developers > PlaygroundGthenDthenP
- Go to Your profileGthenP
- Go to SecurityGthenE
- Go to Settings⌘,
- Go to Teams and rolesGthenJ
Mount
Wrap the app tree with KeyboardShortcutsProvider. Global handler listens for ⌘K (or Ctrl+K on Windows / Linux) anywhere, and for ? (unshifted) when focus is NOT in an input / textarea / contenteditable — the same convention GitHub and Linear use. ⌘K was chosen over ⌘/ because on Mac international layouts (LATAM/ES) the browser intercepts ⌘/ before the handler ever sees it. The dialog trigger is the ONLY chord in the system that uses a modifier — every other shortcut in SHORTCUTS is a plain sequence (C/P/D/G then a letter).
// app/layout.tsx
import { CommandPaletteProvider } from "@/components/kit/command-palette";
import { KeyboardShortcutsProvider } from "@/components/organisms/keyboard-shortcuts-dialog";
<CommandPaletteProvider>
<KeyboardShortcutsProvider>
{children}
</KeyboardShortcutsProvider>
</CommandPaletteProvider>Data shape
Shortcuts live in src/lib/shortcuts.ts. Single chord = string[]. Multi-chord sequence (C then L) = string[][]. Modifier keys use SEMANTIC TOKENS (Mod / Alt / Shift / Ctrl / Enter / Esc / ArrowUp…) — the Kbd atom translates each token to the platform-correct glyph at render time (⌘ on Mac, Ctrl on Windows / Linux). Never put raw Mac glyphs (⌘ / ⌥ / ⇧) in this data. Labels are keys into t.shortcuts.items so both EN and ES render.
// src/lib/shortcuts.ts
export const SHORTCUTS: ShortcutGroup[] = [
{
groupKey: "actions",
items: [
// Every action is a 2-key sequence, no modifier. Prefix carries the verb:
// C then X = Create X · P then X = Publish X · D then X = Duplicate X
{ labelKey: "createPaymentLink", keys: [["C"], ["L"]] }, // C then L
{ labelKey: "publishRoute", keys: [["P"], ["R"]] }, // P then R
{ labelKey: "duplicateRoute", keys: [["D"], ["R"]] }, // D then R
// ...
],
},
{
groupKey: "sections",
items: [
{ labelKey: "goHome", keys: [["G"], ["H"]] }, // G then H
{ labelKey: "goRiskConditions", keys: [["G"], ["S"]] }, // G then S
{ labelKey: "goRiskRules", keys: [["G"], ["S"], ["R"]] }, // G then S then R (child)
{ labelKey: "goSettings", keys: ["Mod", ","] }, // ⌘, on Mac / Ctrl , on Win — the single sanctioned modifier chord
// ...
],
},
];Import
import {
KeyboardShortcutsProvider,
KeyboardShortcutsDialog,
useKeyboardShortcuts,
} from "@/components/organisms/keyboard-shortcuts-dialog";Props
KeyboardShortcutsProvider
| Prop | Type | Default | Description |
|---|---|---|---|
| children | ReactNode (required) | — | The app subtree. The provider owns the open state and the global ⌘K + ? key handler. |
useKeyboardShortcuts()
| Prop | Type | Default | Description |
|---|---|---|---|
| open | boolean | — | Whether the dialog is currently open. |
| setOpen | (v: boolean) => void | — | Open or close the dialog imperatively. |
| toggle | () => void | — | Flip the open state. |