🌐
Expo Documentation
docs.expo.dev › versions › latest › sdk › updates
Updates - Expo Documentation
A library that enables your app to manage remote updates to your application code. ... expo-updates is a library that enables your app to manage remote updates to your application code.
🌐
npm
npmjs.com › package › expo-updates
expo-updates - npm
Fetches and manages remotely-hosted assets and updates to your app's JS bundle.. Latest version: 29.0.15, last published: 13 days ago. Start using expo-updates in your project by running `npm i expo-updates`. There are 196 other projects in ...
      » npm install expo-updates
    
Published   Dec 08, 2025
Version   29.0.15
Author   650 Industries, Inc.
🌐
GitHub
github.com › expo › expo › blob › main › packages › expo-updates › CHANGELOG.md
expo/packages/expo-updates/CHANGELOG.md at main · expo/expo
An open-source framework for making universal native apps with React. Expo runs on Android, iOS, and the web. - expo/packages/expo-updates/CHANGELOG.md at main · expo/expo
Author   expo
🌐
Expo Documentation
docs.expo.dev › eas-update › download-updates
Downloading updates - Expo Documentation
An example of how to check for updates in the background · To ensure the background task is registered when the application starts, import and invoke the setupBackgroundUpdates function within the top-level component. import * as TaskManager from 'expo-task-manager'; import * as BackgroundTask from 'expo-background-task'; import * as Updates from 'expo-updates'; const BACKGROUND_TASK_NAME = 'task-run-expo-update'; export const setupBackgroundUpdates = async () => { TaskManager.defineTask(BACKGROUND_TASK_NAME, async () => { const update = await Updates.checkForUpdateAsync(); if (update.isAvailable) { await Updates.fetchUpdateAsync(); await Updates.reloadAsync(); } return Promise.resolve(); }); await BackgroundTask.registerTaskAsync(BACKGROUND_TASK_NAME, { minimumInterval: 60 * 24, }); }; setupBackgroundUpdates();
🌐
Expo Documentation
docs.expo.dev › bare › installing-updates
Install expo-updates in an existing React Native project - Expo Documentation
This guide explains how to set up a bare React Native project for use with EAS Update, a hosted remote update service that includes tools to simplify installation and configuration of the expo-updates library.
🌐
Expo
expo.dev › changelog
Changelog — Expo
Check out new updates and improvements to Expo and EAS from the Expo team.
🌐
Expo Documentation
docs.expo.dev › eas-update › introduction
EAS Update - Expo Documentation
EAS Update makes fixing small bugs and pushing quick fixes a snap in between app store submissions. It accomplishes this by enabling an app to update its own non-native pieces (such as JS, styling, and images) over-the-air.
🌐
Medium
medium.com › @caleb_23647 › expo-updates-fa846ce96640
Expo Updates. Hey React Native Expo developers! Have… | by Purple Wren Digital | Medium
November 30, 2023 - Expo Updates is a library from Expo that allows developers to instantly push app updates and changes to their in-testing (think TestFlight) or in-production app. It’s a part of the Expo ecosystem, which simplifies the React Native development ...
Find elsewhere
🌐
GitHub
github.com › SohelIslamImran › expo-in-app-updates
GitHub - SohelIslamImran/expo-in-app-updates: A lightweight and easy-to-use module for implementing native in-app updates for Android and iOS
A lightweight and easy-to-use module for implementing native in-app updates for Android and iOS - SohelIslamImran/expo-in-app-updates
Starred by 246 users
Forked by 11 users
Languages   TypeScript 36.6% | Kotlin 28.6% | Swift 24.5% | JavaScript 7.0% | Ruby 3.3%
🌐
GitHub
github.com › expo › custom-expo-updates-server
GitHub - expo/custom-expo-updates-server: A simplified demonstration of expo-updates protocol use.
Update updates.url in app.json and re-run the build steps below. The example Expo project configured for the server is located in /expo-updates-client.
Starred by 471 users
Forked by 123 users
Languages   TypeScript 84.8% | JavaScript 7.8% | CSS 6.4% | Shell 1.0%
🌐
Medium
shift.infinite.red › how-to-implement-over-the-air-updates-with-expo-updates-in-react-native-c26787d4a3cf
How to implement over the air updates with expo-updates in React Native | by Jamon Holmgren | Red Shift
September 20, 2021 - First, I updated the Signing & Capabilities -> Signing team to be my “Jamon Holmgren” team. ... I could then run the app in Release mode on the iOS simulator. I had a bit better luck with Android by just running the following: ... This opened up the Android emulator and ran it in release mode. By running expo publish I was able to push up various changes to Expo and watch the hash change, like so:
🌐
GitHub
github.com › expo › expo › tree › main › packages › expo-updates
expo/packages/expo-updates at main · expo/expo
The expo-updates module enables your app to manage remote updates to your application code.
Author   expo
Top answer
1 of 3
30

