Developer guides

React Native OTA Updates — Documentation

Ship JavaScript and asset changes to apps already installed on a device — no store review, no waiting. The five steps below take you from nothing to a shipped update.

Ship your first update

About ten minutes end to end. Steps 2–5 are once per app; after that, shipping is a single command.

  1. Create a free account

    1 min

    No card, no server to run. Every account starts on the Free plan.

  2. Install and connect

    2 min

    Run this in your React Native project. ota init detects your stack, creates the project, writes ota.config.js and the release scripts, and prints one SDK key per channel.

    terminal
    npm install @otaupdate/react-native
    npm install -g @otaupdate/cli
    
    ota login
    ota init
  3. Put the key in your build

    5 min

    One plugin entry for Expo, two edits per platform for bare React Native. The only step that differs by project type — both are in the quickstart, side by side.

  4. Add one line to your app

    1 min

    This checks on launch and on resume, installs on the next restart, and arms rollback protection.

    App.tsx
    export default withOtaUpdate(App);
  5. Rebuild once, then ship JS instantly

    3 min

    The rebuild is what puts the SDK in the binary — you only do it once, and it must be a release build. After that every JS change ships over the air in seconds.

    terminal
    npm run ota:staging     # ship to your staging channel
    npm run ota:prod        # ship to production
    npm run ota:doctor      # why isn't my update arriving?

Which setup are you on?

Only step 3 differs, and the quickstart covers both inline. These pages are the detail.

Before you start

OTA only runs in release builds

A debug build loads JS from Metro, so the bundle path is never consulted and nothing you publish will appear. Always test with a release build. This wastes more time than everything else on this page combined.

What an update can and cannot replace

Can: anything inside the JS bundle and its assets — screens, logic, styles, images.

Cannot: a new native module, a permission, an SDK bump, or an Info.plist change. Those still need a store release. Shipping JS that calls a native API the installed binary lacks will crash the app — keep the two apart with a runtime version.

All guides