Using InterMux
Pick a network for each app. This short guide covers the command line first, then the same workflow in the window.
01 Before you start
InterMux runs on Linux with systemd and network namespaces. Run it as your normal user, never with sudo. Network changes go through a small polkit-gated helper, so a password prompt appears when root work is needed.
If it is not installed yet, the one-line installer sets it up and checks the dependencies:
curl -fsSL https://intermux.me/install.sh | shThen see what is available on the machine:
intermux check
intermux interfaces
intermux apps --search firefoxcheck reports missing tools. interfaces lists the connections you can bind, and apps searches the installed desktop applications. Flatpak apps cannot be bound because they run in their own sandbox.
02 Your first binding
A binding is one interface plus one application. Use bind to start the app inside a namespace routed through that interface:
intermux bind --app firefox --iface wlan0The app starts as you, with your profile and settings. Everything it sends leaves through wlan0. When the last process of the app exits, a background watcher removes the binding.
DNS can be a preset or a comma-separated list of addresses:
intermux bind --app firefox --iface wlan0 --dns quad9
intermux bind --app qbittorrent --iface eth0 --dns 1.1.1.1,9.9.9.9Presets are auto, cloudflare, google and quad9. If the app is already running, add --separate-profile to open a second copy, or --close-existing to close and reopen it.
03 Check what is running
intermux statusstatus shows every binding and every routed running app. For each namespace it also reports the DNS servers, the bandwidth limit and the traffic counters. To confirm which address the outside world sees:
intermux verify --iface wlan004 Everyday commands
Move and restart
intermux move --app firefox \
--iface wlan0 --to wg0
intermux restart --app firefox --iface wlan0DNS and limits
intermux dns --iface wlan0 1.1.1.1,9.9.9.9
intermux limit --iface wlan0 \
--down 20 --up 5Running apps pick up DNS changes without a restart. A bandwidth limit covers every app on that interface together; run limit without values to remove it. Moving an app restarts it, because routing belongs to the namespace.
Use stop for one binding and kill for every host instance of an app. reconnect re-adds routes after a link comes back.
intermux stop --app firefox --iface wlan0
intermux kill --app firefox
intermux reconnect05 Apps that are already open
adopt routes a running app through an interface without closing it. InterMux moves its processes into a cgroup and marks its packets, so new connections use the chosen link:
intermux adopt --app firefox --iface eth0The command prints an ID. Give that ID to release to stop routing the app:
intermux release <ID>Connections the app already had open keep their old route until they reconnect. Name lookups for an adopted app use the normal system route, not the chosen interface, and IPv6 for the adopted group is rejected so traffic cannot leak around the interface. This needs cgroup v2 and nft.
06 Command reference
Run intermux <command> --help for flags and details. helper and watch are internal and are not meant to be run directly.
| Command | What it does |
|---|---|
intermux --help | List every command, or get help for one command. |
intermux check | Report missing system tools and how to install them. |
intermux interfaces [--all] | List bindable interfaces. --all includes the others. |
intermux apps [--search TEXT] | List desktop applications, optionally filtered. |
intermux bind --app APP --iface IF | Start an app inside a namespace bound to an interface. |
intermux status | Show bindings, DNS, limits and traffic per namespace. |
intermux verify --iface IF | Print the public IP seen from that interface. |
intermux restart --app APP --iface IF | Restart a bound app in the same namespace. |
intermux move --app APP --iface IF --to IF | Move a bound app to another interface (it restarts). |
intermux stop --app APP --iface IF | Stop the app bound to an interface. |
intermux kill --app APP [--force] | Stop every host instance of an app. |
intermux dns --iface IF SERVERS | Change the DNS servers of an interface namespace. |
intermux limit --iface IF [--down M] [--up M] | Set or remove a bandwidth limit in Mbit/s. |
intermux adopt --app APP --iface IF | Route an app that is already running. |
intermux release ID | Stop routing an adopted app. The ID comes from adopt or status. |
intermux reconnect | Re-add routes for interfaces that are back. |
intermux teardown-idle | Remove plumbing for bindings with no running apps. |
intermux remove --iface IF [--yes] | Stop everything on an interface and remove its namespace. |
intermux reset [--kill-apps] [--yes] | Remove everything InterMux created. |
intermux report [--web] [--out DIR] | Save a bug report zip, or open the reporting portal. |
07 The window
Run intermux with no command to open the GUI, or start it from your application menu. Do not run it as root. The window has three sections: New binding, Queue and Bindings.
New binding
Choose an interface, then an application. Pick DNS and a speed limit if you need them, then add it to the queue. Start all starts the queue and asks for your password once.
Bindings
One row per interface, with its apps underneath. See status, PID, download and upload speed, a one-minute graph, speed limit, DNS and public IP.
Actions
Buttons follow the selected row: check public IP, restart, stop, open log, move, force quit or release. Right-click a row for the same actions.
If an app is already running when its queue starts, InterMux asks what to do: close and reopen it, open a separate profile, Shift current session to move the running copy without restarting it, or cancel. VPN connections… connects or imports NetworkManager VPNs. Refresh, Re-add routes, Remove stopped and Reset everything are in the same toolbar.
08 Clean up and undo
Bindings normally disappear when their apps exit. To tidy up the rest, or to start over:
intermux teardown-idle
intermux reset --kill-apps --yesreset removes everything InterMux created. Add --kill-apps to also stop the applications it started, and --yes to skip the confirmation. To remove the program itself:
curl -fsSL https://intermux.me/install.sh | sh -s -- --uninstall09 Troubleshooting
Each binding writes a log under ~/.local/state/intermux/logs. In the GUI, Open log opens the selected app's log. For verbose output on stderr:
INTERMUX_DEBUG=1 intermux statusintermux report writes a zip of diagnostics to ~/intermux-reports (change the folder with --out DIR). Nothing is uploaded automatically. If idle bindings are not cleaned up, check the watcher:
sudo systemctl status intermux-watch.service
sudo systemctl enable --now intermux-watch.serviceInterMux is beta software that changes system networking. Try it first on a machine you can recover from a mistake.
That covers the common path. The README has the full details.