Skip to content

๐Ÿ”„ 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:

MethodWhat ChangesReview RequiredSpeed
๐Ÿ—๏ธ Full build (EAS Build)Native code, dependencies, app configYes (store review)1-7 days
โšก OTA update (EAS Update)JavaScript code, assetsNoInstant

๐Ÿค” When to Use Each โ€‹

Full build (store update):

  • ๐Ÿ“ฆ Adding or updating native dependencies
  • โš™๏ธ Changing app.json configuration
  • โฌ†๏ธ 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 โ€‹

bash
# Install expo-updates
cd packages/mobile
npx expo install expo-updates

# Configure EAS Update
eas update:configure

This adds the required configuration to app.json.

๐Ÿš€ Publishing an OTA Update โ€‹

After making changes to JavaScript code:

bash
# 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 โ€‹

ChannelPurpose
๐Ÿš€ productionLive app on the stores
๐Ÿ‘€ previewInternal testing builds
๐Ÿงช developmentDevelopment builds

โช Rollback โ€‹

If an OTA update introduces a bug:

bash
# 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 โ€‹

bash
# Build
eas build --profile production --platform android

# Submit to Google Play
eas submit --platform android --latest

In Google Play Console, the new version appears in your releases. Add release notes and roll it out.

๐ŸŽ iOS โ€‹

bash
# Build
eas build --profile production --platform ios

# Submit to App Store Connect
eas submit --platform ios --latest

In App Store Connect:

  1. ๐Ÿ”ข Create a new version (increment the version number)
  2. ๐Ÿ“ฆ Select the new build
  3. ๐Ÿ“ Fill in "What's New in This Version"
  4. ๐Ÿ“ค Submit for review

๐Ÿ”ข Version Numbering โ€‹

Follow semantic versioning:

Change TypeVersion BumpExample
๐Ÿ› Bug fixesPatch1.0.0 โ†’ 1.0.1
โœจ New featuresMinor1.0.1 โ†’ 1.1.0
๐Ÿ’ฅ Breaking changesMajor1.1.0 โ†’ 2.0.0

Update the version in packages/mobile/app.json:

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:

bash
# Check for Expo SDK updates
npx expo install --check

# Update to latest compatible versions
npx expo install --fix

Major Expo SDK upgrades (e.g., SDK 52 โ†’ 53) should be tested thoroughly:

  1. ๐Ÿ“– Read the Expo changelog for breaking changes
  2. ๐Ÿงช Update locally and test all app flows
  3. ๐Ÿ‘€ Build a preview version for testing
  4. ๐Ÿš€ 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:

yaml
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-interactive

Add your EXPO_TOKEN to GitHub repository secrets:

  1. ๐Ÿ”‘ Get your token: eas login then go to expo.dev/settings/access-tokens
  2. โš™๏ธ 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 build then eas submit for each platform
  • [ ] ๐Ÿ”ข Update version number in app.json for store updates
  • [ ] ๐Ÿ“ Write release notes / "What's New"
  • [ ] ๐Ÿ“Š Monitor crash reports after release
  • [ ] โญ Respond to any new reviews