Keybindings
The complete agentty keymap.
Everything you can do without leaving the home row.
Global
| Key | Action |
|---|---|
| Enter | Send the current message |
| Esc | Cancel the current turn / reject a permission / close a modal (does NOT quit) |
| S-Tab | Cycle permission profile (Write → Ask → Minimal) |
| Ctrl+K | Command palette |
| Ctrl+J | Thread list (opens at the current thread) |
| Ctrl+N | New thread |
| Alt+←/→ | Quick-cycle to the adjacent thread (← newer, → older) |
| Ctrl+←/→ | Quick-cycle threads (empty composer, idle session) |
| Ctrl+T | Todo / plan view |
| Ctrl+/ | Model picker — one list across every provider you're signed into (fuzzy-search, Enter switches provider+model atomically) |
| Ctrl+Tab | Quick-swap to the previous model you used (jumps across providers) |
| Ctrl+P | Provider picker (manage/switch LLM backends, hosts, accounts) |
| Ctrl+S | Smart Mode overlay (routing + learning) |
| Ctrl+G | Run a code block from the newest reply on your real terminal |
| Ctrl+R | Review pending diffs |
| Ctrl+O | Browse the full text of a frozen retrieved-context card |
| Ctrl+U | Expand / collapse the newest retrieved-context card (empty composer) |
| Ctrl+L | Redraw the screen |
| Ctrl+C | Quit (the only quit key) |
Every open key toggles. Pressing a modal's own open key again while it's up closes it — Ctrl+P shuts the provider picker, Ctrl+K the command palette, Ctrl+S the Smart Mode overlay, and so on. The model and provider pickers also cross-hop: Ctrl+P from the model picker jumps to the provider picker, Ctrl+/ does the reverse.
The model picker spans every provider. Ctrl+/ opens one fuzzy list of every model on every backend you're signed into — typesonfor every Sonnet,gptfor every GPT — and Enter switches provider and model in a single step. A recent section (the models you toggle between) sits up top, and providers you're not signed into appear as dim sign in to … rows that drop straight into login. Ctrl+Tab jumps to your previous model without opening anything. Use Ctrl+P when you want to manage backends (add a custom host, switch accounts) rather than pick a model.
If Ctrl+/ or Ctrl+Tab do nothing, your terminal can't encode them.Ctrl+/andCtrl+Tabare among the few chords legacy terminals literally cannot send (on most,Ctrl+Tabis byte-identical toTab). agentty negotiates the kitty keyboard protocol on startup, so the keys work on terminals that support it — kitty, Ghostty, WezTerm, foot, Konsole, recent xterm/Alacritty, iTerm2 3.5+, and Blink Shell on iOS. On a terminal that can't (notably mosh sessions, some minimal iOS SSH apps), use the always-portable routes instead: type/model(or/swap) in the composer, or open the command palette with Ctrl+K and pick "Switch model" / "Swap to previous model". Both work on every terminal. (SetMAYA_NO_KITTY_KEYBOARD=1to disable the protocol.)
Esc steps back one level. In a multi-step flow — provider picker → Custom host… → host input → API-key prompt — Esc pops one level at a time (and restores what you typed) rather than collapsing the whole stack. The footer showsEsc backwhen there's a parent,Esc cancelwhen there isn't.
Composer
The composer is a full readline-style editor. Keys are grouped below by what they do.
Submit & compose
| Key | Action |
|---|---|
| Enter | Send the message (or, while streaming, queue it) |
| Shift+Enter | Insert a newline |
| Alt+Enter | Insert a newline (fallback for terminals that don't deliver Shift+Enter) |
| Ctrl+E | Toggle the expanded (taller) composer |
| / | Open the command palette — when line-leading (start of buffer or after a newline) |
| @ | Open the file-mention picker — at a word boundary; inserts an @file chip |
| # | Open the symbol picker — at a word boundary; inserts a #symbol chip |
Cursor motion
| Key | Action |
|---|---|
| ← / → | Move one character (steps over an attachment chip as a single unit) |
| Ctrl+← / Ctrl+→ | Move one word (a run of punctuation counts as one unit) |
| Home / End | Jump to start / end of the buffer |
Ctrl+← / Ctrl+→ switch to word-motion only when the composer has text; on an empty composer with an idle session they cycle threads instead (same as Alt+←/→).
Editing
| Key | Action |
|---|---|
| Backspace | Delete the character (or whole chip) before the cursor |
| Ctrl+W | Delete the word before the cursor (readline unix-word-rubout) |
| Alt+D | Delete the word after the cursor (readline kill-word) |
| Ctrl+U | Kill to beginning of line |
| Alt+K | Kill to end of line |
| Ctrl+Z | Undo — rewinds word-by-word, not keystroke-by-keystroke |
| Ctrl+Y / Ctrl+Shift+Z | Redo |
| Ctrl+V / Alt+V | Paste an image from the clipboard as an attachment chip |
Undo coalesces a run of typing into one step (broken on whitespace and on any non-typing edit), so one Ctrl+Z after a paste reaches the pre-paste state. Ctrl+V is intercepted by some terminals (Windows Terminal binds it to its own paste); Alt+V is the fallback that every terminal passes through. Pasting an image over SSH needs one setting — kitty must be allowed to answer clipboard reads, and tmux must pass the request through. See Clipboard & Images.
Kill-to-end is Alt+K, not the readline-standard Ctrl+K — Ctrl+K is reserved app-wide for the command palette. It pairs with Ctrl+U (kill-to-start) the same way Alt+D (delete word forward) pairs with Ctrl+W (delete word back). Ctrl+U also doubles as “expand/collapse the newest retrieved-context card” when the composer is empty and such a card is on screen; with text in the box it always means kill-to-line-start.
History & queue
| Key | Action |
|---|---|
| ↑ | On an empty composer: recall queued messages (if any), else walk back through your previous messages |
| ↓ | Walk forward through history toward the live draft |
| Alt+↑ | Edit queued messages one at a time (loads the most recently queued first) |
| Alt+↓ | Step back out of the per-item queue editor toward the live draft |
| Alt+Backspace | Drop the most recently queued message (empty composer, nothing peeked) |
Queue behavior
Typing while a turn streams queues the message rather than interrupting. There are two ways to work with the queue:
- ↑ on an empty composer pulls every queued message back into the buffer at once (joined by newlines, cursor at the seam) — destructive on the queue, so re-submit to re-queue.
- Alt+↑ / Alt+↓ step through the queue one message at a time to fix a single entry; Enter re-queues the edited message in place. This works even mid-edit, so you don't have to clear the composer first.
The composer placeholder hints press ↑ to edit queued — type to queue another… when relevant.
Review pane (Ctrl+R)
When the agent has edited files, Ctrl+R opens the review pane. Edits are already on disk — the pane is a keep/undo gate.
| Key | Action |
|---|---|
| j / k or ↑ / ↓ | Move between hunks |
| h / l or Tab | Previous / next file |
| y / Enter | Accept the current hunk (keep it) |
| n | Reject the current hunk (revert it) |
| Ctrl+D / Ctrl+U or PgDn / PgUp | Scroll inside a hunk taller than the viewport |
| Ctrl+A | Accept all — keep every change |
| Ctrl+X | Reject all — revert every file (two-press to confirm) |
| Esc / q | Close — keeps accepted + undecided hunks, reverts rejected ones |
Esc commits, it does not cancel. Closing keeps every undecided hunk (the edit is already live). The footer saysEsc keep all/keep rest/applyso the outcome is never a surprise. To throw away everything, use Ctrl+X (Reject all).
Palette-only actions
Some actions have no dedicated key — reach them from the command palette (Ctrl+K). Notably Rewind to checkpoint opens a diff-preview picker over every checkpointed turn (git repo + idle session); see Checkpoints & rewind. Fork thread branches the current conversation into a fresh thread that carries near-zero context — the parent transcript is read on demand — to escape a full context window; see Forking a Thread. Compaction depth cycles how full the context window gets before agentty auto-compacts in the background (75/90/95%) — see Providers & Models.