‹ all releases

A cell can take the whole window. A board that reads your repo, moves the work, and starts the run.

Empryo 3.7.1-beta · Sep 4, 2026
Release artwork & highlights
3.7.1-betaSep 4, 2026

Empryo is a coding agent that runs on your machine, and a cell is one JSON file that adds something to it: a panel, a live board, a rule for the agent. In this release a cell can take the centre of the app. Point one at a folder of markdown in your repo and you get a board, a column per stage, a lane per thing moving, a bar for each card's progress. Drag a card and the file on disk changes. Press the action on it and a coding lane opens in the background on the model the cell asked for, then reports back when it lands.

The rest of the release is about what a turn costs. OpenAI lanes cache explicitly, narrowing the tool belt no longer rewrites the cached prompt, and Empryo tells you what a mid-session setting change will cost before you make it.

The canvas

/canvas, or a cell that asks for the centre. The transcript steps aside and the cell has the window.

  • A board with real axes. Lanes are what moves, columns are the stage it is at, and a card carries its own progress bar. A rail and an inspector sit beside the board. Clicking a card aims everything in them at that card.
  • Your repo as the source. files://specs/*.md reads a folder as rows. Frontmatter becomes fields, the first heading becomes the title. Moving a card writes the new stage back into the file, one fence in and out, nothing else touched.
  • Live sources stay open. A wss:// or loopback socket pushes rows as they change instead of being polled, with size and rate caps and reconnect backoff.
  • A card can start work. Any card, action or trigger can open its own background lane on the model and mode the cell names, filled in from the card's own fields. It never writes your composer or steals the tab, and its finish or failure comes back as a trigger the cell can react to.
  • Slots. A cell can replace the transcript or the area above the prompt, always with a way back, never over a running turn.
  • The agent can see what it built. In morph mode it renders a cell at real widths and looks at the picture instead of reading its own JSON back. A tall board is scaled and tiled in order rather than cropped, and each shot is budgeted like the picture it is.
Morph mode has a room of its own

The tab that writes cells is no longer a chat window with different tools. It is the Atelier: a culture that breathes with the work, notes and a verb ticker in place of tool cards, and a status line that follows what the agent is actually doing.

  • A morph tab is a locked room. The mode picker is fixed, Shift+Tab is inert, and asking for morph mode from a coding tab opens a new tab instead of converting the one you are working in.
  • A lane opened for work never inherits morph mode from the tab that opened it, and leaving morph mode now actually leaves it.
  • New cells are global by default. Templates and pastes land in ~/.empryo/morphs, where they follow you across repos. The agent is told when a cell belongs to a project instead.
Turns cost less
  • Explicit prompt caching on GPT-5.6 and up. The first-party OpenAI lane plants its own cache marks, so a long session stops re-writing a prefix nothing will match again.
  • Restricting tools no longer breaks the cache. Changing mode, toggling a tool or approving a plan used to remove tools from the request and rewrite the prompt from that point on. Where OpenAI allows it, the declarations now stay byte-identical and only the allow-list changes.
  • The cache follows the workspace, not the tab. Two tabs on one project share a warm prefix.
  • You are warned before you spend. Changing effort in a warm 619k session now says the switch drops the whole prompt cache, and what re-reading it will cost. It warns, never blocks, and stays quiet on a cold lane.
  • Cache writes are billed correctly. GPT-5.6 is the first OpenAI generation to charge for one. The fallback rate treated it as ordinary input and under-reported every written token by 25%.
Fixed
  • `web_search` came back without its query field. A rebuilt tool belt could lose a tool's schema, so the model was told the parameter it was given did not exist. Reported on 3.7.0-beta. Every 3.7.0-beta build carries it, so upgrading is the fix.
  • A failed turn showed `[object Object]`. Mid-turn failures on the ChatGPT and Codex route arrive with no message text, and the pill printed the raw frame. Errors are now read out of the shapes providers actually send.
  • Compaction has one trigger. It fires at 95% of the model's real window or the route's byte cap, on every lane, and never gates you or the recovery path. A window the provider reports now beats a stale local hint.
  • A hook's refusal holds everywhere. A PreToolUse deny now blocks every tool rather than only the built-in belt, and hooks can see the paths a call would touch before it runs.
  • Copilot seats. --list-models copilot says which catalog tier answered, signing out forgets the previous seat's models and token, and a seat's real context windows arrive instead of a sibling's. A listing still being written when you sign in no longer lands after the reset and hands the next seat the old account's catalog.
  • Reasoning knobs reach the routes that take them. GPT models on the opencode-go lane get the OpenAI reasoning options and ask for summaries by default, and a Codex account's effort ladder is read from its own catalog rather than a guess.
  • The tools popup tells the truth. The request_tools row toggles again and resolves against the tab's own mode, instead of painting as a live switch that did nothing.
Safer by default
  • Git is a gated tool now, and a whole-tree command that would discard the worktree is refused while another tab holds uncommitted edits.
  • A cell the agent installs arrives switched off, and its download goes through the same address and size gate as a feed.
  • A cell you hide leaves every agent-facing door at once: engine data, guards, the error ledger and its own files.
  • A guard pattern that could run away is refused instead of being compiled, and an MCP App's frame accepts origins only.
Right-to-left text and every other script
  • Arabic and Hebrew prose is laid out by counting the words that carry a direction, not by reading the first character. A prompt that opened with a path used to throw an Arabic sentence's punctuation to the far left of the line.
  • Arabic, Hebrew, CJK, Thai and the Indic scripts each name a real face on macOS, Windows and Linux instead of falling through to whatever the engine picked last. Japanese and Chinese get the quarter-em spacing between scripts that the typesetting rules ask for.
Smaller things you will notice
  • Streamed text paints in the frame it was cut, code fences stop re-highlighting on every slice, and the caret stays on the prose instead of chasing block tails. The word fade honours reduced motion.
  • Cards on a board move the moment you drop them, before the write comes back.
  • Long file names in the Diffs list no longer overlap their counts and badges.
  • The effort rows follow the lane you are on, and provider options read as labels rather than raw keys.
  • The desk resume strip sits on the dock shelf, lined up with the composer.
  • When the scripting sandbox is missing something a script asked for, it names it.