๐ Updates & Maintenance โ
After your app is live on the stores, you'll need to publish updates periodically โ bug fixes, new features, or menu changes. This page explains the different update strategies and how to use them.
๐ Update Types โ
There are two ways to update your app:
| Method | What Changes | Review Required | Speed |
|---|---|---|---|
| ๐๏ธ Full build (EAS Build) | Native code, dependencies, app config | Yes (store review) | 1-7 days |
| โก OTA update (EAS Update) | JavaScript code, assets | No | Instant |
๐ค When to Use Each โ
Full build (store update):
- ๐ฆ Adding or updating native dependencies
- โ๏ธ Changing
app.jsonconfiguration - โฌ๏ธ Updating the Expo SDK version
- ๐ง Adding new native modules
OTA update (over-the-air):
- ๐ Bug fixes in JavaScript code
- ๐จ UI changes (colors, layouts, text)
- ๐ฑ New screens or features (JS-only)
- ๐ Translation updates
- ๐ Updating the API base URL
โก OTA Updates with EAS Update โ
Over-the-air updates let you push changes to users instantly without going through app store review. When users open the app, it downloads the latest JavaScript bundle in the background.
๐ง Setup โ
# Install expo-updates
cd packages/mobile
npx expo install expo-updates
# Configure EAS Update
eas update:configureThis adds the required configuration to app.json.
๐ Publishing an OTA Update โ
After making changes to JavaScript code:
# Publish an update to the production channel
eas update --branch production --message "Fix checkout button alignment"The update is available to users immediately. The next time they open the app, it downloads in the background and applies on the following launch.
๐ก Update Channels โ
| Channel | Purpose |
|---|---|
๐ production | Live app on the stores |
๐ preview | Internal testing builds |
๐งช development | Development builds |
โช Rollback โ
If an OTA update introduces a bug:
# List recent updates
eas update:list
# Roll back by republishing the previous good version
eas update --branch production --message "Rollback: revert checkout fix"๐๏ธ Full Store Updates โ
For changes that require a new native build:
๐ค Android โ
# Build
eas build --profile production --platform android
# Submit to Google Play
eas submit --platform android --latestIn Google Play Console, the new version appears in your releases. Add release notes and roll it out.
๐ iOS โ
# Build
eas build --profile production --platform ios
# Submit to App Store Connect
eas submit --platform ios --latestIn App Store Connect:
- ๐ข Create a new version (increment the version number)
- ๐ฆ Select the new build
- ๐ Fill in "What's New in This Version"
- ๐ค Submit for review
๐ข Version Numbering โ
Follow semantic versioning:
| Change Type | Version Bump | Example |
|---|---|---|
| ๐ Bug fixes | Patch | 1.0.0 โ 1.0.1 |
| โจ New features | Minor | 1.0.1 โ 1.1.0 |
| ๐ฅ Breaking changes | Major | 1.1.0 โ 2.0.0 |
Update the version in packages/mobile/app.json:
{
"expo": {
"version": "1.1.0"
}
}The buildNumber (iOS) and versionCode (Android) are auto-incremented by EAS when you have "autoIncrement": true in eas.json.
๐ Monitoring App Health โ
๐ฅ Crash Reporting โ
After publishing, monitor for crashes:
- ๐ค Google Play Console โ Android Vitals โ Crashes & ANRs
- ๐ App Store Connect โ App Analytics โ Metrics โ Crashes
- ๐ฆ Expo Dashboard โ Your project โ Updates (shows update adoption)
๐ฌ User Feedback โ
- โญ Respond to app store reviews promptly (see Store Listings)
- ๐ง Add an in-app feedback mechanism (email link in the Account tab)
๐ฆ Keeping Dependencies Updated โ
Periodically update Expo SDK and dependencies:
# Check for Expo SDK updates
npx expo install --check
# Update to latest compatible versions
npx expo install --fixMajor Expo SDK upgrades (e.g., SDK 52 โ 53) should be tested thoroughly:
- ๐ Read the Expo changelog for breaking changes
- ๐งช Update locally and test all app flows
- ๐ Build a preview version for testing
- ๐ Submit to stores after verification
๐ค Automating Builds with GitHub Actions โ
You can automate builds when you push to main:
Create .github/workflows/mobile-build.yml:
name: Mobile Build
on:
push:
branches: [main]
paths:
- 'packages/mobile/**'
- 'packages/shared/**'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- uses: expo/expo-github-action@v8
with:
eas-version: latest
token: ${{ secrets.EXPO_TOKEN }}
- run: npm ci
- name: Build Android
run: cd packages/mobile && eas build --profile production --platform android --non-interactive
- name: Build iOS
run: cd packages/mobile && eas build --profile production --platform ios --non-interactiveAdd your EXPO_TOKEN to GitHub repository secrets:
- ๐ Get your token:
eas loginthen go to expo.dev/settings/access-tokens - โ๏ธ Add it to GitHub: Repository โ Settings โ Secrets โ New repository secret
โ Checklist for Each Update โ
- [ ] ๐งช Make and test changes locally
- [ ] ๐ค Determine if this is an OTA update or full build
- [ ] โก For OTA:
eas update --branch production --message "description" - [ ] ๐๏ธ For full build:
eas buildtheneas submitfor each platform - [ ] ๐ข Update version number in
app.jsonfor store updates - [ ] ๐ Write release notes / "What's New"
- [ ] ๐ Monitor crash reports after release
- [ ] โญ Respond to any new reviews