‹ all releases
Session persistence used to be spread across a handful of files that could fall out of sync — a crash, a fork, or a save taken mid-turn could quietly drop part of your history. This release moves every surface — the terminal, the desktop app, headless runs and the background daemon — onto a single append-only session log, so what you see is what was saved. The desktop app also grows into the terminal's equal: a live Concise view, the same narration fold, and a send gate that waits for the code graph. And prompts get cheaper — a set of cache fixes stops silently throwing away the reusable prefix.
New- One append-only session log, across every surface. Sessions now persist as a single append-only event log that the terminal, desktop app, headless runs and the background daemon all write to and restore from — folding that log is the *only* restore path. The old design spread state across several files that could disagree, so a crash or a save taken mid-turn could lose part of a conversation. Existing saves are migrated on first load.
- A live Concise view in the desktop app. The desktop chat gains a ground-up Concise mode with a forge status header and ghost narration, plus a two-way narration fold that matches the terminal exactly. One "Concise | Details" control switches between the running summary and the full transcript.
- The desktop app waits for the code graph before it sends. A message typed while the genome is still indexing is now parked until the graph is ready, then sent — the same send gate the terminal already had, so an early send no longer misses codebase context.
- `/export api` captures the real request and response. Exporting now records the actual bytes sent to and received from the provider, not a reconstruction — the thing you want when you're debugging a provider or filing a report.
- Faster search over large trees. grep's count mode is served straight from the FFF index instead of re-reading files, and symbol outlines are memoised on content. Pasted images can now be forwarded to
/goal, running tool icons animate, and the desktop titlebar keeps its panel toggles visible at all times.
- Prompts stop throwing away their cache. A prefix-invalidating bug meant the reusable part of each request was being rewritten every turn, so the provider's prompt cache kept missing and you paid full price for tokens that should have been cached. The prefix is now stable, the child render cache is gated correctly, and the "cache miss" warning only fires when a miss actually cost you tokens — not on the harmless ones.
- Restored sessions match what you saw. On load, the restored UI is now guaranteed to be a superset of the model transcript, and gaps left by a save taken mid-turn are repaired — so resuming can't crash the next request or show less than was there.
- The background daemon stops wiping session metadata. A hearth save path could flush metadata in a way that erased it; it now flows through the session log like everything else.
- The plan tool stops hijacking the turn. An approved plan no longer ends the turn before it runs, a second plan call can't start while one is executing, and the mode banner is actually injected — so plan and architect runs behave.
- Streaming markdown stops flickering. Both the terminal and the desktop chat showed raw markdown for a frame before formatting it as text streamed in; that flash is gone.
- `empryo doctor` reads correctly on Windows. Its output no longer staircases down the screen.
- grep and glob agree whether the index is on or off. Path-pattern globs that returned nothing with FFF disabled, and corpus differences between the two modes, are fixed.
- Desktop polish. Follow-ups from the widget migration: low-contrast segmented controls and inputs, wizard cards painting outside their box, rows overflowing under the overlay scrollbar, and a workspace picker that went invisible under "reduce motion".
- Linux clipboard images are validated. Image reads now check the PNG signature before trusting the bytes.
- The desktop app's hand-rolled widgets were replaced with a shared shadcn primitive set — buttons, inputs,
Kbdand the rest — so the UI is consistent and easier to extend. - The boot screen was unwedged and made diagnosable, with an optional live logs console behind
--debug. - Tool verbs and categories now come from one source of truth, and TUI-only tools are scoped out of the desktop agent's belt.
- The website's features page was rebuilt in the cosmos language, and the blog index gained a lead story with centered page headers.
- Every macOS and Linux build is still executed before it ships —
empryo doctormust load the native runtime and parse real code inside a Linux container, and under Rosetta for Intel macOS.
