Skip to content

mnml

A terminal IDE for the people who do everything in a terminal. Vim or standard editing — neither buried in `if vim {}`. One binary, 39+ languages, 94 themes.

mnml is a terminal IDE in the NvChad aesthetic — file-tree rail, tabline, powerline statusline, Nerd-Font devicons, tree-sitter highlighting — built on one design decision that runs through everything: a pluggable input layer. Vim modal editing and a modeless VS Code-style keymap are both first-class, both fully remappable, and swappable at runtime. The editor, buffer, and render layers never branch on which one is active.

Install it as a proper macOS .app (DMG, drag to Applications, click the dock icon and mnml opens in Terminal.app) or as a CLI on any platform.

Two editing modes, one codebase

Modal vim (Normal / Insert / Visual / Visual-Block / Replace + a : ex-command line with :%s///, ranges, :g/, :norm, :sort, :!cmd, user-defined :commands) and a modeless VS Code-style keymap (multi-cursor with Ctrl-D, column cursors). Swap live with :set input=vim. Input handlers translate keys into a closed set of edit operations; the rest of the app is mode-agnostic.

LSP, batteries included

Completion with docs, hover, go-to-definition / references / rename-with-preview, code actions, inlay hints, semantic tokens, document & call / type hierarchies, signature help, document colors, code lens, document links, format-on-save, external linters (eslint / ruff / shellcheck), a Problems pane. A Mason-style tools picker auto-installs servers / formatters / linters.

Rich git

Gutter signs, a 3-mode diff pane (Hunk / Inline / Split) with per-hunk staging, intraline highlighting, a staging view, a coloured-lane commit DAG with sortable columns + WIP row, a branch / worktree / PR rail, blame gutter, fetch / pull / push / cherry-pick / revert / tags / stash / reflog, AI-written commit messages.

Fuzzy everything

File finder, command palette, buffer switcher, symbol picker, marks / clipboard / recent-commands pickers, a which-key leader popup — all over one fuzzy-match core. Ripgrep-backed workspace grep with cross-file replace. Multi-root workspaces.

AI panes — Claude Code & Codex

Run the claude CLI or Codex as embedded panes, with multi-session tab strips and :rename. Or talk to the Anthropic Messages API directly with an agentic read-only tool loop — backend, model, system prompt, and token cap are all config knobs. On-selection actions (explain / fix / refactor / write-tests) stream into a pane; fix and refactor apply as reviewed diffs. Inline suggestions via API or a fully local in-process FIM model (fim-engine, no API key, offline after a one-time download).

Baked-in HTTP client

Send .http / .curl / .rest files with {{variable}} templating + environments + pre / post-request scripts. Editable form-style request pane (method / URL / headers / body), re-send, copy-as-curl. Request chains (.chain.json). OpenAPI / Swagger → .curl stub discovery. CLI mode: mnml run FILE, mnml chain run FILE, mnml discover SPEC.

Browser + CDP capture

Launch Chrome over DevTools Protocol as a Pane::Browser — live console, filtered network log, DOM tree with live highlight, cookies, web storage, performance panel. Capture full-page or per-node screenshots, print-to-PDF, snapshot diffs, device emulation, multi-target, headless support.

Debugging (DAP)

Debug Adapter Protocol client — launch or attach, breakpoints (conditional, hit-count, exception), step controls, call-stack pane, variables tree with set-variable, watch expressions, REPL pane with lazy-expand. Reverse-debugging where the adapter supports it.

SCM & CI dashboards

Pipelines / builds and pull requests across Bitbucket, GitHub, GitLab, and Azure DevOps, grouped by repo with per-branch and “mine” views. PR ↔ pipeline cross-navigation. Per-job log tail with severity colouring.

Testing & quality

Playwright runner with a grouped results pane, jump-to-source, trace-timeline viewer, flaky-test dashboard. A line-based .test end-to-end format (open, key, type, command, click, expect screen ...) that drives the real App against a virtual backend — same code path as the GUI.

UI & polish

94 NvChad base46 themes (onedark / gruvbox / catppuccin / kanagawa / tokyonight / nord / dracula / …). Tree-sitter highlighting for 39+ languages with language injection (fenced code blocks, embedded <script> / <style>). Markdown preview with inline image rendering via Kitty / iTerm2 graphics protocols. Zen mode, sticky scope context, indent guides, hover tooltips, right-click menus, a keyboard-driven settings overlay.

Headless + scriptable

mnml --headless renders to a virtual screen driven over a file-IPC channel (command in, screen.txt / status.json / events.jsonl out) — same App and draw path as the terminal UI. Out-of-process plugins over that channel can register commands that appear in the palette and resolve as keybindings. :term <binary> opens any TUI binary as a Pty pane.

The manual goes deep on each surface — what’s there, how to drive it, the keymaps, the config knobs.

mnml is one of two small Rust tools by Chris McLennan. They share design language and run perfectly well standalone in any terminal.

  • mnml — this IDE.
  • mixr — a terminal DJ rig. Opens as a Pty pane inside mnml via mixr.show.

See the family page →