what this is built on

Acknowledgements

swe-mux runs coding agents somebody else wrote, in terminals somebody else's emulator draws, over a network somebody else's mesh built. The inventory below is generated from the same files that produce THIRD-PARTY-NOTICES.md, so it cannot drift from what actually ships; the prose above it is hand-written and names only projects whose influence is visible in the repository.

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.

What ships alongside it

Three facts about the shipped artifact that a license list alone does not carry. Each is lifted from THIRD-PARTY-NOTICES.md, which is itself generated from the resolved dependency closure and checked against the built desktop bundle.

Modified redistributions
  • @xterm/xterm and @xterm/addon-webgl (MIT). Patched at install time by frontend/scripts/patch-xterm-webgl.mjs and frontend/scripts/patch-xterm-requestmode.mjs. The shipped copies are therefore modified versions, not upstream releases.
Binary redistributions without an OSI license
  • Intel OpenMP runtime (libiomp5md.dll) (Intel Simplified Software License). Vendored inside the ctranslate2 wheel and copied into _internal/ctranslate2/. Redistributed under Intel's terms, which permit binary redistribution as part of an application.
Weak copyleft, and how to replace it
  • num2words 0.5.14 (LGPL). LGPL-2.1. Required by misaki.en, which imports it at module scope to speak numbers in the Kokoro G2P; there is no misaki English path without it. Same weak-copyleft reasoning and same relink treatment as pystray. NOT part of the 2026-08-17 audit baseline - it entered with the espeak-free TTS replacement, which is why the gate exists.
  • pystray 0.19.5 (LGPLv3). LGPL-3.0. The Windows tray icon (desktop.py). Weak copyleft: it reaches swe-mux only through its public API and imposes nothing on swe-mux's own license. Ships as replaceable source under _internal/pystray/ so the LGPL relink condition is satisfied.

Both ship as plain, replaceable source inside the desktop bundle rather than compiled into its archive, which is the LGPL relink condition. No GPL or AGPL code is redistributed, and none resolves into the dependency closure.

Models

Downloaded on demand into the data directory and never bundled. Each is pinned by immutable revision and verified per file by SHA-256 before it loads.

ModelLicenseUpstream
Kokoro-82M (ONNX int8 weights + voices)Apache-2.0hexgrad/Kokoro-82M
Whisper (faster-whisper CTranslate2 conversions)MITopenai/whisper
Silero VADMITsnakers4/silero-vad
en_core_web_sm (spaCy English model)MITexplosion/spacy-models

The dependency closure

Every package swe-mux resolves and redistributes, with the license each one declares. Generated from packaging/third_party_licenses.json, which packaging/license_audit.py writes from the two lockfiles and the test suite reconciles against them. The declared license is what the package says about itself; where that has been measured to disagree with what the package actually ships, the notices file records the disagreement rather than this table.

