In a real app
The eas.json file is the first thing to read in a project. A healthy setup has at least three profiles: development (developmentClient: true, internal distribution), preview (release, internal distribution, preview channel), and production (production channel, autoIncrement for the build number). Each profile points at an EAS Update channel; that link decides which OTA updates a binary receives by default, and it can only be changed afterwards from inside the app, through Updates.setUpdateRequestHeadersOverride.
The usual pitfalls are about secrets and environment: EXPO_PUBLIC_* variables that differ between local and EAS, a git-ignored google-services.json therefore missing on the runner (pass it as a file-type environment variable), or an .easignore that accidentally excludes a required folder. Pinning Node, Xcode, or Java versions in the profile (node, image) avoids surprises when EAS changes its default images.
To diagnose a build that passes locally and fails on EAS, eas build --local replays the pipeline on your machine with the same steps. In an audit I check that credentials are managed by EAS or at least documented, that the production profile does not ship developmentClient, and that iOS builds run on an image compatible with the Xcode version Apple requires for submission.
Related terms
Prebuild (Continuous Native Generation)
The Expo command that generates the android and ios folders from app.json and config plugins instead of maintaining them by hand.
OTA update (EAS Update)
Shipping a new JavaScript bundle and its assets to installed apps without going through the stores; EAS Update is Expo’s service for it.
Development build
A debug build of your own app that includes expo-dev-client: your native modules, plus a launcher to connect to Metro.
Runtime version
The identifier that guarantees an OTA update is only applied to builds whose native code is compatible with it.
CocoaPods
React Native’s historical iOS dependency manager (Podfile, pod install, .xcworkspace), in maintenance mode and being replaced by SwiftPM.
Our services on this
Expo migration
Move a bare React Native app to Expo: prebuild, config plugins, development builds, EAS Build and Update. PR by PR, in your repo, without a rewrite.
App development
From idea to store with a squad of senior React Native engineers who already work together: scoping, Expo architecture, design system, CI/CD, handover.