Expo Updatesprotocol v1

Over-the-air updates you host yourself

The Expo Updates server, running on your own Cloudflare account.

The Open OTA dashboard showing production and staging channels with update adoption, health and device counts

Everything a release needs

Deploy it once.
Publish as often as you like

Alchemy provisions the whole stack in your Cloudflare account, and the CLI does the rest from your app repository.

  1. Deploy to Cloudflare

    One pnpm cloud:deploy:prod creates the Workers, the D1 database, the R2 bucket, the Analytics Engine dataset and the Access policy in front of the dashboard.

  2. Connect your Expo app

    open-ota init writes the update URL, channel, signing settings and runtime policy into your app config, then runs doctor over the result.

  3. Publish an update

    open-ota publish checks the app and server, exports both platforms, uploads missing assets and publishes one update group.

FAQs

No. Open OTA implements Expo Updates protocol version 1 and serves the standard expo-updates client, so your app talks to your own server instead of EAS.

Open OTA is MIT licensed. You pay Cloudflare for the Workers, D1, R2 and Analytics Engine usage in your own account, and nothing to us.

Any client that speaks Expo Updates protocol version 1. The server matches on platform and runtime version and never reads an SDK version; protocol 0 requests are rejected. It is developed and verified against SDK 57.

In your Cloudflare account. Update metadata and device check-ins go to D1, assets to R2, and check and asset events to Analytics Engine. The dashboard sits behind Cloudflare Access.

Not today. One deployment serves one app across its channels. Multi-app hosting, per-device targeting and percentage splits between branches are outside the current scope.