~/swaraj.dev
Back to all posts
May 25, 20261 min read

Zero‑Downtime OTA Updates with Expo Updates and EAS

Learn how to combine Expo Updates with EAS to ship over‑the‑air patches without forcing users to reinstall, keeping your app alive during rapid iterations.

expoeasotaupdates

Insight

Expo's expo-updates module lets you push JavaScript and asset changes without a store release. When paired with EAS Build and EAS Update, you can ship a new bundle, let the client download it in the background, and apply it on the next foreground launch – all without disrupting the current session. The key is to enable fallbackToCacheTimeout and trigger a silent reload only when the new bundle is ready.

Example

// app.json (or eas.json) – enable OTA
{
  "expo": {
    "updates": {
      "fallbackToCacheTimeout": 0,
      "url": "https://u.expo.dev/<PROJECT_ID>"
    }
  }
}

// Somewhere in your root component
import * as Updates from 'expo-updates';
import { useEffect } from 'react';

useEffect(() => {
  const check = async () => {
    const { isAvailable } = await Updates.checkForUpdateAsync();
    if (isAvailable) {
      await Updates.fetchUpdateAsync();
      await Updates.reloadAsync(); // applies silently on next render
    }
  };
  check();
}, []);

Takeaway

Configure fallbackToCacheTimeout to 0 so the app never stalls waiting for a remote bundle, and let expo-updates handle the download silently. This pattern gives you zero‑downtime releases, ideal for hot‑fixes and feature flags, while keeping the user experience seamless.