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