Remote Control
WireGuard builds one private network (10.8.0.0/24) across the wired and Wi-Fi subnets. RustDesk gives full desktop control of the Ally and laptop; SSH gives the Pi a terminal. Control never goes through Caddy or HTTPS.
← Voidgate
Private VPN keys :: do not share configs across devices

Step order

  1. Pi (done): old phone configs retired, four client configs generated, four peers live in wg0.
  2. Each device: install WireGuard, import that device's own .conf, turn the tunnel ON.
  3. Each Linux device (Ally, laptop): install RustDesk, set a permanent password, enable Direct IP Access.
  4. Windows: WireGuard ON, open RustDesk, connect to 10.8.0.30 (Ally) or 10.8.0.20 (laptop).

You must install WireGuard on every device and import that device's config once. There is no way around that for split subnets without merging the LANs.

How it connects

Windows PC 10.8.0.10 :: ethernet 192.168.3.x
Raspberry Pi WG server 10.8.0.1
ROG Ally 10.8.0.30 :: Wi-Fi 192.168.7.x
Arch laptop 10.8.0.20 :: Wi-Fi 192.168.7.x

Once the tunnels are up, RustDesk runs from Windows to 10.8.0.30 / 10.8.0.20, and SSH runs from anywhere to pihole@10.8.0.1. Domains like voidgate.top are only used as the away-from-home WireGuard endpoint.

Fixed VPN addresses

Client configDeviceVPN IP
windows-pc.confWindows desktop10.8.0.10
arch-laptop.confOmarchy Arch laptop10.8.0.20
rog-ally.confROG Ally (SteamOS)10.8.0.30
oneplus-phone.confOnePlus Android10.8.0.40

Pi server stays 10.8.0.1. Each device imports only its own config.

Endpoint: home vs away

NAT hairpin to the public IP does not work from inside the house, so a home config must point at a same-subnet Pi LAN IP. Away configs use the public hostname. The home and away variants share the same key and VPN IP; only the Endpoint line differs. Import both tunnels and activate whichever matches your location.

DeviceAt home (Endpoint)Away (Endpoint)
Windows PC (ethernet)192.168.3.100:51820
windows-pc.conf
voidgate.top:51820
windows-pc-away.conf
ROG Ally / Arch laptop (Eero Wi-Fi)192.168.7.251:51820
rog-ally.conf / arch-laptop.conf
voidgate.top:51820
*-away.conf
OnePlus phone192.168.7.251:51820
oneplus-phone-home.conf
voidgate.top:51820
oneplus-phone.conf

Do not use 104.8.0.42 as a home endpoint. HTTPS / WireGuard to the public IP from inside the LAN gets no response (hairpin is broken). Home configs must use the Pi LAN IP on your own subnet; never target 192.168.3.100 from the 192.168.7.x Wi-Fi (separate routers, no route between them).

Pre-flight (one per portable device, on home Wi-Fi, before importing): ping 192.168.7.251 from the Ally/laptop, or ping 192.168.3.100 from Windows, should succeed. If the Eero 192.168.7.251 ping fails, the Eero has client isolation enabled; turn it off or place the Pi and clients on the same Eero profile.

No DNS line is set, so each device keeps its own resolver: Pi-hole at home (so *.voidgate.top web stays reachable while the tunnel is up), cellular DNS away.

Install the apps

AppWhere
WireGuard
RustDesk

You do not download WireGuard from voidgate. Install the WireGuard app, then import the .conf file for that device.

RustDesk first time (Ally and laptop are the hosts)

On the Ally / laptop (one time)

  1. Open RustDesk, go to Settings (gear).
  2. Security: set a permanent password (no per-session approval).
  3. Security: enable Direct IP Access. Without it you cannot connect by 10.8.0.x and must use the public RustDesk ID.
  4. Allow RustDesk through the host firewall: TCP 21114-21119, and specifically TCP 21118 from 10.8.0.0/24 while the tunnel is up.
  5. Note the numeric ID on the main screen. From Windows you can use the ID or the VPN IP; the VPN IP is more reliable across the split subnets.

On Windows (the controller)

  1. Turn WireGuard on (tunnel active).
  2. Open RustDesk, type 10.8.0.30 (Ally) or 10.8.0.20 (laptop) into Remote ID.
  3. Connect and enter the host's permanent password. You should see the full desktop.
  4. For a terminal instead of the GUI: ssh user@10.8.0.30 in PowerShell (run whoami on the host to learn the user).

Wayland caveat (SteamOS / KDE / Omarchy): if the remote screen is black or input is ignored, the host is on a Wayland session. Use an X11 / Xorg login session, or grant RustDesk the PipeWire screen-capture portal per the RustDesk Wayland notes. SteamOS Game Mode is a poor RustDesk host; use Desktop Mode for setup and when you expect remote control.

Getting the config onto the ROG Ally (SteamOS)

The repo github.com/aringadre76/selfhosted is private, so cloning or a raw download on the Ally needs authentication: a GitHub personal access token (PAT) or an SSH key added to your GitHub account.

Take only that device's file. Do not copy another device's .conf onto the Ally.

Away from home and from the phone

On cellular or hotel Wi-Fi, turn on WireGuard with the away config (voidgate.top:51820). You join the same 10.8.0.0/24 network as home. Then:

TargetToolWorks away?
Raspberry Pi (homelab, Cursor CLI, docker compose)SSH to pihole@10.8.0.1Yes, if the Pi is on and UDP 51820 is forwarded
Laptop / Ally (full desktop)RustDesk to 10.8.0.20 / 10.8.0.30Only if that device is powered on with its tunnel active
Pi via Cursor cloudcursor.com/agents → raspberry-pi-homelabYes, no VPN required (outbound worker)

Phone to Pi for Cursor CLI:

cd ~/selfhosted
docker compose ps
docker compose logs --tail=50 caddy
~/.local/bin/agent --help

Typing long commands on a phone is awkward but valid. For serious work, Cursor Cloud Agents are usually easier and need no VPN (the Pi worker cursor-worker.service must be running).

Troubleshooting

SymptomCheck
RustDesk times outWireGuard off on Windows or on the host; ping 10.8.0.30 first.
Ping failsHost tunnel not active, or peer missing on the Pi (sudo wg show).
Connects then black screenHost in Game Mode or display asleep; wake it in Desktop Mode.
Black screen / no inputWayland session: switch to X11 or set up the RustDesk Wayland portal.
Ping OK but RustDesk refusesHost firewall: allow RustDesk (21114-21119) and Direct IP Access; allow incoming from 10.8.0.0/24 while WG is up.
Works at home but not awayActivate the -away.conf (Endpoint = voidgate.top:51820). Away needs the public A record pointing at the live home IP (dig voidgate.top @1.1.1.1) and UDP 51820 forwarded to 192.168.3.100.
WG works away but not at home (Windows, 3.x)Use the home config Endpoint = 192.168.3.100:51820 (Pi eth0). The public IP / hostname fails at home because hairpin is broken.
WG fails on Ally / laptop at homeUse Endpoint = 192.168.7.251:51820 (Pi wlan0, same Eero subnet). Not 104.8.0.42, not 192.168.3.100. If ping 192.168.7.251 fails, Eero client isolation is on.

v1 uses RustDesk public rendezvous servers. The Pi is SSH / Cursor CLI only (no RustDesk host). A self-hosted RustDesk relay on the Pi is a possible later phase.