Expo OTA Updates: Fast Iteration Without Store Submissions
Expo's OTA update feature lets you ship JavaScript fixes directly to devices, bypassing store review. This guide covers setup, a worked example, and key limitations.
13 Aug 2025, 03:04 UTC

The problem of slow app releases
When a mobile app needs a quick fix, the usual path is to submit a new version to the store, wait for review, and then wait for users to update. This cycle can take days or weeks, which is unacceptable for many teams.
Expo OTA updates as a practical solution
Expo’s over‑the‑air (OTA) update feature lets developers push a new JavaScript bundle directly to devices, bypassing the store review process. The service is called EAS Update and is available from SDK 48 onward.
Configuring OTA in app.json
To enable OTA, the app.json must contain an updates block and a runtimeVersion field. Example:
runtimeVersion: 1.0.0
updates:
fallbackToCacheTimeout: 0
The runtimeVersion must be incremented each time a new bundle is prepared; otherwise Expo will cache the previous code and users will not see the update.
Worked example: pushing a quick fix
Suppose a typo in a welcome message needs changing. The steps are:
- Open a terminal in the project root (where app.json lives).
- Run
eas update --branch preview. This command builds the bundle and uploads it to the EAS Update service. - While the command runs, open the Expo Go app on a test device and select the Dev Client profile that matches the preview branch.
- When the download finishes, the new bundle is loaded automatically; the app’s version shown in Settings now reflects the updated runtimeVersion.
After the update, verify that the welcome message displays the corrected text. If the change does not appear, check that the runtimeVersion was bumped and that the device is using a recent Expo Go client.
Trade‑offs and limitations
OTA updates are powerful but have constraints:
- Only JavaScript and TypeScript code can be changed; native module modifications require a new binary.
- Devices running an older Expo SDK cannot receive OTA updates, so users must upgrade the client app.
- Large bundles may take longer to download on slow networks, affecting user experience during the rollout.
- If
runtimeVersionis not correctly incremented, Expo may serve a cached bundle, leaving users on stale code.
Verifying the update
To confirm that OTA is active, perform the following checks:
- Inspect app.json to ensure
updates.fallbackToCacheTimeoutis set to 0 and thatruntimeVersionis a new value. - Execute
eas update --branch previewfrom the project directory. The CLI must have permission to access the EAS account; this typically means an API token with admin rights. - Open Expo Go on a device, switch to the preview profile, and watch the bundle download progress in the console output.
- After the download, compare the version number displayed in the device’s Settings with the version listed in the EAS dashboard to ensure the new bundle is active.
Closing steps
Expo OTA updates provide a fast, low‑friction way to iterate on JavaScript code, which is ideal for rapid bug fixes and feature toggles. Remember to increment runtimeVersion for each release, test the bundle thoroughly before triggering the update, and be aware of the limits when native changes are required. By following the configuration and verification steps outlined above, you can safely adopt OTA updates and keep your app moving forward without the overhead of store submissions.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.