Skip to content
CodeOnAir
← All posts

react-native-code-push and the New Architecture: what to do on React Native 0.76+

Microsoft's archived CodePush SDK needs the New Architecture turned off, and React Native 0.82 doesn't let you. The options, version by version, and how to upgrade without losing over-the-air updates.

CodeOnAir team27 October 20268 min read

If your app uses react-native-code-push and you've just upgraded React Native, or you're about to, this is the problem: the SDK was never updated for the New Architecture, and React Native no longer lets you avoid it.

This post sets out the options in order, from the stopgap to the long-term fixes, with the version numbers that matter. Facts about other projects come from their own READMEs and docs, checked on 27 October 2026, with links so you can check them again.

Does react-native-code-push support the New Architecture?

No. Microsoft archived the react-native-code-push repository on 20 May 2025, and it's now read-only. Its README says:

React Native CodePush won't support new Architecture. In order to use this plugin on React Native versions starting from 0.76 you will need to opt out from new architecture.

The README's compatibility table stops at React Native 0.71. The hosted CodePush service it talked to went away with App Center on 31 March 2025, so even an app that still builds with the old SDK needs some other server to get updates from. Our post on App Center's retirement covers that side.

What breaks, and on which React Native versions

Three version numbers matter:

React Native New Architecture What it means for react-native-code-push
0.76 to 0.81 On by default; you can still turn it off Works only if you opt out, per Microsoft's README
0.81 (Expo SDK 54) The last versions that allow the Legacy Architecture The last place opting out works
0.82 and later The only architecture Opting out is ignored

The React Native 0.82 release post is explicit: if you set newArchEnabled=false on Android or install pods with RCT_NEW_ARCH_ENABLED=0 on iOS, "these will be ignored and your app will still run using the New Architecture." It names React Native 0.81 and Expo SDK 54 as "the last versions that allow you to use the Legacy Architecture."

So opting out is a way to stay where you are, not a way forward. The first upgrade to 0.82 or later ends it.

Option 1: Opt out of the New Architecture

On React Native 0.76 to 0.81 you can turn the New Architecture off and keep the old SDK running against a CodePush-compatible server.

Android, in android/gradle.properties:

newArchEnabled=false

iOS, when you install pods:

cd ios && RCT_NEW_ARCH_ENABLED=0 bundle exec pod install

Expo apps on SDK 53 or 54 set "newArchEnabled": false in app.json. Expo's New Architecture guide says SDK 54 is the last SDK where it can be turned off.

Why this is only a stopgap:

  • It has an end date. You can't upgrade past React Native 0.81 without losing it.
  • React Native is moving on. The 0.82 post says the remaining Legacy Architecture code will be removed in later versions, and libraries follow React Native's lead.
  • You still need a server. The archived SDK needs a CodePush server, and Microsoft's standalone code-push-server was archived at the same time.

Use it to buy a few weeks while you pick one of the options below.

Option 2: A community fork (code-push-next, Revopush)

Two maintained forks of the Microsoft SDK are widely used. Here's what their own pages say.

CodePushNext (@code-push-next/react-native-code-push) describes itself as an "Open-source CodePush client SDK". Its README table lists:

React Native CodePushNext version
0.76 to 0.79 v10.0+ (Old/New Architecture)
0.80 v10.1+ (Old/New Architecture)
0.81 v10.3+ (Old/New Architecture)
0.82+ v10.4+ (New Architecture)

It's a client only. The README tells you to set up your own CodePush-compatible server and release with that server's CLI.

Revopush (@revopush/react-native-code-push) is the SDK for Revopush's hosted service. Its page says "The Revopush SDK supports React Native 0.76+ in the New and Old Architecture", and that existing CodePush apps "can retain the familiar package API, deployment model, and release-react workflow."

Neither page mentions bridgeless mode or Hermes, so test both on your exact React Native version.

Good fit if: you want to stay as close as possible to the original code, and you either run a CodePush server or are happy with Revopush's hosted service.

Option 3: Expo EAS Update

If your app is an Expo app, or you're willing to add expo-updates, Expo's own update service is the default choice. Expo's guide says that "as of SDK 53, all expo-* packages in the Expo SDK support the New Architecture (including bridgeless)."

It's a different SDK and workflow from CodePush: runtime versions instead of binary versions, channels and branches instead of deployments, and eas update instead of release-react. Plan it as a migration, not a package swap. Our CodePush alternatives compared post covers EAS Update's rollouts and pricing.

Good fit if: you're on Expo already.

Option 4: A maintained hosted SDK with the same API

This is what we built, so weigh it accordingly. CodeOnAir CodePush has its own SDK, @codeonair/code-push-react-native (1.1.1 on npm), which:

  • works with the Old Architecture, the New Architecture (including bridgeless) and Hermes, on React Native 0.70 and later;
  • is tested on an Android emulator and an iOS simulator on React Native 0.86 (New Architecture) and 0.76 (both architectures), covering an optional update on the next start, a mandatory update right away, and rollback of an update that crashes at startup;
  • keeps the original JavaScript API names: codePush.sync(), the codePush(App) wrapper, InstallMode, SyncStatus, checkForUpdate(), notifyAppReady().

It isn't a literal drop-in. The package name changes, the native bundle hook changes, and the native config gets a server URL next to the deployment key. On current templates, where MainApplication calls getDefaultReactHost with a package list, Android looks like this:

// MainApplication.kt
import com.codeonair.codepush.CodeOnAirCodePush

