CodePush Migration Guide 2026: Move to SwiftPatch in 30 Minutes
Step-by-step guide to migrate from Microsoft CodePush to SwiftPatch. CodePush is deprecated — migrate in 30 minutes with automatic configuration conversion, zero downtime, and 98% smaller patches.
Why You Need to Migrate From CodePush Now
Microsoft officially shut down App Center and CodePush in March 2025. If you're still using CodePush, you're running on borrowed time — the servers are no longer maintained, there are no security patches, and the SDK hasn't been updated for React Native 0.76+.
SwiftPatch is the most popular CodePush replacement. It's purpose-built to be the modern alternative with 98% smaller differential patches, automatic rollback, and enterprise security. Over 2,500 organizations have already migrated.
Before You Start: What You'll Need
- A React Native project currently using
react-native-code-push - Node.js 18+ installed
- 30 minutes of uninterrupted time
- Access to your app's deployment keys (from App Center)
Step 1: Create a SwiftPatch Account (2 minutes)
Sign up for free at app.swiftpatch.io. The free tier includes 5,000 deploys/month and 2 apps — enough for most migration testing.
Create a new project in the SwiftPatch Console and note your deployment key (you'll need it in Step 3).
Step 2: Remove CodePush SDK (5 minutes)
# Remove CodePush
npm uninstall react-native-code-push
# For iOS, clean pods
cd ios && pod install && cd ..
AppDelegate.mm(iOS) — remove theCodePushimport andbundleURLoverrideMainApplication.ktorMainApplication.java(Android) — remove CodePush package registrationInfo.plist— removeCodePushDeploymentKey
Step 3: Install SwiftPatch SDK (3 minutes)
# Install SwiftPatch
npm install swiftpatch
# iOS: install pods
cd ios && pod install && cd ..
Step 4: Replace CodePush in Your App Code (10 minutes)
Before (CodePush):
import codePush from 'react-native-code-push';
const codePushOptions = {
checkFrequency: codePush.CheckFrequency.ON_APP_RESUME,
installMode: codePush.InstallMode.ON_NEXT_RESTART,
};
function App() {
return <MyApp />;
}
export default codePush(codePushOptions)(App);
After (SwiftPatch):
import { SwiftPatch } from 'swiftpatch';
// Initialize SwiftPatch — same concepts, modern API
SwiftPatch.init({
deploymentKey: 'YOUR_SWIFTPATCH_KEY',
checkFrequency: 'ON_APP_RESUME',
installMode: 'ON_NEXT_RESTART',
autoRollback: true, // NEW: automatic crash rollback
});
function App() {
return <MyApp />;
}
export default App;
If You Used CodePush Sync:
// Before (CodePush)
codePush.sync({
updateDialog: true,
installMode: codePush.InstallMode.IMMEDIATE,
});
// After (SwiftPatch)
SwiftPatch.sync({
showUpdateDialog: true,
installMode: 'IMMEDIATE',
});
If You Used CodePush Hooks:
// Before (CodePush)
const update = await codePush.checkForUpdate();
if (update) {
await update.download();
update.install(codePush.InstallMode.IMMEDIATE);
}
// After (SwiftPatch)
const update = await SwiftPatch.checkForUpdate();
if (update) {
await SwiftPatch.downloadUpdate();
SwiftPatch.applyUpdate({ installMode: 'IMMEDIATE' });
}
Step 5: Deploy Your First SwiftPatch Update (5 minutes)
# Build and release for both platforms
npx swiftpatch release --platform ios --platform android
# Or release with a specific description
npx swiftpatch release --platform all --description "First SwiftPatch release - migrated from CodePush"
Open the SwiftPatch Console to see your release, monitor adoption, and manage rollouts.
Step 6: Verify the Migration (5 minutes)
- Build and run your app in development mode
- Push a small test update via SwiftPatch CLI
- Verify the update is received on-device
- Check the dashboard for adoption metrics
- Test rollback by pushing a deliberately broken update (SwiftPatch will auto-rollback)
CodePush → SwiftPatch Concept Mapping
| CodePush Concept | SwiftPatch Equivalent | Notes |
|---|---|---|
| Deployment Key | Deployment Key | Same concept, different key |
codePush.sync() | SwiftPatch.sync() | Same API pattern |
checkForUpdate() | SwiftPatch.checkForUpdate() | Same API pattern |
InstallMode.IMMEDIATE | 'IMMEDIATE' | String enum instead of number |
InstallMode.ON_NEXT_RESTART | 'ON_NEXT_RESTART' | String enum |
| Deployment (Staging/Prod) | Channels | More flexible channel system |
| Rollback (manual) | Auto-rollback + manual | Automatic crash detection |
| Full bundle release | Differential patch | 98% smaller downloads |
What You Get After Migration
After migrating to SwiftPatch, you immediately gain:
- 98% smaller patches: SwiftPatch uses binary-level diffing, so your users download ~200KB instead of 18MB for each update
- Automatic rollback: If an update crashes, SwiftPatch rolls back in under 3 seconds — no manual intervention needed
- Real-time analytics: See update adoption rates, download speeds, and error rates in real-time
- Bundle signing: Ed25519 cryptographic signatures ensure update integrity
- CI/CD integration: GitHub Actions, GitLab CI, CircleCI, and Bitrise out of the box
- Active development: Weekly updates and new features — unlike CodePush which is abandoned
Troubleshooting Common Migration Issues
"Bundle not found" after migration
Make sure you've removed all CodePush bundle URL overrides from your native code. SwiftPatch uses its own bundle loading mechanism.
App crashes on launch after installing SwiftPatch
Usually caused by leftover CodePush native code. Double-check that react-native-code-push is fully unlinked from both iOS and Android native projects.
Updates not being received
Verify your deployment key is correct and matches the project in the SwiftPatch Console. Check the network tab in Flipper for API call errors.
FAQ
Q: Can I run CodePush and SwiftPatch simultaneously during migration?
A: No, you should remove CodePush completely before installing SwiftPatch. Both modify the bundle loading mechanism and will conflict.
Q: Will my existing CodePush releases continue to work?
A: No. Since App Center is shut down, CodePush servers are no longer available. All existing releases will stop working — which is why you need to migrate.
Q: How long does the full migration take?
A: Most teams complete migration in 30 minutes. Complex setups with custom CodePush configurations might take up to 2 hours.
Q: Is SwiftPatch compatible with my React Native version?
A: SwiftPatch supports React Native 0.60+ including the New Architecture (0.76+). If CodePush worked with your project, SwiftPatch will too.
Q: What about my deployment history and release metadata?
A: CodePush release history is lost since App Center shut down. SwiftPatch starts fresh with your first release. This is a clean slate with better analytics.
Ready to ship updates faster?
Get started with SwiftPatch for free. No credit card required.
Join WaitlistRelated Articles
Expo EAS Update Pricing: Cost, Bandwidth & What It Really Costs at Scale
Expo EAS Update feels cheap when you're starting out. Then your app grows. Here's how Expo actually bills for EAS Update, why costs grow faster than you expect, and what happens when you're shipping frequent releases to real users.
ComparisonExpo EAS Update Alternative — Best Expo Updates Replacement with Patch Updates
Expo EAS Update works well inside the Expo ecosystem. But as apps scale, teams need patch updates, rollback, internal testing, bare React Native support, and on-premise hosting. Here's how SwiftPatch compares.
GuidePatch Updates: The Modern CodePush Alternative
Microsoft CodePush is deprecated. Learn how to migrate to SwiftPatch, the modern OTA update platform for React Native with 98% smaller patches, automatic rollback, and enterprise security.