How it works
Prerequisites
Before you add a device, you need:
- Tailscale installed and signed in on both your Mac and your iPhone, with both devices joined to the same tailnet.
- Wireless Debugging turned on for the iPhone in Xcode (Settings → Developer, on the iPhone, after connecting it to Xcode at least once over USB).
Nuticast doesn't set either of these up for you — it assumes you already have a working Tailscale mesh and a device Xcode has paired with before.
Adding a device
The "Add Device" window has three steps, in this exact order:
1 · iPhones found on the local network
With the iPhone still connected — over USB or on the same Wi-Fi as your Mac — the app scans for its _remotepairing._tcp Bonjour advertisement. Found devices show up in a list with their hostname and port. Pick the one that's your iPhone.
2 · Tailscale device
Next, match that iPhone to its entry in your tailnet. The app runs tailscale status and shows you every peer, online or offline. Pick the one that corresponds to the same physical iPhone.
3 · Display name
Give the pairing a name — "Taha's iPhone," or whatever's clear to you. This is just a label; it doesn't have to match anything Apple-assigned.
Save is disabled until all three fields are filled in. Once you save, the pairing is written to a local device profile — nothing is sent anywhere.
Starting a bridge
Once your iPhone has actually left the local network, toggle Start Bridge — from the main window, the device's detail page, or directly from the menu-bar dropdown.
When you do, the app:
- Confirms the device is genuinely remote. If it's still on the same LAN, it refuses to start — this avoids creating a duplicate Bonjour record that could collide with the iPhone's real one.
- Probes the last-known RemotePairing port on the Tailscale IP, using an actual RemotePairing handshake — not just a port scan — to confirm something is really speaking the protocol on the other end.
- Registers a proxy Bonjour record on your Mac's local network for that iPhone, pointing back at itself.
- Opens TCP and UDP relay listeners for the RemotePairing port and the CoreDevice trusted-tunnel port range (55000–58000 by default), forwarding everything over Tailscale to the real device.
From that point, Xcode and devicectl see what looks like a normal local device — build, install, and debug like the iPhone never left.
Status states
The bridge reports exactly one of four states, shown both as a colored menu-bar icon and per-device:
- Off — not running.
- Pairing… — probing / registering the proxy.
- Bridge active — relays are up and forwarding traffic.
- Error — something failed; the error message names what (e.g. the probe was refused, or the device didn't respond).
Keeping it running
- If your Mac's own IP address changes (new Wi-Fi network, VPN reconnect), the bridge automatically restarts.
- Bridges that were active when you quit the app auto-restore the next time it launches.
- If a bridge reports an Error, use the Scan port button on that device to manually re-probe — useful if the iPhone just came back online and the app hasn't noticed yet.
Settings
- Tailscale CLI path — if
tailscaleisn't on your defaultPATH(or you installed it somewhere non-standard), set the path explicitly here. A "Test device list" button confirms the app can actually run it. - Device profiles — see every saved pairing, its tunnel port range, and delete ones you no longer need.
- Launch at Login — for an always-on bridge that comes back automatically after a restart.