← Projects

project

wmux

wmux is an open-source terminal multiplexer for Windows that shows you what your Claude Code agents are actually doing. I have nine merged pull requests in it and three issue reports that turned into fixes, spread across releases from 0.27 onward.

View source
source
amirlehmam/wmux
built with
TypeScript · Electron · React · xterm.js · node-pty · Vitest · Windows
wmux in use

Everything below is my work, in the order it shipped. The full list is on my pull requests.

Orchestration runs that counted forever (issue #99, PR #101, shipped in 0.27.0)

In degraded mode the orchestration hooks marked finished agents, waves and runs as completed, a word that does not exist in the app's status vocabulary. The app counts exited for agents and complete for waves and runs, so the cockpit sat at 0/N forever even though every agent had finished. I fixed both the shell hook and the JSON tool to write the canonical vocabulary, and added end-to-end coverage typed against the OrchAgentStatus / OrchWaveStatus / OrchRunStatus unions so the bash and TypeScript layers cannot drift apart silently again.

Dead pollers (issue #100, shipped in 0.27.0)

GitPoller and PrPoller were constructed and torn down on every launch but never started, and their updates would have been dropped by the renderer anyway because they carried an empty surface id. Reporting it took about 170 lines of code out of the tree that looked load-bearing and was not.

A CLI that was 250x slower to return than it needed to be (PR #109, shipped in 0.28.0)

Every wmux command lingered around five seconds waiting out a timeout that never needed to fire. The reply came back over the named pipe immediately; nothing resolved on it. wmux ping went from 4.99s to 0.02s.

system.identify reporting a version that was never true (PR #110, shipped in 0.28.0)

The pipe's identify method returned a hardcoded 0.5.0, roughly 22 releases stale, so anything integrating over the pipe was gating on a number that had stopped being accurate a long time ago.

Configurable dev-server ports (PR #115, shipped in 0.33.0)

wmux points its browser panel at a dev server when it sees one start, but the port set was hardcoded, so Streamlit on 8501 or Astro on 4321 got nothing. Ports are now declared in ~/.wmux/config.toml and merged with the built-in defaults, and auto-navigation can be switched off entirely. The same change fixed the selection logic that picked the wrong server when several were listening.

The test suite on the only platform wmux ships for (PR #130, shipped in 0.40.0)

Five orchestrator tests failed on a clean checkout on native Windows, because a Windows path handed to bash lost its separators to escape parsing. wmux is Windows-only, so the suite was red for anybody who cloned it and ran it the intended way.

A sidebar drag at 60 relayouts a second (PR #131, shipped in 0.40.0)

Dragging the sidebar edge fired a width update per mouse event, around 60 a second, and each one relaid out every terminal and made ConPTY re-emit its whole screen. Coalescing to one update per frame made the drag smooth without changing what it does.

Browser panes that split on every command (issue #295, PR #296, merged October 2026)

wmux browser <verb> --surface <id> treated the named browser as a terminal caller, so every command split a fresh browser pane for it. An agent aimed at the newest pane added another pane on each call. A browser surface named this way is now driven directly, and it stays available for a terminal to adopt.

A wait that silently ignored its timeout (PR #228, merged September 2026)

When wmux browser wait <ref> <ms> went through the agent-browser engine, the per-call timeout had nowhere to go and was dropped without a word. It now warns that the timeout was not applied, and the web and CDP waits are unchanged.

Link opening and the webview navigation policy (PR #250, merged September 2026)

Two fixes on the link-opening path. Terminal link activations are now deduplicated by event identity, and the rule for sending a page out to the system browser lives in one module that both the new-window and in-page navigation handlers share, so they cannot drift apart. I could not reproduce the duplicate-tab report on Windows 11 with Firefox, so the dedupe is a defensive fix rather than a confirmed root-cause fix.