Duowire
Back to usage guide

Linux headless host guide

Turn any Linux box — server, NUC, Raspberry Pi — into a Host. No GUI, no root required to run it.

The Linux client is available on the Pro plan and above.

Install

Quickest path: download quick-setup.sh from the download page together with the binary for your architecture, then run one command:

sudo bash quick-setup.sh 'RELAY_CONFIG_STRING' --lan 192.168.0.0/24 --code my-home-lab

This installs the binary, saves your relay config, sets up a hardened systemd service, and starts the first share — all in one step. Prefer to do it by hand instead? Grab the binary from the release page and run:

chmod +x duowire-linux-amd64 && sudo mv duowire-linux-amd64 /usr/local/bin/duowire

Recommended setup: survives reboots, reachable via web

For an unattended box, four steps get you a systemd service, a permanent code, and the web UI.

1. Save the relay config

sudo DUOWIRE_STATE_DIR=/var/lib/duowire duowire setup 'RELAY_CONFIG_STRING'

2. Run the first share once in the foreground, with a permanent code

sudo DUOWIRE_STATE_DIR=/var/lib/duowire duowire host --lan 192.168.0.0/24 --code my-home-lab

Connect once from a remote to verify, then Ctrl-C — this stops the process but keeps the share configured, which is exactly what the service resumes on every start.

3. Install and start the service

sudo DUOWIRE_STATE_DIR=/var/lib/duowire duowire install-service --web 127.0.0.1:8787
sudo systemctl enable --now duowire

4. Verify

sudo duowire status

The web UI

A tiny status/control page served by the daemon itself — status, the connection code in big type, and a Share/Stop button. Two ways to reach it from another machine.

Loopback bind + SSH forward (recommended)

ssh -L 8787:127.0.0.1:8787 user@linuxbox

Then browse http://localhost:8787 — no token needed, SSH is the auth.

LAN bind + bearer token

Install with --web 0.0.0.0:8787 instead — the first non-loopback install prints a bearer token once. This binds a plain-HTTP page to the LAN, so prefer the SSH-forward path where possible.

Day-2 operations

sudo duowire status [--json]— live state via the daemon's socket.

sudo duowire stop — stop sharing; the service keeps running idle.

Upgrade the binary: stop the service, replace /usr/local/bin/duowire, start it again — state and the share are untouched.

Relay migrated or re-keyed? sudo duowire setup 'NEW_CONFIG_STRING' routes through the running daemon automatically.

Files & secrets

State lives in /var/lib/duowire for the system service (or ~/.config/duowire for a per-user service), directory 0700, files 0600. Linux has no DPAPI equivalent, so — like /etc/wireguard/*.conf — these are plaintext protected by file permissions rather than encrypted at rest.

Troubleshooting