Decisions and roadmap
ADR 0007: exo-mobilize — Expo mobile release toolkit
- Status: accepted (owner-approved 2026-09-27)
- Date: 2026-09-27
- Roadmap:
mobile-delivery-pipeline(exo-mobilize)
Context
Exo provisions shared platform services to every app so apps do not spend time on basic plumbing. Shipping to iOS and Android involves the same setup every time: app config, signing, store listings, TestFlight, native sign-in redirects, analytics. Our stack is TypeScript, React, Convex, and Exo ID, 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
(15 iOS + 15 Android builds/month, OTA to 1K MAU); move to Starter ($19/month plus usage,
includes $45 build credit) when several apps ship; run our own Mac builder
(
eas build --local/ fastlane) only at high volume. - exo-mobilize owns the release template: app config, signing, TestFlight and store
listings, Exo ID sign-in via a native redirect scheme (e.g.
universe://auth/callback), and the exo-analyze SDK built in. - The PWA-required-for-mobile repository contract gate 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 build 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 |
Expo wins: open source, reuses our TS/React/Convex/Exo ID code, native UI, OTA updates, and agents are fluent in it.
Consequences
- New mobile apps start from the exo-mobilize template, not from scratch.
- EAS is a service choice, not a dependency: the template must keep a local-build path.
- Each app registers its native redirect scheme with Exo ID as part of onboarding.
Source: docs/adr/0007-exo-mobilize-mobile-release-toolkit.md