This skill provides expert knowledge on Expo Application Services (EAS) for building, submitting, and managing React Native Expo apps.
/plugin marketplace add rahulkeerthi/expo-toolkit/plugin install expo-toolkit@withqwertyThis skill inherits all available tools. When active, it can use any tool Claude has access to.
This skill provides expert knowledge on Expo Application Services (EAS) for building, submitting, and managing React Native Expo apps.
eas init, eas.json configuration)--submit behaviour differences between iOS and Android# 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
The eas.json file defines build profiles. A well-configured file looks like:
{
"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": "your@email.com",
"ascAppId": "1234567890"
},
"android": {
"serviceAccountKeyPath": "./play-store-credentials.json",
"track": "internal"
}
}
}
}
| 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 |
| Property | Description |
|---|---|
simulator | Build for simulator (no signing) |
enterpriseProvisioning | Use enterprise distribution |
resourceClass | Build machine size (default, large) |
| Property | Description |
|---|---|
buildType | Output format (apk or app-bundle) |
gradleCommand | Custom Gradle command |
withoutCredentials | Skip signing (simulator/dev) |
EAS manages three primary iOS credentials:
# 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):
Use local credentials:
Create credentials.json at project root:
{
"ios": {
"provisioningProfilePath": "ios/certs/profile.mobileprovision",
"distributionCertificate": {
"path": "ios/certs/dist-cert.p12",
"password": "certificate-password"
}
}
}
Android requires a keystore for signing:
# 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:
{
"android": {
"keystore": {
"keystorePath": "android/keystores/release.keystore",
"keystorePassword": "keystore-password",
"keyAlias": "key-alias",
"keyPassword": "key-password"
}
}
}
iOS (APNs):
eas credentials --platform ios
# Select: Push Notifications: Manage your Apple Push Notifications Key
# Follow prompts to create or upload key
Android (FCM):
eas credentials --platform android
# Select: FCM API Key: Manage your Firebase Cloud Messaging key
# Provide your FCM server key from Firebase Console
--auto-submit)iOS builds can auto-submit to App Store Connect / TestFlight:
# Auto-submit to TestFlight
eas build --platform ios --profile production --auto-submit
What happens:
Requirements:
appleId and ascAppId in submit profileIMPORTANT: First submission must be manual
For a brand new app on Google Play:
eas build --platform android --profile production--auto-submit works# After first manual upload, auto-submit works
eas build --platform android --profile production --auto-submit
Submit profile for Android:
{
"submit": {
"production": {
"android": {
"serviceAccountKeyPath": "./play-store-credentials.json",
"track": "internal"
}
}
}
}
Track options:
internal - Internal testing (up to 100 testers, instant)alpha - Closed testingbeta - Open testingproduction - Production releaseeas.json# iOS device (requires Apple Developer account)
eas build --platform ios --profile development
# Android device
eas build --platform android --profile development
iOS device registration:
eas device:create# iOS Simulator
eas build --platform ios --profile development-simulator
# Android Emulator (APK works on emulators)
eas build --platform android --profile development
Set in eas.json per profile:
{
"build": {
"production": {
"env": {
"APP_VARIANT": "production",
"API_URL": "https://api.example.com"
}
}
}
}
Use EAS Secrets for sensitive data:
# Set a secret
eas secret:create --name API_KEY --value "secret-value" --scope project
# List secrets
eas secret:list
# Secrets available as env vars during build
Use EXPO_PUBLIC_ prefix for variables accessible in app code:
{
"env": {
"EXPO_PUBLIC_API_URL": "https://api.example.com"
}
}
Access in code:
const apiUrl = process.env.EXPO_PUBLIC_API_URL;
Symptom: Build fails with credential errors
Solution:
# Check credential status
eas credentials --platform [ios|android]
# Regenerate if needed
# For iOS: Create new distribution certificate
# For Android: Create new keystore (WARNING: loses update capability)
Symptom: pod install fails during build
Solutions:
eas build --clear-cachePodfile compatibilitySymptom: Gradle build fails
Solutions:
build.gradle configurationSymptom: Submit fails with "app not found" error
iOS Solution:
ascAppId matches App Store ConnectAndroid Solution:
Symptom: Build rejected due to version already exists
Solution:
Use autoIncrement in production profile:
{
"production": {
"autoIncrement": true
}
}
Or increment manually:
eas build:version:set --platform [ios|android]
base profile# Builds
eas build --platform [ios|android|all] --profile [profile]
eas build:list
eas build:view [build-id]
eas build:cancel [build-id]
# Credentials
eas credentials --platform [ios|android]
eas credentials:configure-build
# Submissions
eas submit --platform [ios|android] --profile [profile]
eas submit --platform ios --latest
eas submit --platform android --id [build-id]
# Secrets
eas secret:create --name NAME --value VALUE
eas secret:list
eas secret:delete NAME
# Devices (iOS)
eas device:create
eas device:list
# Updates
eas update --branch [branch] --message "Update message"
eas update:list
eas [command] --help for detailed command optionsThis skill should be used when the user asks to "create a slash command", "add a command", "write a custom command", "define command arguments", "use command frontmatter", "organize commands", "create command with file references", "interactive command", "use AskUserQuestion in command", or needs guidance on slash command structure, YAML frontmatter fields, dynamic arguments, bash execution in commands, user interaction patterns, or command development best practices for Claude Code.
This skill should be used when the user asks to "create an agent", "add an agent", "write a subagent", "agent frontmatter", "when to use description", "agent examples", "agent tools", "agent colors", "autonomous agent", or needs guidance on agent structure, system prompts, triggering conditions, or agent development best practices for Claude Code plugins.
This skill should be used when the user asks to "create a hook", "add a PreToolUse/PostToolUse/Stop hook", "validate tool use", "implement prompt-based hooks", "use ${CLAUDE_PLUGIN_ROOT}", "set up event-driven automation", "block dangerous commands", or mentions hook events (PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification). Provides comprehensive guidance for creating and implementing Claude Code plugin hooks with focus on advanced prompt-based hooks API.