Double-Escape: one keystroke between your shell and your AI
Every rysh pane has two input modes — shell and prompt. Esc Esc flips between them. That tiny toggle removes the copy-paste bridge you've become.
Count how many times you do this tomorrow: run a command, read the error, switch to a browser tab, paste the error into a chat box, wait, read the answer, switch back, type the fix.
Each switch is small. The sum is your afternoon.
The problem isn't the model. It's placement. Your shell and your AI live in different windows, and you are the copy-paste bridge between them.
One pane, two modes
In rysh, every pane is two things at once:
- a real terminal — a PTY running your
$SHELL, with proper vim/htop support, scrollback, all of it - a conversation with Claude — wired to your files, your git repo, your running processes
You flip between them with Double-Escape. Press Esc twice: the input line switches from shell mode to prompt mode. Press it again: back to shell.
That's it. That's the feature. It's also the entire thesis of rysh compressed into one keystroke: the distance between doing and asking should be zero.
What it feels like
$ go test ./internal/actors/
--- FAIL: TestPaneSnapshotRestore (0.02s)
pane_test.go:143: expected 3 panes, got 2
FAIL
Esc Esc. The status bar flips to prompt.
why did TestPaneSnapshotRestore fail? fix it.
Notice what you didn't do: you didn't paste the error, didn't explain which repo you're in, didn't describe the file layout. The agent is in the pane. It reads the test file, greps for the snapshot logic, re-runs the failing test itself, and proposes an edit — shown as a coloured diff you approve before anything touches disk.
Esc Esc back to shell mode. go test ./.... Green.
You never left the pane. You never left the keyboard.
Why a mode, and not a magic prefix?
Plenty of tools bolt AI onto a terminal with a special prefix character: start your line with some sigil and it goes to the model. That works for one-off questions. It falls apart the moment the AI becomes a colleague instead of a lookup table.
A mode is sticky, and it's per pane. That matters more than it sounds:
- Your "ops" pane can live in shell mode all day. It's a terminal that happens to have an AI on standby.
- Your "worker" pane can live in prompt mode all day. It's an agent conversation that happens to have a shell underneath it.
- A debugging pane flips back and forth twenty times an hour —
Esc Escis muscle memory by lunchtime.
The mode is part of the pane's state, not the UI's. It's persisted with the pane (rysh stores per-pane state in an embedded JetStream KV bucket), so when you detach a session and reattach tomorrow, every pane wakes up in the mode you left it in.
What actually happens underneath
Rysh isn't a chat wrapper with a terminal skin. Everything is an actor talking over an embedded NATS bus.
When you hit Enter, the TUI publishes a typed message to the session's workspace subject. The workspace actor routes it straight to the pane's actor. From there:
- Shell mode → the input is written to the pane's PTY. Output flows back on the pane's shell output topic.
- Prompt mode → the input goes to the pane's LLM execution actor, which runs the agentic loop — tool calls, approvals, the lot — with last-prompt-wins semantics: send a new prompt and any in-flight run is cancelled. No zombie completions.
Here's the detail I like most: shell output and AI output are published on separate topics, then merged into one stream, interleaved by arrival time. So your pane's transcript reads like an actual conversation — command, output, question, answer — instead of two logs fighting over a scrollback. Model responses are rendered as markdown right in the pane.
The honest part
Rysh runs on Claude. Bring your own Anthropic API key and it talks to the Messages API directly; no key, and it falls back to shelling out to the claude CLI. Same model you already use. We didn't train anything smarter — nobody offering you a terminal did.
What's different is placement and plumbing: the model sits inside a real PTY with tools, cross-pane context, approval gates on dangerous operations, and a keystroke — not a browser tab — between you and it. And it's self-hostable: your machine, your keys, your data.
The toggle is a gateway
Double-Escape looks like a convenience feature. It's actually the first domino.
Once shell and AI share a pane, you start wanting more panes — and then panes that are agents, stacked like a deck of cards. Then panes that listen to other panes' output. Then sessions that keep running after you close the laptop, that you can poke from a plain shell with rysh send.
That's the rest of rysh. It starts with pressing Escape twice.
Rysh is early — and that's a feature, not an apology. We're recruiting design partners: teams who want agents inside their real workflow and a direct line to the founders. → rysh.ai/design-partner
Related: Every pane is a conversation · Sessions that survive