Install
swe-mux is on PyPI. The wheel is py3-none-any - pure Python, no compiled extensions - and it already carries the built frontend, so installing needs no checkout and no Node.
Before you start
- Python 3.12 or newer. Check with
python --version. - An installer.
uvis the recommended one,pipxworks the same way, andpipworks with a caveat covered below. - At least one agent CLI, already installed and logged in. swe-mux does not install, manage, authenticate, or proxy them. If you have none yet, install Claude Code, Codex CLI, or opencode first and log into it there.
- Node is not required. Node 22.6 or newer is needed only if you are building swe-mux from a checkout.
Install it
Every method below writes the same three commands: mux (the CLI), muxd (the daemon), and swe-mux (the desktop window and tray). Run exactly one.
# Recommended. Isolated environment, all three commands on PATH globally. uv tool install swe-mux # On Windows, take the desktop extra: it is what adds the window and the tray icon. uv tool install "swe-mux[desktop]" # The same isolated, on-PATH install, without uv. pipx install swe-mux # NOT the same act. Installs into whichever environment is currently active and # puts nothing on PATH globally, so `mux` works only inside that environment. pip install swe-mux
Two things no install does
- No shortcut, no Start Menu entryWheels have no post-install hook and pip runs no install-time code, so this is structural rather than a step somebody forgot. swe-mux starts from a terminal. On Windows you can create the shortcuts afterwards with
mux install-shortcut, which is idempotent and has a--remove. - No agent CLI is installed or logged inThat stays your own arrangement with each vendor. swe-mux finds the CLIs already on your machine and runs them under your own subscription.
The desktop extra, on Windows
Without [desktop] you still get a swe-mux command, and it fails on a missing import rather than opening a window. The extra wants the WebView2 Runtime, which recent Windows builds already have.
It is Windows-only by declaration: pystray and pywebview both carry a win32 platform marker, so on Linux and macOS the extra resolves to nothing and the daemon plus a browser is the whole product.
Start it
muxd # the daemon # then open http://127.0.0.1:8765 swe-mux # Windows, with the desktop extra: the same thing in a window
It worked when mux doctor exits 0. It is read-only and reports on the daemon, the supervisor, the frontend build, the agent CLIs it can detect, the tailnet listener, and the background loops. It is the command that tells installed from working.
If nothing is on your PATH afterwards
This is the ordinary outcome of pip install, and its WARNING: The scripts ... are installed in '...' which is not on PATH scrolls past unread.
# The daemon, needing no PATH setup at all: `python -m swe_mux` is exactly `muxd`.
python -m swe_mux
# Where the three executables went (a `Scripts` directory on Windows).
python -c "import sysconfig; print(sysconfig.get_path('scripts'))"
# Every file this install wrote, those three included.
pip show -f swe-muxPlatform support, stated exactly
| Host | What is proven | What is not |
|---|---|---|
| Windows 10 or 11 | The proving platform. The full gate runs there in CI, including the real ConPTY integration tests and the browser renderer suite, and it is the only host the desktop app ships on. | - |
| Linux | The daemon plus a browser, on a required CI leg. A daemon starts, serves a real terminal, and exits cleanly there on every push. | There is no Linux desktop app, by design. |
| macOS | The wheel installs and the CLI runs, checked on every push. The suite runs there too. | That CI leg is still allowed to fail, so treat macOS as unproven and expect to debug. |
The honest boundary across all three: no CI job on any host starts a daemon from the published wheel. Installing and running the CLI is proven everywhere. That is not the same claim as working end to end.
Upgrading, and from a checkout
uv tool upgrade swe-mux # or: pipx upgrade swe-mux # Run from a checkout instead - what you want if you are changing swe-mux itself. git clone https://github.com/jatoran/swe-mux cd swe-mux uv sync --extra desktop npm --prefix frontend ci # only the source flow needs Node npm --prefix frontend run build # a fresh clone serves no UI until this runs once uv run --extra desktop swe-mux
The frontend bundle is git-ignored build output, so a fresh clone serves a blank page rather than an error until that build has run once. Troubleshooting covers the symptom.
On-device speech is a separate extra
Local text-to-speech and local dictation are --extra voice-local, roughly 400 MB of wheels and model machinery. The Windows desktop bundle always carries it. Without it swe-mux speaks through the operating system's voice engine and dictates through the browser, which is a working configuration rather than a degraded one.