chaitanyagiri / munder-difflin
- среда, 19 августа 2026 г. в 00:00:04
local multi-agent harness
Free, open source and performant — a multi-agent harness that works with the subscriptions you already pay for, on their hourly limits. It turns the terminal coding CLI you already run into a clone of you, one that keeps working while you're away and coordinates a whole office of agents on your own machine.
Wraps Claude Code, Antigravity (Gemini), OpenAI Codex, xAI Grok, Kimi Code, Qwen, OpenCode, Crush, pi.dev, and GitHub Copilot CLI — with bring-your-own keys and local LLMs. Agents that message, route, and remember, coordinated by your clone (Michael) and visualized as avatars at work on a shared office floor.
Electron · React · TypeScript · Pixi.js · xterm.js · node-pty
Note
The world's best agents. The world's worst paper company.
Munder Difflin takes the terminal-agent CLIs you already run — claude, agy, codex, grok,
kimi, qwen, opencode, crush, pi, and copilot — and turns them
into a self-coordinating team: each agent gets long-term memory, a mailbox, and a desk on a 2D
office floor — and your clone (Michael) routes work between them while you watch. He's the
boss of the floor; you're still the boss of him.
Munder Difflin is a desktop app that wraps real terminal-agent CLIs as fully-capable agents, wires them into a hive mind, and puts your clone in charge — Michael, the one agent you talk to in order to get things done. Under the hood it runs the fastest memory layer in the world so every agent remembers what it learns and recalls it instantly.
claude, agy, codex, grok, kimi, qwen, opencode, crush, pi, copilot, or custom session runs as a real
process in a pseudo-terminal (node-pty), byte-for-byte authentic, rendered with xterm.js. you ── talk to ──► ┌─────────────┐
│ GOD agent │ orchestrator / supervisor
│ (Michael's │ roster · routing · adjudication
│ office) │ blackboard · task ledger
└──────┬──────┘
│ assigns · routes · escalates
┌────────────────────────┼────────────────────────┐
▼ ▼ ▼
┌───────────┐ ┌───────────┐ ┌───────────┐
│ agent A │ message │ agent B │ message │ agent C │
│ provider │ ─────────► │ provider │ ─────────► │ provider │
│ + memory │ │ + memory │ │ + memory │
└───────────┘ └───────────┘ └───────────┘
└──────── shared hive: memory · mailbox · blackboard · log ───────┘
claude, agy, codex, or custom)
with its own working directory, identity, and provider-specific lifecycle.outbox/; the harness's router delivers into recipients' inbox/. No agent ever touches git
(single-committer design avoids index.lock corruption).See HIVE.md for the full multi-agent design, SPEC.md for the
terminal/event plane, and DESIGN.md for the visual system.
The floor
node-pty PTY, rendered with xterm.js.Memory & coordination
Control & safety
Command Center
Getting work in and out
munderdifflin://hire link; import only pre-fills the form, a human still spawns it. Browse roles at the Agent Gallery.Note
Status: v0.4.4 — Windows agents can finally talk to each other. On Windows, agents were
never told they could message one another: the protocol reaches them as a multi-line command
line, and cmd.exe cut it at the first newline. They started, looked healthy, and ignored each
other forever. If you tried Munder Difflin on Windows and your team just sat there, that was
this bug. Also fixed: a fresh install now starts its own message router instead of waiting for a
restart, the setup wizard can be finished, and dark mode is rebuilt for readability. New in this
release: Skills, Prerequisites, and release notes that carry their own page.
If you're on 0.3.8, update: that build's usage-limit guard never released the agents it held,
and it has been removed entirely.
macOS (signed & notarized), Windows, and Linux builds are on the
releases page.
node-pty's native addon — on macOS, install Xcode Command Line Tools:
xcode-select --installPATH — Claude Code
(claude, the default), Antigravity (agy), OpenAI Codex (codex), xAI Grok (grok),
Kimi Code (kimi), Qwen (qwen), OpenCode (opencode), Crush (crush),
pi.dev (pi), or GitHub Copilot (copilot). Most missing CLIs self-heal: the harness runs the installer in the
terminal and continues into the new binary.git clone https://github.com/chaitanyagiri/munder-difflin.git
cd munder-difflin
npm install # postinstall rebuilds node-pty against Electron's ABI
npm run dev # launches the Electron app with hot reloadOn first launch you'll go through the onboarding wizard, then land on the floor. Use Add agent to spawn your first session — the GOD agent seats itself in Michael's office automatically.
npm run build # production build via electron-vite
npm run preview # preview the production build
npm run typecheck # type-check the node (main/preload) and web (renderer) projectsIf
node-ptyfails to load after an Electron upgrade, re-runnpm install(thepostinstallhook runselectron-rebuildagainst the current Electron ABI).
Two data planes feed one renderer:
┌───────────────────────────────────────────────────────────────┐
│ Electron Renderer (React) │
│ ┌──────────────────┐ ┌──────────────────────────────┐ │
│ │ Office Floor │ │ Terminal + Command Bar │ │
│ │ (Pixi.js) │ │ Files + Git tabs (xterm.js) │ │
│ └─────────▲────────┘ └────────────▲─────────────────┘ │
│ │ avatar state │ pty bytes / fs / git │
└─────────────┼──────────────────────────┼───────────────────────┘
│ IPC (contextBridge: window.cth)
┌──────┴──────────┐ ┌──────┴─────────────┐
│ Event Plane │ │ Terminal Plane │
│ hooks / hive │ │ node-pty PTYs │
│ router + GOD │ │ + fs + git │
└────────▲────────┘ └──────▲─────────────┘
│ hook payloads │ stdin / stdout
└─────────┬──────────────┘
┌──────┴──────────────┐
│ claude / agy / codex│
└─────────────────────┘
PtyManager that spawns each agent as a node-pty
process and streams output over per-id IPC (pty:data:<id>). The renderer talks only through a
typed window.cth bridge (src/preload/index.ts), which also exposes
sandboxed filesystem and git helpers.hive.ts is the on-disk multi-agent layer; hooks.ts runs the hook
server that provider bridges POST lifecycle payloads to (cth-hook for Claude Code, agy-hook
for Antigravity). memory.ts wraps the semantic memory CLI. The router delivers messages, drains
provider outboxes, the GOD agent adjudicates, and idle/inbox wakeups keep workers draining mail.src/
main/ Electron main process (Node)
index.ts window, IPC handlers, quit guard
pty.ts node-pty manager (spawn/write/resize/kill/stream)
hive.ts on-disk multi-agent layer (memory, mailboxes, router)
hooks.ts hook server + provider hook shims (`cth-hook`, `agy-hook`)
memory.ts semantic memory layer (CLI wrapper, degrade-to-noop)
config.ts harness config persistence + home setup
transcript.ts reads ~/.claude/projects/ JSONL transcripts for real token/cost telemetry
telemetry.ts live OTel collector + usage/cost feed for observability
usage.ts / pricing.ts UsageProvider seam + per-model cost attribution
breaker.ts / control.ts cost/runaway circuit breaker (steer/constrain/stop) + HITL gate / steer / stop
reflect.ts MemoryReflector — memory condensation
db.ts SQLite durable store (window bounds + history) + durable cost ledger
github.ts GitHub issue + CI run ingestion via the gh CLI
shellEnv.ts resolve PATH and shell env for child processes
fs.ts / git.ts sandboxed filesystem + git bridges
preload/ contextBridge → typed window.cth API
renderer/src/
App.tsx top-level layout + wiring
design/ tokens.css / tokens.ts / global.css (design source of truth)
components/ PixelPanel, AgentDetailPanel, CommandBar, ApprovalsPanel, MemoryPanel, …
CommandCenterPanel, Michael's control surface (Terminal/Floor/Memory/Activity/Tasks/Triggers/Handbook tabs)
ToolWaterfall, per-agent tool-span waterfall for the observability view
TasksKanban, dependency-aware kanban board (Tasks tab)
ThreadsPanel, hive message conversation viewer (Messages tab)
MessageQueueComposer, park messages for a busy agent
scene/office/ Pixi office floor: OfficeFloor, Character, Camera, cast, pathfinding, …
store/ · hooks/ zustand store, event loop, PTY parser, typewriter
assets/ tilesets, maps, character sheets (see ATTRIBUTION.md)
docs/ `logo.png`, `banner.png`, landing page (GitHub Pages → munderdiffl.in)
docs/media/ `og.png` (social previews) + rendered Remotion clips
landing-remotion/ Remotion project that renders the landing page's "how it works" clips
HIVE.md · SPEC.md · DESIGN.md multi-agent · terminal/event · visual design
docs/message-queue.md who may type into an agent's terminal, and when
The aesthetic is Animal Crossing × Earthbound × SNES menu UI — pixel-snapped, chunky, friendly.
DESIGN.md is canonical; every component derives from its tokens. The Munder Difflin
brand layers a Dunder-Mifflin maroon (#6E1423) and gold (#F4D35E) on top for logo and
chrome. The 15 avatars are the cast of The Office, differentiated by hair/skin/shirt recipes.
Shipped through v0.4.3 — ten agent engines with BYOK keys and local LLMs, voice orchestration,
the hive (memory · mailboxes · blackboard · event log), Command Center with kanban and schedules,
a built-in Monaco IDE with git rails, integrations registry + secret broker, Slack-spawned workers,
shareable hires and the Agent Gallery, observability and the circuit breaker, durable persistence,
session resume, multi-window floors, and working auto-update.
Full history in CHANGELOG.md.
Next up:
Contributions are welcome — this is an early prototype with a lot of surface area. Start with
CONTRIBUTING.md. The short version: fork, npm install && npm run dev, keep
npm run typecheck green, and derive any new UI from DESIGN.md tokens. Good
first areas: wiring real hook events, the add-agent flow, the config drawer, and cross-platform work.
Official builds send a small set of anonymous usage events (app opened, agent spawned, feature
used) — never prompts, code, file paths, or agent output. The complete event list, the anonymity
guarantees, and the three ways to opt out (Settings toggle, DO_NOT_TRACK, or building from
source — forks compile with no key and send nothing) are documented in
TELEMETRY.md.
Important
Asset licensing. The bundled pixel art (tilesets, maps, and the base character sheets the
Office cast is recolored from) comes from LimeZu via
shahar061/the-office under the LimeZu FREE VERSION
license — non-commercial use only. The recolored sprites inherit that restriction. See
src/renderer/src/assets/ATTRIBUTION.md. To
commercialize, replace these assets or obtain a paid LimeZu license.
The source code is licensed under the MIT License — see LICENSE. The MIT grant
covers the code only; the non-commercial asset restriction above is carved out in the LICENSE scope
note. Munder Difflin is an affectionate parody and is not affiliated with NBC's The Office or
Dunder Mifflin.
shahar061/the-office — office tileset/map vendoring.landing-remotion/).