OTA update tools for iOS compared: Patch vs CodePush vs EAS Update vs Shorebird
Updated · every competitor fact below is quoted or taken from that vendor's own documentation, linked in place.
Short answer: CodePush (Microsoft's hosted service retired March 31, 2025), Expo EAS Update and Shorebird patch a JavaScript or Dart bundle and cannot change native Swift; Patch compiles changed Swift to WebAssembly and runs it in WasmKit on iOS 16+, so it is the option for native SwiftUI and UIKit apps. All four ship interpreted code to an already-signed app rather than a new binary — the basis Apple sets out in Developer Program License Agreement §3.3.1(B), formerly §3.3.2, which Shorebird's FAQ cites by number.
The four OTA tools side by side
| CodePush | Expo EAS Update | Shorebird | Patch | |
|---|---|---|---|---|
| Framework / language | React Native, Cordova (JavaScript) | React Native (JavaScript / TypeScript) | Flutter (Dart) | Native Swift — SwiftUI and UIKit |
| What gets patched | The JavaScript bundle and assets of a release | “JS, styling, and images”, served to the expo-updates library | New Dart code, run through “a custom Dart interpreter” | The Swift you changed, compiled to WebAssembly and run in WasmKit |
| What stays native | Everything compiled into the signed binary | “Change to native code or native dependencies”, app permissions and the Expo SDK version | “Shorebird does not support changing native code (e.g. Java/Kotlin on Android or Objective-C/Swift on iOS).” | Code that calls OS APIs directly; a patch that cannot run falls back to the signed binary |
| Stated Apple basis | — | “your updates need to follow the App Store and Play Store guidelines” | DPLA “section 3.3.1b”; “a custom Dart interpreter to comply with the interpreter-only restriction for updates on iOS” | DPLA §3.3.1(B) (formerly §3.3.2): interpreted code that does not change the app's primary purpose |
| Rollback | Yes — rollback re-releases “the exact same code and metadata as the version prior to the latest one” |
Yes — eas update:rollback: “Rollback a branch to a previous update or the embedded update.” |
Yes — a rolled-back patch “is remotely uninstalled from end users' devices and replaced by either the previous patch or the base release” | Yes — one command recalls a release fleet-wide; devices already running it revert on their next check |
| Channels & staged rollouts | Yes — Staging / Production deployments plus a --rollout percentage “between 1 and 100” |
Yes — branches and channels, plus rollouts: “roll out a change to a portion of your users” | Yes — patch tracks, plus a percentage-based rollouts guide | Yes — channels (canary, beta, production), staged rollout percentages, A/B cohorts and targeting |
| Minimum iOS | — | — | “Shorebird supports the same versions of platforms that Flutter supports” | iOS 16+ |
| Entry pricing tier | No vendor pricing — self-host the server, pay your own infrastructure | “Free — $0/month”, then “Starter — $19/month plus additional usage cost” (expo.dev/pricing) | “Free” at “$0/month” with 5,000 monthly patch installs, then “Pro” at “$20/month” (shorebird.dev/pricing) | Hobby free for up to 100 devices, then Startup $59/month (pricing) |
| Open-source client | Yes — microsoft/code-push-server, MIT, archived May 20, 2025 | Yes — “The Expo source code is made available under the MIT license” | Yes — the shorebirdtech/shorebird repo shows “Apache-2.0, MIT licenses found” | Yes — PatchSDK is MIT; the compile engine is Apache-2.0 |
| Hosted status | Retired — “Visual Studio App Center is scheduled for retirement on March 31, 2025” | Hosted — EAS, run by Expo | Hosted — run by Shorebird | Hosted — run by Patch; self-hosting the SDK against your own base URL is supported |
Sources: Microsoft App Center retirement · microsoft/code-push-server · EAS Update introduction · EAS Update rollbacks · EAS Update rollouts · Shorebird FAQ · Shorebird rollback · Apple Developer Program License Agreement.
Can CodePush update a native Swift app?
No. CodePush replaces the JavaScript bundle of a React Native or Cordova app, and a native Swift app has no JavaScript bundle to replace. There is nothing in a Swift and SwiftUI binary that CodePush can address, so the tool has no effect on it at all.
CodePush is also no longer a service you can sign up for. Microsoft's notice states that “Visual Studio App Center is scheduled for retirement on March 31, 2025” and that after that date “it will not be possible to sign in with your user account nor make API calls.” For CodePush specifically, Microsoft wrote: “We have prepared a special version of CodePush that can be integrated into your app and run independently from App Center.” That standalone server is microsoft/code-push-server, MIT-licensed and archived on May 20, 2025. Running CodePush in 2026 means operating and maintaining that server yourself — and it still only patches JavaScript.
Read more: the CodePush alternative for native Swift. Source: Visual Studio App Center Retirement.
Can Expo EAS Update patch SwiftUI?
No. Expo's docs define the product plainly: “EAS Update is a cloud service that serves updates for projects using the expo-updates library.” A SwiftUI app does not use expo-updates and has no JavaScript bundle for the service to serve, so EAS Update has nothing to deliver to it.
Expo is equally explicit about the boundary inside a React Native app. Its “when to use EAS Update” list names what an update cannot change: “Change to native code or native dependencies”, app permissions, the Expo SDK version, and “Anything that requires a new app binary version.” EAS Update ships “JS, styling, and images”. That boundary is the same one every OTA tool has — it just falls in a different place depending on how much of the app is interpreted rather than compiled.
Read more: the EAS Update alternative for native Swift. Source: EAS Update introduction (Expo shows “Last modified July 22, 2026” on that page).
Is there a Shorebird for Swift?
Not from Shorebird. Shorebird is code push for Flutter, and its FAQ answers the question directly: “Shorebird does not support changing native code (e.g. Java/Kotlin on Android or Objective-C/Swift on iOS).” Shorebird ships new Dart code and runs it, in its own words, through “a custom Dart interpreter to comply with the interpreter-only restriction for updates on iOS.”
Patch is the equivalent tool for the Swift side of that sentence. Instead of a Dart interpreter it uses WasmKit: the patchcli CLI compiles the Swift you changed to WebAssembly and the on-device SDK runs it, so Swift logic, async/await and SwiftUI view bodies can be updated over the air. The architectural idea is the same one Shorebird uses for Flutter — an interpreted layer over an unchanged signed binary — applied to native iOS.
Read more: the Shorebird alternative for native Swift. Source: Shorebird Code Push FAQ.
What does Patch patch, and what stays native?
Patch ships over-the-air code updates to native Swift iOS apps. You write ordinary Swift; patchcli compiles the parts that changed to WebAssembly and uploads them as a patch, and the PatchSDK runs that WebAssembly on-device in the WasmKit runtime. Covered code includes Swift logic, async/await concurrency, and SwiftUI view bodies. It requires iOS 16 or later.
What stays native is the code that talks to the operating system directly — camera, HealthKit, entitlement-gated frameworks and anything else that resolves to a native symbol in the signed binary. The engine detects that split at build time and only ships what it can prove will run. If a patch cannot run on a device, the SDK falls back to the version compiled into the App Store binary, so an update cannot leave the app broken. Anything needing a new entitlement, a new permission string or a new native dependency still needs an App Store release.
More detail: how it works and what is covered.
Which should you choose?
Pick by the language your app is actually written in. Three of the four options are better than Patch for the stacks they were built for.
React Native. Use Expo EAS Update if you want a hosted service, or run microsoft/code-push-server yourself if you are already on the CodePush client and want to keep it. Patch is the wrong tool here — it does not ship JavaScript bundles.
Flutter. Use Shorebird. It patches Dart, integrates with a Flutter release workflow, and is built by people who worked on Flutter. Patch does not ship Dart.
Native Swift and SwiftUI. None of the other three can change your code, because none of them has a JavaScript or Dart layer to change. That is the gap Patch fills: Hobby is free for up to 100 devices, install is brew install patch-release/tap/patchcli, and patchcli init wires the SDK into an existing Xcode project.
Mixed apps. A React Native or Flutter app with native modules needs both approaches, and the native side still waits on App Store review for anything its OTA tool declares out of bounds.
OTA update tools, answered.
For a native Swift app, Patch. CodePush replaced a React Native JavaScript bundle, so its direct successors — the self-hosted code-push-server and Expo EAS Update — are only useful if your app still has a JavaScript bundle. A Swift and SwiftUI app has none. Patch compiles the Swift you changed to WebAssembly and runs it on-device in WasmKit, which gives a native app the same workflow: ship a fix without App Store review, stage the rollout, roll the fleet back instantly. If your app is React Native, run Microsoft's open-sourced server yourself or move to EAS Update instead — Patch does not ship JavaScript.
Patch is the closest equivalent. Shorebird is code push for Flutter and its FAQ states: “Shorebird does not support changing native code (e.g. Java/Kotlin on Android or Objective-C/Swift on iOS).” Shorebird ships new Dart code and runs it through a custom Dart interpreter. Patch ships changed Swift compiled to WebAssembly and runs it in the WasmKit runtime, and its SwiftUI coverage means view bodies — not just business logic — can be updated over the air. Both tools solve the same problem for different languages: Shorebird for Dart, Patch for Swift.
Yes, for the code each one covers. All four deliver interpreted code to an app that is already signed and installed, rather than a new binary, so the update never passes through App Review. Apple's Developer Program License Agreement §3.3.1(B), “Executable Code”, reads: “Except as set forth in the next paragraph, an Application may not download or install executable code. Interpreted code may be downloaded to an Application but only so long as such code: (a) does not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application (b) does not bypass signing, sandbox, or other security features of the OS; and (c) for Applications distributed on the App Store, does not create a store or storefront for other Applications.” Shorebird's FAQ cites the same clause by number. Expo's docs add that updates “need to follow the App Store and Play Store guidelines”.
Expo EAS Update, Shorebird and Patch run hosted services. CodePush no longer does. Microsoft's retirement notice states that “Visual Studio App Center is scheduled for retirement on March 31, 2025” and points CodePush users to a standalone server: “We have prepared a special version of CodePush that can be integrated into your app and run independently from App Center.” That repository, microsoft/code-push-server, is MIT-licensed and was archived on May 20, 2025, so running CodePush today means hosting and maintaining it yourself.
No. Every OTA tool has a boundary at the compiled binary. Expo's docs list “Change to native code or native dependencies”, app permissions and the Expo SDK version as things an update cannot change. Shorebird cannot change native Swift, Kotlin or Objective-C. Patch ships Swift logic, async/await and SwiftUI views, but code that calls OS APIs directly stays in the signed binary, and if a patch cannot run the app falls back to the version it shipped with. Anything that needs new entitlements, a new permission string or a new native symbol still needs an App Store release.
Each vendor publishes its own tiers, and the units differ. Expo lists Free at $0/month, Starter at $19/month, Production at $199/month and Enterprise as custom, metered by monthly active users. Shorebird lists Free at $0/month with 5,000 monthly patch installs, Pro at $20/month, Business at $400/month and Enterprise as custom, metered by patch installs. Patch lists Hobby free for up to 100 devices, Startup at $59/month for up to 10,000 devices, and Enterprise by agreement, metered by distinct devices. CodePush has no vendor pricing — you host the MIT-licensed server and pay your own infrastructure.
Ship your first native Swift patch today.
Free to start. No App Store review. Instant rollback.