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:

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:

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:

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:

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

Next Steps