| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| latest-linux.yml | 2026-08-18 | 406 Bytes | |
| latest-mac.yml | 2026-08-18 | 542 Bytes | |
| latest.yml | 2026-08-18 | 373 Bytes | |
| Munder-Difflin-0.4.4-linux-x86_64.AppImage | 2026-08-18 | 172.7 MB | |
| Munder-Difflin-0.4.4-mac-universal.dmg | 2026-08-18 | 241.6 MB | |
| Munder-Difflin-0.4.4-mac-universal.dmg.blockmap | 2026-08-18 | 253.7 kB | |
| Munder-Difflin-0.4.4-mac-universal.zip | 2026-08-18 | 232.7 MB | |
| Munder-Difflin-0.4.4-mac-universal.zip.blockmap | 2026-08-18 | 242.3 kB | |
| Munder-Difflin-0.4.4-win-x64-portable.exe | 2026-08-18 | 131.5 MB | |
| Munder-Difflin-0.4.4-win-x64-setup.exe | 2026-08-18 | 131.8 MB | |
| Munder-Difflin-0.4.4-win-x64-setup.exe.blockmap | 2026-08-18 | 136.9 kB | |
| SHA256SUMS.txt | 2026-08-18 | 532 Bytes | |
| README.md | 2026-08-18 | 32.1 kB | |
| v0.4.4 source code.tar.gz | 2026-08-18 | 28.8 MB | |
| v0.4.4 source code.zip | 2026-08-18 | 30.0 MB | |
| Totals: 15 Items | 969.7 MB | 0 | |
Munder Difflin v0.4.4
A local hive of Claude Code, Antigravity, Codex, 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.4
If you use Windows, this is the release that makes the app work. Agents could never message each other there — they started, looked completely healthy, and quietly ignored one another forever. That's fixed.
It's also the release that fixes 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
- Your agents can talk to each other. This never worked before. If you tried the app on Windows and your team just sat there, that was this bug — not you.
- Setup no longer runs off the edge of the screen.
The first five minutes
- Setup finishes. Accepting the suggested folder used to fail outright, and the folder box was empty even though the text above promised a suggestion. Both fixed.
- It tells you what's missing straight away, instead of walking you through four steps and then sending you back to the first one.
- A fresh install works immediately. Messages between agents, live status on the cards, and "Restart & Continue" all used to stay dead until you restarted the app. Nothing said so.
New things
- Skills — see every skill your agents can use, browse 227 more, and install or remove them in a click.
- Prerequisites — one page in Settings that says which supporting tools you have, which you don't, and what each one is for. A button asks Michael to set up whatever is missing.
- Release notes you'll actually read — like this one. Updates can now bring a designed page instead of a version number in the corner.
- A card at the top of Settings with your version, plan, and a way to reopen these notes.
Dark mode
Rebuilt. Every button, box and input is drawn with a one-pixel border, and in dark mode those borders were effectively invisible — so the whole app read as flat grey shapes. The colours are re-tuned and checked for readability rather than picked by eye. Backgrounds are softer, text is a warm off-white instead of glaring white, and the selected tab is legible again.
Everything else
Copy from a terminal comes back clean, with accents and dashes intact. Dictation pastes what you just said. Images and screenshots open in the IDE. Michael sits first on the dock again and it's obvious which agent you're looking at. Task cards stop going missing. Idle agents stop being told to compact every hour. Grok 4.6 is selectable. The office stops drawing itself when nobody's looking at it.
For the nerds — what actually happened, in detail
**Windows: two separate bugs, one symptom.** The hive protocol reaches an agent as a command-line argument: multi-line, paren-heavy, ~6.1k characters. A `.cmd` cannot be handed to `CreateProcess`, so any non-`.exe` target was spawned as `cmd.exe /d /s /c "<one pre-escaped string>"`. cmd.exe treats CR/LF as a statement separator before quoting is considered, so the argument was truncated at its first newline — taking the block that names `inbox/` and `outbox/` with it. Escaping cannot fix this: cmd.exe has no backslash escape, every `"` toggles quote state, and no escape exists for a newline. The fix decodes the npm shim to its interpreter and script and spawns that with an argv **array**, so node-pty's MSDN/CRT escaping hands the whole prompt to `CreateProcess` (ceiling 32767, not 8191). The first fix still missed OpenCode. `opencode-ai`'s `bin` is `./bin/opencode.exe` — a compiled binary, not a JS script — so npm writes an *interpreter-less* shim (`"%dp0%\..\opencode-ai\bin\opencode.exe" %*`). The resolver only modelled "interpreter + script" and returned null, falling straight back to the truncating path for **every** Windows OpenCode install. Diagnosed on macOS by generating the exact shim with npm's own `cmd-shim` package; the resolver now handles direct-executable shims, and the previously silent fallback logs which target it could not decode. **First-run bootstrap.** `bootstrapHiveServices()` runs once at app-ready and opens with `if (!hive.enabled()) return` — and a fresh install has `harnessHome: null` at that moment. Onboarding then sets it through `config:update`, which did not re-bootstrap. The message router (`hive.startRouter()`, the poll loop draining `outbox/` → `inbox/`), the hook server, the telemetry collector and the mission scheduler all stayed dead for the entire session. `changeHome` had always handled this by relaunching; onboarding does not relaunch. It now bootstraps on the `null → set` transition. A second source also records the live session id, so "Restart & Continue" has a resume key even when a hook never lands. **Onboarding.** The folder field read `window.process.env.HOME`, which is always `undefined` under `contextIsolation: true` with only `cth` bridged — so the "suggested" default could never appear. It now suggests `~/HarnessAgents` literally, which `normalizeHiveHome`/`expandTilde` already expand at both the config-write boundary and `ensureHarnessHome`'s mkdir. The overlay also centres with `margin: auto` rather than `align-items: center`, because a centred flex item that overflows is clipped at the top and unreachable by scrolling. **Dark mode.** Text always measured fine (11–14:1). `ink-300` measured **1.73–2.09:1** — and it is the structural token, used 187 times, 93 of those as `inset 0 0 0 1px`. Below ~3:1 a one-pixel line is not perceivable. It is now 3.4–4.0:1, the ground sits at luminance 0.009–0.020 rather than near-black, and text is 0.71 rather than 0.84. The selected Command Center tab was painting `ink-900` (near-white in dark) on a light accent fill at 1.55–1.87:1; a new `--cth-on-accent` token is dark in both themes and takes it to 7.0–8.5:1. The xterm palette re-states these values because xterm takes literals, so it moved with them. **Release drops.** A release body may carry an authored HTML page between ` <style> html, body { height: 100%; } body { overflow: hidden; } .stage { height: 100%; } .pg { position: absolute; opacity: 0; pointer-events: none; } .page { display: none; height: 100%; flex-direction: column; padding: clamp(24px, 4vw, 46px); } #pg1:checked ~ .stage .p1, #pg2:checked ~ .stage .p2, #pg3:checked ~ .stage .p3, #pg4:checked ~ .stage .p4, #pg5:checked ~ .stage .p5, #pg6:checked ~ .stage .p6 { display: flex; animation: rise .34s cubic-bezier(.2,.7,.3,1) both; } @keyframes rise { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } } .content { flex: 1; min-height: 0; overflow-y: auto; } .center { display: flex; flex-direction: column; justify-content: center; } .nav { flex-shrink: 0; display: flex; align-items: center; gap: 12px; padding-top: 16px; margin-top: 12px; border-top: 1px solid var(--line); } .dots { display: flex; gap: 7px; flex: 1; } .dot { width: 7px; height: 7px; border-radius: 999px; background: rgba(20,19,26,.16); cursor: pointer; transition: background .2s, transform .2s; } .dot:hover { background: rgba(20,19,26,.34); } .dot.on { background: var(--accent); transform: scale(1.25); } .btn { cursor: pointer; border-radius: 999px; font-size: 13.5px; font-weight: 600; padding: 9px 18px; border: 1px solid var(--line); color: var(--ink-soft); user-select: none; transition: background .16s, color .16s; } .btn:hover { background: rgba(20,19,26,.04); } .btn.primary { background: var(--ink); border-color: var(--ink); color: #FBFAF8; } .btn.primary:hover { background: [#2]a2733; } .kicker { font-size: 11.5px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase; color: var(--accent); margin: 0 0 14px; } h1 { font-size: clamp(1.8rem, 4.4vw, 2.7rem); } .lede { margin-bottom: 1.4em; } .big { font-size: clamp(3.2rem, 10vw, 5.4rem); line-height: .92; letter-spacing: -.045em; font-weight: 700; margin: 0 0 .1em; background: linear-gradient(135deg, #14131A 20%, #1B7F5A 115%); -webkit-background-clip: text; background-clip: text; color: transparent; } .stat { display: flex; gap: 24px; flex-wrap: wrap; margin-top: 24px; padding-top: 18px; border-top: 1px solid var(--line); } .stat b { display: block; font-size: 1.5rem; letter-spacing: -.03em; font-weight: 680; } .stat span { font-size: 12px; color: var(--ink-soft); } .tag { display: inline-block; font-size: 10.5px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: var(--accent); background: rgba(27,127,90,.09); padding: 4px 9px; border-radius: 999px; } .quote { border-left: 2px solid var(--accent); padding-left: 15px; margin: 18px 0 0; color: var(--ink-soft); font-size: 14.5px; } .rows { list-style: none; padding: 0; margin: 0; } .rows li { display: grid; grid-template-columns: 96px 1fr; gap: 12px; align-items: baseline; padding: 7px 0; border-bottom: 1px solid var(--line); font-size: 13.5px; } .rows i { font-style: normal; font-size: 10px; font-weight: 700; letter-spacing: .09em; text-transform: uppercase; color: var(--ink-soft); } .rows b { font-weight: 620; } .rows p { margin: 1px 0 0; color: var(--ink-soft); font-size: 12.5px; } .card { border: 1px solid var(--line); border-radius: var(--radius); padding: 16px 18px; } .card h2 { margin: 10px 0 .2em; font-size: 1.15rem; } .card p { margin: 0; color: var(--ink-soft); font-size: 13.5px; } .split { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; align-items: start; } /* 16:10, not 4:3 — the taller ratio pushed the second row past the fold, and a drop page that scrolls cuts a sentence in half at the boundary. */ .split .placeholder { aspect-ratio: 16 / 10; } </style> <input class="pg" type="radio" name="pg" id="pg1" checked> <input class="pg" type="radio" name="pg" id="pg2"> <input class="pg" type="radio" name="pg" id="pg3"> <input class="pg" type="radio" name="pg" id="pg4"> <input class="pg" type="radio" name="pg" id="pg5"> <input class="pg" type="radio" name="pg" id="pg6">Munder Difflin
0.4.4
The release where Windows finally joined the floor — and the first run stopped quietly failing.
The headline
Agents can talk to each other on Windows.
Roughly half of all downloads run on Windows, where agent-to-agent messaging had never worked at all.
Every agent booted, rendered, and looked completely healthy. None of them had been told they had an inbox.
Any CLI that is not an .exe was launched through cmd.exe, which cuts a multi-line argument at its first newline — taking the protocol block with it. Spawns now launch the real interpreter with an argument array, so the whole prompt survives.
The first five minutes
Setup finishes. The floor wakes up.
Four separate bugs sat on the very first thing a new user does.
- WizardThe suggested folder works
Accepting ~/HarnessAgents stored a literal tilde and died on ENOENT. It now resolves to a real path — and the field actually suggests it.
- WizardIt tells you at step one
An empty folder used to walk you through all four steps before bouncing you back. The panel no longer overflows a short screen either.
- HiveServices start at setup, not next launch
On a fresh install the message router, hooks and telemetry stayed dead until you restarted — so mail never moved and agents never reported.
- AgentsRestart & Continue has something to resume
The live session id is recorded from a second source, so continuing works even when a hook never lands.
New
Four things that were not here before.
Every skill your agents can use
What is installed across Claude Code, OpenCode and Codex — and a browsable catalog of 227 more, with search, filters, install and uninstall.
Whether you actually have the tools
MemPalace, uv, git and every agent engine, with live status and where each one sits on disk. One button asks Michael to fill in the gaps.
This page
Update notes used to be three clipped bullets in the corner. A release can now carry its own designed page, and you are reading the first one.
Rebuilt for reading
Every control border measured under 2:1 against its background, so the edges defining them were invisible. Re-tuned and measured, not eyeballed.
Everything else
The rest of the list.
- TerminalCopy comes back clean
The quote rail is stripped and terminals run in UTF-8, so an em dash survives the trip to another app.
- TerminalDictation pastes what you just said
- IDEImages open as images
PNG, SVG and embedded screenshots render. The title names the agent.
- AgentsRestart & Continue revives a dead agent
- AgentsGrok 4.6 in the model picker
- AgentsOpenCode runs the model you actually have
- BoardTask cards stop going missing
- HiveA wake nudge survives an odd message id
- HiveCompact fires once, not every hour
- HiveThe cost ledger is out of your git history
- OfficeThe floor stops rendering when nobody is looking
- LayoutMichael sits first on the dock again
One last thing
Thank you for running this on your own machine.
Every agent here starts on your hardware, in your folders, under your keys. Nothing about that changes.
If it has been useful, a star is the entire marketing budget. The button is just below this page.