what leaves your machine, and what does not

Privacy

swe-mux is a program that runs on your own computer. There is no swe-mux account, no swe-mux backend, and nothing your install uploads anywhere. Everything it records is written to a directory on your own disk and stays there. The one thing it fetches is a static file from this website, described below.

That makes most of a privacy policy inapplicable, so this page says the two things that are actually true: exactly which requests the software makes, and what this website sees. Last revised 2026-09-06.

The one request the software makes on its own

Once a day the daemon fetches https://swemux.dev/version.json to find out whether a newer release exists. If that does not answer, it falls back to the public GitHub Releases API for this repository. It downloads nothing either way, and it shows a dismissible banner if a newer version is out.

  • The request carries no query string, no custom header, no cookie, and no identifier of the machine or the install. It is a plain GET of a static file that is byte-identical for every copy of swe-mux, so it conveys nothing beyond the fact that some address asked for a public file.
  • It is off with one switch. Settings, Diagnostics, Software updates, or update_check_enabled in your config file. Off means no request is made at all, rather than a request that is ignored.
  • Installing an update is a separate act you take. Nothing downloads automatically. swemux update --install <version> fetches that release from GitHub and verifies its SHA-256 against the published manifest before anything is staged.
  • The mechanism and every one of these constraints are in src/swe_mux/update_check.py, and the test suite proves the disabled case by counting requests rather than by reading the promise.
  • This end of it is counted, and here is exactly how. Since 2026-09-06 the website adds 1 to a daily total when something asks for version.json. The counter stores two values and no others: the constant text version-check, and the HTTP status of the response. No address, no user agent, no country, no referer, and no identifier derived from any of them - not "kept briefly", but never written down, so there is no record of you to lose or to be asked for later. It is nine lines in worker/index.js and a test fails if that call ever grows a field taken from the request. What it can tell the project is how many requests arrived today; what it cannot tell the project is who, where, or whether two of them were the same computer.

There is no crash reporting, no licence check, and no first-run registration, and the software still sends nothing about you or your work. That is the complete list of unprompted outbound traffic: one file, once a day, or nothing. Turning the update check off removes you from the count above, because the request that gets counted is never made.

What reaches a third party only if you turn it on

Each of these is off until you configure it, and each one talks to a service you already have a relationship with rather than to this project.

  • Your agent CLIsClaude Code, Codex, opencode and the rest contact their own vendors under your own subscription, exactly as they do outside swe-mux. swe-mux proxies nothing, resells nothing, and is not in the path of those requests.
  • Summaries and the assistantRead-aloud summaries, the Mux assistant, the scan timeline, automation observers, and attention narration call an OpenRouter-compatible endpoint with your key. The text being summarized or asked about goes to that endpoint. Each of these is separately switchable and separately budgeted.
  • Web pushNotifications to a phone go through your browser vendor's push service, and only after you subscribe that device. The payload is what the notification says.
  • Saved provider accountsSubscription-window polling calls that vendor's own usage endpoint with the credential you saved. Credentials stay on your machine and go nowhere but the provider they belong to.
  • On-device speechThe local speech models download once from Hugging Face, pinned by revision and verified per file by SHA-256. After that, dictation and speech run entirely on your machine.
  • Experimental Edge TTSReaches a Microsoft endpoint and is the one integration that requires an explicit acknowledgement before any text leaves the machine, because it uses a consumer endpoint with no third-party service contract. Its client is installed from PyPI into an isolated environment and is never bundled.
  • TailscaleReaching your machine from a phone uses your own tailnet. Tailscale operates that coordination service under your agreement with them; swe-mux adds no relay and no broker of its own.

What the software stores, and where

All of it is on your own disk, in one directory, and none of it is transmitted anywhere.

  • The data directory is ~/.mux on Windows, $XDG_DATA_HOME/swe-mux (else ~/.local/share/swe-mux) on Linux, and ~/Library/Application Support/swe-mux on macOS. An existing ~/.mux wins on every host and MUX_DATA_DIR overrides all of it.
  • It holds your configuration, the session registry and terminal checkpoints, SQLite databases for history and telemetry, the daemon log, generated speech clips, and the clipboard-history ring. Terminal output is in there, which means anything an agent printed is in there.
  • Agent transcripts are read in place and never moved, rewritten, or deleted. They stay wherever the vendor's own CLI put them.
  • Deleting that directory deletes everything swe-mux has recorded. There is no second copy and nothing to request from anyone.

Two things worth knowing rather than discovering. The diagnostics bundle (swemux doctor --export) is built for sharing and deliberately contains no terminal bytes and no message content, but it does contain a sanitized configuration, so read it before attaching it to anything. And anyone your tailnet admits to the daemon's listener has terminal and code-execution authority on the host: Tailscale policy is the entire access boundary, because there is no swe-mux login to add one.

This website

swemux.dev is static files served by Cloudflare Workers from the site/ directory of the public repository. GitHub Pages served it until 2026-08-31; the files and the repository did not change, only the host.

  • No analytics script, no tracking pixel, no cookie set by this site, and nothing the page itself requests from a third party. No external fonts, no tag manager, no embedded video. Nothing the browser runs reports that you visited, so pages you read here are not counted at all. Every page is one HTML file with its CSS and its handful of lines of JavaScript inline. You can read the whole thing with view-source.
  • One path is counted on the server, and only one: /version.json, the file installs poll for a new release. The counter's whole schema is a fixed label and a status code - the section above spells it out - and it is the only thing on this site the project measures. Pages are not counted, downloads from here are not counted, and no other path is.
  • One exception, and it belongs to the host rather than the page: Cloudflare sends NEL and Report-To response headers, which ask your browser to report failed requests to a.nel.cloudflare.com. Successful loads report nothing - the sampling fraction is zero. Nothing in the page triggers it, and the project never sees those reports.
  • One value is stored in your browser: localStorage under the key swemux-theme, holding dark or light. It is what stops the colour scheme flashing on load, it is never read by anything else, and it never leaves your browser.
  • Cloudflare serves these pages and therefore sees the requests, the way any web host does, including your address. That is covered by Cloudflare's own privacy policy and it is true of every site you visit. What is specific to this one is what the project takes out of it: the single counter above, and nothing else. No request log is enabled, exported, or stored, so outside that counter there is no per-visit record for the project to read - which is a statement about a setting anyone can check in the repository, not a claim that a web host is blind.
  • Links from here to GitHub, PyPI, or another project's site are ordinary links. Following one is a request to that host, under that host's terms.

Rights, and who to ask

There is no account to delete, no export to request, and no profile held anywhere, because the project holds nothing about you. Data protection rights are exercised against whoever holds data, and for swe-mux that is you, on your own machine.

If you believe a sentence on this page is wrong, open an issue. A privacy claim that turns out to be false is a bug in this page and will be corrected rather than defended. Security reports go through the security policy instead, privately.

This page describes how the software behaves. It is not legal advice and it is not a contract; what you are permitted to do with swe-mux is the licence.