CodePush in React Native

CodePush used to be the default answer for React Native over-the-air updates. That answer needs more context now. Microsoft retired Visual Studio App Center on March 31, 2025, and the hosted App Center workflow that many CodePush tutorials depended on is no longer a safe long-term default.
Quick Answer
You can still use over-the-air updates in React Native, but do not start a new app by blindly following old App Center CodePush tutorials. For a modern React Native app, choose one of these paths:
| Path | Best for | Tradeoff |
|---|---|---|
| EAS Update | Teams that want a maintained OTA service for JavaScript, styles, and assets | Requires expo-updates and an EAS workflow |
| Self-hosted CodePush-compatible service | Teams already invested in CodePush and willing to own infrastructure | You own hosting, keys, releases, monitoring, and migration risk |
| App Store / Google Play releases only | Apps with infrequent changes or strict native release control | Slower bug-fix delivery |
OTA updates are useful, but they do not replace native releases. Any change that touches native code, permissions, entitlements, SDK versions, icons, splash screens, app extensions, or bundled native assets still needs a new store build.
What Changed With CodePush?
Older React Native tutorials usually assumed this flow:
- create an App Center account;
- create CodePush apps and deployments;
- install
react-native-code-push; - publish updates through App Center CLI or CodePush CLI.
That flow is outdated because App Center has been retired. Microsoft published retirement guidance and pointed CodePush users toward a special version that can run independently from App Center, but that is not the same as having a hosted App Center product behind your updates.
Microsoft's standalone CodePush server repository is archived and provided without Microsoft support, so it should be treated as self-hosted infrastructure, not as a managed service replacement. If you are maintaining an existing CodePush integration, audit it before the next production release:
- where are deployment keys stored?
- which service serves update bundles?
- who owns the update server?
- how are bad updates rolled back?
- does the app block incompatible updates by native version?
- is update rollout visible in monitoring?
If you cannot answer those questions, treat the integration as release risk.