Expo and React Native App Store Screenshots: A Practical Workflow
Capture Expo app store screenshots from a release build in the iOS simulator and Android emulator, automate them with Maestro and design every store size.
ScreenShipper team · · 7 min read
Quick answer: Build a release version of your Expo app for the simulator (npx expo run:ios --configuration Release or an EAS build profile with "simulator": true), open it in the iOS simulator and Android emulator, set a clean status bar, and capture with xcrun simctl io booted screenshot or adb exec-out screencap -p > screen.png. Expo's submit and metadata tools don't upload screenshots, so you design and upload them separately.
Why Not Screenshot Expo Go or a Development Build
It's tempting to grab screenshots from whatever is running in front of you. With Expo, that usually means a development build or Expo Go, and both leave traces:
- LogBox warnings and error toasts at the bottom of the screen.
- The developer menu or debugging overlays popping up mid-capture.
- JavaScript running in development mode, so animations and lists can feel slower or render differently.
- In Expo Go, native modules your app depends on may be missing, so some screens can't render at all.
A release build shows exactly what customers get, and Apple's guideline 2.3.3 asks for screenshots that show your app in use. Use a build that matches the version you'll submit.
Step 1: Make a Release Build for Simulators
Pick the route that fits your setup:
| Platform | Command or setting | Notes |
|---|---|---|
| iOS, on your Mac | npx expo run:ios --configuration Release | Requires Xcode; not code signed for the App Store, which is fine for screenshots |
| iOS, in the cloud | EAS build profile with "ios": { "simulator": true }, then eas build -p ios --profile preview | Produces an .app for the simulator |
| Android, on your machine | npx expo run:android --variant release | Runs on a connected emulator or device |
| Android, in the cloud | EAS build profile with "android": { "buildType": "apk" } | Install the APK with adb install app.apk |
To install a downloaded simulator .app, unpack it and run xcrun simctl install booted path/to/YourApp.app, or drag it onto the simulator window. On Xcode 27, simulators open in Device Hub instead of the old Simulator app; simctl commands keep working, and recent Expo CLI versions detect Device Hub.
Step 2: Prepare Screens with Demo Data and a Clean Status Bar
Use a screenshot mode. Expo inlines environment variables that start with EXPO_PUBLIC_, so EXPO_PUBLIC_SCREENSHOT_MODE=1 can tell your app to skip onboarding, sign in to a demo account and load realistic, fictional data. Every capture run then shows the same content.
Fix the status bar. On iOS, xcrun simctl status_bar booted override --time 9:41 --batteryState charged --batteryLevel 100 --cellularMode active --cellularBars 4 --wifiBars 3. On Android, use demo mode, starting with adb shell settings put global sysui_demo_allowed 1. Our clean status bar guide has every command.
Set the appearance. For a dark set, run xcrun simctl ui booted appearance dark on iOS or adb shell cmd uimode night yes on Android.
Wait for fonts and images. If you load fonts with expo-font or remote images, let them finish before capturing, or the first screenshot may show a fallback font.
Step 3: Capture Manually or Automate with Maestro
Manual capture works for one language and a few screens:
- Open the app on the simulator and go to the first screen.
- Run
xcrun simctl io booted screenshot 01-home.pngon iOS oradb exec-out screencap -p > 01-home.pngon Android. - Move to the next screen and repeat with a new file name.
Our Xcode simulator screenshot guide and Android emulator screenshot guide cover save locations and which device gives which size.
Maestro is an open-source UI testing tool that Expo's documentation uses for end-to-end tests, including runs on EAS Workflows. A Maestro flow is a short YAML file: launch the app, tap through screens and call takeScreenshot with a name at each stop, which saves a PNG. Run the same flow on each simulator and language to rebuild your whole set after every release. Check Maestro's documentation for the current syntax.
Other React Native projects use Detox or fastlane snapshot with native UI tests for the same job; our fastlane snapshot guide explains that route.
Step 4: Design and Size Screenshots for Both Stores
Raw captures become store screenshots once you add a headline, background and, optionally, a device frame. One design can serve both stores if each export follows that store's rules:
- App Store: the iPhone 6.3″ set (1206 × 2622 or 1179 × 2556) is required for every iPhone app; 6.9″ is optional. Upload 1 to 10 screenshots per size, without an alpha channel. See the iPhone size guide.
- iPad: if your app runs on iPad, App Store Connect requires 13″ iPad screenshots. Expo's
ios.supportsTabletsetting controls this, and some Expo templates set it totrue, so check your app config before submission day. Our iPad screenshot guide explains how to show a real tablet layout. - Google Play: 2 to 8 screenshots per device type, JPEG or 24-bit PNG, with the long side no more than twice the short side. Most modern phone captures are taller than that, so place them inside a 9:16 layout. See the Google Play size guide.
Step 5: Upload: What Expo Tools Do and Don't Handle
- `eas submit` uploads your signed build to App Store Connect or Google Play. Expo's documentation states it doesn't manage store listing metadata or screenshots.
- Expo Metadata (in beta) keeps App Store listing information in a
store.config.jsonfile and pushes it witheas metadata:push. Its documentation lists screenshot uploads as not supported, and Google Play isn't implemented yet. - App config fields such as
nameandiconset what's in the binary; they don't change store screenshots.
So you upload screenshots in App Store Connect and Play Console yourself, or with fastlane's deliver and supply actions if you already use fastlane.
Common Expo Screenshot Mistakes
- LogBox warnings left in the corner of a screenshot.
- A splash or sign-in screen as the first image. Apple asks for the app in use, not a login page.
- A stretched phone layout on iPad because
supportsTabletis on but the UI was never adapted. - Content under the Dynamic Island when safe areas aren't handled with
react-native-safe-area-contextor similar. - Expo Go branding or developer UI anywhere in the frame.
- Platform mix-ups, such as Android navigation bars in the App Store set.
Frequently Asked Questions
Can EAS upload my App Store screenshots?
No. eas submit uploads builds only, and Expo Metadata currently doesn't support uploading screenshots. Upload them in App Store Connect and Play Console, or with fastlane.
Can I take store screenshots from Expo Go?
You can, but development overlays, missing native modules and debug behavior make it risky. A release build on a simulator gives clean, accurate captures.
Do I need iPad screenshots for my Expo app?
Only if your app runs on iPad, which ios.supportsTablet controls. If it does, App Store Connect requires 13″ iPad screenshots that show your real tablet layout.
How do I automate React Native screenshots?
Maestro flows with takeScreenshot are the simplest option and run locally or on EAS Workflows. Detox and fastlane snapshot with native UI tests also work. Building with Flutter instead? See our Flutter screenshot guide.
Can I use the same screenshots for iOS and Android?
You can share the design, but export each store's sizes separately and capture each platform on its own OS. Apple's guideline 2.3.10 bars other platforms' imagery in App Store metadata.
Sources
From raw captures to store-ready screenshots
Drop your simulator or emulator captures into a template and export every store size, or frame a single screen with the free mockup generator.