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:

  1. Before upgrading, update to 0.2.22 and run mnml export-config-zon. It writes ~/.config/mnml/config.zon beside your config.toml, which it leaves alone.
  2. For each workspace with a .mnml/config.toml, run mnml export-config-zon --out .mnml/config.zon from inside it.
  3. 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, not mnml-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-rs stays 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 .webp shows 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, gq reflow, gcc comment 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, :changes and :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.pick previews 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 run and discover commands 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 carries integrations.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_source adds 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-gnu and x86_64-pc-windows-gnu.
  • .tar.xz (.zip on Windows) with a .sha256 each, sha256.sum, the shell and PowerShell installers, an MSI for winget, .deb and .rpm packages, and a Homebrew tap update.
  • mnml --version prints the version and the profile it would run in.

Testing

  • mnml test runs the .test end-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.
Edit on GitHub