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.
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.