Self-hosting Expo Updates vs using Cresc
When an EAS Update invoice starts growing with monthly active users and bandwidth, the next idea is usually to run your own update server. Expo supports this: the expo-updates client (MIT) can point at any server that implements the Expo Updates protocol. This page compares that route with moving to Cresc.
Facts about Expo are taken from Expo's official documentation and pricing page as of October 2026. Tell us at [email protected] if anything here is out of date.
Short answer
- Self-host Expo Updates if you want to keep the
expo-updatesclient and are prepared to build and operate a production update server yourself. - Use Cresc if what you want is lower, predictable OTA cost without building a server: you swap the client library once and get diff patches, rollback and a dashboard from a hosted service. If you must run the server in your own infrastructure, Cresc also offers a supported self-hosted deployment on custom pricing.
What self-hosting actually involves
Expo publishes custom-expo-updates-server as a simplified example, not a production server. To run it for real you need to build and own:
- The protocol server: manifest and asset endpoints that implement protocol v1, multipart responses,
runtimeVersionmatching and channel selection. - Storage and CDN for every bundle and asset you publish, with cache headers that don't serve stale manifests.
- Code signing if you want clients to verify manifests, including key rotation.
- A publishing pipeline: export with
npx expo export, upload assets, write manifests, promote between channels. EAS CLI'seas updateonly publishes to EAS. - Rollback and rollout: the protocol defines a
rollBackToEmbeddeddirective; percentage rollouts, release history and dashboards are up to you. - Diff patches: EAS Update serves bsdiff patches from Expo SDK 55, but the public protocol spec does not define how a custom server should serve patches. Expect to send full bundles unless you build this yourself.
Comparison table
Where EAS Update pricing sits
For reference, EAS Update's Production plan is $199 a month including 50,000 updated monthly active users and 1 TiB of bandwidth. Beyond that it bills $0.005 per extra MAU up to 200,000 (tiered down after that) and $0.10 per extra GiB. Cresc Pro is $99 a month for 1,000,000 update checks per day with CDN delivery included. See the full model in Expo pricing vs Cresc.
Moving an Expo app to Cresc
- Install
react-native-updateand the CLI, and runnpx expo prebuild; with Expo SDK 50+ the native bundle URL is configured automatically (Installation). - Replace
Updates.checkForUpdateAsync()andUpdates.fetchUpdateAsync()with theuseUpdatehook or an update strategy (Code Integration). - Remove
expo-updatesfrom the project so the two clients don't compete for the bundle. - Build and upload your native baseline, then publish updates with
cresc bundle(Publishing).
FAQ
Can I self-host EAS Update?
Not EAS Update itself, but Expo supports custom servers: the expo-updates client can point at any server implementing the Expo Updates protocol. Expo's example server is a simplified demo, so production use means building your own server, storage, publishing pipeline and rollout tooling.
Does a self-hosted Expo Updates server support diff patches?
The public Expo Updates protocol spec does not define patch delivery for custom servers. EAS Update's bsdiff patches (Expo SDK 55 and later) are a feature of Expo's hosted service.
Can Cresc be self-hosted?
Both options exist. The standard plans are hosted with CDN delivery included. Teams that need the server in their own infrastructure can get a supported self-hosted deployment on a separately negotiated plan; contact [email protected]. The client SDK (MIT) and CLI (BSD-3-Clause) are open source.
Does Cresc work with Expo?
Yes. Cresc supports Expo SDK 50 and later through prebuild, with the bundle URL configured automatically. Expo Go is not supported, since OTA updates need native code.