File: installing-updates.md | Updated: 11/15/2025
Hide navigation
Search
Ctrl K
Home Guides EAS Reference Learn
Archive Expo Snack Discord and Forums Newsletter
Copy page
Learn how to install and configure expo-updates in your existing React Native project.
Copy page
expo-updates is a library that enables your app to manage remote updates to your application code. It communicates with the configured remote update service to get information about available updates. 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.
Do you use Continuous Native Generation (CNG) in your project?
You may be reading the wrong guide. To use expo-updates in a project that uses CNG
, see EAS Update "Get started"
.
The expo package must be installed and configured. If you created your project with npx @react-native-community/cli@latest init and do not have any other Expo libraries installed, you will need to install Expo modules
before proceeding.
To get started, install expo-updates:
Terminal
Copy
- npx expo install expo-updates
Then, install pods for iOS:
Terminal
Copy
- npx pod-install
Configuring expo-updates library
Apply the changes from the diffs from the following sections to configure expo-updates in your project.
Run eas update:configure to set the updates URL and projectId in app.json.
Terminal
Copy
- eas update:configure
Modify the expo section of app.json. If you created your project using npx @react-native-community/cli@latest init, you will need to add the following changes including the updates URL
.
The example
updatesURL andprojectIdshown below are used with EAS Update. The EAS CLI sets this URL correctly for the EAS Update service when runningeas update:configure.
If you want to set up a custom expo-updates server
instead, add your URL to updates.url in app.json.
app.json
Copy
{ "name": "MyApp", "displayName": "MyApp", "expo": { "name": "MyApp", ... "updates": { - "url": "https://u.expo.dev/[your-project-id]" + "url": "http://localhost:3000/api/manifest" } } }
Modify android/app/build.gradle to check for the JS engine configuration (JSC or Hermes) in Expo files:
Modify android/app/src/main/AndroidManifest.xml to add the expo-updates configuration XML so that it matches the contents of app.json:
If using the updates server URL (a custom non-HTTPS update server running on the same machine), you will need to modify android/app/src/main/AndroidManifest.xml to add the update server URL and enable usesCleartextTraffic:
android/app/src/main/AndroidManifest.xml
Copy
<application android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:allowBackup="false" android:theme="@style/AppTheme" + android:usesCleartextTraffic="true" > - <meta-data android:name="expo.modules.updates.EXPO_UPDATE_URL" android:value="https://u.expo.dev/[your-project-id]"/> + <meta-data android:name="expo.modules.updates.EXPO_UPDATE_URL" android:value="http://localhost:3000/api/manifest"/> </application>
Add the Expo runtime version string key to android/app/src/main/res/values/strings.xml:
Add the file Podfile.properties.json to the ios directory:
ios/Podfile.properties.json
Copy
{ "expo.jsEngine": "hermes" }
Modify ios/Podfile to check for the JS engine configuration (JSC or Hermes) in Expo files:
Using Xcode, add Expo.plist file to ios/your-project/Supporting with the following content to match the contents of app.json:
Expo.plist
Copy
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>EXUpdatesCheckOnLaunch</key> <string>ALWAYS</string> <key>EXUpdatesEnabled</key> <true/> <key>EXUpdatesLaunchWaitMs</key> <integer>0</integer> <key>EXUpdatesRuntimeVersion</key> <string>1.0.0</string> <key>EXUpdatesURL</key> <string>http://localhost:3000/api/manifest</string> </dict> </plist>
expo-updates API reference
for more information on how to use the library.expo-updates with a custom server that implements the Expo Updates protocol
. See custom-expo-updates-server README
.