{"id":23407,"date":"2009-10-11T04:59:58","date_gmt":"2009-10-11T04:59:58","guid":{"rendered":"https:\/\/scannn.com\/chaitanyagiri-munder-difflin-local-multi-agent-harness-%c2%b7-github\/"},"modified":"2009-10-11T04:59:58","modified_gmt":"2009-10-11T04:59:58","slug":"chaitanyagiri-munder-difflin-local-multi-agent-harness-%c2%b7-github","status":"publish","type":"post","link":"https:\/\/scannn.com\/lv\/chaitanyagiri-munder-difflin-local-multi-agent-harness-%c2%b7-github\/","title":{"rendered":"chaitanyagiri\/munder-difflin: local multi-agent harness \u00b7 GitHub"},"content":{"rendered":"\n<div id=\"\">\n<div align=\"center\" dir=\"auto\">\n<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/github.com\/chaitanyagiri\/munder-difflin\/blob\/main\/docs\/logo.png\"><\/a><\/p>\n<div class=\"markdown-heading\" dir=\"auto\">\n<h3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\">Agent harness to run an office of your clones<\/h3>\n<p><a id=\"user-content-agent-harness-to-run-an-office-of-your-clones\" class=\"anchor\" aria-label=\"Permalink: Agent harness to run an office of your clones\" href=\"#agent-harness-to-run-an-office-of-your-clones\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\/><\/svg><\/a><\/div>\n<p dir=\"auto\"><strong>Free, open source and performant<\/strong> \u2014 a multi-agent harness that works with the<br \/>\nsubscriptions you already pay for, on their hourly limits. It turns the terminal coding CLI<br \/>\nyou already run into a clone of you, one that keeps working while you&#8217;re away and<br \/>\ncoordinates a whole office of agents on your own machine.<\/p>\n<p dir=\"auto\">Wraps <a href=\"https:\/\/claude.com\/claude-code\" rel=\"nofollow\">Claude Code<\/a>, Antigravity (Gemini), OpenAI Codex,<br \/>\n<strong>xAI Grok<\/strong>, <strong>Kimi Code<\/strong>, <strong>Qwen<\/strong>, <strong>OpenCode<\/strong>, <strong>Crush<\/strong>, <strong>pi.dev<\/strong>, and<br \/>\n<strong>GitHub Copilot CLI<\/strong> \u2014 with bring-your-own keys and local LLMs.<br \/>\nAgents that message, route, and remember, coordinated by <strong>your clone<\/strong> (Michael) and<br \/>\nvisualized as avatars at work on a shared office floor.<\/p>\n<p dir=\"auto\">\n  <em>Electron \u00b7 React \u00b7 TypeScript \u00b7 Pixi.js \u00b7 xterm.js \u00b7 node-pty<\/em>\n<\/p>\n<p dir=\"auto\">\n  <a href=\"https:\/\/github.com\/chaitanyagiri\/munder-difflin\/blob\/main\/LICENSE\"><img decoding=\"async\" alt=\"License: MIT\" src=\"https:\/\/camo.githubusercontent.com\/9a2d9818e3f6728c750f785ae68783d28ae36755138a1ccff1f1861c355a20cd\/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d4634443335452e7376673f7374796c653d666c61742d737175617265266c6162656c436f6c6f723d364531343233\" data-canonical-src=\"https:\/\/img.shields.io\/badge\/license-MIT-F4D35E.svg?style=flat-square&amp;labelColor=6E1423\" style=\"max-width: 100%;\"\/><\/a><br \/>\n  <a href=\"https:\/\/github.com\/chaitanyagiri\/munder-difflin\/blob\/main\/CHANGELOG.md\"><img decoding=\"async\" alt=\"Version: 0.4.4\" src=\"https:\/\/camo.githubusercontent.com\/b335333d3ab234f520f6b339af2aaa5f85e24999f37b3323fda5e1cc87dbed7d\/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f76657273696f6e2d302e342e342d4634443335452e7376673f7374796c653d666c61742d737175617265266c6162656c436f6c6f723d364531343233\" data-canonical-src=\"https:\/\/img.shields.io\/badge\/version-0.4.4-F4D35E.svg?style=flat-square&amp;labelColor=6E1423\" style=\"max-width: 100%;\"\/><\/a><br \/>\n  <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https:\/\/camo.githubusercontent.com\/7da71598a28b72d40e22cfa64c3f6d4222ca4898666fe88557a461e55f385b6d\/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7374617475732d776f726b696e6725323070726f746f747970652d4634463145412e7376673f7374796c653d666c61742d737175617265266c6162656c436f6c6f723d364531343233\"><img decoding=\"async\" alt=\"Status: prototype\" src=\"https:\/\/camo.githubusercontent.com\/7da71598a28b72d40e22cfa64c3f6d4222ca4898666fe88557a461e55f385b6d\/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7374617475732d776f726b696e6725323070726f746f747970652d4634463145412e7376673f7374796c653d666c61742d737175617265266c6162656c436f6c6f723d364531343233\" data-canonical-src=\"https:\/\/img.shields.io\/badge\/status-working%20prototype-F4F1EA.svg?style=flat-square&amp;labelColor=6E1423\" style=\"max-width: 100%;\"\/><\/a><br \/>\n  <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https:\/\/camo.githubusercontent.com\/5f638ada4c5171db5ee91d00357df8b6e8fa791f5a7063f08e02b20d49a089eb\/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d6d61634f5325323025374325323057696e646f77732532302537432532304c696e75782d4634463145412e7376673f7374796c653d666c61742d737175617265266c6162656c436f6c6f723d364531343233\"><img decoding=\"async\" alt=\"Platform: macOS | Windows | Linux\" src=\"https:\/\/camo.githubusercontent.com\/5f638ada4c5171db5ee91d00357df8b6e8fa791f5a7063f08e02b20d49a089eb\/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d6d61634f5325323025374325323057696e646f77732532302537432532304c696e75782d4634463145412e7376673f7374796c653d666c61742d737175617265266c6162656c436f6c6f723d364531343233\" data-canonical-src=\"https:\/\/img.shields.io\/badge\/platform-macOS%20%7C%20Windows%20%7C%20Linux-F4F1EA.svg?style=flat-square&amp;labelColor=6E1423\" style=\"max-width: 100%;\"\/><\/a><br \/>\n  <a href=\"https:\/\/github.com\/chaitanyagiri\/munder-difflin\/blob\/main\/CONTRIBUTING.md\"><img decoding=\"async\" alt=\"PRs welcome\" src=\"https:\/\/camo.githubusercontent.com\/740c97319cdfd8d1dc8e1cd18413fff787cecd9cfa29ce3ee82749e987aa7948\/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5052732d77656c636f6d652d4634443335452e7376673f7374796c653d666c61742d737175617265266c6162656c436f6c6f723d364531343233\" data-canonical-src=\"https:\/\/img.shields.io\/badge\/PRs-welcome-F4D35E.svg?style=flat-square&amp;labelColor=6E1423\" style=\"max-width: 100%;\"\/><\/a><br \/>\n  <a href=\"https:\/\/discord.gg\/SEDzP5ZPk5\" rel=\"nofollow\"><img decoding=\"async\" alt=\"Discord\" src=\"https:\/\/camo.githubusercontent.com\/d6771d9983c7b0ea29a3228f656a398660db9208451dcaa1683d578fe3e12989\/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446973636f72642d6a6f696e2532307468652532306f66666963652d4634443335452e7376673f7374796c653d666c61742d737175617265266c6162656c436f6c6f723d364531343233\" data-canonical-src=\"https:\/\/img.shields.io\/badge\/Discord-join%20the%20office-F4D35E.svg?style=flat-square&amp;labelColor=6E1423\" style=\"max-width: 100%;\"\/><\/a>\n<\/p>\n<p>\n<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/github.com\/chaitanyagiri\/munder-difflin\/blob\/main\/docs\/media\/og.png\"><img decoding=\"async\" src=\"https:\/\/github.com\/chaitanyagiri\/munder-difflin\/raw\/main\/docs\/media\/og.png\" alt=\"Munder Difflin \u2014 A hive of agents that message, route, and remember\" width=\"1240\" style=\"max-width: 100%;\"\/><\/a><br \/>\n<\/p>\n<\/div>\n<hr\/>\n<div class=\"markdown-alert markdown-alert-note\" dir=\"auto\">\n<p class=\"markdown-alert-title\" dir=\"auto\"><svg data-component=\"Octicon\" class=\"octicon octicon-info mr-2\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"\/><\/svg>Note<\/p>\n<p dir=\"auto\"><strong>The world&#8217;s best agents. The world&#8217;s worst paper company.<\/strong><br \/>\nMunder Difflin takes the terminal-agent CLIs you already run \u2014 <code>claude<\/code>, <code>agy<\/code>, <code>codex<\/code>, <code>grok<\/code>,<br \/>\n<code>kimi<\/code>, <code>qwen<\/code>, <code>opencode<\/code>, <code>crush<\/code>, <code>pi<\/code>, and <code>copilot<\/code> \u2014 and turns them<br \/>\ninto a self-coordinating team: each agent gets long-term memory, a mailbox, and a desk on a 2D<br \/>\noffice floor \u2014 and <strong>your clone<\/strong> (Michael) routes work between them while you watch. He&#8217;s the<br \/>\nboss of the floor; you&#8217;re still the boss of him.<\/p>\n<\/div>\n<p dir=\"auto\">Munder Difflin is a desktop app that wraps <strong>real terminal-agent CLIs<\/strong> as fully-capable agents,<br \/>\nwires them into a <strong>hive mind<\/strong>, and puts <strong>your clone<\/strong> in charge \u2014 Michael, the one agent <em>you<\/em><br \/>\ntalk to in order to get things done. Under the hood it runs the <strong>fastest memory layer in the<br \/>\nworld<\/strong> so every agent remembers what it learns and recalls it instantly.<\/p>\n<ul dir=\"auto\">\n<li><strong>Every terminal is an agent.<\/strong> Each <code>claude<\/code>, <code>agy<\/code>, <code>codex<\/code>, <code>grok<\/code>, <code>kimi<\/code>, <code>qwen<\/code>, <code>opencode<\/code>, <code>crush<\/code>, <code>pi<\/code>, <code>copilot<\/code>, or custom session runs as a real<br \/>\nprocess in a pseudo-terminal (<code>node-pty<\/code>), byte-for-byte authentic, rendered with xterm.js.<\/li>\n<li><strong>Every agent is an avatar.<\/strong> Sessions appear as characters on a Pixi.js office floor \u2014 they walk<br \/>\nto stations as they work, and envelopes fly desk-to-desk when they message each other.<\/li>\n<li><strong>The hive coordinates them.<\/strong> Agents read their memory and drain a mailbox; the router moves<br \/>\nmessages between inboxes; the GOD agent adjudicates, assigns, and escalates only when it needs you.<\/li>\n<li><strong>Memory that&#8217;s instant.<\/strong> A markdown-first memory layer with a semantic recall index means agents<br \/>\nremember across sessions and recall in milliseconds.<\/li>\n<\/ul>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"            you \u2500\u2500 talk to \u2500\u2500\u25ba  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510&#10;                                \u2502  GOD agent  \u2502  orchestrator \/ supervisor&#10;                                \u2502 (Michael's  \u2502  roster \u00b7 routing \u00b7 adjudication&#10;                                \u2502   office)   \u2502  blackboard \u00b7 task ledger&#10;                                \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2518&#10;                                       \u2502 assigns \u00b7 routes \u00b7 escalates&#10;              \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510&#10;              \u25bc                         \u25bc                         \u25bc&#10;        \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510            \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510            \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510&#10;        \u2502  agent A  \u2502  message   \u2502  agent B  \u2502  message   \u2502  agent C  \u2502&#10;        \u2502 provider  \u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25ba \u2502 provider  \u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25ba \u2502 provider  \u2502&#10;        \u2502  + memory \u2502            \u2502  + memory \u2502            \u2502  + memory \u2502&#10;        \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518            \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518            \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518&#10;              \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 shared hive: memory \u00b7 mailbox \u00b7 blackboard \u00b7 log \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\">\n<pre class=\"notranslate\"><code>            you \u2500\u2500 talk to \u2500\u2500\u25ba  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n                                \u2502  GOD agent  \u2502  orchestrator \/ supervisor\n                                \u2502 (Michael's  \u2502  roster \u00b7 routing \u00b7 adjudication\n                                \u2502   office)   \u2502  blackboard \u00b7 task ledger\n                                \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                                       \u2502 assigns \u00b7 routes \u00b7 escalates\n              \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n              \u25bc                         \u25bc                         \u25bc\n        \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510            \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510            \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n        \u2502  agent A  \u2502  message   \u2502  agent B  \u2502  message   \u2502  agent C  \u2502\n        \u2502 provider  \u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25ba \u2502 provider  \u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25ba \u2502 provider  \u2502\n        \u2502  + memory \u2502            \u2502  + memory \u2502            \u2502  + memory \u2502\n        \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518            \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518            \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n              \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 shared hive: memory \u00b7 mailbox \u00b7 blackboard \u00b7 log \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n<\/code><\/pre>\n<\/div>\n<ol dir=\"auto\">\n<li><strong>You spawn agents<\/strong> \u2014 each is a normal terminal process (<code>claude<\/code>, <code>agy<\/code>, <code>codex<\/code>, or custom)<br \/>\nwith its own working directory, identity, and provider-specific lifecycle.<\/li>\n<li><strong>Agents collaborate through the hive<\/strong> \u2014 a local git repo of plain files. They write to their own<br \/>\n<code>outbox\/<\/code>; the harness&#8217;s router delivers into recipients&#8217; <code>inbox\/<\/code>. No agent ever touches git<br \/>\n(single-committer design avoids <code>index.lock<\/code> corruption).<\/li>\n<li><strong>The GOD agent runs the floor<\/strong> \u2014 it reads every request, resolves routine ones itself (keeping<br \/>\nthe system fully autonomous), and only escalates <em>critical<\/em> items (spend, destructive ops, scope<br \/>\nchanges) into an approvals queue you act on.<\/li>\n<li><strong>Everything is visible<\/strong> \u2014 you watch avatars move, envelopes fly, and the live terminal stream;<br \/>\nyou can type back into any session, browse its files, and read its git history.<\/li>\n<\/ol>\n<p dir=\"auto\">See <a href=\"https:\/\/github.com\/chaitanyagiri\/munder-difflin\/blob\/main\/HIVE.md\"><code>HIVE.md<\/code><\/a> for the full multi-agent design, <a href=\"https:\/\/github.com\/chaitanyagiri\/munder-difflin\/blob\/main\/SPEC.md\"><code>SPEC.md<\/code><\/a> for the<br \/>\nterminal\/event plane, and <a href=\"https:\/\/github.com\/chaitanyagiri\/munder-difflin\/blob\/main\/DESIGN.md\"><code>DESIGN.md<\/code><\/a> for the visual system.<\/p>\n<p dir=\"auto\"><strong>The floor<\/strong><\/p>\n<ul dir=\"auto\">\n<li><strong>Every terminal is a real agent.<\/strong> Claude Code, Antigravity (Gemini), OpenAI Codex, xAI Grok, Kimi Code, Qwen, OpenCode, Crush, pi.dev, GitHub Copilot CLI, or a custom command \u2014 each in its own <code>node-pty<\/code> PTY, rendered with xterm.js.<\/li>\n<li><strong>Every agent is an avatar.<\/strong> A Pixi.js office floor where agents walk to stations, envelopes fly desk to desk, and avatar state reflects real work.<\/li>\n<li><strong>A GOD orchestrator you talk to.<\/strong> It routes tasks, adjudicates traffic, and escalates only what needs a human. Or press <strong>Talk<\/strong> and run the floor by voice.<\/li>\n<li><strong>Per-agent git worktrees.<\/strong> Optional isolation so parallel agents never collide on branches.<\/li>\n<\/ul>\n<p dir=\"auto\"><strong>Memory &amp; coordination<\/strong><\/p>\n<ul dir=\"auto\">\n<li><strong>The hive<\/strong> \u2014 per-agent memory, atomic-file mailboxes, a shared blackboard, an append-only event log, single-committer git.<\/li>\n<li><strong>Semantic recall<\/strong> \u2014 markdown memory mined into a shared palace, searchable from the UI, with condensation so it doesn&#8217;t grow forever.<\/li>\n<li><strong>Enterprise Knowledge Graph<\/strong> \u2014 your own documents and policies, queryable by any agent.<\/li>\n<\/ul>\n<p dir=\"auto\"><strong>Control &amp; safety<\/strong><\/p>\n<ul dir=\"auto\">\n<li><strong>Human gates<\/strong> \u2014 spend, scope, and destructive ops escalate to you. Steer mid-run or stop gracefully.<\/li>\n<li><strong>Circuit breaker<\/strong> \u2014 a steer \u2192 constrain \u2192 stop ladder for agents that loop, storm errors, or blow their budget.<\/li>\n<li><strong>Budgets &amp; telemetry<\/strong> \u2014 per-agent token budgets, real cost from transcripts, a durable ledger, OTel spans, and a tool waterfall.<\/li>\n<\/ul>\n<p dir=\"auto\"><strong>Command Center<\/strong><\/p>\n<ul dir=\"auto\">\n<li>Kanban tasks with dependencies, scheduled missions + heartbeat, live fleet monitoring, memory search, activity log, and a CI watcher.<\/li>\n<li><strong>Skills<\/strong> \u2014 what every agent can already do across Claude Code, OpenCode and Codex, plus a browsable catalog of 227 more with search, filters, install and uninstall.<\/li>\n<li><strong>Built-in Monaco IDE<\/strong> \u2014 file tree, editor tabs, save, plus CHANGES \u00b7 HISTORY \u00b7 COMPARE git rails with commit graph, diffs, branch compare, and guarded checkout. All fs\/git access brokered through main.<\/li>\n<\/ul>\n<p dir=\"auto\"><strong>Getting work in and out<\/strong><\/p>\n<ul dir=\"auto\">\n<li><strong>Slack &amp; webhooks<\/strong> \u2014 message a channel or POST a webhook; Michael can spawn an ephemeral worker, reply in-thread, and tear it down.<\/li>\n<li><strong>Shareable hires + Agent Gallery<\/strong> \u2014 import a role from a <code>munderdifflin:\/\/hire<\/code> link; import only pre-fills the form, a human still spawns it. Browse roles at the <a href=\"https:\/\/munderdiffl.in\/hires\/\" rel=\"nofollow\">Agent Gallery<\/a>.<\/li>\n<li><strong>BYOK keys + local LLMs<\/strong> \u2014 per-provider keys in a write-only secret broker, plus Ollama \/ LM Studio \/ vLLM base URLs. Guides: <a href=\"https:\/\/munderdiffl.in\/blog\/run-munder-difflin-on-open-models\/\" rel=\"nofollow\">open models<\/a> \u00b7 <a href=\"https:\/\/munderdiffl.in\/blog\/run-munder-difflin-on-a-mac-mini\/\" rel=\"nofollow\">Mac Mini<\/a>.<\/li>\n<li><strong>Auto-update<\/strong> \u2014 new releases download in the background; you click restart, and the notes arrive as a designed page rather than a version number.<\/li>\n<li><strong>Prerequisites<\/strong> \u2014 one Settings page showing which supporting tools (uv, git, Node, MemPalace, each agent CLI) you have, what each is for, and a button that asks Michael to install what is missing.<\/li>\n<\/ul>\n<div class=\"markdown-alert markdown-alert-note\" dir=\"auto\">\n<p class=\"markdown-alert-title\" dir=\"auto\"><svg data-component=\"Octicon\" class=\"octicon octicon-info mr-2\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"\/><\/svg>Note<\/p>\n<p dir=\"auto\"><strong>Status: v0.4.4 \u2014 Windows agents can finally talk to each other.<\/strong> On Windows, agents were<br \/>\nnever told they could message one another: the protocol reaches them as a multi-line command<br \/>\nline, and <code>cmd.exe<\/code> cut it at the first newline. They started, looked healthy, and ignored each<br \/>\nother forever. If you tried Munder Difflin on Windows and your team just sat there, that was<br \/>\nthis bug. Also fixed: a fresh install now starts its own message router instead of waiting for a<br \/>\nrestart, the setup wizard can be finished, and dark mode is rebuilt for readability. New in this<br \/>\nrelease: <strong>Skills<\/strong>, <strong>Prerequisites<\/strong>, and release notes that carry their own page.<br \/>\n<strong>If you&#8217;re on 0.3.8, update:<\/strong> that build&#8217;s usage-limit guard never released the agents it held,<br \/>\nand it has been removed entirely.<br \/>\nmacOS (signed &amp; notarized), Windows, and Linux builds are on the<br \/>\n<a href=\"https:\/\/github.com\/chaitanyagiri\/munder-difflin\/releases\/latest\">releases page<\/a>.<\/p>\n<\/div>\n<ul dir=\"auto\">\n<li><strong>macOS, Windows, or Linux<\/strong>.<\/li>\n<li><strong>Node.js 18+<\/strong> and npm.<\/li>\n<li>A <strong>C\/C++ toolchain<\/strong> for <code>node-pty<\/code>&#8216;s native addon \u2014 on macOS, install Xcode Command Line Tools:\n<\/li>\n<li>At least one supported agent CLI on your <code>PATH<\/code> \u2014 <strong><a href=\"https:\/\/claude.com\/claude-code\" rel=\"nofollow\">Claude Code<\/a><\/strong><br \/>\n(<code>claude<\/code>, the default), <strong>Antigravity<\/strong> (<code>agy<\/code>), <strong>OpenAI Codex<\/strong> (<code>codex<\/code>), <strong>xAI Grok<\/strong> (<code>grok<\/code>),<br \/>\n<strong>Kimi Code<\/strong> (<code>kimi<\/code>), <strong>Qwen<\/strong> (<code>qwen<\/code>), <strong>OpenCode<\/strong> (<code>opencode<\/code>), <strong>Crush<\/strong> (<code>crush<\/code>),<br \/>\n<strong>pi.dev<\/strong> (<code>pi<\/code>), or <strong>GitHub Copilot<\/strong> (<code>copilot<\/code>). Most missing CLIs self-heal: the harness runs the installer in the<br \/>\nterminal and continues into the new binary.<\/li>\n<li><em>Optional:<\/em> <strong>your own API keys and local LLMs<\/strong> in <strong>Settings \u2192 AI Engines<\/strong> (Ollama \/ LM Studio \/ vLLM).<\/li>\n<li><em>Optional:<\/em> the semantic memory index for instant cross-session recall \u2014 markdown memory works without it.<\/li>\n<\/ul>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"git clone https:\/\/github.com\/chaitanyagiri\/munder-difflin.git&#10;cd munder-difflin&#10;npm install        # postinstall rebuilds node-pty against Electron's ABI&#10;npm run dev        # launches the Electron app with hot reload\">\n<pre>git clone https:\/\/github.com\/chaitanyagiri\/munder-difflin.git\n<span class=\"pl-c1\">cd<\/span> munder-difflin\nnpm install        <span class=\"pl-c\"><span class=\"pl-c\">#<\/span> postinstall rebuilds node-pty against Electron's ABI<\/span>\nnpm run dev        <span class=\"pl-c\"><span class=\"pl-c\">#<\/span> launches the Electron app with hot reload<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">On first launch you&#8217;ll go through the onboarding wizard, then land on the floor. Use <strong>Add agent<\/strong> to<br \/>\nspawn your first session \u2014 the GOD agent seats itself in Michael&#8217;s office automatically.<\/p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"npm run build      # production build via electron-vite&#10;npm run preview    # preview the production build&#10;npm run typecheck  # type-check the node (main\/preload) and web (renderer) projects\">\n<pre>npm run build      <span class=\"pl-c\"><span class=\"pl-c\">#<\/span> production build via electron-vite<\/span>\nnpm run preview    <span class=\"pl-c\"><span class=\"pl-c\">#<\/span> preview the production build<\/span>\nnpm run typecheck  <span class=\"pl-c\"><span class=\"pl-c\">#<\/span> type-check the node (main\/preload) and web (renderer) projects<\/span><\/pre>\n<\/div>\n<blockquote>\n<p dir=\"auto\">If <code>node-pty<\/code> fails to load after an Electron upgrade, re-run <code>npm install<\/code> (the <code>postinstall<\/code> hook<br \/>\nruns <code>electron-rebuild<\/code> against the current Electron ABI).<\/p>\n<\/blockquote>\n<p dir=\"auto\">Two data planes feed one renderer:<\/p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510&#10;\u2502                     Electron Renderer (React)                  \u2502&#10;\u2502   \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u2502&#10;\u2502   \u2502 Office Floor      \u2502    \u2502 Terminal + Command Bar       \u2502    \u2502&#10;\u2502   \u2502 (Pixi.js)        \u2502    \u2502 Files + Git tabs (xterm.js)  \u2502    \u2502&#10;\u2502   \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25b2\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25b2\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518    \u2502&#10;\u2502             \u2502 avatar state             \u2502 pty bytes \/ fs \/ git  \u2502&#10;\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518&#10;              \u2502 IPC (contextBridge: window.cth)&#10;       \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510        \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510&#10;       \u2502  Event Plane    \u2502        \u2502  Terminal Plane    \u2502&#10;       \u2502  hooks \/ hive   \u2502        \u2502  node-pty PTYs     \u2502&#10;       \u2502  router + GOD   \u2502        \u2502  + fs + git        \u2502&#10;       \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25b2\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518        \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u25b2\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518&#10;                \u2502 hook payloads          \u2502 stdin \/ stdout&#10;                \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518&#10;                   \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510&#10;                   \u2502 claude \/ agy \/ codex\u2502&#10;                   \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\">\n<pre class=\"notranslate\"><code>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502                     Electron Renderer (React)                  \u2502\n\u2502   \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u2502\n\u2502   \u2502 Office Floor      \u2502    \u2502 Terminal + Command Bar       \u2502    \u2502\n\u2502   \u2502 (Pixi.js)        \u2502    \u2502 Files + Git tabs (xterm.js)  \u2502    \u2502\n\u2502   \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25b2\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25b2\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518    \u2502\n\u2502             \u2502 avatar state             \u2502 pty bytes \/ fs \/ git  \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n              \u2502 IPC (contextBridge: window.cth)\n       \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510        \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n       \u2502  Event Plane    \u2502        \u2502  Terminal Plane    \u2502\n       \u2502  hooks \/ hive   \u2502        \u2502  node-pty PTYs     \u2502\n       \u2502  router + GOD   \u2502        \u2502  + fs + git        \u2502\n       \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25b2\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518        \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u25b2\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                \u2502 hook payloads          \u2502 stdin \/ stdout\n                \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                   \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n                   \u2502 claude \/ agy \/ codex\u2502\n                   \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n<\/code><\/pre>\n<\/div>\n<ul dir=\"auto\">\n<li><strong>Terminal plane.<\/strong> The main process owns a <code>PtyManager<\/code> that spawns each agent as a <code>node-pty<\/code><br \/>\nprocess and streams output over per-id IPC (<code>pty:data:&lt;id&gt;<\/code>). The renderer talks only through a<br \/>\ntyped <code>window.cth<\/code> bridge (<a href=\"https:\/\/github.com\/chaitanyagiri\/munder-difflin\/blob\/main\/src\/preload\/index.ts\"><code>src\/preload\/index.ts<\/code><\/a>), which also exposes<br \/>\nsandboxed filesystem and git helpers.<\/li>\n<li><strong>Hive \/ event plane.<\/strong> <code>hive.ts<\/code> is the on-disk multi-agent layer; <code>hooks.ts<\/code> runs the hook<br \/>\nserver that provider bridges POST lifecycle payloads to (<code>cth-hook<\/code> for Claude Code, <code>agy-hook<\/code><br \/>\nfor Antigravity). <code>memory.ts<\/code> wraps the semantic memory CLI. The router delivers messages, drains<br \/>\nprovider outboxes, the GOD agent adjudicates, and idle\/inbox wakeups keep workers draining mail.<\/li>\n<\/ul>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"src\/&#10;  main\/                      Electron main process (Node)&#10;    index.ts                 window, IPC handlers, quit guard&#10;    pty.ts                   node-pty manager (spawn\/write\/resize\/kill\/stream)&#10;    hive.ts                  on-disk multi-agent layer (memory, mailboxes, router)&#10;    hooks.ts                 hook server + provider hook shims (`cth-hook`, `agy-hook`)&#10;    memory.ts                semantic memory layer (CLI wrapper, degrade-to-noop)&#10;    config.ts                harness config persistence + home setup&#10;    transcript.ts            reads ~\/.claude\/projects\/ JSONL transcripts for real token\/cost telemetry&#10;    telemetry.ts             live OTel collector + usage\/cost feed for observability&#10;    usage.ts \/ pricing.ts    UsageProvider seam + per-model cost attribution&#10;    breaker.ts \/ control.ts  cost\/runaway circuit breaker (steer\/constrain\/stop) + HITL gate \/ steer \/ stop&#10;    reflect.ts               MemoryReflector \u2014 memory condensation&#10;    db.ts                    SQLite durable store (window bounds + history) + durable cost ledger&#10;    github.ts                GitHub issue + CI run ingestion via the gh CLI&#10;    shellEnv.ts              resolve PATH and shell env for child processes&#10;    fs.ts \/ git.ts           sandboxed filesystem + git bridges&#10;  preload\/                   contextBridge \u2192 typed window.cth API&#10;  renderer\/src\/&#10;    App.tsx                  top-level layout + wiring&#10;    design\/                  tokens.css \/ tokens.ts \/ global.css (design source of truth)&#10;    components\/              PixelPanel, AgentDetailPanel, CommandBar, ApprovalsPanel, MemoryPanel, \u2026&#10;    CommandCenterPanel,      Michael's control surface (Terminal\/Floor\/Memory\/Activity\/Tasks\/Triggers\/Handbook tabs)&#10;    ToolWaterfall,           per-agent tool-span waterfall for the observability view&#10;    TasksKanban,             dependency-aware kanban board (Tasks tab)&#10;    ThreadsPanel,            hive message conversation viewer (Messages tab)&#10;    MessageQueueComposer,    park messages for a busy agent&#10;    scene\/office\/            Pixi office floor: OfficeFloor, Character, Camera, cast, pathfinding, \u2026&#10;    store\/ \u00b7 hooks\/          zustand store, event loop, PTY parser, typewriter&#10;    assets\/                  tilesets, maps, character sheets (see ATTRIBUTION.md)&#10;docs\/                        `logo.png`, `banner.png`, landing page (GitHub Pages \u2192 munderdiffl.in)&#10;docs\/media\/                  `og.png` (social previews) + rendered Remotion clips&#10;landing-remotion\/            Remotion project that renders the landing page's &quot;how it works&quot; clips&#10;HIVE.md \u00b7 SPEC.md \u00b7 DESIGN.md   multi-agent \u00b7 terminal\/event \u00b7 visual design&#10;docs\/message-queue.md        who may type into an agent's terminal, and when\">\n<pre class=\"notranslate\"><code>src\/\n  main\/                      Electron main process (Node)\n    index.ts                 window, IPC handlers, quit guard\n    pty.ts                   node-pty manager (spawn\/write\/resize\/kill\/stream)\n    hive.ts                  on-disk multi-agent layer (memory, mailboxes, router)\n    hooks.ts                 hook server + provider hook shims (`cth-hook`, `agy-hook`)\n    memory.ts                semantic memory layer (CLI wrapper, degrade-to-noop)\n    config.ts                harness config persistence + home setup\n    transcript.ts            reads ~\/.claude\/projects\/ JSONL transcripts for real token\/cost telemetry\n    telemetry.ts             live OTel collector + usage\/cost feed for observability\n    usage.ts \/ pricing.ts    UsageProvider seam + per-model cost attribution\n    breaker.ts \/ control.ts  cost\/runaway circuit breaker (steer\/constrain\/stop) + HITL gate \/ steer \/ stop\n    reflect.ts               MemoryReflector \u2014 memory condensation\n    db.ts                    SQLite durable store (window bounds + history) + durable cost ledger\n    github.ts                GitHub issue + CI run ingestion via the gh CLI\n    shellEnv.ts              resolve PATH and shell env for child processes\n    fs.ts \/ git.ts           sandboxed filesystem + git bridges\n  preload\/                   contextBridge \u2192 typed window.cth API\n  renderer\/src\/\n    App.tsx                  top-level layout + wiring\n    design\/                  tokens.css \/ tokens.ts \/ global.css (design source of truth)\n    components\/              PixelPanel, AgentDetailPanel, CommandBar, ApprovalsPanel, MemoryPanel, \u2026\n    CommandCenterPanel,      Michael's control surface (Terminal\/Floor\/Memory\/Activity\/Tasks\/Triggers\/Handbook tabs)\n    ToolWaterfall,           per-agent tool-span waterfall for the observability view\n    TasksKanban,             dependency-aware kanban board (Tasks tab)\n    ThreadsPanel,            hive message conversation viewer (Messages tab)\n    MessageQueueComposer,    park messages for a busy agent\n    scene\/office\/            Pixi office floor: OfficeFloor, Character, Camera, cast, pathfinding, \u2026\n    store\/ \u00b7 hooks\/          zustand store, event loop, PTY parser, typewriter\n    assets\/                  tilesets, maps, character sheets (see ATTRIBUTION.md)\ndocs\/                        `logo.png`, `banner.png`, landing page (GitHub Pages \u2192 munderdiffl.in)\ndocs\/media\/                  `og.png` (social previews) + rendered Remotion clips\nlanding-remotion\/            Remotion project that renders the landing page's \"how it works\" clips\nHIVE.md \u00b7 SPEC.md \u00b7 DESIGN.md   multi-agent \u00b7 terminal\/event \u00b7 visual design\ndocs\/message-queue.md        who may type into an agent's terminal, and when\n<\/code><\/pre>\n<\/div>\n<p dir=\"auto\">The aesthetic is <strong>Animal Crossing \u00d7 Earthbound \u00d7 SNES menu UI<\/strong> \u2014 pixel-snapped, chunky, friendly.<br \/>\n<a href=\"https:\/\/github.com\/chaitanyagiri\/munder-difflin\/blob\/main\/DESIGN.md\"><code>DESIGN.md<\/code><\/a> is canonical; every component derives from its tokens. The Munder Difflin<br \/>\nbrand layers a <strong>Dunder-Mifflin maroon<\/strong> (<code>#6E1423<\/code>) and <strong>gold<\/strong> (<code>#F4D35E<\/code>) on top for logo and<br \/>\nchrome. The 15 avatars are the cast of <em>The Office<\/em>, differentiated by hair\/skin\/shirt recipes.<\/p>\n<p dir=\"auto\">Shipped through <strong>v0.4.3<\/strong> \u2014 ten agent engines with BYOK keys and local LLMs, voice orchestration,<br \/>\nthe hive (memory \u00b7 mailboxes \u00b7 blackboard \u00b7 event log), Command Center with kanban and schedules,<br \/>\na built-in Monaco IDE with git rails, integrations registry + secret broker, Slack-spawned workers,<br \/>\nshareable hires and the Agent Gallery, observability and the circuit breaker, durable persistence,<br \/>\nsession resume, multi-window floors, and working auto-update.<br \/>\nFull history in <a href=\"https:\/\/github.com\/chaitanyagiri\/munder-difflin\/blob\/main\/CHANGELOG.md\"><code>CHANGELOG.md<\/code><\/a>.<\/p>\n<p dir=\"auto\">Next up:<\/p>\n<p dir=\"auto\">Contributions are welcome \u2014 this is an early prototype with a lot of surface area. Start with<br \/>\n<a href=\"https:\/\/github.com\/chaitanyagiri\/munder-difflin\/blob\/main\/CONTRIBUTING.md\"><code>CONTRIBUTING.md<\/code><\/a>. The short version: fork, <code>npm install &amp;&amp; npm run dev<\/code>, keep<br \/>\n<code>npm run typecheck<\/code> green, and <strong>derive any new UI from <a href=\"https:\/\/github.com\/chaitanyagiri\/munder-difflin\/blob\/main\/DESIGN.md\"><code>DESIGN.md<\/code><\/a> tokens<\/strong>. Good<br \/>\nfirst areas: wiring real hook events, the add-agent flow, the config drawer, and cross-platform work.<\/p>\n<p dir=\"auto\">Questions, bugs, or want to show off your office? Join the Discord: <strong><a href=\"https:\/\/discord.gg\/SEDzP5ZPk5\" rel=\"nofollow\">https:\/\/discord.gg\/SEDzP5ZPk5<\/a><\/strong>. Add your Discord handle to a PR and you&#8217;ll get the <code>employee of the month<\/code> role when it merges.<\/p>\n<p dir=\"auto\">Official builds send a <strong>small set of anonymous usage events<\/strong> (app opened, agent spawned, feature<br \/>\nused) \u2014 never prompts, code, file paths, or agent output. The complete event list, the anonymity<br \/>\nguarantees, and the three ways to opt out (Settings toggle, <code>DO_NOT_TRACK<\/code>, or building from<br \/>\nsource \u2014 forks compile with no key and send nothing) are documented in<br \/>\n<a href=\"https:\/\/github.com\/chaitanyagiri\/munder-difflin\/blob\/main\/TELEMETRY.md\"><code>TELEMETRY.md<\/code><\/a>.<\/p>\n<div class=\"markdown-alert markdown-alert-important\" dir=\"auto\">\n<p class=\"markdown-alert-title\" dir=\"auto\"><svg data-component=\"Octicon\" class=\"octicon octicon-report mr-2\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"\/><\/svg>Important<\/p>\n<p dir=\"auto\"><strong>Asset licensing.<\/strong> The bundled pixel art (tilesets, maps, and the base character sheets the<br \/>\nOffice cast is recolored from) comes from <a href=\"https:\/\/limezu.itch.io\/\" rel=\"nofollow\">LimeZu<\/a> via<br \/>\n<a href=\"https:\/\/github.com\/shahar061\/the-office\"><code>shahar061\/the-office<\/code><\/a> under the <strong>LimeZu FREE VERSION<br \/>\nlicense \u2014 non-commercial use only<\/strong>. The recolored sprites inherit that restriction. See<br \/>\n<a href=\"https:\/\/github.com\/chaitanyagiri\/munder-difflin\/blob\/main\/src\/renderer\/src\/assets\/ATTRIBUTION.md\"><code>src\/renderer\/src\/assets\/ATTRIBUTION.md<\/code><\/a>. <strong>To<br \/>\ncommercialize, replace these assets or obtain a paid LimeZu license.<\/strong><\/p>\n<\/div>\n<p dir=\"auto\">The <strong>source code<\/strong> is licensed under the <strong>MIT License<\/strong> \u2014 see <a href=\"https:\/\/github.com\/chaitanyagiri\/munder-difflin\/blob\/main\/LICENSE\"><code>LICENSE<\/code><\/a>. The MIT grant<br \/>\ncovers the code only; the non-commercial asset restriction above is carved out in the <code>LICENSE<\/code> scope<br \/>\nnote. <em>Munder Difflin<\/em> is an affectionate parody and is not affiliated with NBC&#8217;s <em>The Office<\/em> or<br \/>\nDunder Mifflin.<\/p>\n<\/div>\n<p><a href=\"https:\/\/github.com\/chaitanyagiri\/munder-difflin?utm_source=tldrdev\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Agent harness to run an office of your clones Free, open source and performant \u2014 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&#8217;re away and coordinates a [&hellip;]<\/p>\n","protected":false},"author":16,"featured_media":23408,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[143],"tags":[],"class_list":["post-23407","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai"],"_links":{"self":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/posts\/23407","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/comments?post=23407"}],"version-history":[{"count":0,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/posts\/23407\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/media\/23408"}],"wp:attachment":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/media?parent=23407"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/categories?post=23407"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/tags?post=23407"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}