‹ all releases

Cells and Morphs. One JSON file adds a panel, a board or a rule to the app, and the agent writes it for you.

Empryo 3.7.0-beta · Sep 2, 2026
Release artwork & highlights
3.7.0-betaSep 2, 2026

You can now change what Empryo looks like without touching its code. A cell is one JSON file. It can add a panel, a live board, a status chip, a slash command or a rule for the agent. Morph mode is a tab whose only job is writing cells. Ask it for a panel that shows what Spotify is playing with the cover's colour on the whole window. It writes the file, the app applies it within a second, and the panel stays.

The coding side moved too. The agent gets a scripting tool that reads, edits and runs tests in one program. The Diffs panel marks changed words and reverts any file. Grok subscriptions sign in natively. The context window is collected instead of dropped off a cliff.

Cells and Morphs

A cell lives in .empryo/morphs (yours), .cells (the team's, committed) or ~/.empryo/morphs (every repo). The app validates it, applies it live, and adds what it declares beside its own features.

  • Panels go where a native feature would. A card in the context pane, a section above the file tree, a full tab beside the map, a floating corner card, or a strip right above the prompt.
  • About twenty blocks. Stats, progress, boards, a kanban with drag to transition, notes, fields, toggles, sliders, timers, galleries, charts, tables, tabs, markdown, countdowns, an equaliser strip, and a sandboxed MCP App frame.
  • A click does its own work. It stores state, posts a declared call to an API, stages or sends a prompt, or opens a popup. A notebook or a timer never wakes a model.
  • Pictures and GIFs render inline. A thumbnail on a board row, a gallery tile, an image block. The app fetches each one through the same gate as a feed: public https, image types only, 8 MB, no redirects.
  • Feeds. A pulse reads JSON from an https or loopback endpoint on a heartbeat and pours it into a board, with caching and backoff. Nothing is fetched until you trust the repo. engine:// feeds read the app's own data, such as changed files, recent sessions and background agents.
  • The app can wear the data. accent and the theme accept templates over a feed, so a cell can recolour the window with whatever is playing, building or failing. A trigger announces the change.
  • A cell can brief the agent. Instructions, rules scoped to paths or branches, read-only lookups, tool guards, and state both of you write. You approve that layer once. Any edit to it holds the layer until you approve again, or you switch on auto-approve in Morphs and Cells.
  • Secrets stay on your machine. {{secret:X}} and {{env:X}} fill on the sidecar. Names cross the wire, values never do.
  • Cells travel. Signed cells carry an Ed25519 signature, a public directory installs one in a click, and A2UI files import and export.
  • Every surface. The TUI and headless runs get the same runtime. /cells lists, approves and toggles. empryo cells does the same from a shell.
  • Morph mode is a mode like the others. Any tab enters or leaves it from the mode picker. The agent in it has a short tool belt built from the cell vocabulary and cannot touch project code.
The agent gets a scripting tool

code_script runs one JavaScript program against the workspace and returns a summary. In one script it reads files, edits by symbol in any language, renames, rewrites, then runs the typecheck and the tests. A per-workspace state survives between calls. Edits survive a thrown script, and a whole run rolls back by id. Saved scripts form a library you replay with new parameters.

Diffs at word level, with a way back
  • Chat diff cards mark only the changed words in a line. Unrelated lines stay unmarked.
  • The Diffs panel lists edits newest first, shows a deleted file as deleted, and reverts one file or all of them behind a two-step arm.
  • Diffs survive a restart, a revert and /clear. An external edit shows up within seconds. A CRLF save over an LF write no longer reads as a whole-file change.
  • /changes in the TUI counts every writing tool and nests paths relative to the workspace.
Grok as a subscription

/login grok signs in a Grok Build subscription with the same grant Grok's own client uses. /login grok-device takes a device code for a browser on another machine. Grok joins Claude and Codex under subscriptions, with live models, token refresh, plan rotation and several accounts. The old CLI puppet is gone, and so is its Docker requirement.

Hooks fire where they were declared
  • SessionStart and SessionEnd fired nowhere, and the desktop fired no lifecycle hook at all. Every declared event now fires on every surface.
  • Empryo reads the hook files Copilot CLI and Codex already use, including plugin-bundled hooks and the Claude managed policy directory. Repo-local hooks wait behind repo trust.
Context is collected
  • Old tool output is stubbed once it stops mattering, so the window stops filling with stale text while the prompt cache keeps its prefix.
  • Auto-compaction triggers as a share of the model's real window and re-arms without waiting for a large drop. One turn made of hundreds of tool rounds compacts whole instead of answering "not enough older messages".
  • A route's real request cap is learned from its own rejection. The declared 1 MiB ChatGPT wall is gone.
  • Images count at the provider's per-picture price instead of their byte size.
Smaller things you will notice
  • Thai, Lao, Khmer and Burmese prose wraps between words in the TUI instead of wherever the column ran out.
  • When a project directory cannot hold a database lock (a network mount, a read-only checkout), memory and the code graph open in a shadow directory instead of failing. /storage counts them.
  • Proxy models stay hidden until an account is signed in or the proxy answers.
  • Copilot seats resolve their own context window. The 1M models no longer inherit a 200k sibling's ceiling.
  • Live translation catalogs were rejected for newlines the English also has, so liveTranslations never loaded a file. Fixed.
  • The Claude lane learns the client version floor from the API's own refusal, so a new model stops reading as unsupported until the next release.
  • Monaco takes the pane's surface on the desktop instead of painting an opaque slab.
  • The Windows TUI no longer crashes on start when the file finder's native library loads after the renderer's.
  • TypeScript 7 (tsgo) projects get working diagnostics and go to definition. Monorepo path aliases resolve per package.

Cells and Morphs are experimental and growing. Build one and show it on Discord or GitHub.