FixControl is built for operators on the keyboard. Every list page, every detail pane, and the global shell share one map. Press ? anywhere to open the live help dialog — it shows whatever is registered while the page is mounted, so it's always honest.
Global
| Keys | Does |
|---|---|
Cmd/Ctrl+K | Open the command palette (search, navigate, run actions). |
? | Open the live shortcut help dialog. |
g then i | Go to Issues. |
g then n | Go to Inbox. |
g then p | Go to Patches. |
g then w | Go to Workspaces. |
g then f | Go to Follow-ups. |
g then k | Go to Knowledge. |
g then a | Go to Agents. |
g then r | Go to Runs. |
g then d | Go to Dashboard. |
g then s | Go to Settings. |
g-prefix chords ignore typing context, so they don't fire while you're editing a field.
Tables (every list page)
| Keys | Does |
|---|---|
j / k | Move active row down / up (wraps at edges). |
Shift+j / Shift+k | Page-jump 10 rows (clamps at edges, doesn't wrap). |
Enter | Open the active row (split pane on Issues, detail route elsewhere). |
/ | Focus the search input in the table toolbar. |
x | Toggle selection on the active row; sets the range anchor. |
Shift+x | Range-select from the anchor to the active row (Gmail-style, additive). |
Cmd/Ctrl+A | Select every row on the visible page. |
Esc | Clear selection if any; otherwise blur the focused element. |
Selection survives pagination, sort changes, and filter changes — refilter to narrow the visible set, keep ticking rows, and bulk-act on the union once you're done.
When the mouse hovers a row, the active-row marker syncs to it — so j/k after a hover continues from where you were looking.
Row actions (page-bound)
Each list page may bind extra single-key actions on the active row. The help dialog (?) lists the ones that the current page registered.
| Keys | Page | Does |
|---|---|---|
a | Issues | Run the row's primary action (open / approve / send). |
f | Issues | Run fix on the active row. |
g then o | Issues | Open queue (clear bucket filter). |
g then r | Issues | Review bucket. |
Page-bound row keys never fire while typing.
Detail pages
| Keys | Does |
|---|---|
[ | Previous item under the list filter+sort you came from. |
] | Next item under the same filter+sort. |
The pager only renders when there is recorded list context. Open a detail directly (deep link, fresh tab) and the pager hides — there's nothing to step through. The recorded context survives a page reload because it lives in URL state on the list page; the detail route reads it back.
Split view (Issues, Patches, Inbox, Follow-ups)
| Keys / gesture | Does |
|---|---|
| Drag divider | Resize the split. Width is persisted per-operator. |
Focus divider, ← / → | Step the divider 16 px. |
Focus divider, Shift + ←/→ | Step 64 px. |
Focus divider, Home / End | Snap to max / min. |
The split collapses on narrow viewports automatically. When the pane is collapsed, row activations route to the standalone detail page instead.
Command palette (Cmd/Ctrl+K)
The palette searches across navigation, queues, recent entities, saved views, and actions — anything a page registers while mounted shows up.
- Type to fuzzy-search; arrow keys move highlight;
Enterruns. - Actions registered by a page can fire the same handlers as bulk toolbars and row buttons. So "Approve issue ABC-12" works whether or not the issue is currently in your filter.
- The palette resets its query on close — re-opening starts clean.
Examples that exist out of the box: go to issues, new issue, approve selected, delete selected, open recent: BIZ-29, plus every saved view by name.
What's preserved across reloads
- Table state — page, page size, sort, search, filters, view — lives in the URL, so reload restores exactly what you had.
- Selection — survives pagination, sort, and filter changes; cleared by an explicit
Esc, the bulk-bar Clear, or navigating away. - Split-pane width + open state — per-page, per-operator, persisted in your browser.
- Saved views — per-tenant, shared across operators when marked shared.
- Detail-pager context — the captured list filter rides along to the detail route, so
[/]keep working after a reload of the detail page itself.