The terminal
AI agents can drive.
A cross-platform terminal with built-in MCP, HTTP, and CLI control planes. Claude Code, Cursor, Aider, your scripts — they all get the same JSON-RPC surface to drive every operation.
Open source · Local-first · No cloud · No login
Your terminal is a surface. AI agents are the hands.
Most terminals embed AI inside the binary — Warp's cloud orchestrator, ChatGPT desktop's panel. Unterm picks the opposite end: keep AI completely outside, expose the terminal as a surface that any external agent can grip via MCP. The terminal is the hand. Whatever's holding it is up to you.
Three ways to use Unterm
We didn't build for one workflow. The MCP surface means each persona gets the same control plane through different entry points.
Drive multiple terminal panes from Claude Code, Cursor, or your own agent. Each pane is one task; your agent picks where to type. Multi-instance NATO names (alpha, bravo, charlie…) make routing across windows trivial.
- Director / worker pattern: outer agent supervises inner agent in a pane
- Long-running watcher: kick off a build, poll until idle, decide next step
- Multi-pane orchestration: fan work across projects, aggregate results
- Recording with token redaction for review and fine-tune
Cron-friendly CLI for everything you can do in the GUI. unterm-cli ships in every release; pipe --json through anywhere downstream that wants raw JSON-RPC. Same surface for ops scripts, dashboards, runbooks.
- Auto proxy detection: macOS scutil / Windows registry / GNOME gsettings
- Headless screenshots and pane reads for incident docs
- Recording → markdown for runbook generation, PII-redacted by default
- No telemetry, no login, every server bound to 127.0.0.1
MIT-licensed WezTerm fork with first-class agent integration. Patches accepted on GitHub. Build it yourself; the binary CLI ships in every release. Web Settings UI is a Tailwind + Alpine SPA — fork the page, change the colors.
- Universal arm64 + x86_64 macOS binary, signed with Developer ID
- Linux .deb (apt) and AppImage (any distro)
- Windows MSI with WiX 6 + portable .zip
- 9 locales out of the box, system locale auto-detect
One install, three platforms
Download the signed bundle for your OS. Cross-platform parity is a correctness property — if a feature works on Windows but bails on macOS, that's a bug.
curl -fsSL https://unterm.app/install.sh | sh Detects OS + arch, downloads the right artifact for the latest release. macOS gets the signed + notarized DMG into /Applications. Linux uses apt when available, falls back to the AppImage in ~/.local/bin.
Or grab the artifact directly:
Four control surfaces, one engine
Every Unterm window starts a local MCP server and an HTTP settings server. Read and write the same JSON state from any of them.
Line-delimited JSON-RPC on 127.0.0.1:19876, auth-token gated. Spawn shells, read pane state, capture screenshots, control sessions.
Same surface from any shell, cron job, or script. Thin JSON-RPC client over the local MCP — no duplicated business logic.
Modern config UI in the browser, not the cell grid. Tailwind + Alpine SPA at 127.0.0.1:19877. Themes, proxy, recordings, language.
en / 简体 / 繁體 / 日本語 / 한국어 / Deutsch / Français / Italiano / हिन्दी out of the box. System locale auto-detect.
OSC 133 block-segmented markdown with built-in redaction. Recordings live in <cwd>/.unterm/sessions/.
One-click region capture from the status bar. PNG to disk, image to clipboard, path to text clipboard.
Reads macOS scutil / Windows registry / GNOME gsettings / env. One-toggle on/off. No URL config.
Built on a customized WezTerm engine — Metal on macOS, OpenGL on Linux, DirectX via ANGLE on Windows.
What's new in v0.10
Three weeks of Windows polish + the multi-instance foundation that AI agents need to drive a fleet of terminals.
Windows used to flash bright white between window create and the first GL frame. Root cause: WindowProc intercepted WM_ERASEBKGND but never painted, so the DWM redirection bitmap stayed in its uninitialized white state. Now we manually FillRect the client area with BLACK_BRUSH before returning.
Each Unterm process owns one instance with a NATO-phonetic name (alpha, bravo, charlie…). MCP instance.list enumerates all live instances; agents pick by cwd, title, or start order. Window title becomes Unterm — alpha — Project for visual mapping.
PowerShell and cmd.exe spawned by Unterm get UTF-8 output by default — no more mojibake on zh-CN, ja-JP, ko-KR Windows installs. Agents don't have to fix the user's $PROFILE; we wrap at spawn time with chcp 65001 + Console.OutputEncoding setup.
Active pane's working directory shows up between the shell name and dimensions, with $HOME → ~ and middle truncation. Click to copy the full path. Works across local panes, mux clients, and SSH-forwarded sessions.
Five principles, no exceptions
Every server, every API endpoint, every recording lives on 127.0.0.1. No login, no telemetry, no subscription. Your shell history is yours.
No chat overlay, no ghost-text autocomplete, no inline AI panel. The terminal is the surface — Claude Code, Cursor, your scripts grip it through MCP.
Every product feature ships with an MCP method and a CLI subcommand on day one. If it can't be driven from outside, it doesn't ship.
A feature that works on Windows but bails on macOS or Linux is a bug, not a 'not yet supported.' Mac, Linux, Windows ship together.
When a feature is awkward, delete it instead of redesigning it. No right-click menu, no Cmd+Q confirmation, no manual proxy URL config — they used to exist, then we cut them and the product got better.
How Unterm differs
Three terminals reset the bar in 2026. They each picked a different lane.
| Feature | Unterm | Warp | iTerm2 | Ghostty |
|---|---|---|---|---|
| MCP-controllable from outside | ✓ | ✗ | ✗ | ✗ |
| Local-first, no cloud | ✓ | ✗ | ✓ | ✓ |
| GPU rendering | ✓ | ✓ | ✗ | ✓ |
| macOS + Linux + Windows | ✓ | ✓ | macOS | macOS+Linux |
| Open-source client | ✓ MIT | AGPL | ✓ GPL | ✓ MIT |
| AI inside the terminal | ✗ (by design) | ✓ (cloud) | ✗ | ✗ |
| 9-language native UI | ✓ | en | en | en |
Comparison reflects publicly documented features as of 2026-05-01. Other terminals may have closed-source or roadmap items not listed.
Get Unterm 0.11.0
macOS bundle is signed with a Developer ID and Apple-notarized. Linux .deb / AppImage and Windows .msi / .zip are also published.
View v0.11.0 release on GitHubFrequently asked
What is Unterm?
A cross-platform terminal emulator with built-in MCP, HTTP, and CLI control surfaces. The product thesis: terminal as MCP-controllable surface, so any external AI agent can drive it from outside instead of having an AI baked into the terminal itself.
How does it work with Claude Code, Cursor, or other agents?
Each Unterm window starts a local MCP server (TCP, JSON-RPC, auth-token gated). Point your MCP client at 127.0.0.1:<port> — the port + token are written to ~/.unterm/server.json on launch. The agent can spawn shells, run commands, read pane state, capture screenshots, toggle recording, and switch settings.
How do I drive multiple Unterm windows from one agent?
Each Unterm process is one instance with a NATO-phonetic name (alpha, bravo, …) recorded in ~/.unterm/instances/<name>.json. Call instance.list on any one of them to enumerate; pick by cwd / title / start order; connect to that instance's port with its auth token. ~/.unterm/active.json points at the most recent live instance for single-instance fallbacks.
How is this different from Warp?
Warp embeds AI inside a closed cloud orchestrator (Oz) — external tools like Claude Code can't drive Warp from outside. Unterm picks the third lane: keep AI out of the terminal, expose the terminal itself as an MCP-controllable surface, and let any agent grip it. No cloud, no login.
Where does my data go?
Nowhere external. MCP and Web Settings servers bind to 127.0.0.1 only. Session recordings land under <project>/.unterm/sessions/ with built-in redaction for tokens. There is no telemetry, no analytics, no login, no cloud round-trip. Your shell history is yours.
How do I script it?
Use unterm-cli: session list, proxy status, theme set midnight, session record start, screenshot. Pass --json to any subcommand for raw JSON-RPC output suitable for shell pipelines and cron jobs.
Which platforms ship signed and notarized?
macOS: universal arm64 + x86_64 DMG signed with a Developer ID and Apple-notarized + stapled (no Gatekeeper warnings). Linux: .deb for Debian/Ubuntu and AppImage for any distro. Windows: WiX-built MSI installer and portable .zip. All published to GitHub Releases on every minor tag.
Is it open-source?
Yes — MIT licensed. Built on top of the WezTerm engine for renderer / font / SSH / mux work, with a thin Unterm product layer (MCP, Web Settings, recording, i18n, signing pipeline) on top. Source at github.com/unzooai/unterm.
How do I contribute?
Open an issue or PR on GitHub. The project tracks bugs, feature requests, and discussion in one queue. We bundle accumulated fixes into minor releases — patch-level versions don't trigger CI builds. Documentation lives in-repo at /docs.
Community & contact
Open queue, no gatekeeping. The right place for your question depends on what kind of question it is.
Bug reports, feature requests, regressions. The triage queue is single — every report gets read.
Questions about MCP integration patterns, agent setup, workflow design. Other users may have hit the same thing.
Direct line for security issues, partnerships, or anything that doesn't fit a public forum.
Sister projects
Same author, same MCP-first design philosophy, different domains.