exo-deploy
One release path for every surface. Web on Railway, mobile on Expo (config, signing, TestFlight and store listings, Exo Key native sign-in, exo-analyze built in).
Source: ADR 0007, accepted (owner-approved) on 2026-09-27. It is on main and not yet on
staging: read it on main.
Roadmap: mobile-delivery-pipeline.
Renamed 2026-10-02: exo-deploy became exo-deploy and now covers every surface (web on Railway, mobile on Expo, pages and embedded app surfaces). ADR 0007 keeps its original filename. RevenueCat moved to Payments.
Why
Shipping to iOS and Android involves the same setup every time: app config, signing, store listings, TestFlight, native sign-in redirects, and analytics. Exo's stack is TypeScript, React, Convex, and Exo Key, and most code is written by agents. Universe already ships on Expo and is the reference.
Decision
- Expo is the standard mobile framework for Exo Apps. Expo is an MIT-licensed framework on React Native.
- EAS is optional and swappable for build, submit, and OTA updates. Start on EAS Free, move to
Starter when several Apps ship, and run an own Mac builder (
eas build --localor fastlane) only at high volume. - exo-deploy owns the release template: app config, signing, TestFlight and store listings,
Exo Key sign-in via a native redirect scheme (for example
universe://auth/callback), and the exo-analyze SDK built in. - The PWA-required-for-mobile gate in the repository contract stays.
Unit economics
| Stage | Fixed cost | Marginal cost |
|---|---|---|
| Apple Developer Program | $99/year (required) | — |
| EAS Free | $0 | Capped at 15 + 15 builds/month, OTA to 1K MAU |
| EAS Starter | $19/month | Usage beyond the $45 build credit |
| Own Mac builder | Hardware or hosted Mac | ~$0 per build; pays off only at high volume |
At current volume the toolkit costs ~$8/month (Apple fee amortized). Move up a tier only when build counts or OTA MAU exceed the current tier.
Alternatives considered
| Option | Why not |
|---|---|
| Bare React Native | Same runtime without Expo's build, config, and OTA tooling |
| Flutter | Dart rewrite, no official Convex client, OTA only via Shorebird |
| Capacitor / Ionic | Webview feel |
| Kotlin / Compose Multiplatform | Kotlin rewrite |
| Lynx (ByteDance) | Too young |
| Native Swift + Kotlin | Two codebases |
Consequences
- New mobile Apps start from the exo-deploy template.
- EAS is a service choice, not a dependency: the template keeps a local-build path.
- Each App registers its native redirect scheme with Exo Key during onboarding.
Status
Accepted; planned. Template location: TBD.