exoDocs
Decisions (ADRs)

Decisions and roadmap

ADR 0007: exo-mobilize — Expo mobile release toolkit

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

StageFixed costMarginal cost
Apple Developer Program$99/year (required)—
EAS Free$0capped at 15+15 builds/month, OTA to 1K MAU
EAS Starter$19/monthusage beyond the $45 build credit
Own Mac builderhardware 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

OptionWhy not
Bare React NativeSame runtime without Expo's build, config, and OTA tooling
FlutterDart rewrite, no official Convex client, OTA only via Shorebird
Capacitor / IonicWebview feel
Kotlin / Compose MultiplatformKotlin rewrite
Lynx (ByteDance)Too young
Native Swift + KotlinTwo 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

On this page