Why Expo Go Won't Open
Hi, I'm Olamiji. I’m a Software Engineer who believes that while code is our tool, life is our canvas. I document my journey through front-end development and the lessons I learn outside the IDE.
In my last post, we installed the "Pro Tech Stack": NativeWind, MMKV, Reanimated, and more. I was ready to see my beautiful Tailwind-styled dashboard on my phone. I ran npx expo start, scanned the QR code, and then... nothing.
My phone stared back at me with an error: "No usable data found." If you're transitioning from web to mobile, this is your first "Welcome to Mobile" hurdle. Let’s break down why this happens and how to fix it.
Usually, when you start an Expo project, the URL looks like this: exp://192.168.1.185:8081
But after I installed my dependencies, the terminal gave me this instead: exp+rivo-app://expo-development-client/?url=http%3A%2F%2F192.168.1.185%3A8082
Expo Go saw that URL and said, "I don't know what that is."
The Root Cause: The Two Worlds of Expo
To understand the fix, you have to understand that Expo lives in two worlds:
1. The "Sandbox" (Expo Go)
Expo Go is like a universal web browser for mobile apps. It’s great for beginners because it has common native tools (camera, location) pre-installed.
- Limit: It cannot run "Custom Native Code" (like MMKV or Reanimated Worklets).
2. The "Real World" (Development Client)
When we installed expo-dev-client in the last step, we told Expo: "I’m a pro now. I want to use custom native modules." Expo CLI is smart, it sees that library and immediately stops generating URLs for Expo Go. It starts generating URLs for your own Custom Development Client.
The Solution: Supporting Both Worlds
You don't have to choose one or the other! You can force Expo to work with Expo Go while you're still in the "UI design" phase, then switch to the Dev Client when you need the heavy native features.
I resolved this by updating my package.json scripts to be explicit.
{
"scripts": {
"start": "expo start", // Default (Dev Client mode)
"start:go": "expo start --go", // The "Magic" flag for Expo Go
"start:tunnel:go": "expo start --tunnel --go", // Use this if your WiFi is acting up
"ios": "expo run:ios", // Builds your custom iOS app
"android": "expo run:android" // Builds your custom Android app
}
}
Why use --go?
The --go flag tells Expo: "I know I have pro-libraries installed, but for right now, just give me a standard URL that the Expo Go app can read."
Why use --tunnel ?
If your phone and computer are on different WiFi networks (or your router has a strict firewall), the QR code might fail even with the right URL. The Fix: Run npm run start:tunnel:go. This creates a secure "tunnel" through the internet so your phone can find your computer anywhere.
Level 1 vs. Level 2
One of the biggest lessons I learned is that you don't need to "over-pack" your project on Day 1. Installing everything at once is what breaks your Expo Go connection. Instead, I recommend a modular approach:
Level 1: The "Safe" UI Stack
Best for: Beginners, UI prototyping, and rapid development in Expo Go.
npx expo install nativewind tailwindcss @tanstack/react-query zustand lucide-react-native
NativeWind: Tailwind CSS for mobile (purely styling).
Zustand: Lightweight JavaScript state management.
React Query: Effortless API data handling and caching.
Lucide-React-Native: Clean, lightweight SVG icons.
These libraries use the features already built into the Expo Go app. You can scan the QR code and see your changes instantly without a custom build.
Level 2: The "Pro" Performance Stack
Best for: Production apps, high-performance storage, and advanced animations.
npx expo install expo-dev-client react-native-mmkv react-native-reanimated react-native-worklets @shopify/flash-list
expo-dev-client: Turns your project into a custom app (replaces Expo Go).
react-native-mmkv: 30x faster storage using C++ logic.
react-native-reanimated: Smooth, UI-thread animations (120 FPS).
@shopify/flash-list: High-performance list rendering for massive data.
Installing these moves you out of the "Sandbox." You must now build your own Development Client to run this custom native code.
The Feature Comparison
| Feature | Level 1 (Safe Stack) | Level 2 (Pro Stack) |
| App Needed | Expo Go (App Store): You can test on your phone instantly with Expo Go. | Your Own Custom App |
| Setup Speed | Instant | Requires a Native Build |
| Performance | Standard | Peak (C++ & UI Thread) |
| URL Format | exp:// | exp+your-app:// |
| Target | Beginners / UI Design | Production / Pro Apps |
| What to Install | nativewind, zustand, react-query | mmkv, flash-list, dev-client |
My mistake wasn't installing the wrong libraries, it was installing them too early. Start with the "Safe" stack to build your UI. Only add the "Pro" tools when you actually need that extreme performance or custom native power. This keeps your workflow fast and your QR codes working!
"I’m documenting every step of this journey so we can learn together. Don’t just read, build!
Ready to take the leap? You can find the full series here. Be sure to run the setup today, and drop a comment if you run into any bugs. Let’s build something great together!