# 07 · Deploy

https://exo.now/docs/stack/deploy

> Exo Deploy ships every surface. Web apps and services run on Railway, and iOS and Android apps ship with Expo.



<StackFacts dimension="07 · Deploy" platforms="[&#x22;railway&#x22;, &#x22;expo&#x22;]" via="Exo Deploy" status="Web live on Railway. Mobile toolkit accepted (ADR 0007, 2026-09-27) and planned; Universe already ships on Expo." />

## What it is [#what-it-is]

The deploy dimension answers: how does each surface reach users, and what is running now?
**Exo Deploy** owns the release path for every surface:

| Surface                         | Platform             | Path                                                               |
| ------------------------------- | -------------------- | ------------------------------------------------------------------ |
| Web apps and services           | Railway              | `staging` auto-deploys; a release PR to `main` promotes production |
| Mobile apps (iOS, Android)      | Expo                 | TestFlight, then the App Store and Google Play                     |
| Pages and embedded app surfaces | Construct on Railway | Same path as web                                                   |

Every surface follows the same Staging → Release Candidate → Production path, described in
[How work ships](../shipping/index.mdx). The service design is on the
[Exo Deploy](../platform/exo-deploy.mdx) page. In-app purchases live under
[Payments](./payments.mdx), not here.

## Platform [#platform]

* **Railway** runs Next.js hosting for the Exo web app, cron workers that reach external systems
  (Entire trail sync, provider health sweeps, revenue snapshot pulls), and Valkey for rate limits
  and short-lived caches ([infrastructure](../../../docs/infrastructure.md)). The Exo web image is
  a standard `Dockerfile` (`node:22-bookworm-slim`, pnpm 11.15, `pnpm build`, port 3000,
  `output: 'standalone'`). The self-hosted Arch-Router assessor is a second Railway service built
  from `services/arch-router/`.
* **Expo**, an MIT-licensed framework on React Native, is the standard mobile framework for Exo
  apps. **EAS** is optional and swappable for build, submit, and OTA updates (ADR 0007).

## Boundary and replaceability [#boundary-and-replaceability]

* **Web: the contract is an OCI image:** a standard `Dockerfile`, an HTTP port, and environment
  variables. Railway and Coolify are the initial adapters, and the contract requires neither
  ([architecture](../../../docs/architecture.md),
  [cross-platform delivery](../../../docs/platform-delivery.md)).
* Railway holds runtime secrets. Exo stores only the names of environment variables.
* Leaving the managed runtime includes a documented handoff of the container contract, health
  checks, variable names, volumes, scheduled jobs, domains, and rollback
  ([portability](../../../docs/portability.md)).
* A provider-generated hostname is deployment evidence, never the review URL
  ([staging topology](../../../docs/staging-topology.md)).
* **Mobile:** EAS is a service choice, not a dependency. The Exo Deploy mobile template keeps a
  local-build path (`eas build --local` or fastlane). The repository contract keeps a
  **PWA-required-for-mobile** gate, and each app registers its native redirect scheme with Exo Key
  during onboarding.

## Cost notes [#cost-notes]

Web:

* One recorded unit cost: **\~$0.007 per 5-minute run on a 2 vCPU / 2 GB Railway worker**
  (ADR 0005, used to price EXO Verify).
* The Arch-Router service is CPU-only and runs comfortably in \~1 GB RAM, with no per-call cost
  ([arch-router](../../../services/arch-router/README.md)).
* Monthly Railway spend for Exo and the portfolio: **TBD**. Every deployment must first pass the
  projects.dev credential and spend gate.

Mobile (ADR 0007, 2026-09-27):

| Stage                   | Fixed cost             | Marginal cost                                             |
| ----------------------- | ---------------------- | --------------------------------------------------------- |
| Apple Developer Program | $99/year (required)    | —                                                         |
| EAS Free                | $0                     | Capped at 15 iOS + 15 Android 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 mobile toolkit costs about **$8/month** (Apple fee amortized).

## Status [#status]

* **Live:** Exo web on Railway, with staging at `staging.exo.now` and production at `exo.now`.
* **Planned:** the Exo Deploy mobile template
  ([roadmap: mobile-delivery-pipeline](../../../roadmap/items/mobile-delivery-pipeline.md)).
  Template location: **TBD**.
* **Reference:** Universe already ships on Expo, registered with Exo Key using the native
  redirect `universe://auth/callback`.
* **Evidence rule:** a push proves only that Git received the commit, and a provider success proves
  only that a deployment job finished. Staging is current only after the deployed commit,
  `/api/health`, access boundary, and browser behavior are verified
  ([build and deploy](../../../docs/build-and-deploy.md)).
