Skip to content

v0.4.6

Latest

Choose a tag to compare

@github-actions github-actions released this 27 Aug 01:00
· 33 commits to main since this release

Munder Difflin v0.4.6

A local hive of Claude Code, Antigravity, Codex, Gemini, Cursor, Grok & Copilot agents that run themselves.
Messaging, routing, and remembering, coordinated by your clone, Michael, who you talk to. Local-first and open source.

munderdiffl.in · see it in action, then grab a build below


What's new in 0.4.6

The release that speaks your language and updates itself. The interface now runs in Chinese and
Arabic, the auto-updater downloads and installs a new build end to end, fonts ship inside the app so
a blocked network never leaves you on a blank window, and the way agent engines are launched is
hardened. Plus the Settings rework, an IME fix for CJK typing, and 16 community pull requests.

  • The interface speaks Chinese and Arabic. Pick zh-CN or Arabic in Settings — every string is
    translated, with nothing falling back to English, and the terminals read right to left. Some
    screens still need their padding and icons mirrored, and that is the next piece of work.
  • Updates install themselves. The badge advances check to available to downloading to downloaded
    on its own, and the button at the end restarts into the new version. This is the release that
    proves that path end to end.
  • Fonts ship inside the app. No Google Fonts fetch on launch, so the app opens at the same speed
    on any network, including one where Google is blocked. The release drop's fonts are bundled too,
    and it can no longer white-screen while a stylesheet loads.
  • Engine command launching is hardened. The name of the CLI an agent launches is validated
    before it is ever resolved against your PATH, so nothing but a plain command name or an absolute
    path reaches a shell.
  • IME typing no longer sends early. Pressing Enter to choose a Chinese or Japanese candidate
    picks the word instead of firing the message with half-typed text.
  • Settings has one Save button. The Connections tab stops repeating itself; REST API, MCP,
    Slack and webhooks each keep their place.
  • The app counts messages you send, not what they say. A single message_sent event closes the
    activation funnel: a count and nothing else, no text, no length, no content of any kind.
    TELEMETRY.md lists it like every other event and the same opt-out applies.
  • The ASK ME card renders markdown. Questions with emphasis, bullets, code, tables and links
    now render instead of showing their raw asterisks.

A note on Pro

v0.5.0 launches with Pro and Teams plans alongside the community version. Community stays free, stays
open, and keeps getting updates. Pro ships with new features and integrations, with more posted
throughout the year, and it stays ahead of Community, for power users who want the full potential
of coding agents and agent harnesses. The Pro roadmap also includes a mobile app. The first 100 people on the
Founders' Wall get a month of Pro free, then 50% off the annual plan.

Thanks

