Releases: ooyeku/stem
Release list
v0.14.0
Deterministic Editing — repeatable operations, a plugin host that can't hang the editor, and a crash-recovery format that survives its own filenames.
Macros: transactional record and replay
Macros record the command stream off the message bus, not raw keystrokes, so replay is immune to mode and timing skew.
q+ a register starts recording,qstops;[N] @+ a register replays with a count.- Replay is all-or-nothing. The whole macro applies as one undo group, and a replay that errors mid-way rolls the buffer back to its pre-replay state instead of leaving a half-applied edit.
- A recording indicator sits in the status bar; a failed replay surfaces the rolled-back step as a toast.
Macros live in per-session a–z registers. Durable, cross-restart storage arrives with the named-register work in #3.
The plugin host is now a library, and every call is metered
The pure-Zig wasm interpreter has been extracted into its own project, wick — stem's second general-purpose spin-off after vigil. stem now depends on it as a pinned package.
- Fuel-metered calls. Every plugin call runs under an instruction budget. A runaway plugin fails that one call with
OutOfFuel— logged, counted, contained — instead of hanging the editor. Host calls cost one instruction, so a plugin waiting on a slowgitsubprocess is never penalized. - Containment you can see. Per-plugin call, trap, last-error, and fuel-usage stats appear in the plugin-manager dashboard and the control center, and plugin traps feed the check-engine light alongside dead letters and open circuits.
Session files that survive their own filenames
The session and crash-recovery parser scanned for field markers instead of parsing JSON, so a path containing ", \, or } truncated or dropped the buffer it belonged to. On a real session written for a workspace holding quote"file.zig and brace}file.zig, the old parser recovered one usable buffer out of three.
Parsing and serialization now both go through std.json:
- Paths round-trip exactly — quotes, braces, newlines, control bytes, emoji. Control characters were previously written raw, producing a file that wasn't valid JSON at all.
- Out-of-range numbers saturate instead of wrapping; a long enough digit run used to panic a safe build.
- A path that isn't valid UTF-8 costs that one buffer rather than making the whole file unparseable, and a malformed split layout is dropped the same way — losing your layout beats losing your buffers.
Install
Prebuilt archives for macOS (arm64/x86_64), Linux (x86_64/arm64), and Windows (x86_64) are attached below. The Unix tarballs now ship their own installer, which places the binaries and bundled plugins exactly where a from-source install does and tells you what to add to your PATH if it isn't already there:
tar xzf stem-v0.14.0-<target>.tar.gz
cd stem-v0.14.0-<target>
./install.sh # or: ./install.sh --prefix ~/.localThe binaries aren't notarized yet, so a browser download is quarantined by Gatekeeper. install.sh clears that for you; if you run the binary straight from the archive instead, fetch it with curl -LO or clear the attribute yourself with xattr -d com.apple.quarantine ./stem.
Verify a download against the attached SHA256SUMS.txt:
shasum -a 256 -c SHA256SUMS.txtAlso in this release
- Test coverage went from 656 to 723 passing tests — not by writing 67 new ones, but by discovering that nine modules' test suites were never wired into the build and had quietly rotted,
split_manager(window splits) among them. Fixing them turned up tests asserting the opposite of real behavior, and a leak-checking helper that could only pass for code that allocated nothing. - Dead code removed: an orphaned
help_view.zig, a leftover loader helper, an unused import. - Docs refreshed across the README, architecture, plugin, and roadmap pages.
Full Changelog: v0.13.1...v0.14.0
v0.13.1
v0.13.0 — the reliability release
stem v0.13.0 — the reliability release
First tagged release. Stem is a modal terminal editor built on
vigil, an Erlang/OTP-style
supervised runtime for Zig: it supervises itself, heals itself, and
can show you exactly what its runtime is doing.
Highlights
Self-healing language servers. Crashed LSP servers restart with
jittered exponential backoff behind per-language circuit breakers —
a crash-looping server stops burning CPU, and a half-open probe
recovers it automatically once the cause clears. The restart path that
could previously fire once per rendered frame is fixed and gated.
Self-healing workers. The syntax parse worker and workspace
indexer now run under a worker supervisor: if one dies, the watchdog
respawns it within ~2s and says so in the status bar.
Nothing fails silently. Undeliverable messages land in
inspectable dead-letter queues with reasons; poison messages trip a
hook; dead letters, open circuits, and crashes light a check-engine
indicator pointing at the live runtime cockpit
(stem.control_center).
Crash-safe sessions, cheaper. Recovery snapshots write through
vigil's checkpoint pipeline: background thread, atomic rename,
version-stamped, skipped entirely when nothing changed.
Vigil 3.0 under the hood. One injected telemetry pipeline (no
global state), graceful drain on shutdown (in-flight messages get
500ms to land, and stem records when they don't), and honest
supervision counters.
Faster editing plumbing (from the 2.3 line): condition-parked
receives (microsecond wake latency), ring-buffer mailboxes, batched
receive in the core loop, single-allocation messages, precise LSP
debounce via the runtime timer service, and flow control so a slow
plugin can't stall the cursor.
Plus: opt-in multi-instance presence (STEM_CLUSTER), a fuller
runtime health view (timers, alerts, dead letters, vigil debug dump),
and a public roadmap
through 0.15.0.
Install
Prebuilt binaries below (macOS arm64/x86_64, Linux x86_64/arm64):
tar xzf stem-<target>.tar.gz && sudo mv stem /usr/local/bin/
Or from source (Zig 0.16+): zig build -Doptimize=ReleaseFast
The ten-second demo
Open stem, run stem.control_center from the command palette
(Space f), then kill -9 your language server from another
terminal. Watch the editor notice, back off, recover, and log every
step.