Skip to content

Repository files navigation

Expo Open OTA

Self-hosted over-the-air updates for Expo apps, built for production at scale.

An open-source Go server implementing the Expo Updates protocol,
with a web dashboard, multi-app support, progressive rollouts, instant rollbacks and one-command publishing.

Latest release eoas on npm CI status License

Documentation · Quick start · Issues · Contact

Install the docs MCP server in Cursor Install the docs MCP server in VS Code

The documentation is exposed as an MCP server: plug it into Cursor, VS Code, Claude Code or any MCP client.

Expo Open OTA is an independent open-source project. It is not affiliated with, endorsed or supported by Expo.

The Expo Open OTA dashboard showing a production branch with a progressive rollout in progress at 25%

Battle-tested in production. Expo Open OTA has been serving over-the-air updates in production since early 2025, to apps totaling more than a million monthly active users.

Why self-host your OTA updates?

Cut costs. EAS Update pricing scales with your monthly active users. Self-hosting serves unlimited updates to unlimited devices for the price of your infrastructure.

Own your infrastructure. Updates live in your bucket, are served by your server and travel through your CDN, behind your security policies.

No vendor lock-in. The standard Expo Updates protocol on top of standard storage. Switch clouds anytime.

Built for production and scale

Your CDN does the heavy lifting. Devices download updates from your CDN, straight out of your bucket. The server only answers lightweight update checks, so millions of devices checking in never turn into millions of downloads hitting it.

It scales horizontally. The update server is stateless: run as many replicas as your traffic needs, they stay consistent with each other out of the box.

It plugs into your monitoring. Metrics, dashboards and health checks come built in, ready for whatever observability stack you already run.

Features

Multi-app support

One server hosts all your Expo apps. Each app gets its own branches, channels, API tokens and update history, and your whole team manages everything from a single dashboard. No Expo account required.

One-command publishing

Ship an update from your terminal or CI with the eoas CLI. Rollbacks and republishing are one command too.

npx eoas publish --branch production --rollout-percentage 10

Release channels & branches

Your app is built once and asks for a channel. You decide which branch of updates that channel serves: remap to roll out, remap back to roll back. No rebuild, no store review.

Channels page mapping release channels to branches, with a progressive branch rollout in progress

Progressive rollouts

Ship to 10% of devices, watch your metrics, then increase, finish or revert in one click from the dashboard.

Manage rollout dialog with traffic split presets and promote or revert actions

A/B testing

A channel can serve two branches at once, with devices split deterministically between them. Test two variants in production, promote the winner.

Stateless mode

Start with nothing but a bucket and a few environment variables, no database. When you want the multi-app dashboard, plug in PostgreSQL and the server migrates itself into control plane mode automatically.

Integrations

Storage AWS S3  ·  Google Cloud Storage  ·  Azure Blob Storage  ·  Cloudflare R2  ·  MinIO  ·  DigitalOcean Spaces  ·  Supabase Storage  ·  any S3-compatible storage  ·  local file system
CDN CloudFront  ·  GCS signed URLs  ·  Azure SAS URLs  ·  custom CDN domain  ·  direct serving
Cache Redis  ·  in-memory
Key store AWS Secrets Manager  ·  environment variables  ·  local key files  ·  sealed in the database

Plus expo-updates code signing, and Hermes source maps for Sentry or PostHog.

Quick start

Deploy on Railway

  1. Deploy the server with the Railway button above, Docker or the Helm chart.
  2. Run npx eoas init in your Expo project to wire it to your server.
  3. Publish your first update with npx eoas publish --branch production.

The full walkthrough for both modes is in the documentation: stateless mode and control plane mode. Coming from v2? Follow the migration guide.

Ask the docs from your AI assistant

The documentation is exposed as an MCP server, so your AI tools can answer questions about Expo Open OTA with the docs as their source:

https://mercure-technologies.gitbook.io/expo-open-ota/~gitbook/mcp

Use the install buttons at the top of this page for Cursor and VS Code. For Claude Code:

claude mcp add --transport http expo-open-ota-docs https://mercure-technologies.gitbook.io/expo-open-ota/~gitbook/mcp

Any other MCP-compatible client (ChatGPT connectors included) can be pointed at the same URL.

Enterprise

For teams that need tighter control, the Enterprise edition adds:

  • Single sign-on (OIDC): let your team sign in through Microsoft Entra ID, Okta, Google Workspace, Keycloak or any OpenID Connect issuer.
  • Protected branches: once a branch is protected, only API tokens you explicitly allow can publish, roll back or republish on it. A token handed to a developer for staging can never ship to production.
  • IP allowlists: restrict each API token to your CI runners' addresses, per address or CIDR range.
  • Audit logs: every publish, rollback, login, role change and configuration edit is recorded with who did it, from which IP, and whether it succeeded. Browse the trail from the dashboard or export it as NDJSON for your compliance tooling.
API token access restrictions with protected branches and an IP allowlist Single sign-on configuration page supporting any OIDC identity provider

The enterprise code lives in public ee/ directories you can read before you buy, and licenses are verified fully offline against an embedded key: your production servers never phone home. Everything else on this page is MIT. For a license, contact us.

Contributing

Contributions are welcome! For anything beyond a small fix, please open an issue before writing code. Expo Open OTA is an open-core project and some advanced features are reserved for the commercial edition; the boundary is documented in CONTRIBUTING.md.

Disclaimer

Expo Open OTA is not officially supported or affiliated with Expo. This is an independent open-source project.

License

The core is MIT and will stay MIT. Enterprise features live in ee/ directories and are covered by a commercial license (see ee/LICENSE); everything else is MIT (see LICENSE).

Contact

contact@mercuretechnologies.com

About

An open-source self-hosted server implementing the Expo Updates protocol, built for production. Multi-app dashboard, progressive rollouts, instant rollbacks, served from your own bucket and CDN.

Topics

Resources

Contributing

Stars

Watchers

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages