Platform Features
Everything You Need for Production OTA Updates
Enterprise-grade React Native over-the-air updates — with binary diffing, crash-triggered auto-rollback, server-driven A/B testing, and full data sovereignty through Bring Your Own Storage.
Bandwidth
Binary Diffing — 15 MB Bundle to 94 KB Patch
Every time you push a React Native update, you change a handful of lines of JS. Your users, however, download the entire compiled bundle — often 10–20 MB — because most OTA platforms serve complete files. RNPush applies bsdiff, the same binary patching algorithm used by operating system update systems, to compute the smallest possible delta between the previous bundle your user has cached and the new one you just pushed.
The result is dramatic. A typical production bundle that weighs 15 MB compresses to a patch of roughly 94 KB — a 99% reduction in bytes transferred per device. At 100K daily active users pushing four updates a month, that difference is the gap between 6 TB of egress and 38 GB. With BYOS and standard S3 transfer pricing, you're looking at a monthly bandwidth bill measured in dollars instead of hundreds of dollars.
Binary diffing in RNPush works across all JavaScript engines and bundlers — not just Hermes. Whether your app targets Hermes, JSC, or a custom V8 build, and whether you bundle with Metro or Re.Pack, the diff algorithm operates on the output bytes, not the engine format. You get the same compression regardless of your build pipeline.
Key Points
- bsdiff algorithm — same technique as OS patch systems
- 15 MB → ~94 KB typical patch size (~99% reduction)
- Engine-agnostic: works with Hermes, JSC, V8, Re.Pack
- Patches are signed and integrity-verified before application
- Falls back to full bundle if cached version is missing
Reliability
Auto-Rollback — Crash Detected, Previous Bundle Loaded in 3 s
Shipping a bad update to production is a matter of when, not if. The question is how quickly your infrastructure recovers. Most OTA platforms, including Expo EAS and Stallion, have no built-in crash detection. When a broken bundle reaches users, they stay broken until your team notices, pushes a fix, and waits for propagation — a process that can take hours during which every affected user sees a crashed app.
RNPush's native SDK tracks crash counts in local persistent storage (MMKV where available, AsyncStorage as fallback). After each update, the SDK counts how many times the app crashes during the first N launches — a configurable threshold you set in rnpush.config.js. If that threshold is crossed, the SDK immediately loads the previous bundle from its local cache. This happens entirely on-device, before any network request, in under three seconds. Your server never needs to be involved in the recovery path.
Auto-rollback is included on every RNPush plan, including Hobby. You configure the crash threshold (default: 3 crashes in 5 launches), the launch window, and an optional webhook that fires on rollback so your team gets notified. For teams that previously ran 24/7 on-call rotations to monitor OTA deployments, this is often the single feature that justifies switching.
Key Points
- Crash tracking in MMKV / AsyncStorage — survives process restarts
- Configurable threshold: crashes per launch window
- On-device recovery in under 3 seconds — no network round-trip
- Rollback webhook for alerting (Slack, PagerDuty, etc.)
- Available on all plans including free Hobby tier
Experimentation
Server-Driven A/B Testing — No App Store Submission Required
Traditional mobile A/B testing requires you to ship both variants in a single binary, hide one behind a feature flag, and submit to the App Store — a process that takes days and locks both variants into the build. RNPush flips this model: you push variant A and variant B as separate OTA bundles, and the server decides which bundle each device receives based on rules you define in the dashboard.
Targeting is flexible. You can split traffic by percentage (e.g. 20% of users get variant B), by device type (iPad vs iPhone), by OS version, by app version range, or by custom user attributes you pass from your app code. RNPush evaluates targeting rules server-side and delivers the appropriate bundle URL. Your client SDK downloads and caches whichever bundle the server assigns — no feature-flag SDK required in your JS code.
When your experiment concludes, rolling out the winner is a single dashboard action: point 100% of traffic at the winning variant. Users who already have it cached get no new download. Users on the losing variant receive a tiny diff patch to the winner. The entire promotion happens without a new app build, without App Store review, and without any code change.
Key Points
- Server-side targeting: %, device type, OS, app version, custom attributes
- No feature-flag SDK needed in your React Native JS code
- Roll out winners instantly — single dashboard action
- Variant metrics dashboard: crash rate, update adoption, custom events
- Available on Growth and Scale plans
Data Sovereignty
Bring Your Own Storage — Your Bundles Never Touch Our Servers
Most OTA platforms act as a CDN for your compiled JavaScript. When you push an update, your bundle is uploaded to the vendor's infrastructure, stored on their servers, and served from their CDN to your users. This creates a compliance problem: your production JS code — which may contain business logic, API endpoint patterns, or proprietary algorithms — lives in a third-party data store you don't control.
RNPush BYOS changes the architecture entirely. You connect your own cloud storage bucket — AWS S3, Google Cloud Storage, or Cloudflare R2 — during setup. When you run npx rnpush push, the CLI diffs and signs your bundle locally, then uploads the patch directly to your bucket using your own credentials. RNPush's servers are involved only in the control plane: storing routing rules, crash telemetry, and experiment assignments. The actual bundle bytes live in your infrastructure, served from your bucket, billed to your cloud account.
This architecture makes SOC 2, HIPAA, and GDPR compliance straightforward. Your bundles inherit the access controls, encryption settings, audit logs, and retention policies you've already configured in your cloud account. There is no vendor DPA to negotiate, no third-party sub-processor to list, and no data residency question to answer — because your code never leaves your environment.
Key Points
- Supported providers: AWS S3, Google Cloud Storage, Cloudflare R2
- Bundles uploaded directly from your CI — RNPush servers never see them
- Inherits your IAM, KMS encryption, and audit logs
- Standard cloud egress rates (typically $0.009/GiB on S3)
- SOC 2 / HIPAA / GDPR compliance by architecture, not by contract
Developer Experience
One-Command CLI — From Zero to First Push in 10 Minutes
OTA migration projects stall because setup is painful. Configuring storage credentials, wiring the native SDK, setting up signing keys, and connecting CI pipelines can easily consume a sprint. RNPush is designed to be running in production before the end of your first hour.
The npx rnpush init command inspects your project and does the work for you. It detects whether you're on Expo Managed Workflow, Expo Prebuild, bare React Native, or migrating from Microsoft CodePush. It prompts for your storage provider, generates a minimal rnpush.config.js, installs and auto-configures the native SDK pod and Gradle dependency, and writes a sample CI step for GitHub Actions, Bitrise, or CircleCI. For CodePush migrations, npx rnpush migrate --from codepush rewrites your existing configuration with zero changes to your JS call sites.
The CLI is open source and runs entirely on your machine. No telemetry is collected during init. Your storage credentials are written only to your local config file and your CI secrets — they are never sent to RNPush servers.
Key Points
- npx rnpush init — auto-detects Expo Managed, Expo Prebuild, bare RN, CodePush
- Auto-configures native SDK (CocoaPods + Gradle) and storage credentials
- Generates CI step for GitHub Actions, Bitrise, CircleCI
- npx rnpush migrate --from codepush — zero JS code changes required
- CLI is open source — no init-time telemetry
Release Management
Deployment Channels — Staged Rollouts with Per-Channel Rollback
Shipping an update to every user at once is a risk you don't need to take. RNPush deployment channels let you model your release pipeline as a set of named environments — production, staging, preview, canary — each with its own active bundle, rollout percentage, and rollback history.
Percentage rollouts let you expose a new bundle to 5% of your production users, watch crash rates and adoption metrics, then ramp to 25%, 50%, and 100% at your own pace. If a problem appears at 10%, you roll back that channel with a single command — npx rnpush rollback --channel production — and only the users on the new bundle revert. Users who haven't updated are unaffected.
Channels are independent. A rollback on production does not affect staging. A canary channel can run a completely different bundle than production indefinitely. Teams use this to give QA engineers, internal beta users, or enterprise pilot customers a different update track without maintaining a separate app binary.
Key Points
- Named channels: production, staging, preview, canary — unlimited
- Per-channel percentage rollouts with real-time adoption metrics
- npx rnpush rollback --channel <name> — instant, targets only that channel
- Channel-specific crash-rate dashboards
- Promote a staged bundle to production with one command
How RNPush Compares to Expo EAS
Many of the features above are not available in Expo EAS OTA updates. Here's the quick view. See the full comparison with pricing →
| Feature | RNPush | Expo EAS |
|---|---|---|
| Binary diffing | ✅ All engines | ⚠️ Hermes only |
| Auto-rollback | ✅ All plans | ❌ Not available |
| A/B testing | ✅ Growth+ | ❌ Not available |
| BYOS | ✅ All plans | ❌ Expo CDN only |
| Flat-rate pricing | ✅ | ❌ MAU + bandwidth |
Ready to ship OTA updates with confidence?
Binary diffing, auto-rollback, A/B testing, and BYOS — all in a single platform with flat-rate pricing. Get started in 10 minutes.
Join the Waitlist →Free plan available · No credit card required