wmux

openwong2kim·openwong2kim.wmux

Windows terminal multiplexer with MCP server for AI agents

wmux is a Windows terminal multiplexer built for AI coding agents. Run Claude Code, Codex, and Gemini CLI side by side with split terminals, browser automation, and MCP integration. Features include session persistence, dangerous command detection, real-time token cost tracking, and cross-workspace terminal control via MCP tools.

winget install --id openwong2kim.wmux --exact --source winget

Latest 3.58.0·September 19, 2026

Release Notes

Added

• The main window now remembers its size, position and maximized (or macOS fullscreen) state across launches, including the relaunch after an auto-update. A saved rectangle that no longer fits any connected display — monitor unplugged, laptop undocked, resolution changed — is discarded in favour of the default size rather than restoring the window off-screen.

• Remote agents now appear in Fleet View and the titlebar vitals chip, with the same host origin badge the sidebar roster shows. They stay out of the deck's Fleet roster, which lists only agents this desktop can drive directly.

• Desktop notifications for remote agents. A desktop attached to a remote host now raises a notification when a remote agent finishes a turn or starts waiting for input, instead of only showing it on the pane. The main process holds one /api/events subscription per attached host and routes its events through the same notification path as local ones, so the global settings, per-category mutes, idle suppression and dedup all apply unchanged; the host label prefixes the title. Reconnects replay nothing, so a dropped connection never produces a burst of banners.

• The lock-screen Live Activity keeps up even after the iOS app is closed. The approval counter on the lock screen used to update only while the wmux app was alive in the background; once iOS or you closed it, the numbers froze. The daemon now drives the activity itself over APNs:it starts one when something needs your approval, updates it as approvals arrive or are answered, and ends it when the last one is done. A burst of changes goes out as one update, and updates carry only counts — how many approvals are pending, how many panes are blocked and for how long, and how many agents are running — plus the daemon's name. The push relay can read those counts; it still cannot read any notification text. A phone paired to an older daemon keeps updating the activity locally, as before. Requires the matching iOS app update. (#1411)

• Resume chip for remote-terminal tabs. A tab mirroring a session on a paired host now offers the same resume affordance a local tab has:the conversation id, the exact --resume line, and a click that types it into the remote pane. Continuing an agent session on another machine used to mean finding the id on that machine and retyping it by hand. The host publishes only what the chip needs — agent, conversation id, whether the recorded working directory still matches, and the recorded permission mode — and never the path to its own transcript file. The "never type into a live agent" gate travels with it, so the chip stays hidden while the host says the agent is still running, and the command is typed without a trailing Enter, exactly as locally. The chip is not offered on a host serving without --allow-input, which refuses every write anyway; a host running an older build simply shows no chip.

