Over-the-air updates for React Native,
without EAS or Expo cloud
Ship JavaScript and asset updates to your Expo / React Native apps instantly — without Expo cloud, without EAS, without per-request billing. Channels, rollbacks, code signing and analytics built in.
$ npm install -g otapush
$ otapush login
$ otapush init
$ otapush publish --channel staging --platform ios
✓ Update 8f3a2c1 published to staging (ios)The same protocol as EAS Update: the expo-updates client, unchanged.
Your app talks to the update server over the standard Expo Updates protocol — the same client library you already use, no new SDK required.
Channels
Dev, staging and prod channels out of the box. Publish to staging, verify on real devices, promote to prod in one click.
Instant rollback
A bad release is one click away from being undone. Roll a channel back to the previous update — clients recover on next launch.
Real-time stats
Monthly active users, update checks, downloads and installs — broken down by day, channel and platform.
iOS + Android
One publish pipeline for both platforms. Per-platform channel state, so an iOS hotfix never disturbs Android users.
Expo & bare React Native
Managed Expo projects and bare RN alike — init patches app.json or your native AndroidManifest/Expo.plist, publish bundles with expo export or react-native bundle.
Code signing
Every manifest is signed with your app's private key. Clients verify signatures before applying an update — supply-chain safe.
No Expo account needed
Register, init, publish — that's all. No Expo login, no EAS CLI, no cloud lock-in: the app talks to the update server over the open protocol.
Otapush, EAS Update, CodePush
App Center — and with it CodePush — was retired on 31 March 2025. Here is where the remaining options differ.
| Update protocol | Otapush | EAS Update | CodePush (self-hosted) |
|---|---|---|---|
| Update protocol | Expo Updates Protocol v1 | Expo Updates Protocol v1 | CodePush, its own |
| Client library | expo-updates, unmodified | expo-updates, unmodified | react-native-code-push |
| Expo account | Not needed | Required | Not needed |
| Who runs the server | We do | Expo does | You do |
| Cost of leaving | Change one URL — the client is standard | Change one URL — the client is standard | Replace the client library |
| Payment in ₽, invoice for companies | Yes | No | Your own hosting bill |
Both Otapush and EAS Update speak the protocol the stock expo-updates client already implements, so moving between them is a configuration change rather than a migration.
Simple pricing
Metered by monthly active users (unique devices per month). The server keeps serving updates even over the limit — no surprise outages.
Free
- Up to 10 MAU
- One app
- Dev / staging / prod channels
- One-click rollbacks
- Basic stats
- Community support
For individual developers
Start for freeStart
- Up to 1,000 MAU
- Up to 3 apps
- Dev / staging / prod channels
- One-click rollbacks
- Basic stats
- Email support
For individual developers
Choose planProRecommended
- Up to 10,000 MAU
- Up to 10 apps
- Dev / staging / prod channels
- One-click rollbacks
- Full stats and analytics
- Code signing
- Priority support
For individuals and companies
Choose planBusiness
- Up to 100,000 MAU
- Unlimited apps
- Dev / staging / prod channels
- One-click rollbacks
- Full stats and analytics
- Code signing
For individuals and companies
Choose planEnterprise
- Unlimited MAU
- Unlimited apps
- Everything in Business
- On-premise setup assistance
For individuals and companies
Contact usPayment methods: Bank card (MIR / Visa / Mastercard) or SBP via T-Bank acquiring; Invoice to a bank account for legal entities (Pro plan and up).
Withdrawal from the contract is by written request; the plan stays active until the end of the paid period. The price of services not rendered is refunded on request under the public offer.
Draft pricing — final prices will be announced before launch.
Questions people ask before switching
Can I update a React Native app without an App Store review?
Yes, as long as the update only changes the JavaScript bundle and assets. Apple's Developer Program License Agreement §3.3.1(B) permits downloading interpreted code provided it does not change the app's advertised purpose or bypass OS security; Google Play's Device and Network Abuse policy carries the same exception for interpreted languages. Native code still requires a store release.
Do I need an Expo account or the EAS CLI?
No. Otapush implements Expo Updates Protocol v1, so the expo-updates library already in your app is the whole client. You point its update URL at your Otapush app and publish with the otapush CLI. Bare React Native projects work too — otapush init writes the native configuration for you.
What happens if the update server is unreachable?
Nothing visible to your users. expo-updates launches the bundle the device already has — the last update it downloaded, or the one shipped inside the binary — and simply tries again on the next launch. An update server outage cannot take an app down.
What exactly counts as a monthly active user?
One MAU is one device that checked for or downloaded an update at least once in a calendar month. A device checking a hundred times still counts once. Updates published, channels, and bandwidth are not metered at all.
What happens when I go over the plan limit?
Your apps keep receiving updates. Going over the limit is reported in the portal; no extra charge is added for it, and the update endpoint does not enforce the limit at all — an app in production does not stop working because of a billing threshold.
How do I move from EAS Update?
Point the update URL in your app config at your Otapush app, rebuild once so the new URL and signing certificate are in the binary, then publish. Because both sides speak the same protocol, nothing in your JavaScript changes.
Can I pay from outside Russia?
Not self-serve yet. Card and SBP payments are processed in rubles through Russian acquiring, and companies can pay by invoice. If you are outside Russia, write to us and we will arrange it.
Ship your first OTA update today
The free plan includes 10 MAU — unique devices per month. No card required.