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
- ⌘T in StudioA new shell as a tab of the tile, in its folder
when the build terminal fails, tell me
Told the moment it fails;… summarize it
runs that sentence about itwhen a terminal finishes, tell me
when any terminal asks for me, tell me
Every terminal, finishing or waiting on you
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.
jevie· Studio in this terminal, showing the session this terminal showed last; with nothing held, a shell here. The side lists Recent, Needs you, Working and Shells, each with its count and what each session is doing, and Archived, Claude sessions that ended, to start again. Click a row or a tab to show it, a section's title to fold it; the wheel scrolls the side, and the pane's scrollback unless the program takes the mousejevie --plain(orJEVIE_TUI=plain) · One session at a time, filling the window, with no side; a window under 70 columns gets this toojevie claude(orcodex,opencode,gemini,pi,shell, the agent's own arguments after it) · A new session running it in this folder, shown here. Close the window and it keeps runningjevie attach NAME(alsojevie session attach,agent attach,terminal attach) · Any held session shown here, Studio's too: a name, an id, or its place in the list- In a session, ctrl+b and then: q (or d) detach · c a new shell in its folder · a a new Claude in its folder · n p next and previous · 1–9 that session · l the one before · h (or g, w, s) the side has the keys · b side shown or hidden · , or T rename · x close · ctrl+b a ctrl+b typed · ? every key
- In the side: j k or the arrows move, ↩ shows the row (or opens Archived, or starts an archived session again), l or Esc back to the session, x close, , rename, c a new shell, a a new Claude, q detach
- With
--plain, Go to lists every session with what it is doing: j k move, ↩ shows, / searches, b w i d only blocked, working, idle or done, a all, c a new shell, Esc back jevie ls(alsosession list,agent list,pane list) ·jevie agent read NAMEits screen ·jevie agent wait NAMEuntil its turn ends ·jevie agent prompt NAME words [--wait]·jevie pane run NAME command·jevie pane send-text|send-keys|close|rename NAME …
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.
- ⌘H ⌘J ⌘K ⌘L (or ⌘ and an arrow)The tile that way; with ⇧, move the tile that way
- ⇧⌘ and an arrowSplit that way, a new shell in the tile's folder; ⌥⌘ and an arrow — the pane that way (⌥⇧⌘ moves it)
- ⌘TA new shell as a tab of the tile, in its folder; ⌥⌘T makes the tile beside a tab of this one
- ⌘[ ⌘] (or ⌃Tab ⌃⇧Tab)The tile's tabs; ⌃⌘R (or ⇧⌘R) — rename the session
- ⌘NA new Studio window with a shell in it, as Rex's New Window (the size and layout of the Studio it came from, no window buttons; moved and sized as any window; kept across a relaunch) · ⇧⌘N — a new session in this window, in the place of the pane in hand, which runs on in the side · ⇧⌘G — a new tab in a folder you pick · ⌃⌘I — a path typed into the terminal, browsed for (→ into a folder, ← back)
- ⌘F (or ⇧⌘↩)Fill Studio with the tile, and back · ⌘↩ — the agent in this pane's folder · ⌥⌘↩ — make it the biggest · ⌘0 — all tiles, and back · ⌘A — out a level, ⇧⌘A back in
- ⌥⌘F (or the window button on the tile's bar)Float the pane: it lifts off the tiles into a window over them, which you move by its bar, size by its edges and split inside (⇧⌘ arrows); ⌥ and drag takes a pane out of it to dock elsewhere · ⌥⌘M — put the window away to a chip at Studio's foot, and bring it back · ⌥⌘F again — dock it among the tiles. Right-click a tile's bar for Float, Dock and Minimize; floating windows stay where you left them after a restart
- ⌃⌘NThe next session waiting on you (⌥⌘N the previous) · ⌘; or ⌘Q — the tile you were in before · ⌘O ⌘I — back and forward through where you have been
- ⌘1 – ⌘9The side's row with that number · ⌥⌘1 – 9 a view you kept, ⌥⇧⌘1 – 9 keeps this one
- ⌘M and a letterMark the tile · ⌘' and the letter — back to it
- ⇧⌘FSearch every tile and tab by any letters, terminals and pages; ⌃J ⌃K move in the list
- ⌘BThe side: every pane by session · ⌘. — only the agents, what needs you first · ⇧⌘P — every command, with its keys
- ⌘= ⌘-Text bigger and smaller · ⇧⌘= ⇧⌘- — the tile bigger and smaller · ⌘\ — the next layout (⇧⌘\ the one before)
- ⌘C ⌘VCopy and paste · ⌘P — the tile in a window of its own, ⌘P there puts it back
- ⌘WClose the tile (asked first) · ⇧⌘W — out of Studio, still running · Esc from above — back down to the tile
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:
:splitand:vsplit(and anything that opens a window: help, quickfix, a file tree) open a real tile on the side Neovim puts the window;:tabnewopens one as a tab:qin a window closes its tile; ⌘W on a tile closes its window (its buffer stays open, unsaved changes kept)- the tile you are in is the window you type in, and a jump in Neovim (⌃W W, a definition in another window) brings its tile forward
- completion menus, hovers and pickers are drawn inside the tile they belong to; the status line and command line are on the tile in hand
From the Dock
- Jevie Studio (in Applications, Spotlight, Launchpad, or by name in the palette)A new shell on this desktop's Studio, laid out as a chain with the side open
- Jevie Studio in the Dock or ⌘TabBack to the terminal you used last; ⌘N in its menu — another shell
- It stays in the Dock while a wall holds a terminal, as Jevie Browser does while one holds a page, and leaves when the last one closes
For your coding agents
jevie-term skill setupClaude Code, Codex, OpenCode and Pi taughtjevie-term, each started in a Jevie terminal told where it isjevie-term skill status·jevie-term skill removeWhat is installed in each, or all of it taken outjevie-term api·jevie-term api describe waitEvery command, and exactly what one takes and answers;api call wait '{"session":"web"}'runs it from JSONjevie-term capture 2·jevie-term wait 3f9aA session by its place in the list, or the end of its id; a word that fits two is refused, both namedjevie-term run --beside here --edge bottom -- npm testThe tests in a pane docked below yours, your pane still in handjevie-term do project.mjsA script that lays out a project, reacts when a terminal fails, runs things on a timer;--action pullruns one of its actions,--listnames themstart the dev server in another tab and tell me when it's ready
An agent opens a hidden tile, reads it until it listens, and says on which portrun the tests beside you and fix what fails
A tile for the tests, their exit code waited for, the failures read from its screenrun \dt in the psql pane
Typed into the session named psql, and its answer read backmake the text bigger in that terminal
Jevie-term app type biggerhave another Claude fix the flaky test beside you
Your agent opens a second Claude Code in a pane next to its own (run --beside here -- claude), sends it the task, and waits for its turn to end; it stops at any permission prompt and asks you unless the prompt is plainly inside what you askedjevie-term wait B --turnUntil the agent in that pane finishes its turn: exit 0 done, 10 it waits on a person (a permission, a question, a sign-in, trusting the folder), 11 an error, 12 it ended ·jevie-term turn B— what it is doing nowjevie-term send B 'run the tests' --enterTyped and sent, Return pressed on its own after the text- An agent never types over you: while you have words in a session's input box that you have not sent, what an agent would type there (
jevie-term send,send-key, or over MCP) waits up to 20 s for you to send or clear them, then is refused unrun rather than mixed into yours;--forcetypes anyway jevie-term run --hidden -- cargo testfrom inside an agent's terminalA child of that session: the agent is told, typed into its input, when the tests end, and the run ends if the agent's session does (--outlive-parentkeeps it)jevie-term wait --children all·--children anyUntil none of the sessions it started still works, or until one of them has newsjevie-term tell parent 'done: three files changed'·jevie-term tell B 'also check the error path'One agent's message to another, signed with who sent it, refused while the other waits on a personjevie-term agent --as reviewer -- review src/x.rsA second agent started as a role you keep in~/.jevie/self/roles/reviewer.md(its agent, and what it is told before the task) ·jevie-term roleslists them
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.
jevie-term agents webHow far agents may go in the session named web:off,readordrivejevie-term agents web driveAgents may type and press keys in it too ·jevie-term agents logs off— agents don't see it at all ·--default— back toreadwatch the build pane and tell me when it fails
An agent reads the build terminal until it goes quiet, without typing in itanswer the other Claude's question in pane 2
Refused: a terminal waiting on you (a permission, a question, a sign-in) is yours to answer
From your other Macs
jevie-term remote onThis Mac's terminals reachable from your other Macs on Tailscalejevie-term hostsYour Macs whose terminals answerjevie-term remote on --tailscale built-inA machine with no Tailscale installed joins your tailnet as a device of its own;jevie-term remote statusgives the sign-in link the first timejevie-term serve·jevie-term serve --installA Linux box's or server's terminals served with no Jevie app, once or from boot as a systemd servicejevie-term -S mac-mini list·jevie-term open -S mac-mini webThat Mac's sessions, and one of them as a tile here
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
- The Mac you connect from needs Tailscale; the machine serving can use Jevie's built-in Tailscale instead (
tailscale: built-in). jevie-term serveruns on Linux and macOS, not Windows. It needs JevieSession built there (it tells you the command), and one machine account: Rex's shared and login servers for several accounts are not built.- Anyone a Mac lets in can do what you can in a terminal there. It is off until you turn it on.
- Codex runs the hook only after you approve it with
/hooks; Claude Code runs hooks only in folders you trusted. - The first time Codex starts in a Jevie terminal it asks you to review Jevie's hooks with
/hooks; until you trust them its tile shows only its questions. It asks again when Jevie moves (a build run from elsewhere). - The stand-ins reach Codex and OpenCode typed at a prompt, not ones a script starts in a pipe. In bash and fish they are first on PATH only until your own files put something before them.
- OpenCode gets Jevie's plugin only when you set no
OPENCODE_CONFIG_CONTENTof your own. - Gemini CLI gets Jevie's hooks only when there is no administrator's system settings file (
/Library/Application Support/GeminiCli/settings.json) and you set noGEMINI_CLI_SYSTEM_SETTINGS_PATH; with folder trust on, only in folders you trusted, as your own hooks. - Hermes and Cursor's agent are not covered: Hermes takes hooks only from its own settings file, and the Cursor agent installed here has no hooks. Their desktop notifications still mark a tile as asking.
- In
jevie-nvim, ⌃W's resize, swap and move do nothing (use Studio's keys), layout plugins don't get the places they expect, the global status line is always used ('laststatus' 3), and a window in another tab page shows as an empty tile. Outside Jevie's terminal it is plainnvim. - Terminals are
readto agents over MCP until you saydrive. An agent allowed to drive one can do anything you can type there, and a submitted command really runs. - Agents reaching Jevie from another computer (ChatGPT's connector) get no terminal tools: a terminal is the shell, which stays with agents on this Mac. An agent in a shell here has
jevie-termalready, and the level does not bind it. - What an agent reads is the screen the holder writes at most every 1.5 s, so going quiet takes at least 1.6 s to tell. Earlier output is not read yet, only what is on screen.
- Studio in a terminal draws the session through a terminal of its own, so pictures a program draws with kitty's graphics, its cursor shape and its window title are not shown there;
jevie --plainshows them. Pages and splits are the Mac wall's only. - Text of several lines is sent as one bracketed paste; a program that does not take pastes sees the paste markers.
jevie-term hostsasks only your own Macs; a Mac you allowed by login is reached by its name.
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.
Related
Updated 6 November 2026 · Something wrong or missing? Tell us