Keyboard Shortcuts
Goa provides keyboard shortcuts for navigation, editing, and application actions. The table below shows the default keybindings. Customize them in your theme config.
Navigation
| Key | Action |
|---|---|
↑ / Ctrl+P |
Move cursor up / browse history up |
↓ / Ctrl+N |
Move cursor down / browse history down |
← / Ctrl+B |
Move cursor left |
→ / Ctrl+F |
Move cursor right |
Alt+← / Alt+B |
Move cursor by word left |
Alt+→ / Alt+F |
Move cursor by word right |
Ctrl+A / Home |
Move to start of line |
Ctrl+E / End |
Move to end of line |
PgUp |
Scroll chat viewport up by one page |
PgDn |
Scroll chat viewport down by one page |
Editing
| Key | Action |
|---|---|
Enter |
Send message / submit input |
Alt+Enter / Ctrl+Enter |
Insert a newline |
Tab |
Accept completion / path completion |
Ctrl+W / Alt+Backspace |
Delete word backwards |
Alt+D |
Delete word forwards |
Ctrl+U |
Delete to start of line |
Ctrl+K |
Delete to end of line |
Ctrl+Y |
Paste most-recently deleted text (yank) |
Alt+Y |
Cycle through deleted text after pasting |
Ctrl+Z |
Undo |
Ctrl+V / Cmd+V / Ctrl+Shift+V |
Paste from the system clipboard: files copied in a file manager, then an image, then text |
These chords read the OS clipboard directly, store whatever they find in the
durable image store (~/.cache/goa/images, ~/Library/Caches/goa/images on
macOS) and insert the stored path into the input line, where the submit path
turns it into an attachment — the same store the web UI's /upload uses.
Cmd+V is bound (as super+v, next to Ctrl+V) because a terminal can only
paste for you when the clipboard holds text: with an image-only clipboard — a
screenshot — macOS disables the terminal's own Paste menu item, the chord falls
through to goa, and a terminal speaking the Kitty keyboard protocol reports it
as a key event. Binding that event is what makes Cmd+V paste a screenshot; a
terminal that never forwards the chord still pastes images with Ctrl+V.
Application
| Key | Action |
|---|---|
Ctrl+G |
Toggle the goal status bubble |
Tab |
Next multi-agent tab (yields to a visible completion popup) |
Shift+Tab |
Previous multi-agent tab |
Alt+] / Alt+[ |
Next / previous multi-agent tab (aliases) |
Alt+1…Alt+9 |
Jump to multi-agent tab N |
Alt+T |
Cycle thinking/reasoning level |
Alt+M |
Cycle major mode (coder → planner → reviewer) |
Alt+O |
Open the interactive mode selector |
Ctrl+Shift+M |
Cycle autonomy level (yolo → solo → confirm → review) |
Ctrl+L |
Open the model selector |
Ctrl+P |
Show the assembled system prompt |
Ctrl+X |
Switch orchestrator tab (Conversation ↔ Stats) |
Ctrl+T |
Toggle thinking block visibility |
Ctrl+O |
Toggle all tool output (Summary/Full) |
Ctrl+Shift+Z |
Delete the last chat message |
Ctrl+C |
Cancel input request / quit when empty |
Esc |
Cancel completion / close selection |
/ |
Slash commands |
! |
Run a bash command |
Modals & Overlays
| Key | Action |
|---|---|
↑ / ↓ |
Navigate items in a selector |
Enter |
Confirm selection |
Esc |
Dismiss modal / close overlay |
Tab |
Next field or option |
Shift+Tab |
Previous field or option |
Review Pager
When the interactive review pager is open (/review):
| Key | Action |
|---|---|
↑ / k |
Scroll one line up |
↓ / j |
Scroll one line down |
PgUp |
Scroll one page up |
PgDn |
Scroll one page down |
c |
Add a comment on the current line |
e |
Edit the comment on the current line |
d |
Delete the comment on the current line |
b |
Change the base commit |
s |
Submit the review to the agent |
x |
Export the review to a Markdown file |
q / Esc |
Close the pager |
Single-file review:
/review:file:<path>opens the same pager for one text file (no git required). It shares every key above exceptb(change base), andCtrl+Calso closes it.
Note: Keybindings may vary by terminal emulator. Some keys (like
Ctrl+Enter) require Kitty keyboard protocol support. Use/hotkeysinside Goa to see your active keybindings.
Browser keys (goa server)
The tables above are the whole story: over the web UI the same bindings
apply, because the page does not implement shortcuts of its own. A keypress
is reported to the server (key, ctrl, alt, shift), and the server's
encoder turns it into the byte sequence a terminal would have written — so
Ctrl+G, Alt+1, Ctrl+L, PgUp, F5 and friends mean in the page exactly
what they mean in a terminal. Click the page first to give it focus.
What does differ, and is worth knowing:
| Difference | Why |
|---|---|
Cmd/Ctrl+Cmd chords are left to the browser |
Reload, devtools and tab switching stay available; the page never swallows them |
Alt alone may be claimed by the browser menu on some platforms |
Use Esc to dismiss an overlay if the browser eats Alt |
Text inserted programmatically (Input.insertText, some IME/assistive paths) fires no keydown |
Those keystrokes have no descriptor to encode; type or paste normally — paste goes through /input verbatim |
| No Kitty keyboard protocol | Chords are encoded in the legacy xterm form plus Kitty CSI-u where legacy has no parameter, which covers every binding Goa has |
Read-only servers (--server-read-only) accept every view and reject every
keystroke, so viewers can navigate and scroll but cannot drive the session.
See WEBUI.md for the full transport and security model.
Attach keys (goa attach)
An attached terminal forwards every keystroke verbatim — the session's bindings are the terminal tables above, unchanged. The client keeps exactly one chord for itself:
| Key | Action |
|---|---|
Ctrl+] |
Detach: the terminal is restored and goa attach exits; the session keeps running on the server (/quit inside the session ends it, or stop the server from its console) |
Ctrl+] (byte 0x1d) is deliberately not bound anywhere in the session's
keymap, which is what makes it safe to reserve. Reconnect after a network
drop is automatic; /quit inside the session is reported and attach exits.