TL;DR: OTA updates are enforced by default. App Store updates can be enforced by adding code to check your app version on startup and, if there's a new version, open the App Store on your app's page.

There's two ways of updating a standalone Expo app:

  1. OTA update using expo-cli publish
  2. Using Google Play/App Store

Both of these methods have advantages and shortcomings.

OTA Updates

This is the usual way an update is delivered to Expo apps. OTAs are done via the expo CLI tool and deliver new Javascript code based on your package.json settings. This option also offers the option to publish code using release channels, meaning you could push updates first to you staging environment, validate the update and then push it to production via CLI like so:

expo-cli publish -release-channel staging # pushes and update to the staging channel
expo-cli publish -release-channel production # pushes an update to the production channel

If you are publishing but your standalone app is not updating you might be pushing code to the wrong release channel. You can read more about release channels here.

OTAs are enforced by default:

By default, Expo will check for updates automatically when your app is launched and will try to fetch the latest published version. If a new bundle is available, Expo will attempt to download it before launching the experience.

However it's possible to disable this behavior by setting updates.enabled to false in app.json and then implement your own logic (or none at all), as per the example in their docs:

try {
  const update = await Expo.Updates.checkForUpdateAsync();
  if (update.isAvailable) {
    await Expo.Updates.fetchUpdateAsync();
    // ... notify user of update ...
    Expo.Updates.reloadFromCache();
  }
} catch (e) {
  // handle or log error
}

This system is really great for pushing new JS code to your users, it really helps with live testing since you can test your app with your user, find a flaw, fix it and publish new code which will be almost instantly available for download.

Yet this method has its limitations, for example: you can't update the Expo SDK version this way, you must build a new standalone app and distribute it through the app store (or whatever other method of your choosing).

App Stores

This is the most common way to distribute your .apk and .ipa files. These files can be created by using the expo-cli build:android and expo-cli build:ios for Android and iOS respectively.

It seems like there's an Android API being tested to enforce apps to be updated via this method (SO thread, article), but I don't think it's available yet.

One possible solution to enforce updates via this method is to check your app version on startup and, if there's a new version available in the store, open the app's store page via deep linking so the user is able download it. The example below should help you visualize what I mean.

componentDidMount {
   const hasNewVersion = isStoreUpdateAvailable(); // Checks the store for a new app update
   if (hasNewVersion) {
     Linking.openURL("market://details?id=<>"); // Opens the app's store page so the user can download the update
   }
}

Here's the docs about linking to Google Play.

Hope this answers all your questions, if not leave a comment and I'll edit the answer.

2 of 3
14

UPDATED ANSWER

Since the accepted answer was posted, Expo made changes to the Updates API.

Here's the breaking change.

Updates.reloadFromCache has been renamed to Updates.reloadAsync, and Updates.reload has been removed.

  import * as Updates from 'expo-updates' // Updates*

  try {
    const update = await Updates.checkForUpdateAsync()
    if (update.isAvailable) {
      await Updates.fetchUpdateAsync()
      // NOTIFY USER HERE
      Updates.reloadAsync()
    }
  } catch (e) {
      // HANDLE ERROR HERE
  }

For those wondering where to run this code, I advise to insert it in the componentDidMount/useEffect() method.

🌐
GitHub
github.com › expo › UpdatesAPIDemo
GitHub - expo/UpdatesAPIDemo: Demo app showing the useUpdates() API
Force quit the app, and then issue a yarn update command like the one above, to run EAS Update again and upload a new update bundle to the server. Now start the app. Since the expo-updates module has the default configuration for automatic updates, it will query the server on startup, see that there is an update, and download it.
Starred by 78 users
Forked by 7 users
Languages   TypeScript 88.2% | JavaScript 5.4% | EJS 3.7% | Shell 2.7%
🌐
Expo Documentation
docs.expo.dev › eas-update › how-it-works
How EAS Update works - Expo Documentation
If the library does not find a newer update, it will instead run the newest downloaded update, falling back to the update that was embedded inside the app at build time if none have been downloaded. expo-updates downloads updates in two phases.
🌐
Expo
expo.dev › changelog › 2023-08-08-use-updates-api
UseUpdates() API for expo-updates - Expo Changelog
August 8, 2023 - The expo-updates module allows your app to download and manage remote updates to your application code.
🌐
Stack Overflow
stackoverflow.com › questions › tagged › expo-updates
Newest 'expo-updates' Questions - Stack Overflow
I have configured my app with expo-updates and configure all versions in app.config.ts and eas.json as stipulated in expo docs.
🌐
React Native
reactnative.dev › docs › upgrading
Upgrading to new versions · React Native
Upgrading your Expo project to a new version of React Native requires updating the react-native, react, and expo package versions in your package.json file. Expo recommends upgrading SDK versions incrementally, one at a time.