Diagnosing Expo Go Connection Failures Between Device and Local Server
A structured diagnostic guide for resolving Expo Go connection failures between a physical device and a local development server, covering subnet mismatches, firewall rules, and SDK version alignment.
19 May 2026, 00:18 UTC

Recognizable Condition
You scan the QR code from expo start or enter the exp:// URL manually, but Expo Go never loads the JavaScript bundle. The app may show a generic connection error, hang on a blank screen, or immediately return to the start screen. On the development machine, the Metro bundler appears to be running normally. This pattern usually points to a network-path problem between the physical device and the host, not to a bug in your React Native code.
Cause and Diagnostic Table
| Symptom | Likely Cause | Quick Diagnostic |
|---|---|---|
| Device cannot reach host at all | Different subnet or VLAN | Compare the device Wi-Fi IP with the host local IP; they should share the same network prefix |
| Host reachable, Metro not responding | Firewall blocking the bundler port | Open http://localhost:8081/status on the host, then try the same address from a browser on the device |
| LAN URL is unreachable | NAT, strict firewall, or client isolation | Try --tunnel mode as a comparison test |
| Hostname-based URL fails | DNS or mDNS resolution failure | Ping the host IP directly instead of the machine name |
| Connection drops immediately after handshake | Expo Go client SDK mismatch | Compare the Expo Go app version with sdkVersion in app.json |
Ordered Checks
Confirm Metro is healthy on the host. Run the following in a terminal on your development machine, or open the same address in a local browser:
curl http://localhost:8081/statusExpected check: a response from the packager indicating it is running. If this fails, Metro is not listening; restart the development server before continuing.
Identify the host and device network addresses. On the host, run
ipconfig(Windows) orip addr/ifconfig(macOS/Linux) in a terminal and note the local IPv4 address, for example192.168.1.42. On the mobile device, open Wi-Fi settings and note its assigned IP. Both addresses should begin with the same first three octets (e.g.,192.168.1.x). If the device shows10.0.0.xor192.168.43.x, the two devices are on different networks.Test raw connectivity from the device to the host. Using a network utility app on the phone, ping the host IP address recorded above. Expected check: successful replies. A timeout means the network path is blocked, segmented, or isolated.
Verify the Expo Go client version. Open Expo Go and locate its version or SDK information. Then open your project’s
app.jsonand note thesdkVersionvalue. Expo Go is generally built to support a specific SDK major version; a mismatch can prevent the client from negotiating a session with the dev server.Inspect the start mode and reported endpoint. Run the standard start command in your project directory on the host:
npx expo startObserve whether the output reports a LAN URL with your local IP, a Tunnel URL, or only a localhost URL. LAN mode depends on direct peer-to-peer reachability; Tunnel mode routes through an external relay.
Fixes Tied to Findings
Different Subnet or VLAN
If the device and host are on different subnets, connect both to the same network segment. On corporate or campus networks, request that the mobile device be moved to the same VLAN as the development machine. Guest networks and public Wi-Fi hotspots frequently enforce client isolation, which blocks peer-to-peer discovery regardless of local settings.
Firewall Blocking the Bundler Port
If Metro responds locally but not from the device, allow inbound TCP traffic on port 8081 (and any additional Expo dev-server ports, commonly 19000) through the host firewall. On macOS, adjust the firewall options in System Settings under Network. On Windows, permit your terminal or Node.js through Windows Defender Firewall for private networks. Risk: opening ports increases exposure; prefer scoped rules over disabling the firewall entirely.
LAN Mode Unreachable
When NAT or a strict firewall prevents direct LAN access, start Expo with a tunnel:
npx expo start --tunnel
Expected check: the QR code and terminal output should display a relay URL rather than a bare LAN IP. Limitation: tunnel mode introduces significant latency compared with LAN mode and may be subject to external rate limits.
DNS or Hostname Resolution Failure
If the URL contains a machine hostname that the phone cannot resolve, replace it with the host’s local IP address. In Expo Go, manually enter the connection string using the IP, for example exp://192.168.1.42:19000, ensuring the port matches what the dev server reports.
Expo Go Client Version Mismatch
Update Expo Go from the App Store or Google Play so that it supports the project’s sdkVersion. Alternatively, align the project’s sdkVersion in app.json to the version supported by the installed client. After changing app.json, restart the dev server with cache clearing:
npx expo start --clear
Escalation Criteria
- Both devices are confirmed on the same subnet, port
8081is open, raw ping succeeds, and Expo Go still fails. - Tunnel mode also fails, which suggests outbound firewall rules or network policy are blocking the relay endpoint.
- The problem persists across multiple projects and SDK versions, indicating a deeper Expo Go installation or platform issue.
Limitations and Practical Verification
Public Wi-Fi networks commonly enable client isolation (AP isolation), which prevents devices from reaching each other even when they appear on the same SSID. VPN clients on either the phone or the host can also break LAN discovery. Because Expo tooling evolves, verify current SDK compatibility and default port assignments against the official Expo documentation for your installed version.
To verify a fix, re-run curl http://localhost:8081/status on the host to confirm Metro is healthy, then scan the QR code or enter the URL in Expo Go. The bundle should load within a few seconds. If the bundle loads but the application crashes afterward, the issue has shifted from connectivity to application code.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.