What shaped it
These are the projects the design leans on, rather than the ones
it merely installs. Each is named because you can find it in the repository.
- xterm.jsThe terminal. Every claim on the front page about running a real TUI, with real Unicode widths and real bracketed paste, is a claim about xterm.js and its addons doing the drawing. swe-mux ships two patched copies of it, recorded below, because two defects had to be fixed before agent panes rendered correctly.
- The agent CLIsClaude Code, Codex CLI, and the others the harness registry knows. swe-mux does not install, wrap, proxy, or replace any of them: it runs the ones you already have, on the subscription you already pay for, in a pseudoterminal they cannot tell apart from your own. The whole design assumes they will keep changing without asking.
- TailscaleHow the phone reaches the machine. A tailnet plus Serve on HTTPS is the entire remote-access story, which is why there is no relay, no account, and no port forwarding to explain. Nothing here would be reasonable to ship without it.
- tree-sitterThe code-structure graph is a tree-sitter parse, re-run on the exact bytes of each write. It is what lets blast radius, dead code, and test gaps be deterministic answers instead of a model's opinion.
- Preact and ViteThe browser client, and the reason a full rebuild of it is seconds rather than a coffee break. The whole UI, desktop and phone, is one build.
- CodeMirrorUnder the Markdown note editor, its language modes, and the diff surfaces. The editor is built on top of it rather than being a textarea with a preview pane bolted on.
- aiohttpThe daemon, its WebSockets, and the reverse proxy that puts a dev server on your phone without exposing a port.
- faster-whisper, CTranslate2, ONNX Runtime, Silero VAD, Kokoro, and misakiVoice, entirely on your machine. Speech is detected, transcribed, and synthesized locally; no audio leaves the host on any default path.
- PyInstaller, pywebview, and pystrayThe frozen Windows desktop application: a WebView2 window, a tray supervisor, and a bundle that can rebuild and redeploy itself while live sessions keep running.
- uvInstall, resolution, and the dependency override that keeps a GPL-linked transitive package out of the closure. The license gate reads what uv resolved, not what anything declares.
- pytest, Playwright, Ruff, and mypyThe verification gate, which is a build-time dependency and ships in nothing. It runs across the host's cores, treats a new warning as a failure, and typechecks each platform's implementation on every host.
- SQLiteEvery durable thing swe-mux knows, in one file you can open with any tool on your machine and read without asking permission.
Conventions rather than code, and equally load-bearing:
Keep a Changelog and
Semantic Versioning shape the
changelog and the release policy;
the Developer Certificate of Origin
is how contributions arrive, deliberately instead of a CLA; and
SPDX identifiers are what make the license
gate a check rather than a reading exercise.
Research the control plane is built on
Three results the design documents cite by name, because the
control plane's shape is an argument and these are the parts of it that are not
ours.
- AgentLens (2026). Of 1,136 passing SWE-bench runs, only a fifth had a clean trace. A passing test is not evidence that the work was done well, which is why the record here keys on what an agent did rather than on what it reported.
- MAST (2025). A failure taxonomy over 1,642 multi-agent traces. It is the reason the detectors look for specific named failure shapes instead of scoring runs.
- Olsen and Goodrich, supervisory control. Fan-out as neglect time divided by interaction time, plus one. That is the metric behind "how many agents are you actually sustainable at", and it is why the interrupt budget is a hard number rather than a preference.