Deploy
Two production surfaces:
- Railway — API + landing page + Postgres.
- TestFlight — iOS app.
Railway
First-time project setup
railway login
railway init # create a new project 'mapvest'
railway link # link this repo to it
Services
Create two Railway services from this repo:
api— root:apps/api, start command:bun run start, healthcheck:/v1/healthlanding— root:apps/landing, start command:bun run start- (Plugin) Postgres
Variables
Mirror Doppler into Railway service variables. Never paste raw secrets by hand:
See `infra/doppler/README.md`. Authoritative Mapvest secrets: Doppler `mapvest/prd` (personal workplace), mirrored to Railway `api`. Sibling Railway apps: `python3 infra/doppler/sync-personal-apps.py`.
Deploy
- Auto-deploy on push to
mainvia GitHub integration. - Manual:
railway up --service api.
Domains
- Landing:
https://mapvest.app— public site.www.mapvest.appis the Railway custom domain on thelandingservice (port 3000). The apex301s towwwat GoDaddy. - API:
https://api-production-4b27.up.railway.app— Railway service domain. No custom API host yet.
The previous landing URL https://landing-production-ce7b.up.railway.app still resolves and can stay as a fallback.
TestFlight (iOS)
Prerequisites
- Apple Developer account (paid) — team ID recorded in
apps/ios/eas.json. - Xcode 16+ on the build machine (locally).
xcodebuild -versionmust succeed. - EAS CLI:
bun add -g eas-cli(orbunx eas ...).
First-time
cd apps/ios
eas login
eas init # creates the EAS project
eas credentials # let EAS manage signing
Bundle id: com.mapvest.app (change if the Apple team requires).
Build + submit
# Preview / internal
eas build --platform ios --profile preview
# Production TestFlight (local / cloud agent with EXPO_TOKEN)
cd apps/ios
eas build --platform ios --profile production --auto-submit --non-interactive
CI (preferred)
GitHub Action ios-eas-production (.github/workflows/ios-eas-production.yml):
- Manual: Actions →
ios-eas-production→ Run workflow (onmain) - Tag:
git tag v0.1.0 && git push origin v0.1.0
Requires repo secret EXPO_TOKEN (Expo access token). Apple signing + ASC submit stay in EAS-managed credentials. The job uses --no-wait so CI returns once EAS accepts the build.
The build appears in App Store Connect → TestFlight → your internal group within ~15 min of upload.
Public join URL (landing CTA): https://testflight.apple.com/join/yvYrrxbM
Demo group
Set up an internal testing group mapvest-demo and add teammates by Apple ID. They receive a TestFlight invite via email and install through the TestFlight app. Testers can also use the public join link above.
Landing page → Docs
The landing page reads docs/*.md at build time. Any doc change requires a landing deploy to appear on /docs/*. This is intentional — production docs are always tagged with a specific commit.