Python 106 packages
PackageVersionLicense
addict2.4.0UNKNOWN
aiohappyeyeballs2.7.1PSF-2.0
aiohttp3.14.1Apache-2.0 AND MIT
aiosignal1.4.0Apache 2.0
annotated-doc0.0.5MIT
annotated-types0.8.0MIT
anyio4.14.1MIT
attrs26.1.0MIT
blis1.3.3BSD
bottle0.13.4MIT
catalogue2.0.10MIT
certifi2026.6.17MPL-2.0
cffi2.1.0MIT-0
charset-normalizer3.4.9MIT
click8.4.2BSD-3-Clause
cloudpathlib0.24.0MIT License
clr-loader0.3.1MIT
colorama0.4.6BSD License
confection1.3.3MIT
cryptography49.0.0Apache-2.0 OR BSD-3-Clause
ctranslate24.8.1MIT
cymem2.0.13MIT
docopt0.6.2MIT
en-core-web-sm3.8.0MIT
faster-whisper1.2.1MIT
filelock3.31.1MIT
flatbuffers25.12.19Apache 2.0
frozenlist1.8.0Apache-2.0
fsspec2026.6.0BSD-3-Clause
h110.16.0MIT
hf-xet1.5.2Apache-2.0
http-ece1.2.1MIT
httpcore1.0.9BSD-3-Clause
httpcore22.12.0BSD-3-Clause
httpx0.28.1BSD-3-Clause
httpx22.12.0BSD-3-Clause
huggingface-hub1.24.0Apache-2.0
idna3.18BSD-3-Clause
jinja23.1.6BSD License
jsonschema4.26.0MIT
jsonschema-specifications2025.9.1MIT
markdown-it-py4.2.0MIT License
markupsafe3.0.3BSD-3-Clause
mcp2.0.0MIT
mcp-types2.0.0MIT
mdurl0.1.2MIT License
misaki0.9.4Apache License
multidict6.7.1Apache License 2.0
murmurhash1.0.15MIT
num2words0.5.14LGPL
numpy2.5.1BSD-3-Clause AND 0BSD AND MIT AND Zlib AND CC0-1.0
onnxruntime1.27.0MIT License
opentelemetry-api1.44.0Apache-2.0
packaging26.2Apache-2.0 OR BSD-2-Clause
pillow12.3.0MIT-CMU
preshed3.0.13MIT
propcache0.5.2Apache-2.0
protobuf7.35.13-Clause BSD License
proxy-tools0.1.0MIT
psutil7.2.2BSD-3-Clause
py-vapid1.9.4MPL-2.0
pycparser3.0BSD-3-Clause
pydantic2.13.4MIT
pydantic-core2.46.4MIT
pygments2.20.0BSD-2-Clause
pyjwt2.13.0MIT
pystray0.19.5LGPLv3
python-multipart0.0.32Apache-2.0
pythonnet3.1.0MIT
pywebpush2.3.0MPL-2.0
pywebview6.2.1BSD 3-Clause License
pywin32312PSF
pywinpty3.0.5MIT License
pyyaml6.0.3MIT
referencing0.37.0MIT
regex2026.7.19Apache-2.0 AND CNRI-Python
requests2.34.2Apache-2.0
rich15.0.0MIT
rpds-py2026.6.3MIT
setuptools83.0.0MIT
shellingham1.5.4ISC License
six1.17.0MIT
smart-open8.0.1MIT License
spacy3.8.15MIT
spacy-legacy3.0.12MIT
spacy-loggers1.0.5MIT
srsly2.5.3MIT
sse-starlette3.4.8BSD-3-Clause
starlette1.6.0BSD-3-Clause
thinc8.3.13MIT
tokenizers0.23.1Apache Software License
tqdm4.69.0MPL-2.0 AND MIT
tree-sitter0.26.0MIT License
tree-sitter-language-pack1.14.3MIT
truststore0.10.4MIT
typer0.27.1MIT
typing-extensions4.16.0PSF-2.0
typing-inspection0.4.4MIT
tzdata2026.3Apache-2.0
urllib32.7.0MIT
uvicorn0.52.4BSD-3-Clause
wasabi1.1.3MIT
watchfiles1.2.0MIT
weasel1.0.0MIT
wrapt2.3.0BSD-2-Clause
yarl1.24.2Apache-2.0
Frontend 96 packages
PackageVersionLicense
@codemirror/autocomplete6.20.3MIT
@codemirror/commands6.11.0MIT
@codemirror/lang-cpp6.0.3MIT
@codemirror/lang-css6.3.1MIT
@codemirror/lang-go6.0.1MIT
@codemirror/lang-html6.4.12MIT
@codemirror/lang-java6.0.2MIT
@codemirror/lang-javascript6.2.5MIT
@codemirror/lang-json6.0.2MIT
@codemirror/lang-markdown6.5.2MIT
@codemirror/lang-php6.0.2MIT
@codemirror/lang-python6.2.1MIT
@codemirror/lang-rust6.0.2MIT
@codemirror/lang-sql6.10.0MIT
@codemirror/lang-xml6.1.0MIT
@codemirror/lang-yaml6.1.3MIT
@codemirror/language6.12.4MIT
@codemirror/legacy-modes6.5.3MIT
@codemirror/lint6.9.7MIT
@codemirror/search6.7.1MIT
@codemirror/state6.7.1MIT
@codemirror/view6.43.9MIT
@continuity-editor/editor0.2.36MIT
@lezer/common1.5.2MIT
@lezer/cpp1.1.6MIT
@lezer/css1.3.6MIT
@lezer/go1.0.1MIT
@lezer/highlight1.2.3MIT
@lezer/html1.3.13MIT
@lezer/java1.1.3MIT
@lezer/javascript1.5.4MIT
@lezer/json1.0.3MIT
@lezer/lr1.4.10MIT
@lezer/markdown1.7.2MIT
@lezer/php1.0.5MIT
@lezer/python1.1.19MIT
@lezer/rust1.0.2MIT
@lezer/xml1.0.6MIT
@lezer/yaml1.0.4MIT
@marijn/find-cluster-break1.0.3MIT
@protobufjs/aspromise1.1.2BSD-3-Clause
@protobufjs/base641.1.2BSD-3-Clause
@protobufjs/codegen2.0.5BSD-3-Clause
@protobufjs/eventemitter1.1.1BSD-3-Clause
@protobufjs/fetch1.1.1BSD-3-Clause
@protobufjs/float1.0.2BSD-3-Clause
@protobufjs/inquire1.1.2BSD-3-Clause
@protobufjs/path1.1.2BSD-3-Clause
@protobufjs/pool1.1.0BSD-3-Clause
@protobufjs/utf81.1.2BSD-3-Clause
@ricky0123/vad-web0.0.24ISC
@ricky0123/vad-web/node_modules/long4.0.0Apache-2.0
@ricky0123/vad-web/node_modules/onnxruntime-common1.14.0MIT
@ricky0123/vad-web/node_modules/onnxruntime-web1.14.0MIT
@types/long4.0.2MIT
@types/node26.2.0MIT
@xterm/addon-clipboard0.2.0MIT
@xterm/addon-fit0.11.0MIT
@xterm/addon-search0.16.0MIT
@xterm/addon-unicode110.9.0MIT
@xterm/addon-web-links0.12.0MIT
@xterm/addon-webgl0.19.0MIT
@xterm/xterm6.0.0MIT
classnames2.5.1MIT
crelt1.0.7MIT
diff-match-patch1.0.5Apache-2.0
events3.3.0MIT
flatbuffers1.12.0SEE LICENSE IN LICENSE.txt
gitdiff-parser0.3.1MIT
graphology0.26.0MIT
graphology-layout-forceatlas20.10.1MIT
graphology-types0.24.8MIT
graphology-utils2.5.2MIT
guid-typescript1.0.9ISC
js-base643.8.1BSD-3-Clause
js-tokens4.0.0MIT
lodash4.18.1MIT
long5.3.2Apache-2.0
loose-envify1.4.0MIT
onnx-proto4.0.4MIT
onnx-proto/node_modules/long4.0.0Apache-2.0
onnx-proto/node_modules/protobufjs6.11.6BSD-3-Clause
onnxruntime-common1.20.1MIT
onnxruntime-web1.20.1MIT
platform1.3.6MIT
preact10.29.7MIT
protobufjs7.6.5BSD-3-Clause
qrcode-generator1.5.2MIT
react19.2.8MIT
react-diff-view3.3.3MIT
shallow-equal3.1.0MIT
sigma3.0.3MIT
style-mod4.1.3MIT
undici-types8.3.0MIT
w3c-keyname2.2.8MIT
warning4.0.3MIT