Blog

Tutorials

A Developer's Guide to React Native Code Push

Master React Native Code Push for instant app updates. Our guide covers setup, best practices, CI/CD automation, and comparisons to alternatives like EAS.

Writer

Nafis Amiri

Co-Founder of CatDoes

Dec 10, 2025

Title slide reading 'A Developer's Guide to React Native Code Push' in black text on a white background with subtle geometric grid lines at the bottom
Title slide reading 'A Developer's Guide to React Native Code Push' in black text on a white background with subtle geometric grid lines at the bottom
Title slide reading 'A Developer's Guide to React Native Code Push' in black text on a white background with subtle geometric grid lines at the bottom

A Developer's Guide to React Native Code Push

Imagine shipping a tiny fix for your app, like a typo, a color change, or even a critical bug, without begging the app stores for permission. No waiting days for a review. You just push the change, and it’s live for your users almost instantly. That’s the magic of React Native CodePush, a tool that delivers Over-the-Air (OTA) updates directly to your users' devices, making your development cycle ridiculously fast.

Why Instant App Updates Matter

A man works at a desk, looking at his smartphone while typing on a laptop, with 'INSTANT OTA UPDATES' overlay.

Think of a traditional mobile app update like mailing a package. You box it up, take it to the post office (the app store), and hope it gets approved and delivered in a few days. If you find a mistake right after you send it, you're out of luck. You have to start the whole process over again. This leaves critical bug fixes and simple improvements stuck in a queue.

CodePush completely flips this on its head. It’s more like editing a webpage. When you tweak a website's CSS or fix a typo, the change is live the moment a user reloads the page. React Native CodePush brings that same web-like speed and flexibility to your mobile app for a huge category of updates.

The Power of Over-The-Air Updates

At its core, CodePush is a service that lets you deploy changes to your app’s JavaScript bundle and assets (like images and fonts) directly, completely bypassing the app store submission process for these specific files. This approach unlocks some massive advantages:

  • Immediate Bug Fixes: Found a crash-causing bug? Push a patch to your entire user base in minutes, not days.

  • Faster Iteration: Want to test a new button color or tweak some copy? Roll out small features and A/B tests on the fly to get real user feedback.

  • A Better User Experience: Your app feels like it’s constantly improving, all without forcing users to go back to the store and download a whole new version.

This capability is a huge reason why React Native has become so popular. The global market for React Native app development was valued at USD 325 million in 2024 and is on track to hit USD 499 million by 2031. This explosive growth is fueled by the framework's ability to slash development costs and get products to market faster. For developers looking to get in on the action, exploring remote React Native job opportunities is a great place to start.

It's crucial to understand what CodePush can't do. It only works for JavaScript and asset updates. If you need to change anything in the native code, like adding a new native module or modifying project configurations, you still have to go through the good old app store release process.

Getting CodePush Running with Microsoft App Center

Jumping into React Native Code Push can feel like a big step, but it’s a pretty logical process when you break it down. The whole show is run by Microsoft App Center, which is their all-in-one platform for building, testing, and monitoring your apps. Your first job is to get your app registered in their cloud.

If you don't already have an account, you'll need to sign up for a free one. Once you're in, you’ll need to register your application. This is a key step: because React Native builds for both iOS and Android, you have to create two separate apps in the App Center dashboard, one for each platform.

Don't skip this or try to combine them. Each platform gets its own unique app secret and set of deployment keys. This is how CodePush knows exactly where to send the right updates, preventing you from accidentally shipping an Android bundle to an iPhone.

Getting the Tools in Place

With your apps set up in the cloud, it’s time to configure your local machine. This means installing the App Center Command Line Interface (CLI), which is how you'll talk to the App Center services right from your terminal.

You can grab it with a simple npm command:

npm install -g appcenter-cli

Once that's installed, you need to connect it to your account by running appcenter login. This command will pop open a browser window, ask you to log in, and then give you a special token to paste back into your terminal. It’s a secure way to link your computer to your App Center account.

Think of this CLI as your mission control for CodePush. You'll use it for everything from pushing out new updates to checking on your release history and managing your Staging and Production environments.

Integrating the SDK into Your Project

Next up, you need to bring the CodePush client-side SDK into your React Native project. This is the piece of the puzzle that lets your actual app talk to App Center to look for and download any available updates.

