We killed app-store releases for non-native changes
After moving 100% of JS-only changes to expo-updates, our release cadence went from weekly to ~9 per week and the crash rate dropped. Here's why.
I'm building cross-platform apps with Expo and writing about every load-bearing detail — OTA updates, remote config, version skew, staged rollouts — that lets a two-person team ship bug fixes in 90 seconds instead of waiting on the App Store.
A full walkthrough of the OTA pipeline I built at Studio: expo-updates to publish bundles, Firebase Remote Config to route users between channels, and a crash-aware client that rolls back the bundle if launch fails twice in a row. From git push to 100% rollout in under 4 minutes, with a 1% staging cohort that catches regressions before they spread.
Read the deep-diveAfter moving 100% of JS-only changes to expo-updates, our release cadence went from weekly to ~9 per week and the crash rate dropped. Here's why.
Remote Config does the cohorting, expo-updates does the delivery, and a tiny GitHub Action does the ramp. 40 lines of YAML, zero humans in the loop after merge.
A 60-line crash-counter persisted to MMKV: if the app dies during JS init twice in a row, it nukes the embedded update and boots the last known-good bundle. Saved my weekend in March.
Why runtimeVersion: "appVersion" is a trap, and the three lines of app.config.ts that fixed our 2.3% "white screen on update" reports.
Treating Firebase RC as the source of truth for both feature gates and OTA channel routing — same primitives, half the moving pieces, one config file in the admin console.
A taxonomy of changes that look JS-only but reach into native: image cache configs, Reanimated worklets, splash screens, deep-link schemes. Push them through the store, not the wire.
The metric I actually care about: time between bundle publish and 95% device adoption. Median is now 38 minutes. Last year it was 6 days.
Counter-intuitive: even pure-JS changes get a native build on every PR. It catches bridge-incompatible Reanimated upgrades before they reach a single real user.