v0.40.0 — wmux asks first
Four community PRs and four issues. The theme this time is wmux being honest about what it does to your machine.
wmux now asks before touching ~/.claude (#132)
wmux integrated with Claude Code and OpenCode by editing files in your home directory — a block in CLAUDE.md and AGENTS.md, four hooks in settings.json, an MCP redirect, and the orchestrator plugin — silently, on every launch. Deleting any of it was futile, because the next launch put it straight back.
The functions were written to be idempotent, and that is exactly what made them unrefusable: idempotence and consent pull in opposite directions, and there was nowhere for a "no" to live.
- First launch asks, naming the exact files. Enable / Not now / Never. "Not now" really is not-now — you get asked again rather than quietly counted as a yes.
- Every write gained an inverse. Declining removes what earlier versions wrote instead of merely stopping future writes. Removal is conservative: your own hooks survive, a
chrome-devtoolsentry you re-pointed survives, an unmarked opencode plugin survives, and aCLAUDE.mdwith your own content keeps all of it. - Settings → General → Agent integration has per-feature toggles — instructions, status hooks, orchestrator plugin, browser panel for MCP — each showing the paths it touches. Turning one off cleans up after itself.
- A corrupt consent record falls back to asking, never to granting.
Thanks to @Modestas for the report, the diagnosis, and the fork with a fix already in it.
A diff pane on a non-git folder no longer freezes the app (#133, PR #135)
Opening a diff pane in a directory that is not a git repo — your home folder, say, which is the default cwd for a new workspace — pinned the main process at 100% of a core, froze the window, and killed the named pipe. A ~3s synchronous full-tree scan ran against a 2s poll, so work queued faster than it drained, permanently.
@capad-xyz filed it with a CPU profile, a measured before/after table, and then the PR: polls can no longer overlap, the snapshot path is fully async, and files are stat-ed before being read (removing ~26 MB of re-reads per poll in the steady state). Concurrent scans of the same directory now coalesce.
Saved sessions keep each terminal's own directory (#134)
A terminal carries two directories — where it was told to start, and where the shell last reported it. Only the first was persisted, and for an ordinary tab it is undefined, so every restored terminal fell back to one workspace-level value written by whichever pane printed a prompt last. Worktrees on D:\ came back on C:\.
Each tab's live directory is now frozen into the saved session, per tab, for both named saves and the 30-second auto-save.
The old icon is gone (#137)
src/renderer/assets/logo.png was a copy of the app icon that the 0.37.0 rebrand never updated, so wmux showed its own previous logo in the titlebar. The copy was the bug, so the copy is deleted — the titlebar now imports the shared SVG (which also drops 452 KB from the bundle).
The window icon also prefers the multi-size .ico over a single 512px PNG, so Windows uses the purpose-drawn 16/24/32px entries instead of downsampling, and the installer refreshes the shell icon cache — which is what kept pinned shortcuts on the old artwork across an in-place update.
If a pinned taskbar button still shows the old icon after updating, unpin and re-pin it once.
Everything else
- Full renderer i18n (PR #136, @simplyBarbe) — every remaining hardcoded string translated into Spanish, French, Italian and Chinese: Settings, Tutorial, Sidebar, CopyMode, the Diff pane, notifications. Includes a real bug fix: markdown file errors always carried a truthy English string, so the translated fallback was structurally unreachable.
- Sidebar drag coalesced to one update per frame (PR #131, @ConnorRobinson13) — a drag was firing ~60 width updates a second, each one relayouting every terminal and making ConPTY re-emit its screen.
- The orchestrator test suite runs on Windows again (PR #130, @ConnorRobinson13) — five tests had been failing on a clean checkout of the only platform wmux ships for, because a Windows path handed to
bashlost its separators to escape parsing. agent-statefollow-up (#128) — a dead PTY no longer leaves a pane rendering as "Needs you" for a process that has exited.
624 tests passing on native Windows, up from 598.
Install
Grab wmux-0.40.0-setup.exe (installer, auto-updates) or wmux-0.40.0-win-x64.zip (portable). Windows may flag the download as unrecognised — wmux is not code-signed by a chain-trusted certificate yet (#71). For the zip, right-click → Properties → Unblock, or Get-ChildItem -Recurse | Unblock-File.
Full Changelog: v0.39.1...v0.40.0