getDefaultReactHost(
  context = applicationContext,
  packageList = PackageList(this).packages,
  jsBundleFilePath = CodeOnAirCodePush.getJSBundleFile(applicationContext),
)

On React Native 0.70 to 0.76, which use DefaultReactNativeHost, you override getJSBundleFile() instead, and the same override works for both architectures:

override fun getJSBundleFile(): String? = CodeOnAirCodePush.getJSBundleFile(applicationContext)

iOS returns the bundle from bundleURL() in release builds:

// AppDelegate.swift
import CodeOnAirCodePush

override func bundleURL() -> URL? {
#if DEBUG
  RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index")
#else
  CodeOnAirCodePush.bundleURL()
#endif
}

Older apps with AppDelegate.mm return [CodeOnAirCodePush bundleURL] from the same method. The step-by-step migration from App Center CodePush walks through every file.

One gotcha from our SDK's README: React Native 0.76 and older don't compile with Xcode 16.3 or later. The fmt pod fails with call to consteval function … is not a constant expression. That's React Native, not CodePush. Upgrade React Native, or in your Podfile's post_install, change define FMT_USE_CONSTEVAL 1 to 0 in Pods/fmt/include/fmt/base.h.

What we don't offer: self-hosting, and separate Staging and Production deployments (it's one deployment per platform per app, so a staging build uses a second app).

How to check which architecture your app runs

Before you choose, confirm what your build actually uses.

Android: look in android/gradle.properties:

grep newArchEnabled android/gradle.properties

iOS: check how pods were installed. If your team runs RCT_NEW_ARCH_ENABLED=0 pod install (in a script, a Makefile or CI), the app is on the Old Architecture. On React Native 0.76 to 0.81, no flag means the New Architecture.

Expo: newArchEnabled in app.json, or the SDK version (55 and later always use the New Architecture).

At runtime, a quick log in a debug build:

// Debug only: these globals are React Native internals, not a public API.
const fabric = (global as any).nativeFabricUIManager != null;
const bridgeless = (global as any).RN$Bridgeless === true;
console.log({ fabric, bridgeless });

If fabric is true, you're on the New Architecture. Remember that on React Native 0.82 and later the answer is always yes, whatever the config files say.

Upgrade checklist: keep install modes, ship one store build, then release OTA

The SDK has native code, so the switch reaches users through a store release. Do it in this order:

  1. Write down your current CodePush setup: install modes, mandatory releases, any checkFrequency, and the deployment names your CI uses.
  2. Swap the SDK and keep the same sync() options. With CodeOnAir:
npm uninstall react-native-code-push
npm install @codeonair/code-push-react-native
cd ios && pod install
import codePush from "@codeonair/code-push-react-native";

codePush.sync({
  installMode: codePush.InstallMode.ON_NEXT_RESTART,     // optional updates
  mandatoryInstallMode: codePush.InstallMode.IMMEDIATE,  // releases marked mandatory
});

If you're unsure which modes suit you, see CodePush install modes: IMMEDIATE or ON_NEXT_RESTART.

  1. Upgrade React Native and the SDK in the same store build, with a new app version (for example 2.0.0).
  2. Test a release build on a real device. Updates only apply in release builds; debug builds load from Metro.
  3. Target OTA releases at the new binary version only. A bundle built with React Native 0.82 must never reach a 0.76 binary, and the reverse. Pass the version explicitly:
npm install -g @codeonair/code-push-cli@beta
codeonair-codepush release-react shop-android -t 2.0.0 -d "First OTA on RN 0.82"
codeonair-codepush release-react shop-ios -t 2.0.0 -r 20

The CLI is @codeonair/code-push-cli (0.10.1, beta). It compiles Hermes bytecode when the app uses Hermes.

  1. Keep the old binary's releases separate. Users who haven't installed the new store build stay on their current bundle until they do.

FAQ

Can I keep react-native-code-push if I opt out of the New Architecture?

Yes, on React Native 0.76 to 0.81, as long as you have a CodePush-compatible server to release to. It stops being an option when you upgrade to 0.82, because the opt-out flags are ignored from then on.

Until which React Native version does opting out work?

React Native 0.81, or Expo SDK 54. The React Native team calls these "the last versions that allow you to use the Legacy Architecture."

Do I need a new store release to switch SDKs?

Yes, once. Any CodePush SDK includes native code, so the new one ships in a store build. After users install it, JavaScript updates go over the air again.

Does CodePush work with Hermes?

CodeOnAir's SDK runs on Hermes, and its CLI compiles your bundle to Hermes bytecode when the app uses Hermes (--useHermes false turns that off). For the forks, check their READMEs; neither page we read mentions Hermes.

Is a fork compatible with my App Center keys?

No. Deployment keys belong to the server that issued them, and App Center's CodePush service is gone. A fork needs a CodePush-compatible server, which gives you new keys. The same is true of any hosted service.

Move to a CodePush SDK that runs on the New Architecture

Install the SDK and the CLI:

npm install @codeonair/code-push-react-native
npm install -g @codeonair/code-push-cli@beta

Then follow the CodePush quick start. Create a free account: the Free plan includes 5,000 CodePush downloads a month, and paid plans are on the pricing page.


Checked on 27 October 2026 against the react-native-code-push README, the React Native 0.82 release post, Expo's New Architecture guide, and the CodePushNext and Revopush pages linked above.

Your first AppLink in five minutes.

Create an app, pick a subdomain, and share a link that opens your app. Try Growth free for 30 days — no card needed.