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.
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).
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.