tunnelbyte ships three routing patterns. All use the same userspace WireGuard tunnel under the hood; they differ in how processes opt in.
Per-app - the default
proxy: line - don’t hardcode it). Your system default route is not modified. No sudo prompt. No wg-quick.
Processes opt in by pointing at the proxy:
curl, Python requests, Go’s http.Client, git, aws CLI, etc. - so opt-in is roughly zero cost. You can run multiple tunnels in parallel (one per region) without conflict, since each one binds its own port.
Wrapped child - tunnelbyte <region> -- <cmd>
- CLI commands (
curl,git,wget, anything that respectsHTTPS_PROXYenv vars): the wrapper setsHTTPS_PROXY,HTTP_PROXY, andALL_PROXYin the child’s environment.NO_PROXYis preserved + appended with localhost entries. - Known Chromium browsers (
chrome,brave,edge,chromium,arc): the wrapper rewrites argv with--proxy-server=http://127.0.0.1:<port>and a dedicated--user-data-dir. Each browser gets its own persistent profile per (browser, region) under your config dir, so re-launchingtunnelbyte fsn -- bravekeeps logins, bookmarks, and extensions. Different regions get different profiles so cookies don’t leak across exit IPs. - Unknown GUI apps (Spotify, Slack, Discord, etc.): the wrapper falls back to the env-var path, which most GUI apps ignore. Use
--allfor these, or run them outside the wrapper and configure their proxy support manually.
System-wide - --all
--all installs a 0.0.0.0/0 route via the tunnel interface, so every process on the machine sees the exit IP without any per-app configuration.
sudois required each run. Nothing setuid is installed - the runningtunnelbyteprocess itself flips routes (via netlink on Linux,routeon macOS) while it holds elevated privileges, and restores them on exit. Caching the prompt across runs is asudosetting, not ours.- On exit (Ctrl-C, expiration, crash), the original routing table is restored. If
tunnelbyteis SIGKILL’d before cleanup runs, the next--allinvocation detects and removes the stale route during pre-flight. - Only one
--alltunnel can be active at a time (the OS only has one default route).
Which to use
| Use case | Mode |
|---|---|
| Scraper, CI job, Playwright, anything proxy-aware | per-app |
| Multiple regions at once (CI runs against several) | per-app |
| Open a fresh browser routed through the tunnel | -- brave (or chrome/edge/chromium/arc) |
| One-shot CLI command routed through the tunnel | -- curl ... |
| ”Make my whole machine look like it’s in Singapore” demo | --all |
| GUI apps that don’t speak HTTP proxy (Spotify, Slack) | --all |
Behind the scenes
All three modes use userspace WireGuard by default rather than the kernel WireGuard module. The trade-offs:- No kernel modules, no
wg-quick, no root for the WireGuard interface itself. - Throughput is bounded by the userspace TCP/IP stack. On modern hardware that’s still well into hundreds of Mbps - plenty for scraping, CI, and most dev workloads.
- On Linux,
--allautomatically switches to the kernel WireGuard module when available, giving you the higher throughput without any extra flag. macOS always uses userspace.
See also
tunnelbyte- full CLI reference for the root command.- Tiers - what each tier gets you.