Introducing AppSpacer — OTA Updates for React Native, Reimagined
April 3, 2026
Mobile developers know the pain. You’ve found a critical bug, the fix is a one-line JavaScript change, but your users won’t get it for 3–7 days because it’s stuck in App Store review. Multiply that by every platform, every build variant, and every release cycle, and you have a workflow that’s fundamentally broken for the speed at which modern teams ship.
AppSpacer changes that. It’s a production-grade OTA (Over-The-Air) update platform purpose-built for React Native — designed to be the tool that CodePush should have been.
Why We Built AppSpacer
Microsoft’s CodePush served the React Native community well for years, but its deprecation left a vacuum. Teams needed a replacement that was:
- Self-hostable — no vendor lock-in, no surprise deprecation notices
- Framework-aware — supporting both Traditional and New Architecture React Native projects
- Safe by default — automatic rollback on crash, SHA-256 verification, and atomic installs
- Beautiful out of the box — premium update UIs that don’t look like they were built in 2015
AppSpacer delivers on all four.
What AppSpacer Does
At a high level, AppSpacer is three things:
1. A React Native SDK (react-native-appspacer)
Install it, wrap your root component, and your app is OTA-ready:
import { withAppSpacer, UpdateUIType } from 'react-native-appspacer';
function App() {
return <MyApp />;
}
export default withAppSpacer({
deploymentKey: 'sk_YOUR_KEY',
appVersion: '1.0.0',
updateDialog: true,
updateUI: UpdateUIType.GLASS,
})(App);That’s the entire integration. The SDK handles checking, downloading, verifying, installing, and restarting — with a beautiful glassmorphism dialog shown to the user.
For teams that want full control, there’s a useAppSpacerUpdate() React hook and a granular imperative API (checkForUpdate, downloadUpdate, restartApp).
2. A CLI (appspacer-cli)
Push updates from your terminal or CI/CD pipeline:
appspacer release-react-native android \
-a my-app \
-d Production \
-t 1.0.0 \
--description "Fixed checkout crash" \
--mandatoryOne command. It bundles your app, zips it, computes the hash, uploads to storage, and creates a release record. The entire process takes about 15 seconds.
3. A Backend & Dashboard
Manage your apps, deployments, teams, and release history through the AppSpacer dashboard. View adoption rates, rollback bad releases, and generate deployment keys — all in one place.
Safety First
OTA updates are inherently risky. A bad update can brick your users’ apps. That’s why AppSpacer has three layers of protection baked in:
Layer 1: SHA-256 Verification
Every downloaded package is verified against the server-provided hash before extraction. If the hash doesn’t match — network corruption, CDN issue, tampering — the update is rejected.
Layer 2: Atomic Installs
Updates use an atomic swap pattern: current_bundle is renamed to previous_bundle, then the new update becomes current_bundle. There is never a moment where no valid bundle exists.
Layer 3: Automatic Crash Rollback
If an update passes verification but crashes the app on boot (bad JavaScript), the native module detects the crash on the next launch and automatically reverts to the last stable version. No user action required. No support tickets.
Five Premium Update Themes
Most OTA update tools show users a boring native alert. AppSpacer ships with 5 hand-crafted UI themes that match modern app design:
| Theme | Style |
|---|---|
| Premium Dark | Dark mode with vibrant glow effects |
| Glass | Modern glassmorphism with frosted transparency |
| Bottom Sheet | iOS-style slide-up sheet |
| Minimal | Clean, utility-focused light theme |
| Full Screen | Immersive experience for major updates |
Set it with one line:
withAppSpacer({
updateUI: UpdateUIType.GLASS,
// ...
})(App);No custom components. No stylesheets. Just plug and play.
One-Command Native Setup
Configuring native files for OTA updates has always been the hardest part. You need to override bundle loading in MainApplication.kt (Android) and AppDelegate.mm (iOS), and the exact code depends on your React Native version and architecture.
AppSpacer automates this with a single command:
npx appspacer setupThe CLI:
- Detects your Android project structure
- Identifies whether you’re on New Architecture (
ReactHostDelegate) or Traditional (ReactNativeHost) - Injects the correct Kotlin/Java code
- Configures iOS (
AppDelegate.mmorAppDelegate.swift) - Creates
.appspacer.bakbackups of all modified files - Is idempotent — safe to run multiple times
Getting Started
1. Install the SDK
npm install react-native-appspacer
cd ios && pod install && cd ..2. Configure native files
npx appspacer setup3. Integrate in your app
import { withAppSpacer } from 'react-native-appspacer';
const App = () => <MyApp />;
export default withAppSpacer({
deploymentKey: 'sk_YOUR_DEPLOYMENT_KEY',
appVersion: '1.0.0',
updateDialog: true,
})(App);4. Push your first update
npx appspacer login -t pat_YOUR_TOKEN
npx appspacer release-react-native android -a my-app -d Staging -t 1.0.0That’s it. Fifteen minutes from npm install to your first live OTA update.
What’s Next
We’re actively working on:
- Delta updates — send only the diff, reducing download sizes by 80%+
- Staged rollouts — release to 10% of users first, then gradually increase
- Analytics dashboard — adoption rates, error tracking, and rollback insights
- Expo support — custom dev client integration for managed workflows
Try It Now
AppSpacer is open source and self-hostable. Check out the documentation to get started, or dive straight into the React Native SDK guide.
If you’re migrating from CodePush, the API is intentionally familiar — the transition should take less than an hour.
Ship faster. Ship safer. Ship with AppSpacer.