jevieDocs Download

↑↓ pick↵ openesc close

Your coding agents

Jevie's terminal

Terminals that keep running when you close them, that your coding agents can drive from inside, and that you can open from your other Macs.

FreeMacCoding agent

Choose an example to copy it, then try it in Jevie.

Use itHow it worksLimitsWhere it's kept

Use it

From your keyboard

From another terminal (kitty, Ghostty, iTerm)

Held sessions shown in any terminal (kitty, Ghostty, iTerm, over ssh) as Jevie Studio's Terminal: the side on the left, the tabs of the shown session's folder on top, the session in the pane. The keys and command names are herdr's.

In Studio

Terminals live on Jevie Studio's Terminal view (studio terminal, studio, or ⌘↩ on a folder in the palette; its other view, the Desk, reads the same sessions as conversations, ⇧⌘O). Studio's keys hold ⌘, as a tiling window manager's do, so a terminal still gets every plain and ⌃ key; ⌘/ shows them all.

Neovim with tiles for windows

Run jevie-nvim (any nvim arguments) in a terminal in Studio. One Neovim runs behind all its tiles, so buffers, registers, undo and language servers are shared:

From the Dock

For your coding agents

For agents over MCP

Agents that reach Jevie over MCP (Claude Desktop, Cursor, any client you add jevie to) see your terminals as tools: jevie_terminals lists them, jevie_terminal_read reads one (waiting for some text, for it to go quiet, or for the agent in it to end its turn), jevie_terminal_type types into it, and jevie_terminal_keys presses keys (Ctrl+C, Shift+Tab, ArrowUp). Each terminal decides how far agents go.

From your other Macs

How it works

Every terminal Jevie opens is held by a session hub, not by its window: close the tile or quit Jevie and the program keeps running; open it again and you see its screen as it is now. Sessions show in Jevie Studio as tiles. Each tile's bar shows what runs in it (Claude's mark, Codex's) and the ports it listens on, so the dev server is the tile that says :5173.

jevie-term is in every Jevie terminal, as rex is in every Rex terminal. An agent uses it to open tiles, run a command and wait for its exit code, read another terminal's screen, type into one, report its status on its tile (working, done, asking) and name its session after its task, so the tile says fix-login-redirect instead of zsh. Here or beside you is the agent's own terminal, the focused pane is the tile you have in hand, and a name always wins over both. jevie-term skill setup installs the skill and a hook that tells each new agent session which terminal it is in, beside your own settings and never replacing them; the guide the skill reads comes from Jevie itself, so an update changes what agents know.

An agent can also drive another agent. jevie-term wait --turn knows when a coding agent in a pane has finished its turn or stopped to ask: from the state a program reports (Rex's Program Status Protocol), or, for Claude Code, which reports none outside Rex, from Claude's own list of its sessions and the prompt on its screen. Only what it says after the last thing typed into it counts, so the turn before's done never ends the wait. The guide tells agents to give a second agent its own folder or worktree, to approve a prompt once and only inside what you asked, never always allow, and to check the files themselves rather than trust the other agent's summary.

A session started from inside another is its child, as herdr's terminals keep them. When a child stops to ask, fails, finishes its turn or ends, Jevie types one line into the agent that started it, saying which child and how to read it, but only once that agent is at its prompt and its screen has been still for three seconds, so it never lands in the middle of your typing; a plain shell is never typed into. A hidden child ends with the session that started it; a tile on your wall stays, since it is yours as much as the agent's.

An agent started with jevie-term agent from inside another is told to answer with jevie-term tell parent.

jevie-term do FILE runs a JavaScript file you wrote against your terminals: it is given t, with every jevie-term command (t.run, t.capture, t.send…), t.on('ended', …) for what happens, t.every and t.after for timers, t.exec for programs, and beside to place a new pane by another. It keeps running while it listens or has a timer, and Ctrl-C stops it. jevie-term events --follow prints what happens in your terminals as it happens: sessions starting and ending, the state a program reports, its folder, its name, its ports. Your when a terminal … triggers are watched every two seconds, and only while you have one.

A tile slower than its program (a cat of a huge file draws far slower than it prints) skips ahead: what it could never have drawn is left out, and it is sent the screen as it is once it catches up, so it stays attached and shows the end; the whole output is still in the session's log. A program's own desktop notification (OSC 9, OSC 777 or kitty's OSC 99, which Claude Code and many tools send) marks its session as asking you, its words in Studio's notification, until you type into it.

Codex, OpenCode, Gemini CLI and pi typed in a Jevie terminal say what they are doing on their tile without anything written into their own settings. The terminal puts a stand-in for each first on PATH (zsh's own files are read first, and the stand-ins go back in front at your first prompt), and the stand-in starts the real agent with Jevie's hooks for that launch only: Codex with -c hooks that report working, done and stopped on the session's socket, and its notifications sent for every approval, plan prompt and question even while you look at it; OpenCode with a plugin named in OPENCODE_CONFIG_CONTENT; Gemini CLI with a settings file of hooks alone (GEMINI_CLI_SYSTEM_SETTINGS_PATH), which Gemini adds to your own hooks; pi with an extension loaded by -e, which also says when a turn failed. Reports carry when they began, so a late one never undoes a newer one.

A finished turn stays marked until you take its tile in hand or type into it. ~/.codex, ~/.config/opencode, ~/.gemini and ~/.pi are never written. Claude Code reports through Jevie's own hooks, as before. JEVIE_AGENTS_OFF=1 starts agents exactly as typed.

What a program prints cannot make Jevie do more than you would. A link it prints opens only after Jevie checks where it really goes: a web or mail link opens; a file opens unless it would run something (an app, a script, a .command, an executable, or a link to one), names another computer, or is not there; a link to another app's scheme (slack://…) asks first; a link holding invisible or direction-changing characters is refused, and the sheet shows the real target. A program cannot read your clipboard (OSC 52 reads are refused; setting it, as pbcopy over ssh does, still works).

Pasting several lines into a program that has not asked for bracketed paste, where each line would run as it lands, asks first.

With jevie-term remote on, this Mac listens on its Tailscale address for your other Macs. A machine without Tailscale can use Jevie's own instead (--tailscale built-in): it joins your tailnet as a device named jevie- and its name, and the node itself says which login is calling. jevie-term serve does the same with no Jevie app running, for a Linux box or a server; --install keeps it running from boot, and restarting it never ends the sessions it holds. Tailscale says who is calling, and only a Mac signed in as you gets in (allow: in the file adds others). open -S HOST SESSION makes a tile here whose program is that remote session; closing the tile lets go of it and it keeps running there.

Limits

Where it's kept

Sessions in ~/.jevie/terms/ (ID.name a session's name, ID.agents how far agents over MCP may go, ID.parent the session that started it, focused the tile in hand), roles in ~/.jevie/self/roles/; remote settings in ~/.jevie/self/terminals.md (tailscale:, name:), the built-in node's keys and state in ~/.jevie/tailnet-term, the service in ~/.config/systemd/user/jevie-term.service; the skill in ~/.claude/skills/jevie-term and ~/.agents/skills/jevie-term, the hook in ~/.claude/settings.json and ~/.codex/hooks.json; the stand-ins, zsh's first file and OpenCode's plugin in ~/.jevie/shell/.

In Jevie, help terminal answers from this page as you type.

Updated 6 November 2026 · Something wrong or missing? Tell us