The process has three main parts:

  1. Install the SDK: Pull the react-native-code-push package into your project using npm or yarn.

  2. Link the Native Bits: You'll need to follow the specific instructions for iOS and Android to link the native code. This usually means running a quick pod install for iOS and making a few small tweaks to your Gradle files on the Android side.

  3. Plug in Your Deployment Keys: Grab the Staging and Production deployment keys from your App Center dashboard. You'll find them under the "Distribute > CodePush" section for each of your apps (iOS and Android). These need to be added to your native project configurations.

Key Takeaway: The deployment keys are the bridge between your app and the App Center service. The Staging key is for pushing test updates to your team, while the Production key is for the real deal that goes out to all your users.

Wrapping Your Root Component

The last, and maybe most important, step is to wrap your app's main component with the CodePush Higher-Order Component (HOC). This little wrapper is the brains of the operation on the client side, handling all the logic for checking, downloading, and installing updates. If you're just getting started with project structure, our guide on how to create an app with React Native is a great place to get your bearings.

By wrapping your App.js or another root component, you're giving the SDK control over the JavaScript bundle your app runs. You can tell it to check for updates silently in the background when the app starts, pop up a confirmation dialog for the user, or even force a mandatory update for a critical bug fix.

Once that wrapper is in place, you’re officially ready to deploy your first over-the-air update.

CodePush vs. EAS Updates: An Honest Comparison

When it comes to Over-the-Air (OTA) updates in the React Native world, two names dominate the conversation: Microsoft's CodePush and Expo's EAS Updates. Picking the right one isn't just about features; it's a decision that hinges almost entirely on how you started your project.

The core difference is simple. CodePush is the classic, powerful choice for "bare" React Native projects. EAS Updates, on the other hand, is the tightly integrated, default solution for the Expo ecosystem.

Think of it like choosing an engine for a car. You might have an incredibly powerful, highly customizable V8 engine, but it only fits a specific type of muscle car frame. Then you have a smooth, efficient hybrid engine that's perfectly integrated with its own car's electronics and chassis. Neither is "better" in a vacuum. The right choice depends on the car you're building.

For developers working on a bare React Native project (the kind where you have direct access to the native iOS and Android folders), CodePush is the battle-tested champion for deploying JavaScript and asset updates directly to your users.

The Case for CodePush

CodePush, which is managed through the Microsoft App Center suite, really shines in environments where you need granular control and are comfortable managing the native side of your app. Because it operates in a bare workflow, it assumes you know your way around Xcode and Android Studio configurations.

This freedom is its biggest strength. It allows for complex integrations and customizations that might be difficult or impossible in a more managed environment. The setup process itself is pretty straightforward once your project is configured for native development, as this flowchart shows.

A flowchart titled 'Code Push Setup' detailing the process, including 'Project Ready?', 'CLI', 'Install CLI', and 'No Setup App'.

As you can see, the main path involves installing the CLI and setting up the app, which underscores its reliance on having direct access to the project's native layers.

The Advantage of EAS Updates

On the other side of the fence, we have EAS Updates, a key part of the Expo Application Services (EAS) platform. If you're building your app with Expo, this is your native tongue. It’s not just an add-on; it's deeply woven into the entire Expo toolchain, from local development all the way to cloud builds and app store submissions.

That tight integration creates an incredibly smooth developer experience. You aren't juggling separate deployment keys or manually tweaking native project files. Everything is managed through your app.json configuration and the EAS command-line interface.

If you're just getting started in the Expo world, our guide on how to create an Expo app will get you up and running quickly.

Key Difference: The trade-off is control versus convenience. CodePush gives you maximum control for bare React Native projects, while EAS Updates provides a seamless, integrated experience for Expo projects.

Honestly, the decision is often made for you the moment you initialize your project. If you start with npx react-native init, you're on the CodePush path. If you begin with npx create-expo-app, EAS Updates is your natural fit.

CodePush vs EAS Updates Feature Comparison

To help you see the differences at a glance, here’s a breakdown of how CodePush (via App Center) and EAS Updates stack up on key features. This table should make it clear which tool aligns best with your project’s foundation and long-term needs.

Feature

React Native CodePush (App Center)

EAS Updates (Expo)

Primary Ecosystem

Bare React Native

Expo & Expo Prebuild

Setup Complexity

Moderate; requires native project configuration.

Low; integrated into Expo config (app.json).

Update Hosting

Microsoft App Center servers.

Expo's global CDN.

Rollback Strategy

Automatic rollback on crash, manual rollbacks via CLI.

