Expo
Why is my Expo app stuck on the loading screen?
Either your phone can't reach the development server, or the app is waiting for something that never finishes, such as a font, an asset, or an API call that runs before the splash screen is hidden. Check the terminal for a bundling error, try tunnel mode, and make sure hideAsync always runs.
Updated October 31, 2026
An app that never gets past the loading screen gives you almost nothing to go on. It does come down to one of two problems, though: either the app never arrives on your phone, or it arrives and then waits for something. Start by working out which one you have.
If it never finishes loading in Expo Go
Watch the terminal where you ran npx expo start while the phone is loading.
-
If scanning the QR code doesn’t open the app, scan it with your phone’s camera app, on iPhone or Android, and make sure your phone and computer are on the same Wi-Fi network. Expo Go also needs to be signed in to the same Expo account as the Expo CLI on your computer before the project will open.
-
If you see a red error in the terminal, the bundle failed to build. Fix that error first, since the phone will keep waiting until it can download a working bundle.
-
If the terminal shows nothing at all, your phone isn’t reaching your computer. Make sure both are on the same Wi-Fi network, and turn off any VPN. Public, office, and school networks can block devices from talking to each other, so try tunnel mode, which routes through the internet instead (reloads are slower, but it connects):
npx expo start --tunnel -
If loading gets slower each time, clear the bundler’s cache:
npx expo start --clear -
Check that your Expo Go version supports your project’s SDK. Each Expo Go release supports a specific SDK version, and you’ll see a message when your project needs a different one.
If it loads, then stays on the splash screen
Calling SplashScreen.preventAutoHideAsync() and hiding the splash once fonts or data have loaded is a good pattern with one weak spot. If the loading never finishes, or throws an error before hideAsync() runs, the splash stays up forever.
We’d call hideAsync() in a finally block, so the splash is hidden whatever happens:
useEffect(() => {
async function prepare() {
try {
await Font.loadAsync(fonts);
await loadInitialData();
} catch (error) {
console.warn(error);
} finally {
await SplashScreen.hideAsync();
}
}
prepare();
}, []);
Give network requests a timeout too, so a slow or unreachable server can’t hold the app on the splash screen. And if you’re testing in Expo Go, keep in mind that from SDK 52 on, you’ll see your app icon there in place of your configured splash screen, so this problem looks like your icon sitting on a plain background.
How you know it’s fixed
The app opens to its first screen on your phone, and if you turn off Wi-Fi while it starts, it shows an error or an empty state instead of waiting forever.
If it’s still stuck
Shake the phone to open the developer menu and reload, and check the logs for errors that appear during startup. In Draftbit, you can see the same startup errors in the preview logs, without a terminal.
Ask the agent
If your app is in Draftbit, paste this into the agent, and it can read your code and make the change for you.
My app gets stuck on the loading screen. Check the logs for errors while it loads, make sure the splash screen is always hidden even if loading fonts or data fails, and add a timeout or error state so the app can't wait forever.