CodePush was retired March 2025

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.

<1.5s
Update propagation
99.99%
Uptime SLA
15 min
Migration time

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.

01

New Architecture ready

100% compatible with Fabric and TurboModules. CodePush's New Architecture support was partial and buggy — AppSpacer guarantees full compatibility.

02

Global edge network

Updates propagate via our edge-mesh network in under 300ms globally. No cold starts, no variable latency, no minutes-long waits.

03

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.

04

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.

05

One-command setup

npx appspacer setup auto-detects your architecture and configures native files. No manual podfile edits.

06

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.

FeatureCodePush (retired)Expo EASStallionAppSpacer
Update propagationVariable (minutes)~30s~10s<1.5 seconds
New Architecture support Partial/buggy Full Full 100% guaranteed
Automatic crash rollback Manual only No Yes Yes
Uptime SLANone99.9%Not published99.99%
Bare React Native supportRequires Expo SDK Full
Expo managed workflow Yes
Phased / % rolloutsBasic only Advanced + cohorts
Dedicated supportCommunity onlyPaid plansEmail onlySlack, <30 min SLA
Free tierWas 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.

01

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.

terminal
# 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
02

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.

App.tsx — after (AppSpacer)
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);
03

(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.

UpdateBanner.tsx
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>
  );
}
04

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.

terminal
# 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.

Yes. Both Apple and Google explicitly permit OTA updates for JavaScript and asset changes that do not alter the app's core binary or primary purpose — this is the same policy CodePush operated under. AppSpacer stays within these boundaries by design. Every deployment includes a compliance check, and our legal documentation covers App Store Review Guidelines §3.3.2 and Google Play Developer Policy in detail.
Most engineers complete the full migration — uninstall, reinstall, swap the HOC, run npx appspacer setup, and push a test release — in under 15 minutes. If you built a complex custom update UI using CodePush's JS API, allow 30–45 minutes to adapt it to the useAppSpacer hook. Our migration documentation covers every edge case.
Yes, AppSpacer supports both Expo managed workflow and bare React Native. For Expo managed, you use the AppSpacer Expo plugin — add it to your app.json and run npx expo prebuild. For bare workflow, npx appspacer setup handles all native configuration automatically. You do not need to eject or restructure your project.
AppSpacer monitors crash rates in real time after every deployment using our built-in telemetry. You configure a crash rate threshold per deployment (default: 2% of sessions). If the threshold is breached within the monitoring window, AppSpacer automatically rolls back to the last stable version — no engineer needs to be online.
Yes, and this is one of the primary reasons teams migrate from CodePush. CodePush's New Architecture support was never officially completed — it had known bugs with Fabric rendering and TurboModule registration. AppSpacer was built with New Architecture as a first-class requirement. It is tested against every React Native release candidate and the 0.74+ release series.
Yes. Every appspacer deploy command accepts a --rollout flag (1–100) and an optional --cohort flag for targeting specific user segments. You can start at 5%, monitor the dashboard, then promote incrementally. Rollout promotion is a single command: appspacer promote --env production --rollout 100.
AppSpacer has a free tier that covers individual developers and small teams with up to 1,000 monthly active devices and 10 deployments per month. Paid plans scale with MAD count and deployment frequency, starting at $29/month. See the full pricing breakdown at appspacer.com/pricing.
AppSpacer is currently a managed cloud service — we handle the infrastructure, edge network, uptime, and security audits so you do not have to. We offer a private cloud deployment option for enterprise customers with strict data residency requirements (EU, US, or APAC). Contact our sales team to discuss private cloud options.

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.