building-with-eas
EAS Build and Submit configuration, credentials management, and troubleshooting. Use when configuring eas.json profiles, managing iOS/Android credentials, or debugging build failures.
What this skill does
# EAS Build & Submit Reference
## Plugin Tools
Before production builds, verify your version hasn't already been released:
```bash
# Check version against EAS build history and store releases
cd /path/to/expo-toolkit && npm run check-version -- /path/to/your/app
# Or directly
node tools/check-version.js /path/to/your/app
node tools/check-version.js /path/to/your/app --json
```
This checks:
- Current version in app.config.js
- Recent EAS builds and their submission status
- autoIncrement settings in eas.json
- Provides guidance if version bump is needed
## Essential Commands
```bash
# Initialize EAS in project
eas init
# Configure build profiles
eas build:configure
# Check/manage credentials
eas credentials
eas credentials --platform ios
eas credentials --platform android
# Build commands
eas build --platform ios --profile development
eas build --platform android --profile preview
eas build --platform all --profile production
# Build with auto-submit
eas build --platform ios --profile production --auto-submit
eas build --platform android --profile production --auto-submit
# Check build status
eas build:list
```
## eas.json Configuration
### Standard Build Profiles
The `eas.json` file defines build profiles. A well-configured file looks like:
```json
{
"cli": {
"version": ">= 16.18.0",
"appVersionSource": "remote"
},
"build": {
"base": {
"env": {
"APP_VARIANT": "production"
}
},
"development": {
"extends": "base",
"developmentClient": true,
"distribution": "internal",
"env": {
"APP_VARIANT": "development"
},
"ios": {
"simulator": false
},
"android": {
"buildType": "apk",
"gradleCommand": ":app:assembleDebug"
}
},
"development-simulator": {
"extends": "development",
"ios": {
"simulator": true
},
"android": {
"buildType": "apk"
}
},
"preview": {
"extends": "base",
"distribution": "internal",
"env": {
"APP_VARIANT": "preview"
},
"android": {
"buildType": "apk"
}
},
"production": {
"extends": "base",
"autoIncrement": true,
"env": {
"APP_VARIANT": "production"
}
}
},
"submit": {
"production": {
"ios": {
"appleId": "[email protected]",
"ascAppId": "1234567890"
},
"android": {
"serviceAccountKeyPath": "./play-store-credentials.json",
"track": "internal"
}
}
}
}
```
### Profile Properties Reference
| Property | Description | Common Values |
|----------|-------------|---------------|
| `developmentClient` | Include expo-dev-client | `true` for dev builds |
| `distribution` | How build is distributed | `internal`, `store`, `simulator` |
| `autoIncrement` | Auto-increment version | `true`, `"version"`, `"buildNumber"` |
| `env` | Environment variables | Object of key-value pairs |
| `extends` | Inherit from another profile | Profile name string |
### iOS-Specific Properties
| Property | Description |
|----------|-------------|
| `simulator` | Build for simulator (no signing) |
| `enterpriseProvisioning` | Use enterprise distribution |
| `resourceClass` | Build machine size (`default`, `large`) |
### Android-Specific Properties
| Property | Description |
|----------|-------------|
| `buildType` | Output format (`apk` or `app-bundle`) |
| `gradleCommand` | Custom Gradle command |
| `withoutCredentials` | Skip signing (simulator/dev) |
## Credentials Management
### iOS Credentials
EAS manages three primary iOS credentials:
1. **Distribution Certificate** - Signs your app for distribution
2. **Provisioning Profile** - Links app, certificate, and devices
3. **Push Notification Key** - For APNs (Apple Push Notification service)
```bash
# Interactive credential management
eas credentials --platform ios
# Options available:
# - Distribution Certificate: Manage your distribution certificate
# - Provisioning Profile: Manage your provisioning profile
# - Push Notifications: Manage your Apple Push Notifications Key
```
**Let EAS manage credentials (recommended):**
- EAS automatically creates and manages credentials
- Certificates stored securely on Expo servers
- Automatic renewal before expiration
**Use local credentials:**
Create `credentials.json` at project root:
```json
{
"ios": {
"provisioningProfilePath": "ios/certs/profile.mobileprovision",
"distributionCertificate": {
"path": "ios/certs/dist-cert.p12",
"password": "certificate-password"
}
}
}
```
### Android Credentials
Android requires a keystore for signing:
```bash
# Interactive credential management
eas credentials --platform android
# Options available:
# - Keystore: Manage your keystore
# - FCM API Key: Manage your Firebase Cloud Messaging key
```
**Local keystore configuration:**
```json
{
"android": {
"keystore": {
"keystorePath": "android/keystores/release.keystore",
"keystorePassword": "keystore-password",
"keyAlias": "key-alias",
"keyPassword": "key-password"
}
}
}
```
### Push Notification Setup
**iOS (APNs):**
```bash
eas credentials --platform ios
# Select: Push Notifications: Manage your Apple Push Notifications Key
# Follow prompts to create or upload key
```
**Android (FCM):**
```bash
eas credentials --platform android
# Select: FCM API Key: Manage your Firebase Cloud Messaging key
# Provide your FCM server key from Firebase Console
```
## Build Submission (`--auto-submit`)
### iOS Submission Behaviour
iOS builds can auto-submit to App Store Connect / TestFlight:
```bash
# Auto-submit to TestFlight
eas build --platform ios --profile production --auto-submit
```
**What happens:**
1. Build completes on EAS servers
2. Build automatically uploaded to App Store Connect
3. Appears in TestFlight for testing
4. Still requires manual submission to App Review
**Requirements:**
- Valid Apple Developer account
- `appleId` and `ascAppId` in submit profile
- App created in App Store Connect
### Android Submission Behaviour
**IMPORTANT: First submission must be manual**
For a brand new app on Google Play:
1. Build the AAB: `eas build --platform android --profile production`
2. Download the AAB from EAS dashboard
3. Manually upload to Google Play Console
4. Complete store listing, content rating, etc.
5. After first release, `--auto-submit` works
```bash
# After first manual upload, auto-submit works
eas build --platform android --profile production --auto-submit
```
**Submit profile for Android:**
```json
{
"submit": {
"production": {
"android": {
"serviceAccountKeyPath": "./play-store-credentials.json",
"track": "internal"
}
}
}
}
```
**Track options:**
- `internal` - Internal testing (up to 100 testers, instant)
- `alpha` - Closed testing
- `beta` - Open testing
- `production` - Production release
### Service Account Setup (Android)
1. Go to Google Cloud Console
2. Create service account with "Service Account User" role
3. Go to Play Console → Setup → API access
4. Link the service account
5. Grant "Release manager" permissions
6. Download JSON key file
7. Reference in `eas.json`
## Development Build Setup
### For Physical Devices
```bash
# iOS device (requires Apple Developer account)
eas build --platform ios --profile development
# Android device
eas build --platform android --profile development
```
**iOS device registration:**
- Devices must be registered in Apple Developer Portal
- EAS can register devices automatically during build
- Or register manually: `eas device:create`
### For Simulators/Emulators
```bash
# iOS Simulator
eas build --platform ios --profile development-simulator
# Android Emulator (APK works on emulators)
eas build --platform android --profile development
```
## Environment Variables
### Build-time Variables
Set in `eas.json` per profile:
```json
{
"build": {
"prRelated in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.