OpenOTA delivers JS bundle updates over the air — instantly, verified, and reversible. Build a signed bundle, push it to your own server, and let installed apps sync, verify, and roll back on their own. Self-host it in ten minutes, or use OpenOTA Cloud and skip the infrastructure entirely.
$ openota release --platform android
✔ Bundle created
✔ Manifest generated · SHA256 verified
✔ Uploaded to project-scoped storage
# live on every device within secondsA one-line copy fix or a critical bug patch can sit in review for days. OpenOTA ships the JS change directly to installed apps — no binary resubmission, no waiting on a reviewer.
Native code, new permissions, and anything Apple/Google require review for still goes through the store as normal. OpenOTA only ever touches the JS bundle — that boundary is enforced by the runtime, not a policy you have to remember.
Every device independently re-verifies the SHA-256 checksum of what it downloaded before running it — the server's word alone is never trusted. If a release is bad, rollback is a local pointer swap, not a re-deploy.
Built for teams who ship fast and can't afford a broken release to sit in the wild.
Ship JS bundle changes to every device in seconds — no app store review, no waiting.
Rolling back happens entirely on-device, no server round-trip, no re-download.
Every bundle is checksummed end to end so a corrupted or tampered package never installs.
Each project gets its own scoped API keys and storage namespace — no cross-tenant leakage.
`openota release` is the whole deploy step. Fits any CI pipeline you already run.
Run it on your own infrastructure today, or use OpenOTA Cloud when you don't want to.
A release reaches an already-open app over a live connection — no waiting for the next launch.
One click on the dashboard — links to your existing account if the email already matches.
openota release builds and uploads a versioned bundle; every installed app runs the same five steps to adopt it.
Metro bundles JS + assets, hashes the output, writes a versioned manifest.
Device asks your server for the active version against its own runtime version.
Package streams to disk with live progress, resumable on flaky networks.
SHA-256 of the extracted bundle is checked against the signed manifest before anything runs.
Bundle swaps in on next launch; a boot-loop trips automatic rollback to the last good version.
{ bundleVersion: "1.2.0", platform: "android", sha256: "0d04b2…8a" }npm install @openota/sdkOTA.configure({ serverUrl, channel: 'production' })openota release --platform androidSame category as CodePush or Expo Updates — the difference is what you own.
Yes, same category — ship JS updates without an app store review. The differences: you own the server (self-host it or use OpenOTA Cloud, identical API either way), it's MIT-licensed and open source, and every device independently re-verifies a bundle's checksum before running it rather than trusting the server.
No — and neither can any OTA tool. Only JavaScript/asset changes can ship this way, by design and by platform policy. Native code changes, new permissions, and anything else that changes the compiled binary still require a normal store submission.
The native runtime tracks boot health — a bundle that crashes on launch triggers automatic rollback to the last known-good version, on-device, without waiting on you. You can also roll back manually from the CLI or the Cloud dashboard, which is a pointer change, not a new deploy.
Self-hosting is a first-class path, not an afterthought — docker compose up and you're running the exact same server code as Cloud. Use Cloud only if you'd rather not operate the infrastructure yourself.
The @openota/sdk package plus a handful of native modules it depends on (storage, filesystem, zip extraction, checksum verification) — see the full list and required native-rebuild steps on the docs page.
Self-host OpenOTA in minutes, or spin up a project on OpenOTA Cloud — same SDK, same CLI, either way.