Away from home
Your Mac, with its screen, from anywhere — through your own VPN
Couchpad was built for a phone and a computer on the same Wi‑Fi. It turns out that is all it needs: put both devices on a VPN and the phone is "on the same network" wherever it is, over cellular or someone else's Wi‑Fi.
There is no Couchpad account and no Couchpad server in this. The VPN carries the packets; Couchpad still does its own key exchange and encryption inside it, so even the VPN provider's relays, if traffic ever goes through one, see only ciphertext. This page uses Tailscale because it is free for personal use and takes a few minutes, but any VPN that gives both devices an address on a shared network works the same way: WireGuard, ZeroTier, your router's built-in VPN.
Set up, once
- Install Tailscale on the computer and on the iPhone, and sign both in to the same account (the Mac App Store app and the iOS app are fine). Each device gets an address that starts with
100.and never changes. - Pair at home first, the normal way, over Wi‑Fi: Couchpad on the phone finds the computer, "Pair an iPhone…" in the menu-bar icon shows the QR, scan it. Pairing is tied to the computer's name, not its address, so one pairing covers both the home network and the VPN.
- Note the computer's Tailscale address. Tailscale's menu-bar icon shows it; so does
tailscale ip -4in Terminal. Something like100.101.102.103.
Connect from outside
- Make sure Tailscale is connected on the phone (its toggle in the Tailscale app, or the VPN indicator in the status bar).
- Open Couchpad. It will search for a while and find nothing: discovery uses Bonjour, which does not cross a VPN.
- Open the gear → Connection and type the computer's Tailscale address. The phone connects, proves it holds its pairing token, and you are in. It remembers the address, so next time it reconnects on its own when Bonjour comes up empty.
- Turn on the screen with the display icon if you want to see what you are doing.
What to expect
- Input feels local. Touches and keys are a few bytes each; a cellular round trip adds tens of milliseconds, which you will not notice typing or clicking.
- The picture lags a little more than at home. The stream was tuned for a Wi‑Fi round trip of about 10 ms and backs off when the link is slower or loses packets, so over cellular you will see fewer frames and a softer image. It is fine for desktop work and finding things; it is not yet a gaming link from a café. This is tuning, and it is being worked on.
- UDP works through Tailscale. Frames go as datagrams, as at home. When Tailscale cannot make a direct connection it falls back to one of its relays, which adds latency; Couchpad notices nothing except a slower link, and the traffic is encrypted either way.
- The computer must be awake. A sleeping Mac is not on any network. Set it to never sleep while plugged in (System Settings → Energy, or Displays → Advanced → "Prevent automatic sleeping on power adapter when the display is off"), or use something that wakes it. Couchpad cannot wake it for you.
Rough edges, for now
- The QR code carries the computer's home Wi‑Fi address, not its Tailscale one, so scanning it from outside hands the phone an address it cannot reach. Pair at home, or type the Tailscale address afterwards.
- The phone's search for the computer takes a few seconds to give up before it tries the stored address. Typing the address in Connection skips the wait.
- Windows hosts work for input but do not stream the screen yet, at home or away.
Security
Nothing changes. Only a phone that paired with the computer can send it anything; the code is never needed again and never travels; every session starts with a fresh key exchange and is encrypted end to end between the two apps. The VPN adds a second layer: your computer's Couchpad port is reachable only from devices you signed in to your own network, and from nowhere on the public internet. Do not port-forward 48123 on your router instead; Couchpad's pairing is strong, but a VPN keeps the port off the internet altogether, which is strictly better. The security notes and the README have the details.