App builds (EAS)
Expo apps are built into installable binaries with EAS Build, Expo's cloud build service. This avoids maintaining local Android/iOS toolchains.
One-time setup
# Install the CLI and sign in to your Expo account
npm install -g eas-cli
eas login
# Initialize EAS in the project (creates a project ID and eas.json)
eas build:configureThis generates eas.json. A typical configuration:
{
"cli": { "version": ">= 12.0.0" },
"build": {
"development": {
"developmentClient": true,
"distribution": "internal"
},
"preview": {
"distribution": "internal",
"android": { "buildType": "apk" }
},
"production": {
"autoIncrement": true
}
},
"submit": {
"production": {}
}
}Bundle identifiers
app.json already sets android.package and ios.bundleIdentifier to com.vineethkrishnan.wespend. Change these if you fork the project.
Build profiles
| Profile | Output | Use |
|---|---|---|
development | Dev client | Debugging with a custom native runtime |
preview | Internal APK / IPA | Share a testable build with the household |
production | Store-ready AAB / IPA | Submission to Play Store / App Store |
Build commands
# A shareable Android APK for internal testing
eas build --platform android --profile preview
# Production builds for both platforms
eas build --platform all --profile productionEAS runs the build in the cloud and returns a download link (and, for internal distribution, a QR code to install on a device).
Supplying secrets to the build
The app reads Supabase credentials from EXPO_PUBLIC_* env vars at build time. For EAS builds, set them as EAS secrets so they are baked into the binary:
eas secret:create --name EXPO_PUBLIC_SUPABASE_URL --value "https://YOUR-PROJECT.supabase.co"
eas secret:create --name EXPO_PUBLIC_SUPABASE_ANON_KEY --value "YOUR-ANON-KEY"Anon key is public by design
The Supabase anon key is meant to ship in the client; Row Level Security is what protects data. Never put the service-role key in the app or in EXPO_PUBLIC_* vars.
Submitting to stores
eas submit --platform android --latest
eas submit --platform ios --latestStore submission requires a Google Play Console and an Apple Developer account. These are the founder-provided credentials noted in the overview.