mnml 0.3.0
Release notes for mnml 0.3.0, released on September 30, 2026.
mnml 0.3.0 is a terminal IDE written in Zig: NvChad's chrome with vim or standard (VS Code) keymaps, terminal panes built on libghostty, Lua scripting, git, an HTTP client and AI coding sessions beside your code, in one binary for macOS, Linux and Windows. It is the first release of the Zig mnml, and it replaces the 0.2.x line, which was written in Rust.
This release is 1 contributor over 2,806 commits, from the first line of Zig on September 4, 2026.
Highlights
Written in Zig, one binary
Every platform gets one static binary with no runtime to install: macOS (Apple silicon and Intel), Linux (x86_64 and aarch64) and Windows (x86_64). Every release binary is a ReleaseSafe build for a baseline CPU, so the safety checks stay on.
Terminal panes on libghostty
A shell or command in a split is painted from the grid of ghostty-vt,
the terminal-emulation core of Ghostty, used as a Zig module. Test and
build runners (cargo, npm, pytest, go) and configured tasks run
in the same panes. See Terminal.
A config you can read
Configuration is ZON — Zig's own data syntax — instead of TOML. The
complete file, every key with its default and a comment, is the
configuration reference. Settings apply in
layers: your home file, then the workspace's, then --config PATH. A
workspace's settings that could run a program are held back until you
trust that workspace, and it asks only once.
Integrations and a Marketplace
Integrations start over on a new SDK. The mnml download stays one binary; each integration is released on its own and installed from inside mnml, either from the first-launch wizard (Jira and Bitbucket, unticked by default) or from the INTEGRATIONS section's Marketplace tab. Every install downloads the build for your platform and checks its sha256 before anything is written. Private integrations install the same way from a folder or a GitHub repository. See Integrations.
Lua scripting
Scripts are Lua 5.4, compiled into mnml. A script can add commands, keys, statusline segments, pickers, decorations and background tasks, and five example scripts ship with every release. See Lua scripting.
Your config: run the converter first
0.3.0 reads config.zon and never reads or writes config.toml. The
converter ships in the last Rust release, because that is the build
that still understands the TOML:
- Before upgrading, update to 0.2.22 and run
mnml export-config-zon. It writes~/.config/mnml/config.zonbeside yourconfig.toml, which it leaves alone. - For each workspace with a
.mnml/config.toml, runmnml export-config-zon --out .mnml/config.zonfrom inside it. - Upgrade.
Every key the converter carries over gets a comment from the schema's
own documentation. Anything it cannot place lands in a trailing
// unmigrated: block at the end of the file, word for word, so
nothing is dropped silently.
If you forget, 0.3.0 tells you once: the first launch that finds a
config.toml with no config.zon beside it shows a notice naming the
file and the command. A workspace whose .mnml/config.toml has not
been converted shows RESTRICTED on the statusline until it is.
Already upgraded? Download 0.2.22 from chris-mclennan/mnml-rust to a scratch folder and run the converter from there.
For users of the Rust version
- Same repository, same name, same install channels. Homebrew, winget and the installers move you to 0.3.0 on your next upgrade.
- The same editor, panes, keymaps and look. What changed is underneath: one static binary, a ZON config and a new integration SDK. A few 0.2.x features are left out on purpose; each one is listed below.
- Keymaps are two complete profiles, vim (NvChad and Neovim chords) and standard (VS Code's), as in 0.2.x. The converter carries your choice across.
- Integrations other than Jira and Bitbucket stay on 0.2.x until
each one is rewritten on the new SDK. If you depend on one, pin 0.2.x
(
brew pin mnml) for now. 0.3.0 can still run any installed program in a terminal pane with:term <binary>. - Asset names dropped the
-rs:mnml-<triple>.tar.xz, notmnml-rs-<triple>.tar.xz. Scripts that download a release by name need the new names. - crates.io is no longer a channel.
cargo install mnml-rsstays on 0.2.22. - The Rust source, its history and every 0.2.x binary are archived, read-only, at chris-mclennan/mnml-rust.
Left out on purpose
Each of these tells you so where you would meet it, usually with a notice naming the reason.
- A local, in-process completion model. Ghost text uses Claude Code, the Claude API or GitHub Copilot.
- brotli response decoding in the HTTP client. It never asks for
br; a server that sends it anyway gets a raw body and a notice. - WebP images. PNG, JPEG and GIF render; a
.webpshows its placeholder. - The glyph builder's live SVG preview pane. mnml still builds its own symbols font from SVG.
- TOML, anywhere. Config, themes, manifests and trust are all ZON.
- Sonos transport controls. The now-playing chip stays.
- Playwright as the generic test runner. Test commands run your project's own test command; Playwright keeps its own commands.
Changelog
What a 0.2.x user notices, condensed. The full list is the v0.3.0 section of CHANGELOG.md and the GitHub release.
The editor
- Vim and standard keymaps as two complete profiles. Undo groups, registers, marks, macros and dot-repeat.
- Multi-cursor: every cursor types, deletes, selects and puts. Visual block yanks and deletes the rectangle.
- Surround (
ys/ds/cs), align,ctrl+a/ctrl+x,gqreflow,gcccomment toggle, the[/]pairs. - Incremental tree-sitter highlighting with 41 grammars compiled in,
with language injection (fenced code,
<script>/<style>). - Sticky context, text objects, the symbol outline, the rendered markdown preview, and snippets with tab stops.
- Open files are checked every 2 seconds: a clean buffer reloads, a modified one warns you.
- Dozens of Neovim-parity fixes in the vim profile, and
:jumps,:changesand:display.
The frame
- Splits, tab pages, the statusline, drag-to-resize dividers and tabs, right-click menus, the command palette.
- The 94 NvChad base46 colour themes;
theme.pickpreviews as you move. - The first-launch wizard, and the settings overlay.
- A pane that opens beside another sizes itself by what is already there: halves, then thirds, then quarters.
Panes
- Terminal panes on libghostty's
ghostty-vt; shell prompt marks (OSC 133) and the working directory (OSC 7) from bash and fish. - Git: status, diff, blame, graph and staging, down to single lines. Conflicts resolve in the editor with Ours · Theirs · Both chips.
- LSP: diagnostics, completion, hover, navigation, rename, formatting, code actions and symbols. DAP: breakpoints, watches, the debug and REPL panes.
- AI: ghost text, Claude Code and Codex session panes, the Claude Agents dashboard across workspaces, the 24-hour spend report and the statusline meter.
- HTTP: the tabbed request pane, environments, cookies, JWT decoding,
SSE, chains, bench, mocks, history, HAR and Postman import; a
WebSocket pane; and the
run,chain runanddiscovercommands without the UI. New since 0.2.x: env files reload when edited, a fuzzy picker over every request, and a body-mode chip.
Integrations and the Marketplace
- Each integration is released on its own
<id>-v<version>tag; every mnml release carriesintegrations.json, the index the Marketplace reads. A row is listed only when it was built for your platform and an SDK your mnml supports. marketplace.add_sourceadds a private source: a folder,owner/repo[:dir], or a pasted GitHub repository URL.- Jira and Bitbucket poll adaptively and share one rate-limit budget across windows and processes.
Shipping
- Five targets, all ReleaseSafe:
aarch64-apple-darwin,x86_64-apple-darwin,x86_64-unknown-linux-gnu,aarch64-unknown-linux-gnuandx86_64-pc-windows-gnu. .tar.xz(.zipon Windows) with a.sha256each,sha256.sum, the shell and PowerShell installers, an MSI for winget,.deband.rpmpackages, and a Homebrew tap update.mnml --versionprints the version and the profile it would run in.
Testing
mnml testruns the.testend-to-end corpus headlessly. A memory leak fails the file.- Every unit test runs on a leak-checking allocator, in Debug and ReleaseSafe, and every change is cross-compiled for all five targets.