# Keyboard Shortcuts
Alga PSA ships a system-wide keyboard shortcut engine active on all MSP pages
(`/msp`). Shortcuts are grouped by scope: **global** shortcuts fire anywhere;
**page** shortcuts fire on the current page; **panel/dialog** shortcuts fire
when a drawer or dialog is open and take priority over page shortcuts.
## Opening the Command Palette
Press **`Mod+K`** (⌘K on macOS, Ctrl+K on Windows/Linux) to open the command
palette. The palette merges navigation destinations, runnable shortcut actions,
and full record search into one keyboard-driven overlay. From here you can:
- **Navigate** to any page by typing its name (e.g. `tickets`, `schedule`).
- **Search records** across clients, tickets, contacts, projects, assets, and
more.
- **Run an action** by prefixing `>` (e.g. `>create ticket`).
- **Open a record by ID** with `#` (e.g. `#1042`).
- **Narrow by type** using field scopes: `ticket:`, `client:`, `project:`,
`asset:`, `contact:`, `user:` / `@name`, `nav:` / `/path`.
- **Magic keywords**: `$mine`, `$recent`, `$open` (abbreviate to first
syllable: `$m`, `$rec`, `$op`).
- **Operators**: double-quoted phrases (`status:"in progress"`), `-` / `NOT`
exclusion, `*` and `?` wildcards, fuzzy `term~`.
## Discovering Shortcuts
Press **`?`** on any MSP page (when not focused in a text field) to open the
**shortcut help dialog**. It lists every shortcut active in the current
context, grouped by scope, resolved for the user's operating system, and with
personalized bindings flagged.
Shortcuts are also surfaced as **visible `kbd` hints** rendered next to
instrumented controls (search field, primary action buttons, relevant menu
items). These hints use OS-native glyph notation (⌘/⌥/⇧/⌃ on macOS;
Ctrl/Alt/Shift on Windows/Linux). The `aria-keyshortcuts` attribute is set on
instrumented controls for screen readers.
## Default Shortcut Reference
### Global (fire anywhere in `/msp`)
| Action | macOS | Windows / Linux |
|--------|-------|-----------------|
| Open command palette | ⌘K | Ctrl+K |
| Open shortcut help dialog | ? | ? |
| Quick-create dialog (multi-type) | N | N |
### Navigation sequences
Press the first key, then the second key within ≈1 second. Sequences are
suppressed while any input, textarea, rich-text editor, or combobox is
focused, and reset on route change.
| Sequence | Destination |
|----------|-------------|
| G → T | Tickets |
| G → C | Clients |
| G → P | Projects |
| G → A | Assets |
| G → S | Schedule |
| G → H | Dashboard (Home) |
### Page-level (fire when the matching page is active)
| Action | Key |
|--------|-----|
| Open current page's create dialog | C |
| Save current page | ⌘S / Ctrl+S |
| Navigate to previous record | `[` |
| Navigate to next record | `]` |
`C` and `N` are suppressed while any editable target is focused and while a
dialog or drawer owns scope.
### Panel / dialog scope
When a drawer or modal dialog is open it captures `Escape` (close/cancel) and
`[`/`]` (previous/next record within the panel). Global and page shortcuts do
not fire while a panel-scope owner is active.
## Customizing Shortcuts
Navigate to **Profile → Keyboard Shortcuts** to manage personal bindings.
| Control | Effect |
|---------|--------|
| Click the binding chip for any action | Capture a new key combination |
| Toggle **Enabled** switch | Disable the shortcut without losing the binding |
| Reset icon on a row | Restore that action's default binding |
| **Reset all** button (confirmation required) | Clear all personal overrides |
Conflict detection runs before commit: if the captured key is already claimed
by another action, the UI prompts for confirmation; the previous owner is
unbound and the new binding takes effect.
Custom bindings are stored per user account and sync across devices. A binding
authored on macOS (e.g. `mod+J`) resolves automatically to Ctrl+J on
Windows/Linux; non-portable combos surface a non-blocking advisory on sign-in
from the other OS.
## Shortcut Profiles
Three preset profiles are available from the Keyboard Shortcuts panel:
| Profile | Description |
|---------|-------------|
| **Default** | Standard bindings optimized for MSP workflows |
| **Vim** | `j`/`k` list navigation and Vim-style action keys |
| **Emacs** | Emacs-inspired modifier-based bindings |
Selecting a profile applies its preset as the binding baseline. Per-action
overrides stack on top of any profile. Per-action reset returns to the active
profile's baseline (not the factory default).
## Scope and Priority Rules
The dispatcher picks the highest-priority registered action that matches the
event's active scope set:
1. **Dialog / panel** — highest priority; owns `Escape` and record-nav keys.
2. **Editor** — `editor`-scoped shortcuts (invoice designer, workflow designer,
rich-text) override page shortcuts.
3. **Page** — page-scoped shortcuts fire when the registered page is active.
4. **Global / shell** — lowest priority; fire regardless of current page.
When the same key maps to two actions in the same scope at the same priority,
the conflict is reported in the settings panel and help dialog (it does not
silently pick one).
Single-letter shortcuts (`C`, `N`, `j`, `k`) are always suppressed inside
``, `