selfhost.directory

The index of self-hostable projects — ranked, categorized and served with live updates.
Own your data and stop giving it to big tech.

MulmoTerminal logo

Self-host MulmoTerminal

11.5.0

Browser terminal grid for parallel AI coding agents

ReleaseOpen SourceMIT
Updated7 hours ago
LanguageTypescript
Setup difficultyModerate
ThemeDark mode
Stars
255
Ports
34567 (Backend HTTP/WebSocket port (production URL)), 6856 (Vite dev-server port (development only))
Requires
claude (Claude Code CLI), gh (GitHub CLI), Git
Install with Docker
MulmoTerminal grid view with live Claude Code sessions color-coded by stateGrid view with four live Claude sessions in color-coded projectsCockpit roster showing one-row-per-session summary listZoomed cell with Canvas GUI panel beside terminalFour projects color-coded in the grid with custom palettesSettings modal with sidebar of grouped sections

What is MulmoTerminal?

MulmoTerminal is a browser-based terminal grid for supervising multiple AI coding agents in parallel. It launches real PTY sessions for each agent (Claude Code, Codex, and five others) and streams them to xterm.js terminals in the browser over WebSockets. Each cell is color-coded by agent state — blue for working, amber for waiting on permission, green for done — with an attention chime and Web Push notifications to your phone. Sessions survive server restarts via tmux persistence. Git worktrees isolate agent work per task with one-click PR creation. The UI includes a cockpit roster showing one-line summaries per session, a Canvas panel rendering rich GUI output (documents, forms, charts, images) via MCP, per-project theming, cost/token readouts, and configurable header buttons. It runs via npx (Node ≥ 22.12), Docker, or SSH tunnel to a remote server. No Electron, no separate install step. Licensed MIT.

Should you self-host MulmoTerminal?

MulmoTerminal scores 53/100 on selfhost.directory (how scoring works) and ranks #66 of 166 in Developer Tools. It has 255 GitHub stars.

It shipped 11 stable releases in the past year. The latest, 11.5.0, came out on 28 October 2026. New versions land roughly every 1 days.

Setup is moderate: expect some configuration beyond a single command. It is MIT-licensed and written mostly in Typescript.

Its closest alternative on selfhost.directory is openhands (87/100, 92 068 stars). It scores higher overall, so compare the two before you pick. See MulmoTerminal vs openhands side by side.

Features

  • Canvas GUI panel
  • Cockpit roster
  • Color-coded session states
  • Command palette and keyboard navigation
  • Cost and token readouts
  • File drag-and-drop and screenshot paste
  • MCP (Model Context Protocol) integration
  • Parallel agent grid
  • Per-directory theming
  • Remote server via SSH tunnel or DockerDocker is experimental, no official image
  • Web push notifications

MulmoTerminal README

How to install MulmoTerminal

Install MulmoTerminal with Docker

Environment variables
MULMOTERMINAL_HOST=0.0.0.0, PORT=34567

docker build -t mulmoterminal-server . docker run -p 127.0.0.1:34567:34567 -v "$HOME/work:/home/dev/work" mulmoterminal-server

No official image yet; example Dockerfile provided in docs. Requires Node 22, git, gh, tmux, Claude Code.

