The Expo EAS Update alternative for bare React Native
EAS Update is the right answer if your app lives inside Expo. If you run bare React Native, already use the CodePush client, or need your bundles and device telemetry on your own infrastructure, Pulsar is the closer fit.
What Expo EAS Update is, and where it fits
EAS Update is Expo’s hosted over-the-air update service. It ships updates through expo-updates, Expo’s own update protocol, and is billed by monthly active user — 1,000 MAU on the Free plan, 3,000 on Starter ($19/mo) and 50,000 on Production ($199/mo), with per-MAU and per-GiB overage above that.
That model works well when you are already paying for the Expo toolchain and your app uses Expo modules end to end. It works less well for a bare React Native app that has been on CodePush for years: you adopt a second update protocol, a second SDK, and a bill that grows with your user count rather than with your release cadence.
Pulsar takes the other route. It speaks the CodePush protocol that the React Native ecosystem has used since 2016, so the on-device client is the mature, battle-tested one your app probably already ships. And on the Pro plan Pulsar can be self-hosted, so the update bundles and the check-in telemetry never have to leave your infrastructure.
When Expo EAS Update is the better choice: Stay on EAS Update if your project is Expo-managed, you use EAS Build and Submit, and MAU-based pricing suits your scale. The integration is tight and well documented, and switching away from it for its own sake is not worth an afternoon.
Pulsar vs Expo EAS Update
| Capability | Pulsar | EAS Update |
|---|---|---|
| Update protocol | CodePush — the client most bare RN apps already ship | expo-updates, Expo’s own protocol |
| Bare React Native | First-class | Supported via expo-updates, but the Expo toolchain is assumed |
| Expo-managed projects | Works with the bare workflow / prebuild | First-class |
| Self-hosting | Yes, on the Pro plan: run the whole service yourself | Managed only (the protocol is open, the service is not) |
| Pricing model | Per monthly active user: free to 1K, $11.99/mo for 100K, $49.99/mo for 300K | Per monthly active user: free to 1K, 3K on Starter, 50K on Production, plus bandwidth and storage |
| Staged rollouts | Yes, by deterministic % | Yes |
| Instant rollback | Yes, one command | Yes |
| Differential updates | Yes, on Startup and above | Yes |
| Target specific devices | Yes — pin a release to explicit device ids | Via channels and branches |
| Open-source client + CLI | Yes (MIT) | Yes (expo-updates is open source) |
Migrating from Expo EAS Update
Moving off EAS Update means changing update client, not rewriting your app. The steps below assume a bare React Native project (or an Expo project that has been prebuilt).
1. Install the Pulsar client
Add the CodePush-lineage client and let autolinking register the native modules on both platforms.
yarn add @novacraft-engineering/pulsar-code-push
cd ios && pod install2. Point it at your deployment
Create an app in the Pulsar dashboard, copy the deployment key, and set it alongside the server URL.
import codePush from '@novacraft-engineering/pulsar-code-push';
export default codePush({
deploymentKey: '<pulsar-deployment-key>',
serverUrl: 'https://api.usepulsar.dev',
checkFrequency: codePush.CheckFrequency.ON_APP_START,
})(App);3. Replace `eas update` in CI
Swap the publish step for the Pulsar CLI. Two environment variables are all a CI job needs.
npm i -g @novacraft-engineering/pulsar-cli
pulsar release MyApp Production --platform ios --target 1.4.0 --rollout 25Frequently asked questions
Can I use Pulsar with Expo?
With the bare workflow or a prebuilt project, yes — Pulsar’s client is a native module, so it needs a project you can run pod install and a Gradle build against. A fully Expo-managed project that never prebuilds should stay on EAS Update.
Is EAS Update more expensive than Pulsar?
Both bill by monthly active user, so it depends on your user count. Pulsar is free to 1,000 MAU, then $11.99/mo covers 100,000 and $49.99/mo covers 300,000. EAS Update includes 3,000 MAU on Starter and 50,000 on Production, with usage-based pricing above that. Compare both at your own user count before deciding.
Do I lose staged rollouts or rollback by leaving EAS Update?
No. Pulsar serves a release to a deterministic percentage of devices, lets you pin a release to explicit device ids, and rolls back with a single command.
Can I run both during a migration?
Yes. Ship a binary with the Pulsar client to a new track while the old binary keeps checking EAS Update. Devices only ever talk to the service compiled into the build they are running.
Compared with the others
- Pulsar vs Microsoft CodePush — the protocol both of them speak.
- Pulsar vs Microsoft App Center
- Pulsar vs RevoPush
- Pulsar vs Stallion
- Pulsar vs hot-updater
Ship the fix without the queue.
Point your React Native app at Pulsar and release in seconds.
Get started →