InterMux
Documentation

Using InterMux

Pick a network for each app. This short guide covers the command line first, then the same workflow in the window.

LinuxVersion 2.0.1, betaCLI and GUI

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:

Terminal
curl -fsSL https://intermux.me/install.sh | sh

Then see what is available on the machine:

Terminal
intermux check
intermux interfaces
intermux apps --search firefox

check 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:

Terminal
intermux bind --app firefox --iface wlan0

The 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:

Terminal
intermux bind --app firefox --iface wlan0 --dns quad9
intermux bind --app qbittorrent --iface eth0 --dns 1.1.1.1,9.9.9.9

Presets 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

Terminal
intermux status

status 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:

Terminal
intermux verify --iface wlan0

04 Everyday commands

Move and restart

Shell
intermux move --app firefox \
  --iface wlan0 --to wg0

intermux restart --app firefox --iface wlan0

DNS and limits

Shell
intermux dns --iface wlan0 1.1.1.1,9.9.9.9

intermux limit --iface wlan0 \
  --down 20 --up 5

Running 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.

Terminal
intermux stop --app firefox --iface wlan0
intermux kill --app firefox
intermux reconnect

05 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:

Terminal
intermux adopt --app firefox --iface eth0

The command prints an ID. Give that ID to release to stop routing the app:

Terminal
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.

CommandWhat it does
intermux --helpList every command, or get help for one command.
intermux checkReport 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 IFStart an app inside a namespace bound to an interface.
intermux statusShow bindings, DNS, limits and traffic per namespace.
intermux verify --iface IFPrint the public IP seen from that interface.
intermux restart --app APP --iface IFRestart a bound app in the same namespace.
intermux move --app APP --iface IF --to IFMove a bound app to another interface (it restarts).
intermux stop --app APP --iface IFStop the app bound to an interface.
intermux kill --app APP [--force]Stop every host instance of an app.
intermux dns --iface IF SERVERSChange 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 IFRoute an app that is already running.
intermux release IDStop routing an adopted app. The ID comes from adopt or status.
intermux reconnectRe-add routes for interfaces that are back.
intermux teardown-idleRemove 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:

Terminal
intermux teardown-idle
intermux reset --kill-apps --yes

reset 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:

Terminal
curl -fsSL https://intermux.me/install.sh | sh -s -- --uninstall

09 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:

Terminal
INTERMUX_DEBUG=1 intermux status

intermux 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:

Terminal
sudo systemctl status intermux-watch.service
sudo systemctl enable --now intermux-watch.service

InterMux 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.