16 community pull requests from 13 contributors landed in this release, one of them (#213)
re-implemented rather than merged. Thank you to @aaroncoville, @abo123v-glitch,
@BUGHUNTER-SACHIN, @djbiz,
@gpechieu, @HsienW,
@HundredBillion, @jhinzzz,
@L422Y, @LavaDMan,
@raifemre, @savvaskoualis and
@Schopenhauer-loves-Hegel, and to everyone who
reviewed a pull request or filed the bug that led to one.

<style> /* Self-contained on purpose. The frame that renders this (0.4.6) strips remote @imports and serves only its two bundled faces — Inter and JetBrains Mono — so every token, font stack and shadow is declared here against those. The look is the old blog's: warm paper, square corners, thick ink borders, hard offset shadows, pastel cards, mono eyebrows. */ :root { --paper: #FFFDF7; --cream: #F5F2E8; --cream-2: #F5ECD7; --white: #FFFFFF; --ink: #1B1B1B; --ink-dim: #57544C; --ink-faint: #8A867A; --yellow: #FFCA54; --sky: #72C2DF; --maroon: #B23A4E; --lilac: #E4DEFB; --peach: #FBDDBE; --mint: #D6F3E1; --sky-soft: #DCEFF7; --line: rgba(27,27,27,0.16); --mono: "JetBrains Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace; --sans: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; } html, body { margin: 0; } body { background: var(--paper); color: var(--ink); font-family: var(--sans); font-size: 14.5px; line-height: 1.5; -webkit-font-smoothing: antialiased; } * { box-sizing: border-box; } .drop { padding: 0; max-width: none; } /* Dotted paper grid behind the hero, same as the blog's header band. */ .hero { position: relative; padding: clamp(26px, 4.5vw, 44px) clamp(22px, 4.5vw, 44px) clamp(20px, 3.4vw, 34px); background: radial-gradient(var(--ink-faint) 1px, transparent 1px) 0 0 / 22px 22px var(--paper); border-bottom: 3px solid var(--ink); } .hero::before { content: ""; position: absolute; inset: 0; pointer-events: none; background: radial-gradient(ellipse at 50% 40%, rgba(255,253,247,0) 25%, var(--paper) 88%); } .hero > * { position: relative; } .eyebrow { font-family: var(--mono); font-size: 11px; font-weight: 500; letter-spacing: .26em; text-transform: uppercase; color: var(--ink-faint); margin: 0 0 12px; } h1 { font-family: var(--mono); font-weight: 700; letter-spacing: -.04em; line-height: 1.06; font-size: clamp(1.6rem, 4.6vw, 2.4rem); margin: 0 0 .45em; text-wrap: balance; } h1 .hl { color: var(--sky); } h1 .mr { color: var(--maroon); } .lede { font-size: clamp(.92rem, 1.8vw, 1.02rem); line-height: 1.55; color: var(--ink-dim); max-width: 62ch; margin: 0; text-wrap: pretty; } .lede b, .card p b, .band b, .thanks p b { color: var(--ink); font-weight: 600; } .body-wrap { padding: clamp(20px, 3.6vw, 34px) clamp(22px, 4.5vw, 44px) clamp(24px, 4vw, 40px); } /* The 0.5.0 announcement: pastel card next to the dark offer band. */ .announce { display: grid; grid-template-columns: 1.2fr 1fr; gap: 16px; margin: 0 0 26px; } .card { background: var(--white); border: 3px solid var(--ink); box-shadow: 6px 6px 0 var(--ink); padding: 14px 16px 13px; border-radius: 0; } .card.lilac { background: var(--lilac); } .card.mint { background: var(--mint); } .card.peach { background: var(--peach); } .card.sky { background: var(--sky-soft); } .card.yellow { background: var(--yellow); } .tag { display: inline-block; font-family: var(--mono); font-size: 9.5px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase; background: var(--ink); color: var(--paper); padding: 4px 8px; } .card h2 { font-family: var(--mono); font-size: 1rem; letter-spacing: -.02em; font-weight: 700; margin: 9px 0 4px; line-height: 1.2; } .card p { font-size: 12.8px; line-height: 1.5; color: var(--ink-dim); margin: 0; } /* The supporters-wall offer: the blog's dark ink band. */ .band { display: flex; align-items: center; gap: 16px; padding: 13px 16px; background: var(--ink) radial-gradient(rgba(255,255,255,.14) 1px, transparent 1px) 0 0 / 14px 14px; color: var(--paper); border: 3px solid var(--ink); box-shadow: 6px 6px 0 var(--ink); } .band .yr { font-family: var(--mono); font-size: 2.4rem; font-weight: 700; letter-spacing: -.05em; line-height: .9; color: var(--yellow); flex-shrink: 0; text-align: center; } .band .yr small { display: block; font-size: 9px; letter-spacing: .2em; font-weight: 500; color: var(--paper); opacity: .7; margin-top: 6px; } .band b { display: block; font-family: var(--mono); font-size: 13px; font-weight: 700; margin-bottom: 3px; color: var(--paper); } .band span { font-size: 12.5px; line-height: 1.45; opacity: .85; } h3 { font-family: var(--mono); font-size: 10.5px; font-weight: 500; letter-spacing: .26em; text-transform: uppercase; color: var(--ink-faint); margin: 22px 0 8px; } /* Feature cards. */ .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; } .grid .card { box-shadow: 4px 4px 0 var(--ink); padding: 12px 14px 11px; } .grid .card h2 { font-size: .92rem; margin: 8px 0 3px; } .grid .card p { font-size: 12.3px; } .rows { list-style: none; padding: 0; margin: 0; } .rows li { display: grid; grid-template-columns: 82px 1fr; gap: 10px; align-items: baseline; padding: 6px 0; border-bottom: 1px solid var(--line); font-size: 12.8px; } .rows i { font-style: normal; font-family: var(--mono); font-size: 9.5px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; color: var(--ink-faint); } .rows b { font-weight: 600; } .rows p { margin: 1px 0 0; color: var(--ink-dim); font-size: 12px; line-height: 1.45; } /* The thank-you wall: cream panel, maroon count, one ink chip per contributor. */ .thanks { margin-top: 26px; padding: 16px 18px 15px; background: var(--cream-2); border: 3px solid var(--ink); box-shadow: 6px 6px 0 var(--ink); } .thanks .head { display: flex; align-items: center; gap: 14px; margin-bottom: 12px; } .thanks .n { font-family: var(--mono); font-size: 2.2rem; font-weight: 700; letter-spacing: -.05em; line-height: .9; color: var(--maroon); text-align: center; flex-shrink: 0; } .thanks .n small { display: block; font-size: 9px; letter-spacing: .2em; color: var(--ink-faint); font-weight: 500; margin-top: 5px; } .thanks p { font-size: 12.8px; line-height: 1.5; color: var(--ink-dim); margin: 0; } .wall { display: flex; flex-wrap: wrap; gap: 8px; } .wall a { display: inline-block; font-family: var(--mono); font-size: 11.5px; font-weight: 600; color: var(--ink); text-decoration: none; background: var(--white); border: 2px solid var(--ink); box-shadow: 3px 3px 0 var(--ink); padding: 5px 10px; border-radius: 0; transition: transform .12s, box-shadow .12s; } .wall a:hover { transform: translate(-1px, -1px); box-shadow: 4px 4px 0 var(--ink); color: var(--maroon); } .foot { font-size: 12px; color: var(--ink-dim); text-align: center; margin: 18px 0 0; } .foot b { color: var(--ink); font-weight: 600; } @media (max-width: 620px) { .announce, .grid { grid-template-columns: 1fr; } } </style>

Munder Difflin · v0.4.6

Speaks your language. Updates itself.

The interface now runs in Chinese and Arabic, the updater installs a new build end to end, and the fonts ship inside the app so a blocked network never leaves you on a blank screen. Plus the Settings rework, an IME fix for CJK typing, and 16 community pull requests.

<div class="announce">
  <div class="card lilac">
    <span class="tag">Coming soon</span>
    <h2>Pro &amp; Teams launch with v0.5.0.</h2>
    <p><b>Community stays free, stays open, and keeps getting updates.</b> Pro ships with new
    features and integrations, with more posted throughout the year, and it stays ahead of
    Community &mdash; for power users who want the full potential of coding agents and agent
    harnesses. A Teams plan launches alongside it, and the Pro roadmap also includes a mobile
    app.</p>
  </div>
  <div class="band">
    <div class="yr">50<small>% OFF</small></div>
    <div><b>Join the supporters wall</b>
    <span>One month of Munder Difflin Pro free, then 50% off the annual plan &mdash; for the
    first 100 people on the wall.</span></div>
  </div>
</div>

<h3>What's new in 0.4.6</h3>
<div class="grid">
  <div class="card mint">
    <span class="tag">i18n</span>
    <h2>Chinese and Arabic.</h2>
    <p>Pick a language in Settings. Every string is translated and the terminals read right to
    left. Some screens still need their padding and icons mirrored &mdash; that is the next
    piece of work.</p>
  </div>
  <div class="card sky">
    <span class="tag">Updates</span>
    <h2>Updates install themselves.</h2>
    <p>The badge moves from check to available to downloading to downloaded on its own, and the
    button at the end restarts you into the new version. This is the release that proves that
    path end to end.</p>
  </div>
  <div class="card peach">
    <span class="tag">Fonts</span>
    <h2>Fonts ship inside the app.</h2>
    <p>No Google Fonts fetch on launch, so the app opens at the same speed on any network,
    including one where Google is blocked &mdash; and this page can no longer white-screen
    while a stylesheet loads.</p>
  </div>
  <div class="card">
    <span class="tag">Security</span>
    <h2>Hardened command launching.</h2>
    <p>The name of the CLI an agent launches is validated before it is ever resolved against
    your PATH, so nothing but a plain command name or an absolute path reaches a shell.</p>
  </div>
</div>

<h3>Also new</h3>
<ul class="rows">
  <li><i>IME</i><div><b>Enter picks the candidate, not sends the message</b>
    <p>Choosing a Chinese or Japanese candidate no longer fires half-typed text.</p></div></li>
  <li><i>Settings</i><div><b>One Save button</b>
    <p>The Connections tab stops repeating itself. REST API, MCP, Slack and webhooks each keep
    their place.</p></div></li>
  <li><i>Telemetry</i><div><b>Counts messages, never content</b>
    <p>A single message_sent event closes the activation funnel. A count and nothing else.</p></div></li>
  <li><i>Ask me</i><div><b>Questions render markdown</b>
    <p>Emphasis, bullets, code, tables and links render instead of raw asterisks.</p></div></li>
</ul>

<div class="thanks">
  <div class="head">
    <div class="n">16<small>PULL REQUESTS</small></div>
    <p><b>Thank you to every contributor.</b> 16 community pull requests from 13 contributors
    landed in this release. If you opened one, reviewed one, or filed the bug that led to one,
    this version has your fingerprints on it.</p>
  </div>
  <div class="wall">
    <a href="https://github.com/aaroncoville" target="_blank" rel="noopener">@aaroncoville</a>
    <a href="https://github.com/abo123v-glitch" target="_blank" rel="noopener">@abo123v-glitch</a>
    <a href="https://github.com/BUGHUNTER-SACHIN" target="_blank" rel="noopener">@BUGHUNTER-SACHIN</a>
    <a href="https://github.com/djbiz" target="_blank" rel="noopener">@djbiz</a>
    <a href="https://github.com/gpechieu" target="_blank" rel="noopener">@gpechieu</a>
    <a href="https://github.com/HsienW" target="_blank" rel="noopener">@HsienW</a>
    <a href="https://github.com/HundredBillion" target="_blank" rel="noopener">@HundredBillion</a>
    <a href="https://github.com/jhinzzz" target="_blank" rel="noopener">@jhinzzz</a>
    <a href="https://github.com/L422Y" target="_blank" rel="noopener">@L422Y</a>
    <a href="https://github.com/LavaDMan" target="_blank" rel="noopener">@LavaDMan</a>
    <a href="https://github.com/raifemre" target="_blank" rel="noopener">@raifemre</a>
    <a href="https://github.com/savvaskoualis" target="_blank" rel="noopener">@savvaskoualis</a>
    <a href="https://github.com/Schopenhauer-loves-Hegel" target="_blank" rel="noopener">@Schopenhauer-loves-Hegel</a>
  </div>
</div>

<p class="foot"><b>Restart to update</b> closes the app and every running agent, so finish or
pause what they are doing first.</p>

Still new in 0.4.5

The release that fixes the things you trusted and were quietly wrong. Cost reporting was off
by more than half after a restart, semantic memory never worked on Apple Silicon, and agents
could not talk to each other reliably. All three are fixed. Plus weekday scheduling, clickable
paths everywhere, one editor instead of two, and 23 community pull requests.

  • Costs are reported right. The telemetry counter reset on every app restart while the
    session id stayed the same, so the floor under reported spend by a wide margin. It is now folded
    from the ledger, with a separate session figure kept alongside.
  • Semantic memory works on Apple Silicon. CoreML overflowed the quantized embedding graph,
    every vector came back NaN, and chroma rejected every upsert. Embeddings are pinned to CPU
    on macOS.
  • Agents talk to each other reliably. An inbox wake watchdog, no more stale nudges, mail to
    a missing inbox is bounced and logged instead of dropped, a capped steer queue, atomic
    webhook dispatch, and PROTOCOL.md refreshes on boot.
  • Workers are reliable to hire. Spawn, teardown, floor cards, and engine availability are
    all checked before a hire is committed.
  • The renderer runs inside Chromium's sandbox.
  • Windows agents quit when the app does.
  • Restart to update no longer gets stuck when a running agent makes the app refuse to quit.
  • Triggers run on weekdays at a time of day, not just on an interval, and they are DST safe.
  • Focus mode survives a restart and you can edit an agent from inside it.
  • Every path in terminal output is clickable. Markdown previews, source opens in the editor,
    images and unknown types reveal in Finder or Explorer.
  • One editor. The fullscreen file overlay is gone, everything opens in the IDE, and the git
    rail is collapsed by default.
  • Updating is one click. The title-bar badge downloads the build for your machine and tells
    you how to install it, it says latest once a check confirms you are current, and the first
    run after an update opens that release's page.
  • Settings opens with a card carrying your version, your plan, and a way back to these notes.
  • Terminals follow the window theme, Gemini CLI and Cursor Agent join the engine list, and
    Michael hires on his own terms with editable agent names.

Still new in 0.4.4 · Windows joins the floor

If you use Windows, 0.4.4 is the release that made the app work. Agents could never message
each other there. They started, looked completely healthy, and quietly ignored one another
forever. It also fixed the first five minutes: setup could not be finished, and on a brand new
install the parts that carry messages between agents never started until you quit and reopened
the app.

  • Windows agents talk to each other. The hive protocol reaches an agent as a multi-line
    command-line argument, and cmd.exe cut it at the first newline, taking the block that names
    inbox/ and outbox/ with it. Spawns now hand the real interpreter an argument array.
  • Setup finishes. Accepting the suggested folder used to fail outright, and the folder box
    was empty even though the text above promised a suggestion.
  • A fresh install works immediately. Messages between agents, live status on the cards, and
    Restart & Continue all stayed dead until you restarted the app, and nothing said so.
  • Skills and Prerequisites. Every skill your agents can use, 227 more to browse and install,
    and one page in Settings that says which supporting tools you have and which you do not.
  • Release drops. A release can carry its own designed page instead of a version number in
    the corner. You are reading one.
  • Dark mode rebuilt. The one-pixel borders that draw every control measured under 2:1
    against their background, so the whole app read as flat grey shapes. Re-tuned and measured
    rather than picked by eye.

Still new in 0.4.3 — Michael is the logo

The mark is a face now. Munder Difflin has always been an office you watch people work in,
and the icon was a pair of script initials on a gradient. It's Michael — your clone — drawn in
the app's own pixel art, on the brand yellow, looking straight back at you.

  • One mark, everywhere. The dock icon on macOS, Windows and Linux, the site favicon and
    header, the in-app toolbar, and the README all render the same portrait. No variant is a
    redrawing of another.
  • The SVG is the source of truth. The mark is authored as pure vector — every pixel of the
    sprite is a rect, with no fonts, no gradients and no filters — and every raster in build/
    and docs/ is generated from it by tools/make-logo.cjs.
    The old icon depended on the Lobster webfont being installed to render correctly.
  • Icons are native at every size. A real multi-resolution .icns (16→1024, with the macOS
    drop shadow) and a .ico carrying six sizes, plus a 32px favicon and a 180px apple-touch-icon,
    so nothing is a downscale of a 512px image any more.
  • Brighter call-to-action buttons. The download button took its fill from the same token as
    accent text, which has to stay dark enough to read on a white page — so on the light theme
    it came out brown. Fills now have their own token and start at what used to be the hover colour.

Note

Appearance only. No functional change in this release: the update carries the new icon into
your dock, and nothing else moves.


Still new in 0.4.2 — Anonymous usage stats, done in the open

Munder Difflin now sends a small set of anonymous usage events (app opened, agent spawned,
feature used) so we can tell whether features are actually used. It is built the way an
open-source project should build it:

  • TELEMETRY.md is the
    complete contract.
    Every event and property is listed there, and the code enforces that list
    as a hard allowlist — anything not in the table cannot be sent. No prompts, no transcripts, no
    file paths, no repo names, no identifiers. Events are PostHog anonymous events (no person
    profile, no identity), keyed by a random UUID you can delete.
  • Opt-out, three ways. Uncheck it during onboarding, flip Settings → General → Anonymous
    usage stats
    , or set the standard DO_NOT_TRACK env var.
  • Forks send nothing. The analytics key is injected only in release CI — building from
    source produces a build where the analytics module is a complete no-op.

Still new in 0.4.1 — The app says what the site says

Michael is your clone. The website has been describing Munder Difflin as a clone of you that
works around the clock — the app still called it a "GOD agent." Now they match.

  • Your clone, not the GOD agent. Michael is described as your clone throughout onboarding,
    and his card on the floor carries a BOSS tag — he's the boss of the agents, you're still
    the boss of him.
  • Onboarding was rewritten. It opens on what you actually get ("a clone of you, working
    24/7") instead of a feature list, and the engine card no longer advertises three engines when
    ten ship — Claude Code, Codex, Grok, Kimi, Antigravity, Qwen, OpenCode, Crush, pi and Copilot
    are all named.

Note

This release changes wording only. The god agent id, the hive folder layout, and message
routing are untouched, so existing hives, memory, and running agents carry over exactly as they
are. Nothing to migrate.


Note

Auto-update carries you here from v0.3.7 or later. If you are still on v0.3.5 or v0.3.6,
those builds shipped the broken updater and need one manual install — grab the download below,
once.


Previously

  • 0.4.0the brand grew up: one yellow "MD" mark across the dock icon, in-app logo, site
    favicon, and munderdiffl.in; the landing page rebuilt around real screenshots and a live
    pixel-floor sim; pricing reframed around Private Cloud and Private Network.
  • 0.3.9 — Settings → General answers "am I up to date?" directly, and removes 0.3.8's
    usage-limit guard that never released held agents.
  • 0.3.8 — memory condensation works for the first time; a Triggers hub; one compaction
    schedule instead of two; a readable commit history.
  • 0.3.7 — auto-update actually runs: a CommonJS/ESM import bug meant the native updater never
    fired in any packaged build since v0.3.4, and the failure was swallowed by a catch.
  • 0.3.6a machine with nothing on it can run agents: Node and npm install themselves
    (verified against the official SHASUMS256.txt), hooks stopped dying with exit 127, ~/dev/foo
    paths resolve, and the office floor rebuilds itself after losing its GPU context.
  • 0.3.5 — a send now escape hatch for a paused message queue, and a compact Command
    Center header.
  • 0.3.4 — talk mode that knows the floor, markdown previews, the IDE git time-machine
    (history + branch compare), redesigned Settings, xAI Grok and Kimi Code, and a single
    delivery gate for every automatic writer. Community work by
    @gts-47 and @qschmick.
  • 0.3.3 — the built-in Monaco IDE, and GitHub Copilot CLI as the first community-contributed
    engine (@anxkhn).
  • 0.3.2 — Realtime Michael: a voice channel to the GOD orchestrator.
  • 0.3.1 — three more engines: OpenCode, Crush, and pi.dev.

Full history in the CHANGELOG.


Thanks

This release carries community work. All 23 of these landed in v0.4.5:

#157 @gpechieu inherited Claude Code session markers are stripped from an agent's PTY env
#158 @gpechieu semantic memory works on Apple Silicon again: embeddings are pinned to CPU on macOS
#159 @gpechieu reliable spawn, teardown and floor cards for the workers Michael hires
#165 @rajpreetcodes a ~ in the harness home folder resolves, so setup cannot die on ENOENT
#171 @KrushanPatel CONTRIBUTING.md matches the platforms the app actually supports
#175 @rekcilyssup a main-process watchdog wakes an idle worker sitting on an undrained inbox
#176 @FenjuFu Gemini CLI joins the engine list
#177 @TTAWDTT each agent's live context-window occupancy shows in the roster
#178 @gpechieu a god-hired worker gets a floor card, and it archives when the worker dies
#179 @kdahal7 statAbs expands ~, so a path resolves the same way on every platform
#181 @TTAWDTT webhook dispatch goes through an atomic add, so a stale ledger cannot overwrite it
#184 @TTAWDTT the per-agent steer queue is capped, which bounds memory on a stalled agent
#185 @hyperstream-pro mail to an id with no inbox is bounced and logged instead of dropped
#186 @BUGHUNTER-SACHIN tests cover the Notifications and Stop idle-detection branches
#187 @hyperstream-pro a stale inbox nudge no longer wakes an agent against an inbox that is already empty
#190 @swarnendu19 agent names can be edited after spin-up
#199 @amey-op the Antigravity queue no longer wedges for 30 seconds
#203 @lifelmy the Crush config env points at the agent's own directory
#210 @chaitanyagiri the art licence claims are true again, Modern Interiors is bought
#214 @pontusm Windows agent processes quit when the app does
#219 @chaitanyagiri engine availability is checked before Michael's engine is committed
#226 @chaitanyagiri the floor reports lifetime spend, not spend since the last app restart
#227 @scy73 the renderer runs inside Chromium's sandbox

Four of the fixes above are @gpechieu's and three are
@TTAWDTT's. Thank you, and thank you to everyone who reviewed a
pull request or filed the bug that led to one.

⤓ Downloads

Latest builds for every platform. The macOS build is universal, one DMG that runs on both
Apple Silicon and Intel.

🍎 macOS

Build File
Universal (Apple Silicon + Intel) Munder-Difflin-0.4.6-mac-universal.dmg

🪟 Windows

Build File
Installer (x64), recommended Munder-Difflin-0.4.6-win-x64-setup.exe
Portable (x64, no install) Munder-Difflin-0.4.6-win-x64-portable.exe

🐧 Linux

Build File
AppImage (x86_64) Munder-Difflin-0.4.6-linux-x86_64.AppImage

📦 Source

Source code (zip) ·
Source code (tar.gz)

Verify your download: SHA256SUMS.txt — then shasum -a 256 -c SHA256SUMS.txt (macOS/Linux) or Get-FileHash (Windows).

The filenames above carry a version number, so they only resolve while this is the
latest release. If a link 404s you are reading an old release page — grab the current
build from the releases page,
which is always right.


First launch

  • macOS — the build is signed with a Developer ID (hardened runtime). If macOS
    still shows an "unidentified developer" warning on first open, right-click the app →
    OpenOpen once. After that, the first time agents touch a folder you'll get a
    single macOS privacy prompt for Documents/Desktop/Downloads — allow it once and the
    grant sticks (it covers the claude agents the app spawns), because the grant is bound
    to the app's stable signature.
  • Windows — not code-signed yet; SmartScreen may show "Windows protected your PC" →
    More infoRun anyway.
  • Linux — make the AppImage executable: chmod +x Munder-Difflin-*.AppImage, then run it.

Requirements

  • macOS 12+, Windows 10/11, or a modern Linux desktop
  • Claude Code installed and on your PATH (and/or the Antigravity agy or OpenAI codex CLI for those providers)
  • A Claude Code subscription (Munder Difflin drives your existing claude CLI — it doesn't replace it)
  • For Realtime Michael (voice): your own OpenAI key with Realtime API access — without it the Talk button stays disabled

🛠 Build from source

git clone https://github.com/chaitanyagiri/munder-difflin.git
cd munder-difflin
npm install        # rebuilds node-pty for Electron
npm run dev        # launches the app with hot reload

Node 18+ and a C/C++ toolchain are required (Xcode CLT on macOS, Build Tools on Windows).
To produce installers yourself: npm run dist (current OS), or dist:mac / dist:win / dist:linux.


What's inside

  • The simulation — every agent is a real claude (or agy / codex / local-provider) pseudo-terminal, visualized as an avatar on a watchable office floor (node-pty · xterm.js · Pixi.js).
  • Talk to Michael — a realtime voice channel to the GOD orchestrator that reads the hive and acts behind spoken echo-back confirmation, BYOK and main-only.
  • Selectable engines + per-hire capabilities — each hire (and Michael himself) runs on a pluggable engine, with its own consented skills + MCP catalog.
  • MemPalace — a markdown-first, semantic memory layer the whole office shares; cross-session recall in ~12ms.
  • GOD orchestrator + hive — one agent you talk to routes work to specialists and stays autonomous, escalating only critical items (spend, destructive ops, scope) to you natively, through human-in-the-loop prompts. It can also spawn an ephemeral worker straight from Slack and tear it down safely.
  • Plugs into your setup — your subscription, settings, skills, and MCP servers, plus an integrations registry with a write-only secret broker; /remote-control reaches the whole floor from your phone.

Full notes in the CHANGELOG.


Links

Website ·
Repo ·
Issues ·
Contribute ·
Become a patron

MIT-licensed. An affectionate parody — not affiliated with NBC's The Office or Dunder Mifflin.