Keyboard shortcuts
Skriuw's keyboard-first model across the desktop shell and web app, the shortcut registry, scoped handlers, and how bindings are re-assigned per device.
Skriuw is keyboard-first across both the Tauri desktop shell and the hosted Next.js web app. Most application-level shortcuts live in apps/web/src/core/shortcuts/registry.ts. Route-owned surfaces register their local handlers through useShortcutScope, while GlobalNotesShortcuts registers the cross-route fallbacks so core note commands still work from settings, graph, trash, shared views, and other app screens. The settings shortcut recorder stores overrides in local storage, validates duplicate bindings before saving, and synchronizes shared binding groups such as settings and command palette shortcuts, so any shortcut backed by SHORTCUT_REGISTRY is re-assignable on the current device.
There are two intentional escape hatches:
- Package-backed registry shortcuts may still use
useShortcutMapdirectly for narrow UI surfaces such as editor search, but their key combinations now resolve fromSHORTCUT_REGISTRYso they remain re-assignable. - Raw keyboard listeners use
keydown/onKeyDowndirectly for desktop shell behavior, widget navigation, tree commands, and focused-widget interactions where the shortcut should not participate in the global registry.
Audit scope: this page documents app shortcuts and focused-widget keyboard commands. The Vim plugin is intentionally excluded because it is a custom modal editing feature rather than an app shortcut layer. The example apps in apps/note-properties-example and apps/search-example are also intentionally excluded.
mod means Cmd on macOS and Ctrl on Windows/Linux.
Shortcuts not using @remcostoeten/use-shortcut
| Function name | What does it do? | Shortcut combination | Path + line |
|---|---|---|---|
onKeyDown | Desktop-only hard quit of the Tauri app. | mod+shift+q | apps/web/src/features/desktop/desktop-quit-shortcut.tsx:17 |
onKeyDown | Desktop-only zoom in. | mod+= / mod++ | apps/web/src/features/desktop/desktop-zoom.tsx:56 |
onKeyDown | Desktop-only zoom out. | mod+- / mod+_ | apps/web/src/features/desktop/desktop-zoom.tsx:56 |
onKeyDown | Desktop-only reset zoom. | mod+0 | apps/web/src/features/desktop/desktop-zoom.tsx:56 |
onKeyDown | Close the welcome walkthrough. | Escape | apps/web/src/features/onboarding/components/welcome-walkthrough.tsx:193 |
onKeyDown | Move to the next welcome walkthrough step. | ArrowRight | apps/web/src/features/onboarding/components/welcome-walkthrough.tsx:193 |
onKeyDown | Move to the previous welcome walkthrough step. | ArrowLeft | apps/web/src/features/onboarding/components/welcome-walkthrough.tsx:193 |
handleKeyDown | Capture a new shortcut binding in settings. | Any non-modifier key combo; Escape cancels | apps/web/src/features/settings/sections/shortcuts-section.tsx:65 |
handleKeyDown | Move down in the BlockNote suggestion menu. | ArrowDown | apps/web/src/features/editor/components/rich-text-editor.tsx:307 |
handleKeyDown | Move up in the BlockNote suggestion menu. | ArrowUp | apps/web/src/features/editor/components/rich-text-editor.tsx:307 |
handleKeyDown | Jump to the last BlockNote suggestion. | PageDown | apps/web/src/features/editor/components/rich-text-editor.tsx:307 |
handleKeyDown | Jump to the first BlockNote suggestion. | PageUp | apps/web/src/features/editor/components/rich-text-editor.tsx:307 |
handleKeyDown | Pick the active BlockNote suggestion. | Enter / Tab | apps/web/src/features/editor/components/rich-text-editor.tsx:307 |
handleGlobalTab | Move focus from the editor to the floating format toolbar. | Tab | apps/web/src/features/editor/components/rich-text-editor.tsx:1178 |
handleInputKeyDown | Command palette result navigation and execution. | ArrowDown, ArrowUp, Enter | apps/web/src/shared/ui/command-palette.tsx:126 |
handleFindKeyDown | Search result navigation and close in find widgets. | Enter, shift+enter, Escape | apps/web/src/features/editor/components/search-widget.tsx:102 |
handleContextMenuKeyDown | Rename or delete notes from a file context menu. | r, Delete, Backspace, d | apps/web/src/features/notes/components/file-list.tsx:601 |
handleTreeItemKeyDown | Navigate and operate the file tree. | ArrowDown, ArrowUp, Home, End, ArrowRight, ArrowLeft, r, Delete, Backspace, d, m, Enter, Space | apps/web/src/features/notes/components/file-list.tsx:931 |
handleTreeItemKeyDown | Complete or cancel file-tree move mode. | Escape, ArrowDown, ArrowUp, Home, End, ArrowRight, ArrowLeft, Enter, Space, m | apps/web/src/features/notes/components/file-list.tsx:948 |
handleKeyDown | Journal tag suggestion navigation and insertion. | ArrowDown, ArrowUp, Enter, Tab, Escape | apps/web/src/features/journal/components/plain-text-editor.tsx:143 |
handleKeyDown | Email domain suggestion navigation and insertion. | ArrowDown, ArrowUp, Enter, Tab, Escape | apps/web/src/app/(auth)/email-domain-autocomplete.tsx:130 |
All shortcuts
| Function name | What does it do? | Shortcut combination | Path + line |
|---|---|---|---|
menu.profile | Open profile from the user menu. | p | apps/web/src/core/shortcuts/registry.ts:35 |
menu.notes | Go to notes from the user menu. | n | apps/web/src/core/shortcuts/registry.ts:41 |
menu.journal | Go to journal from the user menu. | j | apps/web/src/core/shortcuts/registry.ts:47 |
menu.activity | Go to activity from the user menu. | a | apps/web/src/core/shortcuts/registry.ts:53 |
menu.signOut | Sign out from the user menu. | mod+delete | apps/web/src/core/shortcuts/registry.ts:59 |
app.commandPalette | Open the global command palette outside notes/journal-owned palettes. | mod+k / mod+shift+p | apps/web/src/core/shortcuts/registry.ts:66 |
app.settings | Open settings from anywhere outside notes/journal-owned handlers. | mod+comma | apps/web/src/core/shortcuts/registry.ts:75 |
notes.commandPalette | Open the notes command palette on notes routes. | mod+k / mod+shift+p | apps/web/src/core/shortcuts/registry.ts:85 |
notes.newNote | Create note. | mod+n | apps/web/src/core/shortcuts/registry.ts:93 |
notes.newFolder | Create folder. | mod+shift+n | apps/web/src/core/shortcuts/registry.ts:101 |
notes.toggleSidebar | Toggle notes sidebar. | mod+shift+b | apps/web/src/core/shortcuts/registry.ts:108 |
notes.toggleMetadata | Toggle note details. | mod+shift+alt+b | apps/web/src/core/shortcuts/registry.ts:116 |
notes.settings | Open settings. | mod+comma | apps/web/src/core/shortcuts/registry.ts:124 |
notes.toggleEditor | Switch editor mode. | ctrl+m | apps/web/src/core/shortcuts/registry.ts:131 |
notes.focusFileTree | Focus the active note in the file tree. | ctrl+e | apps/web/src/core/shortcuts/registry.ts:137 |
notes.toggleSplit | Toggle split editor. | mod+shift+e | apps/web/src/core/shortcuts/registry.ts:146 |
notes.splitHorizontal | Split editor horizontally. | ctrl+h | apps/web/src/core/shortcuts/registry.ts:154 |
notes.closeTab | Close the focused tab. | ctrl+w | apps/web/src/core/shortcuts/registry.ts:162 |
notes.closeSplit | Close split pane. | ctrl+shift+w | apps/web/src/core/shortcuts/registry.ts:172 |
notes.focusNextSplitPane | Focus next split pane. | ctrl+backtick | apps/web/src/core/shortcuts/registry.ts:180 |
notes.focusPreviousSplitPane | Focus previous split pane. | ctrl+shift+backtick | apps/web/src/core/shortcuts/registry.ts:188 |
notes.switchTab1 | Go to tab 1. | ctrl+1 | apps/web/src/core/shortcuts/registry.ts:196 |
notes.switchTab2 | Go to tab 2. | ctrl+2 | apps/web/src/core/shortcuts/registry.ts:205 |
notes.switchTab3 | Go to tab 3. | ctrl+3 | apps/web/src/core/shortcuts/registry.ts:213 |
notes.switchTab4 | Go to tab 4. | ctrl+4 | apps/web/src/core/shortcuts/registry.ts:221 |
notes.switchTab5 | Go to tab 5. | ctrl+5 | apps/web/src/core/shortcuts/registry.ts:229 |
notes.switchTab6 | Go to tab 6. | ctrl+6 | apps/web/src/core/shortcuts/registry.ts:237 |
notes.switchTab7 | Go to tab 7. | ctrl+7 | apps/web/src/core/shortcuts/registry.ts:245 |
notes.switchTab8 | Go to tab 8. | ctrl+8 | apps/web/src/core/shortcuts/registry.ts:253 |
notes.switchTab9 | Go to last tab. | ctrl+9 | apps/web/src/core/shortcuts/registry.ts:261 |
notes.focusEditor | Focus editor. | slash | apps/web/src/core/shortcuts/registry.ts:270 |
notes.focusSidebarSearch | Focus sidebar search. | ctrl+slash | apps/web/src/core/shortcuts/registry.ts:278 |
notes.findInNote | Open or close find in the rich text note editor. | mod+f | apps/web/src/core/shortcuts/registry.ts |
notes.searchMatchCase | Toggle match case in the editor find widget. | alt+c | apps/web/src/core/shortcuts/registry.ts |
notes.searchWholeWord | Toggle whole-word search in the editor find widget. | alt+w | apps/web/src/core/shortcuts/registry.ts |
notes.searchRegex | Toggle regex search in the editor find widget. | alt+r | apps/web/src/core/shortcuts/registry.ts |
notes.help | Open notes shortcut help. | shift+slash | apps/web/src/core/shortcuts/registry.ts:286 |
journal.commandPalette | Open the journal command palette. | mod+k / mod+shift+p | apps/web/src/core/shortcuts/registry.ts:293 |
journal.toggleSidebar | Toggle journal sidebar. | mod+slash | apps/web/src/core/shortcuts/registry.ts:301 |
journal.settings | Open settings from journal. | mod+comma | apps/web/src/core/shortcuts/registry.ts:307 |
journal.toggleEditor | Switch journal editor mode. | mod+e | apps/web/src/core/shortcuts/registry.ts:314 |
journal.focusEditor | Focus journal editor. | slash | apps/web/src/core/shortcuts/registry.ts:320 |
journal.help | Open journal shortcut help. | shift+slash | apps/web/src/core/shortcuts/registry.ts:328 |
settings.toggleFocus | Toggle settings sidebar/main-pane focus. | slash | apps/web/src/core/shortcuts/registry.ts |
findInNote | Open or close find in the rich text note editor. | mod+f | apps/web/src/features/editor/components/rich-text-editor.tsx:1942 |
matchCase | Toggle match case in the editor find widget. | alt+c | apps/web/src/features/editor/components/rich-text-editor.tsx:1959 |
wholeWord | Toggle whole-word search in the editor find widget. | alt+w | apps/web/src/features/editor/components/rich-text-editor.tsx:1967 |
regex | Toggle regex search in the editor find widget. | alt+r | apps/web/src/features/editor/components/rich-text-editor.tsx:1975 |
handleSlashFocusToggle | Toggle settings sidebar/main-pane focus. | slash | apps/web/src/features/settings/components/settings-page.tsx:233 |
onKeyDown | Desktop-only hard quit of the Tauri app. | mod+shift+q | apps/web/src/features/desktop/desktop-quit-shortcut.tsx:17 |
onKeyDown | Desktop-only zoom in/out/reset. | mod++, mod+-, mod+0 | apps/web/src/features/desktop/desktop-zoom.tsx:56 |
onKeyDown | Welcome walkthrough navigation. | Escape, ArrowRight, ArrowLeft | apps/web/src/features/onboarding/components/welcome-walkthrough.tsx:193 |
handleKeyDown | BlockNote suggestion menu navigation and selection. | ArrowDown, ArrowUp, PageDown, PageUp, Enter, Tab | apps/web/src/features/editor/components/rich-text-editor.tsx:307 |
handleInputKeyDown | Command palette result navigation and execution. | ArrowDown, ArrowUp, Enter | apps/web/src/shared/ui/command-palette.tsx:126 |
handleFindKeyDown | Search result navigation and close in find widgets. | Enter, shift+enter, Escape | apps/web/src/features/editor/components/search-widget.tsx:102 |
handleContextMenuKeyDown | Rename or delete notes from a file context menu. | r, Delete, Backspace, d | apps/web/src/features/notes/components/file-list.tsx:601 |
handleTreeItemKeyDown | Navigate the file tree. | ArrowDown, ArrowUp, Home, End, ArrowRight, ArrowLeft | apps/web/src/features/notes/components/file-list.tsx:931 |
handleTreeItemKeyDown | Rename, delete, move, or open file-tree items. | r, Delete, Backspace, d, m, Enter, Space | apps/web/src/features/notes/components/file-list.tsx:931 |
handleTreeItemKeyDown | Complete or cancel file-tree move mode. | Escape, ArrowDown, ArrowUp, Home, End, ArrowRight, ArrowLeft, Enter, Space, m | apps/web/src/features/notes/components/file-list.tsx:948 |
handleKeyDown | Journal tag suggestion navigation and insertion. | ArrowDown, ArrowUp, Enter, Tab, Escape | apps/web/src/features/journal/components/plain-text-editor.tsx:143 |
handleKeyDown | Email domain suggestion navigation and insertion. | ArrowDown, ArrowUp, Enter, Tab, Escape | apps/web/src/app/(auth)/email-domain-autocomplete.tsx:130 |
handleGlobalTab | Focus floating editor toolbar. | Tab | apps/web/src/features/editor/components/rich-text-editor.tsx:1178 |
Re-assignable shortcuts
Every row below is backed by SHORTCUT_REGISTRY, is shown in the shortcuts settings UI, and can be rebound on the current device. When a default has multiple combos, a user override records one replacement combo for that shortcut id. Shortcuts in the same shared binding group, such as app/notes/journal settings or command palette shortcuts, are rebound and reset together.
| Function name | What does it do? | Shortcut combination | Path + line |
|---|---|---|---|
menu.profile | Open profile from the user menu. | p | apps/web/src/core/shortcuts/registry.ts:35 |
menu.notes | Go to notes from the user menu. | n | apps/web/src/core/shortcuts/registry.ts:41 |
menu.journal | Go to journal from the user menu. | j | apps/web/src/core/shortcuts/registry.ts:47 |
menu.activity | Go to activity from the user menu. | a | apps/web/src/core/shortcuts/registry.ts:53 |
menu.signOut | Sign out from the user menu. | mod+delete | apps/web/src/core/shortcuts/registry.ts:59 |
app.commandPalette | Open the global command palette outside notes/journal-owned palettes. | mod+k / mod+shift+p | apps/web/src/core/shortcuts/registry.ts:66 |
app.settings | Open settings from anywhere outside notes/journal-owned handlers. | mod+comma | apps/web/src/core/shortcuts/registry.ts:75 |
notes.commandPalette | Open the notes command palette on notes routes. | mod+k / mod+shift+p | apps/web/src/core/shortcuts/registry.ts:85 |
notes.newNote | Create note. | mod+n | apps/web/src/core/shortcuts/registry.ts:93 |
notes.newFolder | Create folder. | mod+shift+n | apps/web/src/core/shortcuts/registry.ts:101 |
notes.toggleSidebar | Toggle notes sidebar. | mod+shift+b | apps/web/src/core/shortcuts/registry.ts:108 |
notes.toggleMetadata | Toggle note details. | mod+shift+alt+b | apps/web/src/core/shortcuts/registry.ts:116 |
notes.settings | Open settings. | mod+comma | apps/web/src/core/shortcuts/registry.ts:124 |
notes.toggleEditor | Switch editor mode. | ctrl+m | apps/web/src/core/shortcuts/registry.ts:131 |
notes.focusFileTree | Focus the active note in the file tree. | ctrl+e | apps/web/src/core/shortcuts/registry.ts:137 |
notes.toggleSplit | Toggle split editor. | mod+shift+e | apps/web/src/core/shortcuts/registry.ts:146 |
notes.splitHorizontal | Split editor horizontally. | ctrl+h | apps/web/src/core/shortcuts/registry.ts:154 |
notes.closeTab | Close the focused tab. | ctrl+w | apps/web/src/core/shortcuts/registry.ts:162 |
notes.closeSplit | Close split pane. | ctrl+shift+w | apps/web/src/core/shortcuts/registry.ts:172 |
notes.focusNextSplitPane | Focus next split pane. | ctrl+backtick | apps/web/src/core/shortcuts/registry.ts:180 |
notes.focusPreviousSplitPane | Focus previous split pane. | ctrl+shift+backtick | apps/web/src/core/shortcuts/registry.ts:188 |
notes.switchTab1 | Go to tab 1. | ctrl+1 | apps/web/src/core/shortcuts/registry.ts:196 |
notes.switchTab2 | Go to tab 2. | ctrl+2 | apps/web/src/core/shortcuts/registry.ts:205 |
notes.switchTab3 | Go to tab 3. | ctrl+3 | apps/web/src/core/shortcuts/registry.ts:213 |
notes.switchTab4 | Go to tab 4. | ctrl+4 | apps/web/src/core/shortcuts/registry.ts:221 |
notes.switchTab5 | Go to tab 5. | ctrl+5 | apps/web/src/core/shortcuts/registry.ts:229 |
notes.switchTab6 | Go to tab 6. | ctrl+6 | apps/web/src/core/shortcuts/registry.ts:237 |
notes.switchTab7 | Go to tab 7. | ctrl+7 | apps/web/src/core/shortcuts/registry.ts:245 |
notes.switchTab8 | Go to tab 8. | ctrl+8 | apps/web/src/core/shortcuts/registry.ts:253 |
notes.switchTab9 | Go to last tab. | ctrl+9 | apps/web/src/core/shortcuts/registry.ts:261 |
notes.focusEditor | Focus editor. | slash | apps/web/src/core/shortcuts/registry.ts:270 |
notes.focusSidebarSearch | Focus sidebar search. | ctrl+slash | apps/web/src/core/shortcuts/registry.ts:278 |
notes.findInNote | Open or close find in the rich text note editor. | mod+f | apps/web/src/core/shortcuts/registry.ts |
notes.searchMatchCase | Toggle match case in the editor find widget. | alt+c | apps/web/src/core/shortcuts/registry.ts |
notes.searchWholeWord | Toggle whole-word search in the editor find widget. | alt+w | apps/web/src/core/shortcuts/registry.ts |
notes.searchRegex | Toggle regex search in the editor find widget. | alt+r | apps/web/src/core/shortcuts/registry.ts |
notes.help | Open notes shortcut help. | shift+slash | apps/web/src/core/shortcuts/registry.ts:286 |
journal.commandPalette | Open the journal command palette. | mod+k / mod+shift+p | apps/web/src/core/shortcuts/registry.ts:293 |
journal.toggleSidebar | Toggle journal sidebar. | mod+slash | apps/web/src/core/shortcuts/registry.ts:301 |
journal.settings | Open settings from journal. | mod+comma | apps/web/src/core/shortcuts/registry.ts:307 |
journal.toggleEditor | Switch journal editor mode. | mod+e | apps/web/src/core/shortcuts/registry.ts:314 |
journal.focusEditor | Focus journal editor. | slash | apps/web/src/core/shortcuts/registry.ts:320 |
journal.help | Open journal shortcut help. | shift+slash | apps/web/src/core/shortcuts/registry.ts:328 |
settings.toggleFocus | Toggle settings sidebar/main-pane focus. | slash | apps/web/src/core/shortcuts/registry.ts |
Shortcuts missing configuration support
These shortcuts exist but are not in SHORTCUT_REGISTRY, so users cannot reassign them from the shortcuts settings page. Cross-route note fallbacks are excluded here because they reuse the registry ids and user bindings.
| Function name | What does it do? | Shortcut combination | Path + line |
|---|---|---|---|
onKeyDown | Desktop-only hard quit. | mod+shift+q | apps/web/src/features/desktop/desktop-quit-shortcut.tsx:17 |
onKeyDown | Desktop-only zoom controls. | mod++, mod+-, mod+0 | apps/web/src/features/desktop/desktop-zoom.tsx:56 |
onKeyDown | Welcome walkthrough navigation. | Escape, ArrowRight, ArrowLeft | apps/web/src/features/onboarding/components/welcome-walkthrough.tsx:193 |
handleKeyDown | BlockNote suggestion menu navigation and selection. | ArrowDown, ArrowUp, PageDown, PageUp, Enter, Tab | apps/web/src/features/editor/components/rich-text-editor.tsx:307 |
handleInputKeyDown | Command palette result navigation and execution. | ArrowDown, ArrowUp, Enter | apps/web/src/shared/ui/command-palette.tsx:126 |
handleFindKeyDown | Search result navigation and close in find widgets. | Enter, shift+enter, Escape | apps/web/src/features/editor/components/search-widget.tsx:102 |
handleContextMenuKeyDown | Rename or delete notes from a file context menu. | r, Delete, Backspace, d | apps/web/src/features/notes/components/file-list.tsx:601 |
handleTreeItemKeyDown | File tree navigation and item commands. | ArrowDown, ArrowUp, Home, End, ArrowRight, ArrowLeft, r, Delete, Backspace, d, m, Enter, Space | apps/web/src/features/notes/components/file-list.tsx:931 |
handleTreeItemKeyDown | Complete or cancel file-tree move mode. | Escape, ArrowDown, ArrowUp, Home, End, ArrowRight, ArrowLeft, Enter, Space, m | apps/web/src/features/notes/components/file-list.tsx:948 |
handleKeyDown | Journal tag suggestion navigation and insertion. | ArrowDown, ArrowUp, Enter, Tab, Escape | apps/web/src/features/journal/components/plain-text-editor.tsx:143 |
handleKeyDown | Email domain suggestion navigation and insertion. | ArrowDown, ArrowUp, Enter, Tab, Escape | apps/web/src/app/(auth)/email-domain-autocomplete.tsx:130 |
handleGlobalTab | Focus floating editor toolbar. | Tab | apps/web/src/features/editor/components/rich-text-editor.tsx:1178 |
Desktop versus web discrepancies
| Area | Desktop behavior | Web behavior | Notes |
|---|---|---|---|
| Quit app | mod+shift+q invokes the Tauri quit_app command. | Not registered because the Tauri command is absent. | Desktop-only raw listener in DesktopQuitShortcut. |
| Zoom | mod++, mod+-, mod+0, and mod+wheel apply persisted webview zoom. | Not registered. Browser zoom remains native. | Desktop-only raw listener in DesktopZoom. |
| Tauri menu accelerators | Rust intentionally omits edit/view accelerators that the frontend owns. | Not applicable. | Prevents duplicate handling; frontend owns app shortcuts through useShortcut. |
| Registry shortcuts | Same React codepath when the desktop shell renders apps/web. | Same React codepath in the cloud app. | Route-owned handlers and GlobalNotesShortcuts both resolve user bindings from SHORTCUT_REGISTRY; the global note fallback also allows note/folder creation from journal and non-notes routes. |
Trash
Deleting a note or folder in Skriuw never destroys it right away. It moves to Trash, where you can restore it or remove it for good.
Backup and import
The portable ZIP backup format (v3), import policies (merge, overwrite, replace), the on-disk archive layout, and best-effort imports from Obsidian, Apple Notes, Bear, Notion, and plain Markdown.