Deploy JavaScript updates instantly without app store reviews. A powerful, self-hosted alternative to CodePush and EAS Updates.
Everything you need for seamless over-the-air updates, with full control over your infrastructure.
Run on your own Cloudflare Workers. No vendor lock-in, no usage limits, complete data ownership.
Push updates in seconds. Users get changes on their next app open - no app store review needed.
Ed25519 signature verification ensures bundles are authentic. SHA-256 hashes verify integrity.
Gradual rollouts, instant rollbacks, and multiple channels for staging, beta, and production.
Works with both Expo (EAS Build) and bare React Native apps with native modules included.
Track update adoption, success rates, and failures. Know exactly how your releases perform.
Built on Cloudflare's global edge network for maximum performance and reliability.
React Native App Cloudflare Workers
┌──────────────────┐ ┌──────────────────────────────────┐
│ │ Check │ │
│ @vanikya/ │─────────────▶│ /api/check-update │
│ ota-react-native│ │ /api/download/:bundleId │
│ │◀─────────────│ /api/report-status │
└──────────────────┘ Bundle │ │
│ ┌──────────┐ ┌────────┐ ┌─────┐ │
CLI Tool │ │ D1 │ │ KV │ │ R2 │ │
┌──────────────────┐ │ │ metadata │ │ cache │ │bundles│
│ │ Deploy │ └──────────┘ └────────┘ └─────┘ │
│ @vanikya/ │─────────────▶│ │
│ ota-cli │ │ /api/apps │
│ │ │ /api/releases │
└──────────────────┘ │ /api/channels │
└──────────────────────────────────┘
Get up and running in minutes with these simple steps.
npm install @vanikya/ota-react-native # For Expo apps npx expo install expo-file-system expo-crypto
import { OTAProvider } from '@vanikya/ota-react-native';
<OTAProvider config={{
serverUrl: 'https://your-server.workers.dev',
appSlug: 'my-app',
appVersion: '1.0.0'
}}>
<App />
</OTAProvider>
npm install -g @vanikya/ota-cli # Login to your server ota login --server https://your-server.workers.dev
# Create a release ota release --app my-app \ --channel production \ -v 1.0.1 # Users get the update instantly!
Automatic native code configuration for Expo apps built with EAS Build.
{
"expo": {
"plugins": [
"@vanikya/ota-react-native"
]
}
}
# Build for Android eas build --platform android # Build for iOS eas build --platform ios
getJSBundleFile()bundleURL()OTA updates require a native build with EAS Build. They will NOT work in Expo Go because the plugin modifies native code that isn't present in Expo Go. After building with EAS, you'll have a standalone app that can receive OTA updates.
Verify OTA updates work correctly across all platforms and project types.
app.json: "plugins": ["@vanikya/ota-react-native"]
expo-file-system, expo-crypto
eas build --platform android
app.json: "plugins": ["@vanikya/ota-react-native"]
expo-file-system, expo-crypto
eas build --platform ios
npm install @vanikya/ota-react-native
MainApplication)
getJSBundleFile() in MainApplication
./gradlew assembleRelease
npm install @vanikya/ota-react-native
pod install in ios directory
bundleURL() in AppDelegate
xcodebuild
See how OTA Update stacks up against other solutions.
| Feature | OTA Update | EAS Updates | CodePush |
|---|---|---|---|
| Self-hosted | ✓ | ✕ | ✕ |
| Free tier | ✓ Unlimited | Limited | Limited |
| Open source | ✓ | ✕ | ✕ |
| Expo support | ✓ | ✓ | ✕ |
| Bare RN support | ✓ | Limited | ✓ |
| Signature verification | ✓ | ✓ | ✓ |
| Gradual rollouts | ✓ | ✓ | ✓ |
| Data ownership | ✓ Full | ✕ | ✕ |
Start deploying updates in minutes, not days. Your users will thank you.