~/swaraj.dev
Back to all posts
May 23, 20262 min read

OTA Updates: EAS Update vs CodePush – When to Choose Which

Compare Expo’s EAS Update with Microsoft’s CodePush for over‑the‑air releases, and learn a quick config tip to keep your bundle version in sync across platforms.

expoeascodepushotadeployment

Insight

Over‑the‑air (OTA) updates let you ship JavaScript changes without a store review, but the underlying mechanisms differ. EAS Update bundles the exact Metro output and ties it to a runtimeVersion defined in app.json, guaranteeing that native code and JS stay compatible. CodePush injects a new JS bundle into an already‑installed native binary, which can be risky if you’ve introduced native module changes that the old binary can’t satisfy. In practice, use EAS Update for pure JS/React Native changes and when you already rely on the Expo ecosystem; reserve CodePush for legacy bare React Native projects where you need a lightweight OTA layer.

Example

// eas.json – minimal EAS Update config
{
  "cli": { "version": ">= 3.0.0" },
  "build": { "development": { "developmentClient": true } },
  "submit": {},
  "update": {
    "fallbackToCacheTimeout": 0,
    "url": "https://u.expo.dev/<PROJECT_ID>"
  }
}

The fallbackToCacheTimeout: 0 forces the app to load the latest OTA bundle immediately, while the url points to your Expo project’s update channel.

Takeaway

Pick EAS Update when you control the native build (Expo managed or custom) and need reliable version matching. Reach for CodePush only in bare workflows where native changes are frozen and you want a lightweight OTA shim.