Skip to main content

Build Configuration

TrickBook uses EAS (Expo Application Services) for building and deploying native apps.

EAS Configuration

eas.json

{
"cli": {
"version": ">= 3.7.2",
"appVersionSource": "remote"
},
"build": {
"development": {
"developmentClient": true,
"distribution": "internal",
"node": "20.18.0",
"ios": {
"resourceClass": "m-medium",
"image": "macos-sonoma-14.6-xcode-16.1"
}
},
"preview": {
"distribution": "internal",
"node": "20.18.0",
"ios": {
"resourceClass": "m-medium",
"image": "macos-sonoma-14.6-xcode-16.1"
}
},
"production": {
"node": "20.18.0",
"ios": {
"resourceClass": "m-medium",
"image": "macos-sonoma-14.6-xcode-16.1"
},
"android": {
"buildType": "app-bundle"
}
},
"testflight": {
"distribution": "store",
"ios": {
"resourceClass": "m-medium",
"image": "macos-sonoma-14.6-xcode-16.1",
"autoIncrement": true
},
"node": "20.18.0",
"env": {
"EXPO_NO_DOTENV": "1"
}
},
"playstore": {
"distribution": "store",
"node": "20.18.0",
"android": {
"buildType": "app-bundle",
"image": "latest",
"autoIncrement": true
},
"env": {
"EXPO_NO_DOTENV": "1",
"NODE_ENV": "production"
}
}
},
"submit": {
"production": {},
"playstore": {
"android": {
"track": "internal",
"releaseStatus": "draft"
}
}
}
}

Build Profiles

ProfilePlatformDistributionNode.jsUse Case
developmentiOS/AndroidInternal20.18.0Local dev with dev-client
previewiOS/AndroidInternal20.18.0QA testing
productioniOS/AndroidN/A20.18.0Generic production build
testflightiOSStore20.18.0App Store submission
playstoreAndroidStore20.18.0Google Play submission

App Configuration

app.json

{
"expo": {
"name": "TrickBook",
"slug": "TrickBook",
"version": "2.0.0",
"privacy": "public",
"orientation": "portrait",
"scheme": "trickbook",
"userInterfaceStyle": "automatic",
"icon": "./assets/images/icon.png",
"splash": {
"image": "./assets/images/splash.png",
"resizeMode": "contain",
"backgroundColor": "#121212"
},
"ios": {
"supportsTablet": true,
"bundleIdentifier": "com.thetrickbook.trickbook",
"buildNumber": "5",
"config": {
"googleMapsApiKey": "..."
},
"infoPlist": {
"NSCameraUsageDescription": "TrickBook uses the camera to take photos...",
"NSPhotoLibraryUsageDescription": "TrickBook needs access to your photos...",
"NSLocationWhenInUseUsageDescription": "TrickBook uses your location to find nearby spots.",
"ITSAppUsesNonExemptEncryption": false
}
},
"android": {
"package": "com.thetrickbook.trickbook",
"versionCode": 5,
"adaptiveIcon": {
"foregroundImage": "./assets/images/adaptive-icon.png",
"backgroundColor": "#121212"
},
"config": {
"googleMaps": { "apiKey": "..." }
},
"permissions": [
"ACCESS_COARSE_LOCATION",
"ACCESS_FINE_LOCATION"
]
},
"plugins": [
"expo-secure-store",
"expo-router",
"expo-video",
"expo-apple-authentication",
["expo-location", { "locationWhenInUsePermission": "..." }]
],
"experiments": {
"typedRoutes": true
}
}
}

Key Configuration Options

FieldValuePurpose
nameTrickBookDisplay name
slugTrickBookURL-safe identifier
version2.0.0Semantic version
schemetrickbookDeep link scheme
bundleIdentifiercom.thetrickbook.trickbookiOS app ID
packagecom.thetrickbook.trickbookAndroid app ID
buildNumber5iOS build number
versionCode5Android build number
userInterfaceStyleautomaticSupports dark/light mode

Expo Plugins

PluginPurpose
expo-secure-storeSecure token storage
expo-routerFile-based navigation
expo-videoVideo playback
expo-apple-authenticationApple Sign-In
expo-locationGPS location access

Typed Routes

With experiments.typedRoutes: true, Expo Router generates TypeScript types for all route paths, providing compile-time safety for navigation.

Build Commands

Development Build

# iOS development build
eas build --platform ios --profile development

# Android development build
eas build --platform android --profile development

Preview Build

# Internal distribution for testing
eas build --platform all --profile preview

Production Builds

# iOS for TestFlight
eas build --platform ios --profile testflight

# Android for Google Play
eas build --platform android --profile playstore

# Both platforms
eas build --platform all --profile production

Submission

iOS (TestFlight/App Store)

# Submit latest iOS build
eas submit --platform ios --latest

# Or specify a build
eas submit --platform ios --id BUILD_ID

Android (Google Play)

# Submit latest Android build (internal track, draft)
eas submit --platform android --latest --profile playstore

Version Management

With appVersionSource: "remote" in eas.json:

  • Version is managed in EAS dashboard
  • autoIncrement: true bumps version on each build
  • No need to manually update app.json version

Manual Version Bump

# Set app version
eas build:version:set --platform ios --build-number 10
eas build:version:set --platform android --version-code 6

Environment Variables

For production builds, sensitive values come from EAS secrets:

# Set EAS secrets
eas secret:create --name API_URL --value "https://api.thetrickbook.com"

The EXPO_NO_DOTENV: "1" flag in testflight/playstore profiles prevents loading local .env files during builds.

Build Monitoring

Track builds in EAS dashboard or via CLI:

# List recent builds
eas build:list

# View build details
eas build:view BUILD_ID

iOS Build Environment

SettingValue
macOSSonoma 14.6
Xcode16.1
Resource Classm-medium
Node.js20.18.0