Minutes, not review cycles
Fix a bug in JavaScript and every user has it on their next launch. No App Store or Play Store review for JS and asset changes.
Over-the-air updates for React Native that run on your Cloudflare account. Crash rollback, code signing and staged rollouts built in. Open source.
$ npm install react-native-airdrop$ airdrop release -p ios -m "Fix checkout" --rollout 20
Releasing My App • ios • runtime 2.4.0 • channel production
$ react-native bundle --platform ios --dev false ...
$ hermesc -emit-binary -O ...
38 files (2.41 MB), 1 new to upload, 37 already on server
↑ main.jsbundle (2.1 MB → 612 KB gz)
✔ Published update 7c070454-84bd-4dc2 (20% rollout, signed)
$ airdrop updates list
id platform status installs rollbacks message
7c070454 ios 20% 1,284 0 Fix checkout
a83d4042 ios 100% 48,920 3 Price formattingFeatures
Fix a bug in JavaScript and every user has it on their next launch. No App Store or Play Store review for JS and asset changes.
If a new update crashes before your app renders, the next launch boots the previous bundle and that update is never installed again.
ECDSA P-256 signatures verified on device with a key baked into your binary. Even a compromised server can't ship code.
Files are content-addressed. Devices only download what changed and reuse the rest, gzip-compressed and cached at the edge.
Staged rollouts from 1% to 100%, staging/production channels, mandatory updates, promote between channels, instant rollback.
Updates are bound to a runtime version, so JS never runs against native code it wasn't built for. New store builds reset OTA state.
How it works
One Worker, one D1 database, one R2 bucket, on your own Cloudflare account.
cd apps/server
pnpm run deployPoint the bundle URL at Airdrop and wrap your root component.
import { withAirdrop } from "react-native-airdrop";
export default withAirdrop(App);Bundle, sign and publish from your laptop or CI. Roll back with one command.
airdrop release -p android
airdrop rollback <updateId>Safety net
Every update must call home with notifyAppReady() after it renders. If it crashes first, the next launch silently restores the previous bundle, blacklists the update on that device and reports a rollback, so you see it in airdrop updates list before your users do.
Compare
| Airdrop | EAS Update | CodePush | |
|---|---|---|---|
| Ships JS + assets without store review | ✓ | ✓ | — |
| Self-hosted on your Cloudflare account | ✓ | — | archived |
| Works with bare React Native (no Expo) | ✓ | via expo-updates | ✓ |
| New Architecture | ✓ | ✓ | partial |
| Automatic crash rollback | ✓ | ✓ | ✓ |
| End-to-end code signing | ✓ | ✓ | ✓ |
| Per-file diff downloads | ✓ | ✓ | — |
| Pricing | your Cloudflare bill | per MAU | retired Mar 2025 |
Native code can't be updated over the air on any platform: Apple and Google forbid downloading executable code. Airdrop keeps JS and native in sync with runtime versions instead. Why?
Open source, MIT licensed, runs on infrastructure you already pay for.