NvChad meets VSCode — a terminal IDE for the people who do everything in a terminal. Vim modal editing and the modeless standard keymap are both first-class, neither buried in `if vim {}`. One binary, 39+ languages, 94 themes.
mnml is a terminal IDE that takes NvChad’s aesthetic — file-tree rail, tabline, powerline statusline, Nerd-Font devicons, tree-sitter highlighting — and marries it to VSCode’s discoverability — command palette, activity bar, right-click menus, mouse-first chrome, and a modeless keymap that doesn’t hide anything behind a modifier. Under both surfaces sits one design decision: a pluggable input layer. Vim modal editing and the modeless standard 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 with brew install chris-mclennan/tap/mnml on macOS, winget install mnml on Windows, cargo install mnml-rs anywhere Rust runs (needs zig 0.16.0 + git on PATH — the build script emits a helpful error if either is missing) — or grab the portable tarball for your 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 browser pane — 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.
Integration SDK — ~40 siblings on crates.io
Every non-core tool ships as its own crate. Jira / Bitbucket / GitHub / Slack / Teams / Docker / an AWS suite (Amplify, CodeBuild, CloudWatch, Cognito, DynamoDB, ECR, ECS, EventBridge, Lambda, RDS, Redshift, SNS, SQS) / a database driver family / more. Each installs with <integration> --install, declares its config via a [[auth]] schema, hot-refreshes at runtime, and is auto-updatable. Build your own with mnml-bridge (the wire protocol) + a couple hundred lines of Rust.
mnml is one of three 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.
fim-engine — the local fill-in-the-middle code-completion crate that powers mnml’s offline ghost-text (quantized qwen2.5-coder via candle, no API key).