Urgent.News

What's breaking now, across thousands of outlets.

Tech

Migrating a React Native app to the new EAS build and OTA workflow without a release freeze

The situation You are the lead mobile engineer on a React Native app that ships to 150 000 active iOS and Android users. The app currently uses the legacy **EAS Build Classic * workflow (the expo build:* commands) and OTA updates are delivered via expo publish . A security patch is required, but the team also wants to adopt the newer EAS Build v2 and EAS Update pipelines because they promise…

The lead mobile engineer is dealing with a React Native application that currently uses the legacy EAS Build Classic workflow and OTA updates via expo publish. The app serves over 150,000 active users on both iOS and Android. A security patch is needed, and the team also wants to adopt the newer EAS Build v2 and EAS Update pipelines.

However, when attempting to run eas build --profile production with the new configuration, the CI job fails on iOS due to unresolved native dependencies, while on Android, the build succeeds, but OTA updates are rejected on devices, causing a runtimeVersion mismatch error. The immediate challenge is a stalled security patch, a day of lost developer time, and the risk of delayed scheduled releases.

The issue arises from different native dependency resolution methods between the old and new workflows. Classic builds use the bundled native modules from the Expo Go client, whereas EAS Build v2 resolves each module from the node_modules tree. This mismatched version of expo-modules-core triggers the "Failed to resolve" error. Additionally, the new runtime version enforcement in expo-updates rejects updates produced by the new pipeline if the runtimeVersion in the OTA manifest doesn't match the one baked into the native binary. Cache incompatibilities and CI pipeline assumptions also contribute to the problems.

To migrate incrementally and avoid a dedicated freeze window, the engineer recommends the following steps:

1. Freeze the current production binary in the OTA manifest using eas update --branch production --runtime-version 1.0.0-classic. This pinning ensures that any OTA built with the new pipeline will be rejected until the version is deliberately bumped.

2. Add a new build profile for the new pipeline in eas.json, isolating the new build from the existing production profile. The runtimeVersion policy appVersion will automatically generate a version string based on the version field in app.json.

3. Align native dependencies on a fresh checkout by running npm ci and expo doctor. If any mismatched unimodule versions are reported, pin them in package.json and reinstall.

4. Generate a new OTA manifest that matches the new binary using eas update --branch migration --runtime-version 1.0.0-new. This manifest will be served only to devices that have installed the new binary, keeping classic users on the frozen runtime.

5. Build the new binary internally with eas build --profile production-new --platform ios for testing purposes on a test device.

6. Smoke-test the OTA on the new binary using eas update --branch migration --json. If an EXPO_UPDATES_ERROR: Runtime version mismatch occurs, double-check the runtimeVersion in app.json and the OTA manifest.

7. Roll out the migration gradually to a percentage of users (e.g., 10%) through the OTA dashboard.

Written by urgent.news from Dev.to's reporting — not their text. Machine-written — may contain errors; check the original before relying on it.

Read the original at dev.to →

More in Tech

Group Chats Are Not DMs: Routing Rules for WeChat Customer Service Auto-Reply

E-commerce teams on WeChat answer customers in two different arenas: one-to-one direct messages, and group chats — buyer groups, VIP groups, store announcement groups.

  • WeChat groups vs. DMs require separate routing rules due to distinct interaction dynamics.
  • Bot in group chats causes noise amplification, answer misattribution, and risk exposure.
  • WeChat's routing table treats DMs and groups as separate rule sets with distinct triggers and caps.

Hello DEV! My Goals for Hacktoberfest 2026

Hello everyone! 👋 I'm jumping into Hacktoberfest and excited to dive deeper into the open-source community. What I'm working on Exploring open-source repositories and making meaningful contributions.

I'm building an open-source platform for your database, API, auth and apps

I'm Duc. Since May 2025 I've been building Excalibase on nights and weekends, next to my day job. It started as a GraphQL engine for Postgres, because I like SQL.

  • Duc developed Excalibase as an open-source platform since May 2025.
  • Platform includes database, API (GraphQL and REST), auth, and apps.
  • Future plans involve static frontends on Cloudflare and AI agent workflows.

More from Saturday 17 October →