The React Native OTA Platform CodePush Should Have Been
Microsoft shut down App Center. Your OTA updates are broken. AppSpacer is the production-grade replacement — sub-1.5s propagation, automatic rollbacks, and a 15-minute migration path.
What happened to CodePush?
On March 31, 2025, Microsoft retired Visual Studio App Center — the platform that hosted CodePush. The dashboard went dark. CLI logins stopped working. Update delivery ceased for every team that hadn't already migrated.
Thousands of React Native teams were left scrambling. Some tried self-hosting the open-source CodePush server — a valid option, but one that trades OTA convenience for DevOps overhead, infrastructure costs, and zero uptime guarantees.
The real lesson: OTA updates are too critical to run on infrastructure where they are not the core product. AppSpacer was built from the ground up with one job — ship your React Native updates fast, safely, and reliably.
New Architecture ready
100% compatible with Fabric and TurboModules. CodePush's New Architecture support was partial and buggy — AppSpacer guarantees full compatibility.
Global edge network
Updates propagate via our edge-mesh network in under 300ms globally. No cold starts, no variable latency, no minutes-long waits.
Automatic crash rollback
Real-time crash rate monitoring after every deploy. If your threshold is breached, AppSpacer rolls back automatically — before most users are affected.
Atomic phased rollouts
Roll to 1%, 10%, or 100% of your user base. Canary by device type, region, or custom cohort. Built into the core — not a paid add-on.
One-command setup
npx appspacer setup auto-detects your architecture and configures native files. No manual podfile edits.
Dedicated support SLA
Priority response under 30 minutes via a dedicated Slack channel. CodePush had community-only support. Your production incidents deserve better.
AppSpacer vs CodePush vs the alternatives
Not all OTA platforms are equal. Here is how AppSpacer compares against CodePush (retired), Expo EAS Updates, and React Native Stallion across the dimensions that matter in production.
| Feature | CodePush (retired) | Expo EAS | Stallion | AppSpacer |
|---|---|---|---|---|
| Update propagation | Variable (minutes) | ~30s | ~10s | <1.5 seconds |
| New Architecture support | ✗ Partial/buggy | ✓ Full | ✓ Full | ✓ 100% guaranteed |
| Automatic crash rollback | ✗ Manual only | ✗ No | ✓ Yes | ✓ Yes |
| Uptime SLA | None | 99.9% | Not published | 99.99% |
| Bare React Native support | ✓ | Requires Expo SDK | ✓ | ✓ Full |
| Expo managed workflow | ✗ | ✓ | ✗ | ✓ Yes |
| Phased / % rollouts | Basic only | ✓ | ✓ | ✓ Advanced + cohorts |
| Dedicated support | Community only | Paid plans | Email only | Slack, <30 min SLA |
| Free tier | Was free | ✓ | ✓ | ✓ Yes |
Migrate from CodePush in 15 minutes
You do not need to rewrite your update handling logic. AppSpacer's SDK is designed to be a drop-in replacement for react-native-code-push. Follow these four steps and your first OTA deploy will be live before your next standup.
Remove CodePush, install AppSpacer
Uninstall the legacy package and replace it with the AppSpacer SDK. Both packages have the same native peer dependencies so there are no additional link steps.
# remove the old package npm uninstall react-native-code-push # install AppSpacer npm install react-native-appspacer # auto-configure native files (iOS + Android) npx appspacer setup
Replace the HOC in your App entry point
Swap out the codePush() wrapper with withAppSpacer(). The configuration shape is intentionally similar — most migrations are a direct find-and-replace.
import { withAppSpacer } from 'react-native-appspacer'; function App() { return <MyApp />; } export default withAppSpacer({ deploymentKey: 'sk_YOUR_KEY', appVersion: '1.0.0', updateDialog: true, // 5 built-in themes installMode: 'ON_NEXT_RESTART', })(App);
(Optional) Use the React hook for custom update UI
If you built a custom update flow with CodePush's JS API, AppSpacer provides a useAppSpacer hook with the same lifecycle events — checking, downloading, installing.
import { useAppSpacer } from 'react-native-appspacer'; export function UpdateBanner() { const { status, progress, update } = useAppSpacer(); if (status === 'idle') return null; return ( <View style={styles.banner}> {status === 'downloading' && ( <Text>Downloading update: {Math.round(progress * 100)}%</Text> )} {status === 'available' && ( <Pressable onPress={update}> <Text>Tap to install update</Text> </Pressable> )} </View> ); }
Deploy your first update
Authenticate with the CLI, then push. AppSpacer calculates the delta between versions and ships only what changed — your users download kilobytes, not megabytes.
# authenticate once npx appspacer login # push to production (canary: 10% of users first) npx appspacer deploy \ --env production \ --rollout 10 \ --description "Fix payment screen crash" # watch propagation in real time npx appspacer status
Your update is live. If the crash rate spikes, AppSpacer rolls back automatically. If it looks healthy, promote to 100% with a single command.
Common questions about migrating from CodePush
Everything your team will ask before signing off on the migration.
Your CodePush replacement is one command away
Thousands of engineers have already migrated. Join them and ship your next hotfix in seconds, not days.
Or run npm install react-native-appspacer and start now.