Guide
Hotkeys
gori's keyboard shortcuts are rebindable from the Hotkeys editor. Reach it from Preferences (Ctrl-, β Editor & Keys β Hotkeys, then β΅), or jump straight there with settings:hotkeys in the command palette (Ctrl-P). The editor lists every rebindable action grouped by where it fires (GLOBAL, HISTORY, REPEATER, FUZZER, INTERCEPT, β¦); pick a row, press a new key, done.
Ctrl-, β Editor & Keys β Hotkeys
Ctrl-P β settings:hotkeys
Key budget (how new shortcuts earn a key)
Bare letter keys are scarce. New actions should pick a price tier before taking a chord:
| Tier | Price | When | Examples |
|---|---|---|---|
| L0 Structural | Esc Enter Tab arrows Space (leader) |
Always | focus, open/close, READ/INS, space menu |
| L1 Loop | bare letter or sticky family (^R) |
many times / minute | History/Issues j/k / y t (mark) v (view), sub-tab strip t (mark), Repeater send |
| L2 Session breath | Global bare (cap: c i s only) |
many times / session | capture, intercept, scope lens |
| L3 Contextual | Space then mnemonic |
occasional, pane-local | compare, mine, send-group, copy-as |
| L4 Rare / config | palette (Ctrl-P) or Preferences (Ctrl-,) |
rare | settings, Match & Replace, notifications |
Rules of thumb:
- Default for new pane actions is L3 (space menu only). Promote to a direct key only after the loop proves it.
- Ctrl is for actions that must work while typing (INS), and for run/stop on a workbench (
Ctrl-R/Ctrl-X). It is not a general upgrade from bare. - Shift carries the whole-tab wipes.
β§XisClearin every tab that has one β History, Probe, Authorize, Issues, and the Project ACTIVITY feed β withXas the space-menu letter beside it. The letter isxand notcbecause of what sits under the shift: barexis bound in none of those five scopes, while barecis live in all of them (capture.toggle, anddismisson the Probe list), and a project wipe does not belong one shift above a key an operator presses all day. A destructive chord must also be named where it can be read before it is pressed β the Help sheet and the tab's own body hint, not the space menu alone β and it must ask first. - Copy is the worked example of that rule.
ycopies in READ, andCtrl-Ycopies in INS as well, in every text box. In INS a bareyis a literal character β and typing it over aShift+arrows selection replaces the selection β so the copy reflex needs a chord that survives typing. Both are the same verb (*.copy), so a rebind moves the READ letter andCtrl-Ystays where it is: it is pinned, in every scope, including through an explicit unbind. Unbindingyis a statement about READ mode, and it must not quietly leave a text pane with no way at all to copy what you just selected. - The space menu is not an INS fallback: text editors swallow keys upstream, so
Spacestays a literal character there. An action that has to be reachable while typing needs a Ctrl chord, not just a mnemonic. (This is whyCtrl-Qβ not the space menu alone β carries the Repeater/Fuzzer decoder-chain editor after it gaveCtrl-Yup to Copy.) - History β Repeater and Repeater send stay on
Ctrl-R(same muscle memory). Do not move HistoryβRepeater to barer. - Match & Replace and Notifications ship keyless (palette / badge); rebind them if you want a Global chord.
Editing
The editor opens a working copy. Nothing is saved until you press Enter, and Esc discards every change.
| Key | Action |
|---|---|
β / β (or j / k), wheel |
Move the selection |
e or Space |
Rebind the selected action, then press the new key |
x or Backspace |
Unbind the selected action |
r |
Reset the selected action to its default |
Shift-R |
Reset every action to its defaults |
β / β |
Cycle the OS default profile (see below) |
Enter |
Save + apply (live, no restart) |
Esc |
Discard and close |
When you start a rebind the footer shows "press a key to bind". Press the chord you want, modifiers included, except the ones listed under Reserved keys below. If the key is reserved or already used by another action in the same place, the editor refuses it and tells you why; capture stays open so you can try another key.
A row's chord shows (unbound) when nothing is bound. The β marker means you've changed it from the default; Β· means it's at the default.
Conflicts
Two actions may share a key only if they fire in different places. That's by design (s is "scope lens" almost everywhere but "swap" on the Comparer tab, c is "toggle capture" everywhere except the Intercept queue where it cycles the catch direction). The editor blocks only a same-place collision, because there the keymap could keep just one of them.
Reserved Keys
Some keys can't be rebound because the terminal or gori needs them:
-
Quit:
Ctrl-C,Ctrl-D. -
Indistinguishable from named keys:
Ctrl-M/Ctrl-J(Enter),Ctrl-I(Tab),Ctrl-H(Backspace),Ctrl-[(Escape). -
Structural:
Enter,Esc,Tab,Backspace, and a bare:(the command line). -
gori shortcuts claimed before the keymap:
Ctrl-G(go to line),Ctrl-F(find, thenTabfor find & replace),Ctrl-B(reveal whitespace),Ctrl-E(external editor),Ctrl-P(command palette),Ctrl-N(new repeater/fuzz/note),Ctrl-W(close the sub-tab, or every marked one),Ctrl-Z(undo, consumed by every text editor β Repeater, Fuzzer, Notes, Issues, Intercept, Decoder, JWT, Rewriter and the Project description),Ctrl-,(Preferences), andCtrl-1β¦Ctrl-9(switch sub-tab). These are handled by a hardcoded guard before the keymap, so a binding on them would never fire. For the same reason Command palette, New repeater request, and New fuzz session aren't listed in the editor. Their key is fixed.You can't move an individual key out of that family, but you can give the whole family a second modifier β see Command modifier below.
Ctrl-G/Ctrl-Fact on whichever multi-line pane has focus: the Repeater's request and response, the History detail, the Intercept editor, Notes, the Project description, the Decoder's INPUT and OUTPUT, and the Fuzzer's template and result detail.Tabswitches find to find & replace on the six that are editable β everything else is read-only, and the prompt says so rather than offering a swap it cannot make.
Flow-control/signal chords like Ctrl-S are not reserved; gori runs the terminal in raw mode, so they reach the app (Repeater's SNI toggle ships on Ctrl-S).
OS Default Profiles
The β / β profile selector picks which default key set a fresh (un-overridden) binding uses: auto (tracks the platform gori was built for), macOS, Linux, or Windows. Your own rebindings always sit on top of the chosen profile, regardless of OS.
Today the per-OS defaults are identical: in a terminal, Ctrl+letter chords reach the application on macOS, Linux, and Windows alike, and the genuinely hazardous keys are the reserved control characters above (blocked everywhere). The profile mechanism is in place so a real per-terminal clash can be fixed without touching dispatch. For now, auto is the right choice for everyone.
Command Modifier
The chord family listed under Reserved keys is fixed because a hardcoded guard runs before the keymap. That's a problem when your terminal never delivers the Ctrl form at all:
Ctrl-1β¦Ctrl-9is undeliverable on many terminals β there is no control character for it, so the sub-tab jumps simply never arrive. You never need it: on a sub-tab strip,flists and searches every open sub-tab, from whichever chip you are standing on. (Theβat the strip's left edge opens the same list β click it, or pressβfrom the first chip.)- A multiplexer eats the chord first. tmux's default prefix is
Ctrl-B, which gori also uses for reveal-whitespace.
Preferences β Editor & Keys β Keys β Command modifier (Ctrl-,), or settings:keys in the palette, switches that family between Ctrl and Option (β₯). It is an alias, not a swap: with Option selected, β₯P opens the palette and ^P still does. Only the advertised form changes β status hints, the Help tab and the palette all start showing β₯P, β₯N, β₯1-9.
| Modifier | Effect |
|---|---|
Ctrl (default) |
^P ^N ^W ^G ^F ^B ^E ^Z ^, ^1-^9 |
Option (β₯) |
the above plus β₯P β₯N β₯W β₯G β₯F β₯B β₯E β₯Z β₯, β₯1-β₯9 |
Because Ctrl keeps working, picking Option can never lock you out of the palette β worth knowing before you flip it, since on macOS your terminal must be set to send Option as Meta/Esc+ or β₯P arrives as Ο and nothing happens:
- Terminal.app: Settings β Profiles β Keyboard β Use Option as Meta key
- iTerm2: Settings β Profiles β Keys β Left/Right Option key β Esc+
Two things it does not do. It doesn't touch chords the editor can already rebind (^R send, ^S SNI, β¦) β rebind those per action instead. And if you had bound an action to an Option chord in the family (alt-n, say), turning the alias on shadows it: the guard wins, that action reverts to its default, and the save toast names it.
The first-run wizard recaps this on its Review step, so you can pick a modifier before ever reaching the app.
Where It's Stored
Saved to ~/.gori/settings.json (override the directory with $GORI_HOME) under a sparse hotkeys block. Only the bindings you changed are written, as a list of chord labels per action id; an empty list is an explicit unbind:
{
"hotkeys": {
"os": "auto",
"command_modifier": "alt",
"bindings": {
"rules.edit": ["g"],
"scope.edit": []
}
}
}
command_modifier is "ctrl" (the default) or "alt"; an unknown value falls back to "ctrl". An untouched install writes no hotkeys block at all.
An absent action uses the profile default. Unknown ids and unparseable chords are ignored on load, so hand-edits and version drift degrade gracefully.
Limitations
- Only an action's primary chord is shown/edited; navigation aliases (e.g. the arrow-key duplicates of
j/k) aren't listed. - Every surface that names a rebindable chord reads it from the effective keymap: the command palette, the space menu, the Help tab and its popup, the status-bar hint strips, and the empty-state cards. What stays literal is not a verb: the claimed
^P/^N/^W/^1-9family, structural keys (esc,β΅, arrows,βΉ), and a pane-local letter such asxin an editor. - Space-menu mnemonic letters are stable action identities (Helix-like); rebinding changes the direct chord, not the space-menu letter.
- Pane-local keys that share a letter (Repeater response
x= hex vs request/targetx= select line) stay controller-owned so both meanings can coexist. - Press
?from a navigable context to jump to the Help tab (mitmproxy-style cheat-sheet).
Next Steps
- Settings: the Preferences modal and every section in it
- Themes: switch or create colour themes the same way
- Configuration Reference: the
hotkeyskey insettings.json