Automatic rollbacks, manual control via expo-updates.

Release Channels

Custom channels (e.g., Staging, Production).

Custom channels via EAS (e.g., preview, production).

Targeting

By app version and deployment key.

By app version, runtime version, and channel.

Developer Experience

Requires separate App Center CLI and portal.

Unified with EAS CLI and Expo toolchain.

Cost

Generous free tier, paid tiers for advanced features.

Part of EAS; usage-based pricing with a free tier.

Both are excellent, mature solutions for OTA updates. Your choice is less about which is "better" and more about which one was designed for the workflow you've already committed to.

It's also worth noting the broader landscape is shifting. As of December 2025, React Native's New Architecture is standard, boosting performance across the board. With over 90% of core modules now supporting it and the Hermes engine improving startup times by up to 30%, the raw performance gap between different workflows is shrinking. This makes the developer experience and toolchain integration an even more critical factor in your decision.

Building a Reliable OTA Update Strategy

Pushing out updates instantly is powerful, but doing it without a plan is a recipe for chaos. A solid Over-the-Air (OTA) update system is more than just a technical setup; it’s a thoughtful strategy to make sure your releases are safe, effective, and totally invisible to the user. This is how you move from a cool tech demo to a professional, production-ready workflow.

At its core, a reliable strategy is all about managing risk. You never, ever want to ship a buggy update to your entire user base at once. The simplest way to prevent this is by using separate deployment environments for testing and live releases. App Center gives you Staging and Production deployments right out of the box, and you should use them religiously.

Tablet on a wooden desk displays 'Phased Rollouts' alongside colorful bar and pie charts.

Implementing Phased Rollouts

One of the best risk-management tools in your belt is the phased rollout. Instead of blasting an update to 100% of your users at the same time, you can release it to a smaller slice first, for example 5% or 10%. This approach effectively turns a small segment of your audience into an early-warning system.

If any unexpected crashes or bugs pop up, the damage is contained. You can watch your analytics and user feedback from this small group. If everything looks stable after a day or two, you can confidently dial up the rollout percentage until you reach everyone.

This careful, step-by-step approach is a cornerstone of modern mobile development. When building out your OTA update strategy, it's smart to think back to the initial key factors for Android app development, where planning for future maintenance is absolutely critical.

Configuring Update Policies

How and when your app checks for updates has a direct impact on the user experience. The CodePush SDK gives you a few knobs to turn, letting you find the right balance between getting updates out fast and not annoying your users.

  • On App Start: This is the most common policy. The app checks for an update every time it’s launched, which ensures users get new code quickly.

  • On App Resume: You can also have it check when the app comes back to the foreground. This is great for users who almost never fully close their apps.

  • Manual Checks: For very specific cases, you can trigger a check yourself, maybe after a user performs a certain action in the app.

Key Insight: For most apps, a silent check on app start is the sweet spot. The update downloads in the background and gets applied the next time the user opens the app, making the whole process seamless and non-disruptive.

Enforcing Mandatory Updates

While most updates can be applied quietly in the background, some are just too important to wait. For critical bug fixes or urgent security patches, you can flag a release as mandatory. This tells the CodePush SDK to install the update immediately, getting every user onto the new, stable version as quickly as possible.

This is a vital tool for keeping your app healthy and secure. By combining phased rollouts, smart update policies, and the power of mandatory releases, you build a resilient and professional OTA strategy that lets you ship with confidence.

Automating Deployments with a CI/CD Pipeline

Pushing updates from the command line is fine when you're just starting out, but it doesn't scale. Once your team grows, that manual process becomes slow, inconsistent, and a magnet for human error. This is exactly where a Continuous Integration and Continuous Deployment (CI/CD) pipeline comes in. It’s essential for managing your React Native Code Push releases like a pro.

A person working on a laptop with a complex software interface and the text 'Automate Deployments'.

When you automate deployments, you guarantee every single update follows the same reliable, repeatable steps. It completely eliminates the classic "it works on my machine" headache and establishes a single source of truth for every release.

Designing a Git-Based Workflow

One of the most effective ways to manage this is by tying your CodePush deployments directly to your Git branching model. It creates a release cadence that’s so predictable and transparent that anyone on the team can immediately understand what’s happening. The idea is simple: your Git branches decide where an update goes.

