← All posts

Microsoft App Center CodePush is retired: your migration options

Microsoft retired App Center and its hosted CodePush service in 2025. Here are your options for keeping over-the-air updates in your React Native app — and how to migrate.

Microsoft Visual Studio App Center — the home of the hosted CodePush service — was retired in 2025. If your React Native app still ships over-the-air (OTA) JavaScript updates through App Center CodePush, you need a new backend before your deployment keys stop working.

The good news: the part you'd worry most about — the on-device client — is a stable, open-source protocol. You almost certainly don't need a new SDK. You need a new server to point the existing client at.

What actually goes away

CodePush had two halves: the native client that lives in your app, and the hosted service that stores bundles and answers update checks. Retiring App Center removes the hosted service. The client protocol lives on across several community services, so your migration is a server swap, not an app rewrite.

Your options

  • Self-host the open-source CodePush server. Full control, but you own the infrastructure, scaling, and storage.
  • A hosted CodePush-compatible service such as RevoPush — managed, paid tiers.
  • Pulsar — managed, or self-hosted on a paid plan, CodePush-protocol compatible, so the same client works unchanged.

Migrating with the least effort

Whatever you choose, the migration shape is the same because the client speaks one protocol:

  1. Stand up (or sign up for) a CodePush-compatible server.
  2. Create your app and copy its deployment keys.
  3. Change the client's deploymentKey and serverUrl — nothing else.
  4. Publish a release and confirm devices pick it up.

With Pulsar, that looks like:

export default codePush({
  deploymentKey: '<pulsar-deployment-key>',
  serverUrl: 'https://api.usepulsar.dev',
})(App);

Then ship:

pulsar release MyApp Production --platform ios --target 1.4.0

What to check before you cut over

  • Binary version targeting. Target the native app version your users are actually on, not just your latest. A release targeting 1.4.0 never reaches devices still on 1.3.x.
  • Signed bundles. If you signed updates on CodePush, keep the public key in the app and sign on the new server too.
  • Adoption visibility. Pick a service that reports which devices actually applied an update, not only how many were served — that's how you catch a stuck rollout early.

Migrating off CodePush is usually an afternoon, not a sprint. The client stays; only the server behind it changes.

[See the full CodePush → Pulsar migration guide →](/codepush-alternative)

Ship over-the-air updates with Pulsar.

Self-hostable and CodePush-compatible.

Get started →