Skip to Content
BlogIntroducing AppSpacer — OTA Updates for React Native, Reimagined

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:

  1. Self-hostable — no vendor lock-in, no surprise deprecation notices
  2. Framework-aware — supporting both Traditional and New Architecture React Native projects
  3. Safe by default — automatic rollback on crash, SHA-256 verification, and atomic installs
  4. 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" \ --mandatory

One 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:

ThemeStyle
Premium DarkDark mode with vibrant glow effects
GlassModern glassmorphism with frosted transparency
Bottom SheetiOS-style slide-up sheet
MinimalClean, utility-focused light theme
Full ScreenImmersive 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 setup

The 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.mm or AppDelegate.swift)
  • Creates .appspacer.bak backups 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 setup

3. 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.0

That’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.

Last updated on