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.
Create a free account
1 minNo card, no server to run. Every account starts on the Free plan.
Install and connect
2 minRun this in your React Native project.
ota initdetects your stack, creates the project, writesota.config.jsand the release scripts, and prints one SDK key per channel.terminalnpm install @otaupdate/react-native npm install -g @otaupdate/cli ota login ota initPut the key in your build
5 minOne 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.
Add one line to your app
1 minThis checks on launch and on resume, installs on the next restart, and arms rollback protection.
App.tsxexport default withOtaUpdate(App);Rebuild once, then ship JS instantly
3 minThe 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.
terminalnpm 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
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
Set up your app
Install the SDK
Add @otaupdate/react-native and the ota CLI to an Expo or bare React Native project, then connect the app with one command.
Configure Expo
Configure over-the-air updates in an Expo project with the OTA Update config plugin: one channel key, prebuild, and EAS Build notes.
Configure bare RN
Wire over-the-air updates into a bare React Native app: AppDelegate on iOS, MainApplication on Android (both templates), and the channel SDK key.
Wire up your app
Call the OTA Update SDK from your React Native app: check for updates, show progress, and control when a new bundle is applied.
Ship updates
Publish a release
Build a JavaScript bundle, publish it to a deployment, and verify that installed apps actually picked the update up.
Staged rollouts
Release to a percentage of devices, watch the failure rate, then widen. Bucketing is deterministic per device and per release.
Rollback
A rollback republishes the last good bundle as a new mandatory release, which reaches devices already running the bad build — unlike a pointer flip.
CI / CD
Publish over-the-air updates from a pipeline with a CI API key, including a GitHub Actions workflow you can copy.
Reference
CLI reference
Every ota CLI command: init, release, promote, rollback, status and doctor, plus the flags and environment variables they read.
SDK reference
Every method, install mode and no-update reason in the @otaupdate/react-native SDK.
Config reference
Every configuration option for the OTA Update SDK and CLI: channel SDK keys, ota.config.js, runtime versions and environment variables.
Plans & limits
What each plan includes: apps, monthly active users, releases, rollbacks and team members.
Developer Q&A
What you can and cannot ship over the air, how store review policy applies, and what happens when native code changes.