dash-ota vs the alternatives
Every tool on this page can sign bundles and verify the signature on the device. Stallion,
hot-updater, CodePush and Expo's expo-updates all offer it, and in each of them the private key
stays with you rather than on the update server. In all four, signing is opt-in.
What dash-ota does differently
- Signing is mandatory. There is no unsigned mode: the CLI signs every release with Ed25519, and native code on the device rejects any release that doesn't verify against the public keys compiled into the app. There is no setting to forget.
- The update server never holds the signing key. The backend stores and serves releases that were signed before they reached it. Someone with root on it can hold back updates or re-serve old ones you signed, but can't create a new one.
- Delivery is per file and content-addressed, meaning each file is stored under the SHA-256 hash of its contents. A device downloads only the files it doesn't already have, and checks each one against the hash in the signed manifest.
- Requests are signed with a device key. Each install creates its own key pair (Android Keystore, or the Secure Enclave on iOS) and signs every request with a timestamp and a random nonce, a value the server refuses to accept twice.
- Auto-pause is on by default. Devices report when a release fails on them; once at least 5 reports are in and 20% or more of them are failures, the server stops offering that release.
- You host all of it. The client, CLI and backend are MIT-licensed, and no vendor service sits between your CI and your users' devices.
Two limits to know before you rely on those points. A device key proves that requests come from
the same install; it doesn't prove the install is a genuine copy of your app. Enrollment accepts
whatever your backend's verifyEnrollToken hook accepts, attestation is an optional hook that is
off by default, and on iOS the key falls back to software unless you set
OTA_REQUIRE_HARDWARE_KEY. And the AES-256-GCM payload encryption only hides blobs from someone
who can read your storage and nothing else: the backend and every enrolled install can decrypt
them.
See the security model and the breach walkthrough for what a compromised server can still do.
Feature matrix
Competitor cells were checked against each project's own documentation in September 2026. Hover a cell for its note. If something here is out of date or unfair, open an issue.
Where the others are ahead
- Patches. hot-updater, Stallion (Pro plan and up) and EAS Update (bundle diffing, on by default from SDK 56) send a diff against the bundle the device already has. hot-updater's docs give the example of a 10 MB archive shipping as a patch of about 600 KB. dash-ota doesn't generate patches: unchanged files aren't downloaded again, but a changed JS bundle downloads whole.
- CDN delivery. hot-updater gives the device a signed URL to your storage. dash-ota streams every blob through your own API, so your API carries all of the download traffic.
- Switching channels for QA. EAS Update's "channel surfing", hot-updater's runtime channel switch,
Stallion's in-app testing modal and CodePush's
deploymentKeyoption all let a tester point one build at another channel. In dash-ota the channel is compiled into the binary, so testing another channel means installing another build. - Hosted free tiers. Stallion is free up to 10K monthly active users and EAS Update up to 1K. dash-ota has no hosted option; you run the backend.
- The Expo workflow. EAS Update can publish an update from a pull request and preview it in a
development build. If your app is built with Expo and EAS,
expo-updatesfits that toolchain far better. - Crash tooling. hot-updater has
withSentry(), which uploads source maps. dash-ota has nothing built in; you upload source maps to your crash reporter yourself. - Adoption. npm downloads for the last month:
expo-updatesabout 13.9 million,@hot-updater/react-nativeabout 131k,react-native-stallionabout 28k,react-native-dash-otaabout 460. More users means more bugs already found and more answers already written. - Older React Native. Stallion supports React Native 0.69 and later. dash-ota needs 0.79 or later with the New Architecture.
The roadmap lists which of these dash-ota plans to close.
When not to choose dash-ota
- You want a managed dashboard, analytics and support, and are comfortable with a vendor: Stallion is less setup, has a free tier up to 10K MAU, and can sign its bundles too.
- You build with Expo and EAS:
expo-updateshas X.509 code signing (on EAS it needs a Production or Enterprise plan) and is built into that toolchain. - You want the fastest path to a self-hosted setup: hot-updater works with Supabase, Cloudflare, AWS and Firebase, has a web console and bundle signing, and ships binary patches. dash-ota asks you to set up signing keys before your first publish.
- Your app runs React Native older than 0.79 or the old architecture.
dash-ota fits teams that must be able to say what happens when the update server is compromised, and who will run a backend and manage signing keys to get there. If that isn't a requirement you have, one of the others will get you shipping faster.