Open Source

Self-hosted OTA Updates for React Native

Deploy JavaScript updates instantly without app store reviews. A powerful, self-hosted alternative to CodePush and EAS Updates.

# Push an update in seconds
$ ota release --app my-app --channel production

Creating bundle...
Uploading to server...
Release v1.2.3 published!

All 50,000 users will receive
the update on next app open.

Why OTA Update?

Everything you need for seamless over-the-air updates, with full control over your infrastructure.

☁

Self-Hosted

Run on your own Cloudflare Workers. No vendor lock-in, no usage limits, complete data ownership.

⚡

Instant Updates

Push updates in seconds. Users get changes on their next app open - no app store review needed.

🔒

Secure by Default

Ed25519 signature verification ensures bundles are authentic. SHA-256 hashes verify integrity.

📊

Rollout Control

Gradual rollouts, instant rollbacks, and multiple channels for staging, beta, and production.

📱

Expo + React Native

Works with both Expo (EAS Build) and bare React Native apps with native modules included.

📈

Analytics Built-in

Track update adoption, success rates, and failures. Know exactly how your releases perform.

Architecture

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                   │
                                      └──────────────────────────────────┘
        

Quick Start

Get up and running in minutes with these simple steps.

1
Install the SDK
npm install @vanikya/ota-react-native

# For Expo apps
npx expo install expo-file-system expo-crypto
2
Add to your app
import { OTAProvider } from '@vanikya/ota-react-native';

<OTAProvider config={{
  serverUrl: 'https://your-server.workers.dev',
  appSlug: 'my-app',
  appVersion: '1.0.0'
}}>
  <App />
</OTAProvider>
3
Install the CLI
npm install -g @vanikya/ota-cli

# Login to your server
ota login --server https://your-server.workers.dev
4
Push an update
# Create a release
ota release --app my-app \
  --channel production \
  -v 1.0.1

# Users get the update instantly!

Expo Plugin

Automatic native code configuration for Expo apps built with EAS Build.

1
Add Plugin to app.json
{
  "expo": {
    "plugins": [
      "@vanikya/ota-react-native"
    ]
  }
}
2
Build with EAS
# Build for Android
eas build --platform android

# Build for iOS
eas build --platform ios
?
What the Plugin Does

Android (MainApplication.kt)

  • Overrides getJSBundleFile()
  • Checks SharedPreferences for downloaded bundle path
  • Loads OTA bundle if exists, otherwise uses built-in bundle

iOS (AppDelegate.swift)

  • Overrides bundleURL()
  • Checks UserDefaults for downloaded bundle path
  • Returns OTA bundle URL if exists, otherwise uses built-in bundle

Important: Expo Go Not Supported

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.

Testing Checklist

Verify OTA updates work correctly across all platforms and project types.

🤖

Expo - Android

Setup

  • Add plugin to app.json: "plugins": ["@vanikya/ota-react-native"]
  • Install dependencies: expo-file-system, expo-crypto
  • Build with EAS: eas build --platform android

Functionality

  • Update check triggers on app open
  • Update banner/UI displays correctly
  • Bundle downloads without errors
  • Hash verification passes
  • Update applies on app restart
  • New content visible after restart
🍎

Expo - iOS

Setup

  • Add plugin to app.json: "plugins": ["@vanikya/ota-react-native"]
  • Install dependencies: expo-file-system, expo-crypto
  • Build with EAS: eas build --platform ios

Functionality

  • Update check triggers on app open
  • Update banner/UI displays correctly
  • Bundle downloads without errors
  • Hash verification passes
  • Update applies on app restart
  • New content visible after restart
🤖

Bare React Native - Android

Setup

  • Install package: npm install @vanikya/ota-react-native
  • Native module auto-linked (verify in MainApplication)
  • Override getJSBundleFile() in MainApplication
  • Build release APK: ./gradlew assembleRelease

Functionality

  • Update check triggers on app open
  • Bundle downloads via native module
  • SharedPreferences stores bundle path
  • App restart loads new bundle
  • Rollback works if update fails
🍎

Bare React Native - iOS

Setup

  • Install package: npm install @vanikya/ota-react-native
  • Run pod install in ios directory
  • Override bundleURL() in AppDelegate
  • Build release IPA via Xcode or xcodebuild

Functionality

  • Update check triggers on app open
  • Bundle downloads via native module
  • UserDefaults stores bundle path
  • App restart loads new bundle
  • Rollback works if update fails

Compare Solutions

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 ✕ ✕

Ready to ship faster?

Start deploying updates in minutes, not days. Your users will thank you.

Built with care by