Over-the-air (OTA) update
Pushing new JavaScript and assets straight to installed apps, so you can fix a bug in minutes without another store review.
See it
What it is
Cross-platform apps (React Native, Expo, Capacitor) ship a native shell plus a JavaScript bundle and assets. The shell has to go through store review. The bundle can be swapped without a new binary review, but not because downloaded code stops being code: both stores carve out room for interpreted code that stays within the purpose of the app they already approved, and that carve-out is the whole permission slip. An OTA update replaces that bundle on installed devices, so a typo, a broken API call, or a bad paywall can be fixed in minutes instead of days. Expo's EAS Update is the current mainstream tool, after Microsoft CodePush was retired in 2025.
Typical flow: the app checks a manifest on launch, downloads the new bundle in the background, and applies it on the next cold start (or immediately, if you are willing to interrupt someone). Pair it with staged rollout percentages and a one-click rollback, because an OTA that crashes on boot is the one bug you cannot fix with another OTA.
Two hard limits. First, technical: anything native (a new SDK, a permission, a config plugin, an upgraded runtime) still needs a store build, and pushing a bundle that expects native code the installed binary does not have will crash it. That is what runtime versions are for, so set them deliberately. Second, policy: store rules allow bug fixes and minor changes to interpreted code, but not changing what the app fundamentally is or sneaking past what a reviewer approved. Treat OTA as a repair tool, not a way around review.
Ask AI for it
Set up EAS Update for this Expo app. Configure production and staging channels mapped to release branches, set an explicit runtimeVersion policy tied to the native build so JS bundles can never land on an incompatible binary, and check for updates on app foreground with a background download that applies on next cold start. Add a small non-blocking 'Update ready, restart' banner instead of force-reloading mid-session. Include the CLI commands for publishing to a channel, doing a percentage rollout, and rolling back to the previous update.