CodePush is Shutting Down: Complete Migration Guide (2026)
Microsoft AppCenter CodePush shut down on March 31, 2025. If your React Native app still calls CodePush servers for OTA updates, those calls are failing silently right now. Here's how to diagnose the damage and migrate to a working alternative.
The CodePush Shutdown: What Happened
Microsoft announced in late 2024 that AppCenter — the platform hosting CodePush — would be retired on March 31, 2025. This was not a soft deprecation with a long runway; it was a full shutdown. After that date, the CodePush server endpoints returned errors and the service went dark.
The impact depends on how your app was configured. Apps set to mandatory update mode will prompt users with an update that can never complete, effectively bricking the experience. Apps in optional update mode will silently fail to update — your users continue running whatever bundle was last cached locally, with no new updates reaching them.
Either way, your OTA pipeline is broken. Every fix, feature, or A/B test you push through CodePush has zero delivery since March 31, 2025.
Why CodePush Apps Are Broken Right Now
The react-native-code-push SDK checks in with the AppCenter server on launch to fetch available updates. The check-in endpoint (codepush.azurewebsites.net) no longer responds. Depending on your SDK configuration:
- —Silent failure: update check times out, user stays on cached bundle.
- —Mandatory update loop: user is shown an update prompt that never resolves.
- —Crash on launch: apps with strict update enforcement may fail to start.
The only fix is to remove the CodePush dependency and replace it with a working OTA platform.
What to Look for in a Replacement
Not all OTA platforms are built the same. After CodePush, these are the capabilities worth evaluating before you pick your next provider:
Bring Your Own Storage (BYOS)
Your bundles should live in your own cloud bucket — not the vendor's CDN. BYOS gives you data sovereignty and eliminates per-GiB bandwidth bills.
Binary diffing
Diffing compresses updates from megabytes to kilobytes. A 15 MB bundle becomes a ~94 KB patch. Users download less; updates reach them faster.
Auto-rollback on crash
If a bad update causes crashes, the SDK should detect and revert automatically — before users even open a ticket. No manual hotfix required.
Predictable pricing
Avoid per-MAU or per-bandwidth models that grow unpredictably with your user base. Flat-rate plans let you budget confidently.
Step-by-Step Migration to RNPush
RNPush is protocol-compatible with CodePush, which means you don't need to rewrite your update-check logic — just swap the endpoint. Here's the full migration in five steps.
- 1
Remove the CodePush dependency
npm uninstall react-native-code-pushRemove the package and its native linking from your project. On bare React Native, run cd ios && pod install afterwards.
- 2
Install RNPush and initialise your project
# Install the SDK npm install @rnpush/client # Run the migration wizard npx rnpush migrate --from codepushThe wizard detects your existing CodePush configuration and generates an rnpush.config.js file with equivalent settings.
- 3
Connect your storage bucket
# rnpush.config.js module.exports = { storage: { provider: 's3', bucket: 'my-app-ota-bundles', region: 'us-east-1', }{, channels: ['production', 'staging'], };Supports AWS S3, Google Cloud Storage, and Cloudflare R2. RNPush needs write access to push bundles; your app only needs read access to fetch them.
- 4
Update your CI/CD push command
# Before (CodePush)
appcenter codepush release-react -a MyOrg/MyApp -d Production
# After (RNPush)
npx rnpush push --channel production
The RNPush CLI diffs your bundle against the last release, signs it, and uploads the patch directly to your storage bucket. No data passes through RNPush servers.
- 5
Verify with a staging release
npx rnpush push --channel staging --mandatory falsePush a test bundle to your staging channel, install the staging build on a device, and confirm the update is received. Once verified, push to production.
Common Migration Pitfalls
⚠ Forgetting to remove mandatory update flags
If your app had mandatory: true in CodePush and you remove the SDK without pushing a new binary, users will be stuck in an update loop on old builds. Release a new binary first, then remove CodePush from the SDK.
⚠ IAM permissions too broad
The RNPush CLI push command needs s3:PutObject on your bucket. Your app's SDK only needs s3:GetObject. Create separate IAM credentials for each — don't reuse your admin credentials.
⚠ Mismatched channel names
CodePush used 'Production' and 'Staging' (capital P/S). RNPush channel names are lowercase by default. Make sure your app build is configured with the matching channel name or updates won't resolve.
⚠ Not testing rollback before shipping
RNPush auto-rollback is configured by a crashThreshold value. Set it low (2–3 crashes) in staging and test it explicitly before trusting it in production.
Migrate in 10 minutes — free
RNPush is protocol-compatible with CodePush. The migration wizard handles 90% of the work automatically.
Join the waitlist →Free plan available · No credit card required