Ensure you have Node.js installed alongside a standard React Native or Expo project. Install the EAS CLI globally:
Log in or register an account on Expo:
Navigate to your project root and link it to your EAS account:
This creates an association in your app.json with an EAS project ID.
EAS configuration lives in an eas.json file at the root of your project. Run the setup generator:
This generates a boilerplate file. Modify your eas.json to define realistic development, preview, and production profiles:
Key insight: By default, Android builds produce an .aab (Android App Bundle) designed for the Play Store. Setting "buildType": "apk" in your preview profile outputs a standalone .apk file that you can install directly on test devices via USB or browser download.
To build a native iOS binary without running Xcode locally, invoke:
EAS handles the entire code signing workflow interactively:
- If you don't have an iOS Distribution Certificate or Provisioning Profile, EAS prompts to log in to your Apple Developer account.
- EAS generates and stores the certificates securely in Expo's cloud vault.
- The project bundles, uploads to an isolated macOS runner, runs native compilation, and returns a download link for your .ipa or simulator tarball.
Binary builds are required when adding new native dependencies or editing app permissions. However, if your changes are limited to JavaScript, TypeScript, or asset updates (e.g., UI tweaks, logic bug fixes), building a full binary is unnecessary.
Initialize EAS Update in your project:
Verify that app.json includes the runtime configuration:
When a bug occurs in production, patch your code and deploy directly to user devices:
The update compiles the JS bundle and assets, syncs them to Expo's CDN, and marks them for distribution. The next time users open the application, the new bundle downloads silently in the background and applies on the subsequent launch.
Expo's free tier provides 30 build credits per month across Android and iOS, with priority queues reserved for paid tiers. Optimize your monthly usage with these practices:
- Use local development clients: Run npx expo start for standard iteration instead of triggering a new build for every change.
- Rely on EAS Update for JS changes: Never spend a build credit on a UI color change, typo, or JavaScript logic tweak.
- Use the ios.simulator flag: iOS simulator builds finish faster and don't require an active paid Apple Developer account to test on macOS emulators.