CodePushMigration2025

May 2025 · 7 min read

CodePush Alternative in 2025: What to Use After Deprecation

Microsoft deprecated Visual Studio App Center — and with it, CodePush — in 2024. If your React Native app still relies on CodePush, or if you are planning your migration, this guide covers every viable option with an honest comparison.

What happened to CodePush

CodePush was Microsoft's free OTA update service for React Native (and Cordova) apps, hosted inside Visual Studio App Center. It was widely adopted because it was the only production-grade, free OTA solution available.

In March 2023, Microsoft announced App Center would be retired on March 31, 2025. This included the CodePush service. While App Center itself shut down, the open-source react-native-code-push SDK remains on npm — but the hosted backend no longer exists.

Teams still on CodePush need to migrate. The migration has two parts: replacing the hosted service and, in most cases, replacing the SDK (since react-native-code-push used a CodePush-specific protocol that no alternative implements).

Your options in 2025

There are four realistic paths:

Option 1: Expo EAS Updates

The most popular migration target. Expo EAS Updates is a managed hosted service with a polished CLI and dashboard. It uses the open Expo Updates protocol, which means broad SDK support and good documentation.

Downside: per-MAU pricing. At $99/month for 10,000 MAU and $299/month for 50,000 MAU, cost scales linearly with your user base. There is no predictable flat-rate tier.

Option 2: Relay OTA (self-hosted)

An open-source (MIT) OTA server that implements the Expo Updates protocol. You deploy it on your own infrastructure. Cost is flat — typically $5–30/month regardless of MAU. Requires a backend engineer for initial setup (~2–4 hours).

Option 3: Shorebird

A newer commercial OTA solution with a different approach: it patches the Dart engine rather than replacing the JS bundle. Not compatible with Expo-managed workflow. Has its own pricing model (per-patch or per-user depending on plan).

Option 4: Build your own

The Expo Updates protocol is open. You can build a minimal server that serves manifests and stores bundles in S3. Viable for teams with strong backend capacity and specific requirements not met by existing solutions.

Full comparison

Relay OTAExpo EAS UpdatesShorebirdRoll your own
Cost$5–30/mo flatPer-MAU ($0–$299+)Per-patch or per-userInfra only
Open sourceYes (MIT)NoNoYes
Self-hostedYesNoNoYes
ProtocolExpo UpdatesExpo UpdatesProprietaryAny
SDK changeNo (expo-updates)No (expo-updates)YesYes
Setup effort2–4 hours30 minutes1–2 hours1–4 weeks
DashboardYesYesYesBuild it
RollbackYesYesYesBuild it
Data residencyFull controlNoneNoneFull control
StatusActiveActiveActiveN/A

Which one should you pick

The answer depends on team size, MAU, and whether you have backend engineering capacity.

  • Under 10k MAU, no backend team: Expo EAS Updates. The free/low-cost tier covers you and the setup is minutes.
  • Over 20k MAU, cost is a concern: Relay OTA. The infrastructure cost is 10–30x less than EAS at scale. Payback on setup time is typically under one month.
  • Data residency or compliance requirements: Relay OTA or build your own. You need to control where bundles are stored.
  • Non-Expo bare React Native: Relay OTA or Shorebird. EAS Updates works best with managed Expo workflow.

Migrating from CodePush to Relay OTA

Unlike migrating to a different CodePush-compatible server, migrating to Relay OTA means replacing the SDK. CodePush used a proprietary protocol; expo-updates uses the Expo Updates protocol. These are not compatible.

Step 1: Remove react-native-code-push from your project and remove all CodePush invocations from your JS code.

Step 2: Install expo-updates:

npx expo install expo-updates

Step 3: Configure the updates URL in app.json:

{
  "expo": {
    "runtimeVersion": "1.0.0",
    "updates": {
      "url": "https://your-relay-instance.com/api/manifest",
      "enabled": true,
      "fallbackToCacheTimeout": 0
    }
  }
}

Step 4: Deploy Relay OTA and publish your first update. Your app will receive OTA updates on next cold start.

The most time-consuming part is setting up Relay OTA infrastructure (Neon, R2, compute). The app-side change is under 30 minutes for most projects.

Get started

Relay OTA is open source under the MIT License. Full deployment guide in the docs.