Every feature below reflects what's shipped today, not a roadmap. Where something is partial or in progress — like iOS — it's labeled that way instead of implied.
Ship a new JS bundle to every device in seconds — no app store review, no waiting.
Rolling back happens entirely on-device against a previously verified bundle — no re-download, no server round-trip.
Every device reports a native runtimeVersion; a bundle is only ever offered to a device it's actually compatible with.
A release reaches an already-open app over a live WebSocket connection, not just on next cold start.
Cold-start and background checks apply updates without a blocking prompt — the SDK's sync path never interrupts the user.
Every package is checksummed end to end; a corrupted or tampered bundle is rejected before it ever installs.
The SDK is a thin JS layer (OTA.configure/sync/check) that any React Native app can drop in.
Fully shipped — native bundle-swapping via @openota/native-android, verified end to end on real devices.
The SDK's iOS bridge and server-side support exist, but there's no shipped native module yet — Android is what works today.
openota init / doctor / release / rollback — most day-to-day work never needs the dashboard.
Production, staging, and development each track their own active release and rollout percentage per platform.
Every release, rollback, and rollout change is logged per environment, newest first.
Downloads come from real device check-ins; install/failure/rollback counts come from the SDK reporting its own outcome — no synthetic numbers.
Each project gets its own scoped API keys and storage namespace — no cross-tenant access.
We host the server for you — same CLI, same SDK, same dashboard, nothing to run yourself.
Run the same server binary yourself. MIT licensed, no feature gate versus Cloud.
Local disk or Supabase Storage today. S3/R2/GCS aren't implemented yet — the provider interface exists, but only these two are wired in.