Mobile EAS CI

Componentapps/mobile — Expo React Native shell
StatusProduction source — store binaries require EAS cloud build

Native mobile is a WebView shell around the anoobot web app. Source, tests, and validation gates are complete in-repo; .ipa / .apk artifacts are produced by Expo Application Services (EAS), not checked into git.

Local development (no EAS)

pnpm install
export EXPO_PUBLIC_ANOOBOT_FRONTEND_URL=http://localhost:5173
export EXPO_PUBLIC_ANOOBOT_API_URL=http://localhost:3000
pnpm --filter @anoobot/mobile start

Validation:

bash tools/scripts/validate-mobile-production.sh
bash tools/scripts/verify-expo-metro.sh

EAS build (operator)

cd apps/mobile
pnpm exec eas login
pnpm exec eas init          # first time only — links EAS project
pnpm exec eas build --profile preview --platform all

Profiles (apps/mobile/eas.json):

ProfileUse
developmentDev client, localhost URLs
previewInternal APK / device builds, production URLs
productionStore submission, auto-increment version

GitHub Actions

Workflow: .github/workflows/mobile-eas-build.yml

TriggerAction
Manual (workflow_dispatch)Build with chosen profile + platform
Tag mobile-v* (e.g. mobile-v0.0.1)Preview build on EAS

Repository hosting: CI requires an approved GitHub remote. Do not push tags until hosting is re-approved (see docs/developer-guide.md).

Required secrets

SecretPurpose
EXPO_TOKENExpo account token for non-interactive eas build
EAS_PROJECT_IDUUID from expo.dev after eas init

Optional variables

VariableDefault
ANOOBOT_FRONTEND_URLhttps://app.anoobot.com
ANOOBOT_API_URLhttps://api.anoobot.com

Validate secrets locally:

export EAS_PROJECT_ID=<uuid-from-expo.dev>
export ANOOBOT_VALIDATE_PRODUCTION_SECRETS=true
bash tools/scripts/validate-eas-secrets.sh

See .env.production.example for EAS_PROJECT_ID, EAS_UPDATE_URL, and EXPO_PUBLIC_* URLs.

CI pipeline steps

  1. pnpm install --frozen-lockfile
  2. node tools/scripts/generate-mobile-assets.mjs
  3. bash tools/scripts/validate-mobile-production.sh
  4. eas build --profile <profile> --platform <platform> --non-interactive --no-wait

If EXPO_TOKEN is unset, the workflow prints a notice and skips the build.

Store submission (manual)

Configure placeholders in apps/mobile/eas.jsonsubmit.production:

  • iOS: appleTeamId, ascAppId
  • Android: google-play-service-account.json path

Then:

cd apps/mobile
pnpm exec eas submit --platform ios --profile production
pnpm exec eas submit --platform android --profile production

Related docs

  • apps/mobile/README.md — quick start
  • docs/mobile-production-validation-proof.md — gate attestation
  • docs/desktop-app-status.md — desktop client packaging (Electron)
  • docs/website.md — product status matrix