How to configure MulmoTerminal

  • ANTIGRAVITY_BINagyThe Antigravity CLI binary to spawn

    The Antigravity CLI binary to spawn

  • ANTIGRAVITY_HOME~/.gemini/antigravity-cliAntigravity home directory containing session brain storage

    Antigravity home directory containing session brain storage

  • ANTIGRAVITY_MODELagy defaultModel passed to Antigravity as --model

    Model passed to Antigravity as --model

  • CLAUDE_BINclaudeThe Claude Code binary to spawn

    The Claude Code binary to spawn

  • CLAUDE_CONFIG_DIR~/.claudeClaude Code's own config directory

    Claude Code's own config directory

  • CLAUDE_CWDcurrent dirWorking directory each claude PTY runs in; determines which project's sessions are listed

    Working directory each claude PTY runs in; determines which project's sessions are listed

  • CLAUDE_PERMISSION_MODEautoPermission mode passed to each claude spawn

    Permission mode passed to each claude spawn

  • CLIENT_PORT6856Vite dev-server port (dev only: the URL you open with yarn dev)

    Vite dev-server port (dev only: the URL you open with yarn dev)

  • CODEX_BINcodexThe Codex CLI binary to spawn

    The Codex CLI binary to spawn

  • CODEX_HOME~/.codexCodex home — where its session rollouts and MulmoTerminal-mirrored skills live

    Codex home — where its session rollouts and MulmoTerminal-mirrored skills live

  • CODEX_MODELcodex defaultModel passed to Codex as --model

    Model passed to Codex as --model

  • COPILOT_BINcopilotThe GitHub Copilot CLI binary to spawn

    The GitHub Copilot CLI binary to spawn

  • COPILOT_HOME~/.copilotCopilot's config directory

    Copilot's config directory

  • COPILOT_MODELcopilot defaultModel passed to Copilot as --model

    Model passed to Copilot as --model

  • CURSOR_BINcursor-agentThe Cursor CLI binary to spawn

    The Cursor CLI binary to spawn

  • CURSOR_MODELcursor defaultModel passed to Cursor as --model

    Model passed to Cursor as --model

  • GEMINI_IMAGE_MODELgemini-3.1-flash-image-previewModel used for image generation (needs GEMINI_API_KEY)

    Model used for image generation (needs GEMINI_API_KEY)

  • GROK_BINgrokThe Grok CLI binary to spawn

    The Grok CLI binary to spawn

  • GROK_HOME~/.grokGrok home directory containing its per-directory session store

    Grok home directory containing its per-directory session store

  • GROK_MODELgrok defaultModel passed to Grok as --model

    Model passed to Grok as --model

  • MT_TITLE_MODELhaikuModel used for the cell header's AI title

    Model used for the cell header's AI title

  • MT_TITLE_SOURCEtranscriptWhere the cell header's AI title comes from

    Where the cell header's AI title comes from

    values: transcript, headless

  • MULMOCLAUDE_WORKSPACE_PATH~/mulmoclaudeWhere the managed MulmoClaude workspace lives

    Where the managed MulmoClaude workspace lives

  • MULMOTERMINAL_HOME~/.mulmoterminalRoot for managed git worktrees

    Root for managed git worktrees

  • MULMOTERMINAL_HOST127.0.0.1Host to bind the server to (set to 0.0.0.0 in Docker)

    Host to bind the server to (set to 0.0.0.0 in Docker)

  • MULMOTERMINAL_NO_SKILL_INSTALLunsetSet to any value to skip installing the bundled skills into Claude's skills root

    Set to any value to skip installing the bundled skills into Claude's skills root

  • MUSE_BINmuseThe Muse CLI binary to spawn

    The Muse CLI binary to spawn

  • MUSE_HOME~/.local/share/museMuse home directory containing its session index and logs

    Muse home directory containing its session index and logs

  • MUSE_MODELmuse defaultModel passed to Muse as --model

    Model passed to Muse as --model

  • PORT34567Backend HTTP/WebSocket port (prod: the URL you open)

    Backend HTTP/WebSocket port (prod: the URL you open)

  • WAIT_REAP_GRACE_MS1800000How long a waiting background session is kept before it's auto-reaped

    How long a waiting background session is kept before it's auto-reaped

MulmoTerminal releases & version history

FAQ

Can I use it as an ordinary terminal?

Yes. Pick Shell in an empty cell and choose a directory. No launcher entry, no model, no configuration. Every cell is a real PTY.

Can several agents work in the same repository?

Yes, they're isolated with git worktrees — one worktree and one branch per task, so the same repo is safe to parallelize. Diff, commit, push, and Open PR are reachable from inside the cell.

How many agents do people actually run?

Typically one to six, with the heaviest user at eight. Users don't run more agents than before — they handle the same number more easily without losing track.

Is MulmoTerminal itself free?

Yes — MIT license. Use it at work, fork it, whatever you need. Nothing is sent to any server the authors control.

What do I need to run it?

Node.js 22.12+, claude or codex on PATH, optional tmux for session persistence (on Windows, psmux 3.4.0+). Run with: npx mulmoterminal@latest → http://localhost:34567

Does it work on Windows?

Yes. Windows, macOS and Linux. CI runs Linux and macOS on every PR, and Windows nightly. There are Windows-specific test cases for path separators, realpathSync behaviour, fs.watch differences.

How is this different from Conductor / Crystal?

Conductor/Crystal have more developed diff review and are native (faster). But they're desktop apps — more windows means more memory and every window looks the same. MulmoTerminal fits in one browser tab, reachable from phone.

How is this different from Claude Squad?

Claude Squad is a TUI where you look at one agent at a time. MulmoTerminal is a browser showing several live screens at once. Claude Squad is lighter over SSH.

Why not just split a terminal with tmux?

tmux wasn't designed for agents that stop and ask permission. MulmoTerminal adds visible state colors, grid↔enlarge to scan then read, and phone notifications so you can leave the desk.

How is this different from Cursor?

Completion and inline editing are better in Cursor. MulmoTerminal doesn't replace that — it solves the step before: which agent is waiting on you right now, with color-coded grid and phone push.

How is this different from the VS Code Claude Code extension?

Different jobs — not an either/or. Keeping several agents apart in VS Code windows is expensive (each brings editor, language server, extensions, file watchers). Here agents are processes on a server and UI is browser tabs.

What happens to my hooks, MCP servers and CLAUDE.md?

They keep working. MulmoTerminal launches your own claude/codex CLI — not a wrapper or reimplementation — so hooks, MCP servers, CLAUDE.md and permission settings behave exactly as before.

Can I go back if I don't like it?

Yes. It runs through npx; closing it is the whole uninstall. Sessions live in tmux, settings in ~/.mulmoterminal/ and .mulmoterminal.json. Your existing ~/.claude/ setup is not modified.

Do my existing Claude Code sessions carry over?

Yes. MulmoTerminal uses the same claude --resume, reading the same transcripts from your disk. Nothing is converted to a private format. Point it at a directory you already work in and your history is there.

More in Terminal

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…