Skip to content
xcross
Documentation menu

Run over Wi-Fi

Pair an iPhone once, then run Flutter or Compose Multiplatform apps without a USB cable.

Pair once, then drop the cable.

xcross tunnel --wifi

--wifi picks the best path automatically:

USB attachedpairs through the cable, then unplug
Saved pairingreconnects the known device
Nothing savedadvertises a pair-host (iOS 27+)

Then run over Wi-Fi:

xcross flutter run --wifi

Works on every iOS 17+ version.

  1. 1
    Connect over USB, unlock, tap Trust
  2. 2
    Pair and open the tunnel
    $xcross tunnel --wifi
    Wait for Device ready — paired over USB, wireless RSD tunnel up.
  3. 3
    Unplug and run
    $xcross flutter run --wifi

Pair without USB on iOS 27+

  1. 1
    Run the tunnel
    $xcross tunnel --wifi
    It prints a name like xcross-my-host-a1b2.
  2. 2
    On the iPhoneSettings › Privacy and Security › Developer Mode › Paired Devices › Other Devices
  3. 3
    Tap the exact printed nameIf a saved pairing failed, a fresh suffixed name appears. Delete the stale one.
  4. 4
    Enter the 6-digit codeShown in the terminal.

Device selection

FlagSearches
noneUSB first, falls back to Wi-Fi
--wifiWi-Fi only
--usbUSB only
-u <UDID>one exact device

Network checklist

Same subnetNo guest isolation, NAT, or VPN in between.
mDNS allowedUDP 5353 must pass.
Phone unlockedScreen on during pairing.
Elevated shellsudo or Administrator for the tunnel.

Troubleshooting

Start with xcross tunnel --wifi -v.

Saved device does not reconnect

Wait for the retry to finish. xcross then advertises a fresh name. On iOS 27+ tap it, on older iOS reconnect USB and rerun.

Host shows on the iPhone, but no code appears

You tapped an older entry. Tap the exact name printed by the current run, and check UDP 5353 is open.

USB connected but not detected (Linux / WSL)
sudo systemctl start usbmuxd
pymobiledevice3 usbmux list --usb

On WSL, check the phone is attached with usbipd and USBMUXD_SOCKET_ADDRESS is set.

ESC