• A truncated snapshot can now be continued instead of re-read. When browser_snapshot or browser_smart_snapshot has more page than fits one result, it ends with a continuation token — pass it back as cursor and the next lines of the same capture come back. No second read of the page, so nothing moves under you and the ref numbers stay the ones you were already holding; before this, the only ways past the cut were a narrower selector/q or a bigger budget, and both re-captured the page and re-minted every ref. Windows never split a line, and paging on until (end of capture) is how you know you have read it all. A capture is retired by the next snapshot of that surface, by a navigation, or after five idle minutes, and a cursor into one that is gone says cursor_expired: rather than quietly serving a stale page. (#1413)

• Every browser tool that acts on a page now says whether its action reached it. A click, type, fill, key press, hover, drag, select, scroll, navigation, upload, download or dialog handler ends its result with two machine-readable lines:effect_state: none | committed | unknown, plus an error_code from a small fixed set when it failed. Before, a timeout said only "Timeout 30000ms exceeded", which never distinguished an action that never went out from one that may already have gone through — so an agent either retried and double-submitted a form, or gave up on a flow that had actually worked. none now means nothing was dispatched and a retry is free, committed means the input reached the page, and unknown means a dispatch went out whose outcome cannot be read from here — and an unknown result also says, in words, to inspect the page before retrying. Read-only tools (snapshots, screenshots, extraction, console, network, waits) carry no trailer, and every existing message is unchanged:the two lines are added after it. (#1414)

• browser_snapshot can see menus that only exist on hover. A nav item whose submenu the site reveals on :hover — a mega-menu, an avatar or account menu, a "more" (…) button — used to show up as a nav item with nothing behind it, and the honest reading of that was "this site has no such menu". Such an item's link is now marked has-submenu, worked out from the page's own stylesheets and ARIA without touching the page, and a note at the top of the snapshot says how many were found. Pass probeHover:true and wmux also hovers the top few and lists what each one reveals — [hover first:Docs | API | Pricing] — costing up to ~5 s and moving the pointer, which is why it is opt-in. The pointer is put back afterwards and the menu is checked to have closed again; if one stayed open, the line says so. How long a hover costs is up to the page and the browser, so if the probe runs out of time before reaching every marked trigger it says which ones it has no items for, rather than leaving them bare for you to read as empty menus. Nothing is ever marked on a guess:a form field, a disabled or inert control, and anything behind a modal overlay are all left alone; so is a hover rule that merely nudges an icon that was already on screen, and so is a nav item that shares its sibling's styling but has no submenu of its own. (#1415)

• The browser can ask you to finish a step. Login walls, CAPTCHAs, OTP fields, payment confirmations and consent screens used to end a browser flow outright — the agent had no way to say "I need you for this one thing", so it looped on the page or gave up, and you never found out you were one keystroke away from the rest of the run. Agents now have browser_request_help:a compact Done / Cancel band appears on the browser pane, the pane comes into view, a matching row lands in the Fleet inbox with a jump to the page, and the agent waits. Press Done when you are through and it picks up exactly where it stopped; press Cancel and it is told not to retry that step. The agent can also hand over a condition ("resume once the URL contains /dashboard") and the wait ends by itself, so you do not have to come back to the window to unblock it. Requests carry a deadline wmux enforces, so nothing waits on you forever, and one browser pane can only ever hold one open request. (#1416)

• Live Chrome:the agent writes only to its own tabs. On the Live Chrome attach an agent still reads your whole browser — that is what binding a workspace to it consents to — but it can now only navigate, click, type into, evaluate JavaScript in, set cookies on, resize or close the tabs wmux opened for that workspace, plus tabs you explicitly lend it. Anything else is refused before it touches the page, with an error that names the tab and how to ask for it. Ownership is exact:one workspace's tabs are not another's to drive (#1417)

• Lending a tab. browser_tabs action:"borrow" surfaceId:"…" asks you through the ordinary wmux permission prompt — "Agent in workspace X wants to control tab "…" (origin)" — with a 60-second deadline where no answer means no. action:"return" hands it back, and every grant is dropped when Chrome disconnects, when you change that workspace's Chrome profile, or when wmux quits (#1417)

• A new liveWriteScope setting in browser-backend.json, default "agent". "all" restores the previous behaviour, in which an agent may write to every tab in your browser. It has no Settings toggle on purpose:it is the larger grant of the two (#1417)

Changed

• browser_tabs list now labels every row on Live Chrome as agent (wmux opened it for this workspace), borrowed (you lent it) or user, and takes scope:"agent" / scope:"user" to filter. The default still lists every tab (#1417)

• Agent tabs on Live Chrome now open in their own window where Chrome allows it, so the agent's work is easier to watch and move as a unit. Grouping is best-effort — Chrome offers no way to move an existing tab between windows — and a tab that lands elsewhere is still that workspace's tab (#1417)

• docs/browser-backends.md no longer says Live Chrome cannot be scoped; it describes what reads and writes each cover, how lending works, and why "all" is the bigger grant (#1417)

Fixed

• The sidebar's "Show pane coordinates" setting is now translated in every supported language instead of falling back to English outside en/pl.

• Browser screenshots no longer catch animations mid-frame. Every Playwright-lane capture — the page shot, each downscale rung and element captures — freezes CSS animations and transitions for the duration of the shot, so two screenshots of an unchanged page match instead of differing by whatever a spinner or a fade-in was doing at that instant. The builtin webview lane has no equivalent and is unchanged. (#1410)

• browser_scroll no longer reports scrolling an element that is no longer there. On the builtin backend it as

Installer type: exe

x64—2C4E4B1FC6900848ED62BDDD645827FA37628D068634CD118B5789E4F714726F

Details

Homepage
https://github.com/openwong2kim/wmux
License
MIT
Publisher
openwong2kim
Support
https://github.com/openwong2kim/wmux/issues
Moniker
wmux

Tags

ai-agentdeveloper-toolselectronmcpmultiplexerterminalwindows

Older versions (48)

3.55.0
x64—EA41F2AE8E8DF8460CE43426F83CB869BDC3CF1B05A257B03922AE6188ABA7DC
3.53.0
x64—5015D60570040B5BD48771E7757801EACB3F83360A7D63F8F94B67B3329DBA59
3.52.0
x64—AB0997D65283E2570B6B7661C7316C1ADAC5262955AC13C233DF013772FCEB7B
3.51.0
x64—AB1F31CC3CD264765AB24AA095A8B70FC22C5D1D4FD3F774F3F654422BF64B20
3.50.0
x64—01F2FBE491FAF1EE01AE95C175EB439F21106FC9506120B0200EED9D4669E559
3.49.0
x64—ECBD6C29FDBFE8F208A22BE19400945958667CA9DB5634A46B76AE811E70ADD3
3.48.1
x64—640A91A344401164BDF0F32408DDF8ECE2753889AA8AFA6781894CEA823B5839
3.46.0
x64—BB182B87C63403D68E8C61F306CC9AD1D969848E724DFCCE08DA3421A4D22E57
3.45.0
x64—856E298AB3670EF6FD22210C89A7FE388E9C5357F937263EC59B3B8AE90FAC09
3.44.0
x64—46AEB9DA8008B60D43D988A37F0334C6898EA1FE13AF2C0378D4F3AB7A494243
3.38.6
x64—62C383A514BB340FA9EFE45E7AC335289AB1D9E5778AF87A7BF6245CFB043DB3
3.38.5
x64—51134B99076908CE581DB57EED7F9A5341299101FC533DF01ECEB666A4B2D618
3.38.4
x64—71372F2E5EDEADC5797B9D2B30839D06474237951701E801FBABBD92205C9D4E
3.38.3
x64—8DBB79D09EA17B0E831AD743F9D382F167D759B34B2D8E3191F5F5FDC629FBE8
3.38.2
x64—24CE6F1907E5D838A9550EB769C69B135B5524E14E79726E2F4F7CB2C27E9B6C
3.38.0
x64—36C0CBD4CFC043108566AFC722BCF5DCFEB8BA1ED4D8B1B677725E0851D5C8AF
3.37.2
x64—5BD4971DB7558455BA91B788B080052C5DCDA1CEF84CF2F4A7261E8CCCF2820C
3.37.1
x64—9AE88F7C28FF92849626B9A6DF6B09159A035BDB1DE69BCE65EBF38D2C009496
3.36.0
x64—313855E2177F34ACD89BE669D85E738518F53F4FA86D20A8AB28352CFD80E546
3.35.1
x64—12047A62D52AED8AF835B8D483728D56FF1052223E742E5B649718EEE2C146CD
3.35.0
x64—6647694DC55D6112E01C99CC85BF88AE0D46E9514552DBD9E3A87EE24D8F3904
3.34.0
x64—4446DB4641867EDF6B985A1995309A38F0D73F353AC0A6AADEFBAD5D52F46067
3.33.0
x64—AFE8AA860D452C141D8C2A567BE5EAD85B63E4C652AFABA047233811DDF110E2
3.32.0
x64—1AD5EB64B719245BFCB579689ECBBFA9008481DDA3391CB897D180BC024575D4
3.31.0
x64—56FFEA0CAA490B182CCA81E39C9C09AF5D7A72FB60E99C136051074241108E09
3.30.0
x64—3EF85A3E654114B94137E6F4654AB5C6022791FBB1DC0C56D9C525932CD9163C
3.29.0
x64—2790D0A0639B3FB7C6E6975DB64CEAD9CEB1C66560C0B19FC0D851E19F9F8CD3
3.28.1
x64—BAAC32A06F89A1430B33ACDD86139D226E0327F4EE80EB3D6F41E06684DDEE34
3.28.0
x64—FEE68471B3E29C74249874D25591EA640C01589DAAFE77BA154677CE0223A872
3.27.0
x64—6BBB4C0FF57E163C364624D8C9AA7A58C6FFA18FF49079C9DFE0D0EBF3E0DE9F
3.26.0
x64—B81D484642849F2ECC623E1BEFAA8A81AC890073E018FC38181DE1D1393C0237
3.25.0
x64—84F5DB90A1B54C73C23D5E417A0B87253BDCBF21C1071E435B16304C0AA3E7A8
3.24.1
x64—C2AE072C8E329039C36F3B0776DCE3A4E1041383FE9FEBA65B602A72F966D7FF
3.24.0
x64—5122700C8DDB337A9EBED9BD5F20A490228B0C57F13AD05DD10836D32DDE3C76
3.23.0
x64—B3C54E50B746C83F5CCBF7374468223836E5BDDB8699BB171AC04CB9AFF95C39
2.9.1
x64—F38766F770A1D263EC4496243C53D38F75920A0FA9E082C734B66E338F811651
2.9.0
x64—2167075C281E6B5BE1C87307F52784D39D9510C2494CB560261E08FE012ADBD1
2.8.4
x64—FF5B367428554F2F990A36F175CFE8340B648671AF18BE99E4CF7713273E29F4
2.8.3
x64—55DE51DED063D6C06D1CB90BAE93DD259B789937DBA6A094A9ED3E343640F9DC
2.8.2
x64—DE01FF674A694B9A6344F465D3485307E705EEAEA7A9F028B8ACA789D2F4CA99
2.8.1
x64—ED591E573D2C927F4978EC04E63CE195160017F551362C408DCE75798B24E1D0
2.8.0
x64—559A3103D9D72B6AB5432D662CF3EEB56988B9F682802902BE929031C622DB4B
2.7.4
x64—E6491AAB3BD10FE995ADC7F56DD4746C36DD2609A8707E6480457C87154C4C40
2.7.3
x64—B306F8D26EB1E2CC655E751344F58A2CE38296A036E2CC095498AD428D773A66
2.7.1
x64—4EE7F5519ECF08B87ACCC9114526AB00C39600EDDBDE29F08CF7F0A41E6CDF15
2.7.0
x64user7C00306D9F62F0D08087BECB9EA2D6D16F3CE9A875DD9BCE2286907299EE2F03
2.6.0
x64userFEF363A188A714AB6B0611E125BFEE218872FA45B1A01F1A96E257364548A4DE
2.5.0
x64user407E957240AFC068B11C8F5CBE92ACCA56EB4BB4BA5BB6534DE94A3A95B303C6