Here’s a popular workflow you can steal:

  • Develop Branch: As soon as new code is merged into develop, your CI/CD pipeline automatically kicks off a deployment to your Staging environment. This gives your QA team and internal testers a chance to hammer on the changes in a setting that mirrors production.

  • Main Branch: After the changes get the green light, they’re merged from develop into main. This action triggers the pipeline again, but this time it promotes the update to your Production environment, pushing it out to your real users.

This automated flow acts as a powerful safety net, making sure no code ever reaches your users without being thoroughly vetted first.

Key Takeaway: A Git-driven CI/CD pipeline turns your repository into the mission control for your app updates. Merging a pull request becomes the trigger for a safe, automated release, cutting out manual work and slashing risk.

Integrating the App Center CLI

So how do you make this automation a reality? Your CI/CD platform, whether it’s GitHub Actions or GitLab CI, needs to talk to App Center. This communication happens through the same App Center CLI you’ve been using locally.

To get this working, you'll need to generate an API token from App Center and store it securely as an environment variable in your CI/CD settings. This gives the pipeline the permissions it needs to act on your behalf.

From there, a typical script in your pipeline configuration file (like a .yml file) will handle a few key steps:

  1. Install Dependencies: The job starts by installing your project’s dependencies and the appcenter-cli.

  2. Authenticate: Next, the script uses that secure API token to log into App Center.

  3. Deploy the Update: Finally, it runs the appcenter codepush release-react command, making sure to target the correct app and deployment environment based on which Git branch triggered the workflow.

Making this process automatic is a cornerstone of modern development. To go even deeper, you can check out some of the industry's well-established continuous deployment best practices in our detailed guide. By baking these steps into a pipeline, you build a system that ships updates with both speed and confidence.

Common CodePush Questions, Answered

Jumping into Over-the-Air updates always brings up a few questions. Whether you're trying to figure out a tricky setup or just deciding if React Native Code Push is the right move for your app, you need clear answers. Let's tackle the most common ones developers run into.

We've put together some straightforward answers to help you get a handle on what this tech can and can't do, so you can move forward with confidence.

Can I Update Native Code with CodePush?

No, and this is probably the most critical limitation to understand. CodePush is only for updating your app's JavaScript bundle and assets like images, fonts, or config files. It works by swapping out these files on the app that’s already installed on a user's phone.

Any changes to the native side of your app demand a full-blown binary update through the App Store or Google Play. This includes things like:

  • Adding new native modules or third-party SDKs.

  • Changing app permissions in AndroidManifest.xml or Info.plist.

  • Updating your app's icon or launch screen.

Think of it this way: CodePush can update the "web" parts of your app, but not the native container it lives in.

Does CodePush Work with the Expo Managed Workflow?

Unfortunately, no. CodePush is not compatible with the Expo managed workflow. While the managed workflow is a fantastic system for abstracting away native code headaches, that very abstraction is what gets in the way. CodePush needs direct access to the native project files to hook itself in.

For teams building with the Expo managed workflow, the go-to solution is EAS Updates. It's built right into the Expo ecosystem and offers a seamless OTA update experience. If you’re set on using CodePush, you’ll have to eject to the bare workflow, which gives you that necessary hands-on control of the native project folders.

How Do I Handle Rollbacks for Faulty Updates?

App Center has you covered with solid, built-in rollback features to shield your users from bad releases. If you push out an update and then spot a critical bug, you can instantly roll it back with a single command in the App Center CLI.

A key safety net is the CodePush SDK's automatic rollback. If a new update causes the app to crash right after it's installed, the SDK is smart enough to automatically revert to the last known good version. This is huge for preventing your app from getting stuck in a crash loop and wrecking the user experience.

Is React Native Code Push Still a Good Choice?

Absolutely. For any project built with the bare React Native CLI, CodePush is still a mature, powerful, and totally reliable choice in December 2025. Its tight integration with Microsoft App Center gives you a stable, feature-rich platform for managing OTA updates, even at a massive scale. It provides essentials like phased rollouts and automatic rollbacks, making it a production-ready tool for any serious React Native app.

While EAS Updates has definitely become the standard for the Expo world, CodePush remains the top pick for developers who need the full control and flexibility that the bare workflow offers.

Ready to build and launch your mobile app ideas without the complexity? CatDoes uses an AI-native platform to turn your concepts into production-ready React Native apps, complete with automated builds and releases. Stop wrestling with code and start creating. Discover a faster way to build at CatDoes.

Writer

Nafis Amiri

Co-Founder of CatDoes