Install any skill in seconds. Free to start, no credit card required.
Get Started Free →iOS/macOS app automation — builds, signing, TestFlight, App Store via CLI
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-15 | ✗→✓ | ▲ Improved | — | — |
| case-22 | ✗→✓ | ▲ Improved | — | — |
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-20 | ✗→✓ | ▲ Improved | — | — |
| case-19 | ✓→✓ | = Same ✓ | — | — |
Automate iOS and macOS builds, code signing, TestFlight distribution, and App Store submissions — all from one-off CLI commands. No Fastfile required.
bashfastlane --version
If not installed:
bashbrew install fastlane
Or via RubyGems:
bashsudo gem install fastlane -NV
After install, add to your shell profile:
bashexport PATH="$HOME/.fastlane/bin:$PATH"
API keys avoid 2FA prompts and are the recommended approach for automation and CI.
.p8 file.bashexport APP_STORE_CONNECT_API_KEY_KEY_ID="XXXXXXXXXX" export APP_STORE_CONNECT_API_KEY_ISSUER_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" export APP_STORE_CONNECT_API_KEY_KEY_FILEPATH="/path/to/AuthKey_XXXXXXXXXX.p8"
Or pass the key inline as JSON:
bashexport APP_STORE_CONNECT_API_KEY_KEY='{"key_id":"XXXXXXXXXX","issuer_id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","key_filepath":"/path/to/AuthKey.p8"}'
> Agent guidance: Always prefer API key authentication. Only fall back to Apple ID when the user explicitly does not have API key access.
bashexport FASTLANE_USER="user@example.com" export FASTLANE_PASSWORD="app-specific-password"
Generate an app-specific password at appleid.apple.com. If 2FA is enabled, you may also need:
bashexport FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD="xxxx-xxxx-xxxx-xxxx" export SPACESHIP_2FA_SMS_DEFAULT_PHONE_NUMBER="+1 (xxx) xxx-xxxx"
| Variable | Purpose | |---|---| | APP_STORE_CONNECT_API_KEY_KEY_ID | API key ID from App Store Connect | | APP_STORE_CONNECT_API_KEY_ISSUER_ID | Issuer ID from App Store Connect | | APP_STORE_CONNECT_API_KEY_KEY_FILEPATH | Path to the .p8 private key file | | APP_STORE_CONNECT_API_KEY_KEY | Inline JSON containing all key fields | | FASTLANE_USER | Apple ID email | | FASTLANE_PASSWORD | Apple ID password or app-specific password | | FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD | App-specific password for 2FA accounts | | MATCH_PASSWORD | Encryption password for match certificates repo | | MATCH_GIT_URL | Git URL for match certificates repository |
Fastlane actions can be run directly from the CLI without a Fastfile:
bashfastlane run <action_name> key:value key2:value2
Discover available actions:
bashfastlane actions # List all actions fastlane action <action_name> # Show details for one action fastlane search_actions <query> # Search by keyword
> Agent guidance: Use fastlane run <action> for one-off tasks. This is the core pattern — every section below shows both the shorthand tool command and the fastlane run equivalent.
bashfastlane pilot upload --ipa "/path/to/App.ipa"
Equivalent:
bashfastlane run upload_to_testflight ipa:"/path/to/App.ipa"
With API key:
bashfastlane pilot upload \ --ipa "/path/to/App.ipa" \ --api_key_path "/path/to/api_key.json"
bashfastlane pilot builds
bash# Add a tester fastlane pilot add email:"tester@example.com" group_name:"Beta Testers" # Remove a tester fastlane pilot remove email:"tester@example.com" # List testers fastlane pilot list
bashfastlane pilot distribute \ --build_number "42" \ --groups "External Beta" \ --changelog "Bug fixes and performance improvements"
| Flag | Purpose | |---|---| | --ipa | Path to IPA file | | --app_identifier | Bundle ID (e.g., com.example.app) | | --skip_waiting_for_build_processing | Don't wait for Apple's processing | | --distribute_external | Send to external testers | | --groups | Tester group names (comma-separated) | | --changelog | What to Test text | | --beta_app_review_info | JSON with review info |
bashfastlane deliver --ipa "/path/to/App.ipa" --submit_for_review
Equivalent:
bashfastlane run upload_to_app_store ipa:"/path/to/App.ipa" submit_for_review:true
bashfastlane deliver --skip_binary_upload --skip_screenshots
bashfastlane deliver --skip_binary_upload --skip_metadata
bashfastlane deliver download_metadata --app_identifier "com.example.app"
bashfastlane deliver download_screenshots --app_identifier "com.example.app"
| Flag | Purpose | |---|---| | --ipa | Path to IPA file | | --pkg | Path to PKG file (macOS) | | --app_identifier | Bundle ID | | --submit_for_review | Auto-submit after upload | | --automatic_release | Release automatically after approval | | --force | Skip HTML preview verification | | --skip_binary_upload | Metadata/screenshots only | | --skip_metadata | Binary/screenshots only | | --skip_screenshots | Binary/metadata only | | --metadata_path | Custom metadata folder path | | --screenshots_path | Custom screenshots folder path | | --phased_release | Enable phased release | | --reject_if_possible | Reject current version before uploading |
bashfastlane gym \ --workspace "App.xcworkspace" \ --scheme "App" \ --export_method "app-store" \ --output_directory "./build"
Equivalent:
bashfastlane run build_app \ workspace:"App.xcworkspace" \ scheme:"App" \ export_method:"app-store" \ output_directory:"./build"
bashfastlane gym \ --project "App.xcodeproj" \ --scheme "App" \ --export_method "app-store"
| Method | Use Case | |---|---| | app-store | App Store and TestFlight submission | | ad-hoc | Direct device installation via profile | | development | Debug builds for registered devices | | enterprise | In-house enterprise distribution | | developer-id | macOS distribution outside App Store | | mac-application | macOS App Store | | validation | Validate without exporting |
| Flag | Purpose | |---|---| | --workspace | Path to .xcworkspace | | --project | Path to .xcodeproj | | --scheme | Build scheme | | --configuration | Build config (Debug/Release) | | --export_method | See export methods table | | --output_directory | Where to save the IPA | | --output_name | Custom IPA filename | | --clean | Clean before building | | --include_bitcode | Include bitcode | | --include_symbols | Include dSYM symbols | | --xcargs | Extra xcodebuild arguments | | --derived_data_path | Custom DerivedData path | | --catalyst_platform | macos or ios for Catalyst apps |
> Agent guidance: If the project has a .xcworkspace (e.g., uses CocoaPods or SPM), always use --workspace. Only use --project when there is no workspace.
Sync certificates and provisioning profiles from a shared Git repo or cloud storage.
bashfastlane match appstore --app_identifier "com.example.app"
Equivalent:
bashfastlane run sync_code_signing type:"appstore" app_identifier:"com.example.app"
bashfastlane match development --app_identifier "com.example.app"
bashfastlane match adhoc --app_identifier "com.example.app"
bashfastlane match appstore --readonly --app_identifier "com.example.app"
> Agent guidance: Always use --readonly on CI servers. This prevents accidentally creating new certificates and disrupting the team.
bash# Remove all certificates and profiles for a type fastlane match nuke appstore fastlane match nuke development
> Warning: Nuke is destructive and irreversible. Always confirm with the user before running nuke commands.
| Flag | Purpose | |---|---| | --type | appstore, development, adhoc, enterprise | | --app_identifier | Bundle ID(s), comma-separated for multiple | | --git_url | Git repo URL for certificates | | --readonly | Don't create new certs/profiles | | --force | Renew existing profile | | --team_id | Apple Developer team ID | | --storage_mode | git, google_cloud, s3 | | --verbose | Detailed output |
> Agent guidance: Prefer match over cert + sigh for teams. It centralizes signing and avoids the "works on my machine" problem.
bashfastlane scan \ --workspace "App.xcworkspace" \ --scheme "AppTests" \ --device "iPhone 16 Pro"
Equivalent:
bashfastlane run run_tests \ workspace:"App.xcworkspace" \ scheme:"AppTests" \ device:"iPhone 16 Pro"
bashfastlane scan \ --workspace "App.xcworkspace" \ --scheme "AppTests" \ --devices "iPhone 16 Pro,iPad Pro (13-inch) (M4)"
bashfastlane scan \ --scheme "AppTests" \ --output_types "html,junit" \ --output_directory "./test_results"
| Flag | Purpose | |---|---| | --workspace | Path to .xcworkspace | | --project | Path to .xcodeproj | | --scheme | Test scheme | | --device | Simulator device name | | --devices | Multiple simulators (comma-separated) | | --output_types | html, junit, json | | --output_directory | Where to save results | | --code_coverage | Enable code coverage | | --clean | Clean before testing | | --fail_build | Fail on test failures (default: true) | | --xcargs | Extra xcodebuild arguments | | --result_bundle | Generate Xcode result bundle |
Capture App Store screenshots across devices and languages automatically.
bashfastlane snapshot \ --workspace "App.xcworkspace" \ --scheme "AppUITests" \ --devices "iPhone 16 Pro Max,iPhone SE (3rd generation),iPad Pro (13-inch) (M4)" \ --languages "en-US,es-ES,fr-FR" \ --output_directory "./screenshots"
Equivalent:
bashfastlane run capture_screenshots \ workspace:"App.xcworkspace" \ scheme:"AppUITests" \ devices:"iPhone 16 Pro Max,iPhone SE (3rd generation),iPad Pro (13-inch) (M4)" \ languages:"en-US,es-ES,fr-FR" \ output_directory:"./screenshots"
| Flag | Purpose | |---|---| | --workspace | Path to .xcworkspace | | --scheme | UI test scheme with snapshot calls | | --devices | Simulator names (comma-separated) | | --languages | Locale codes (comma-separated) | | --output_directory | Where to save screenshots | | --clear_previous_screenshots | Clean output folder first | | --stop_after_first_error | Abort on first failure | | --override_status_bar | Clean status bar (9:41, full battery) |
Standalone certificate and provisioning profile management.
bashfastlane cert --development fastlane cert # Distribution certificate by default
Equivalent:
bashfastlane run get_certificates development:true
bash# App Store profile fastlane sigh --app_identifier "com.example.app" # Development profile fastlane sigh --development --app_identifier "com.example.app" # Ad hoc profile fastlane sigh --adhoc --app_identifier "com.example.app"
Equivalent:
bashfastlane run get_provisioning_profile app_identifier:"com.example.app"
bashfastlane sigh repair
| Flag | Purpose | |---|---| | --development | Development cert/profile | | --adhoc | Ad hoc profile | | --app_identifier | Bundle ID | | --team_id | Developer team ID | | --output_path | Where to save profile | | --force | Renew even if current is valid | | --readonly | Don't create, only fetch |
> Agent guidance: For individual developers, cert + sigh works fine. For teams, recommend match instead — it prevents certificate conflicts.
Validate app metadata before submitting to avoid App Store Review rejections.
bashfastlane precheck --app_identifier "com.example.app"
Equivalent:
bashfastlane run check_app_store_metadata app_identifier:"com.example.app"
Generate push notification certificates for APNs.
bashfastlane pem --app_identifier "com.example.app" --output_path "./certs"
Equivalent:
bashfastlane run get_push_certificate app_identifier:"com.example.app" output_path:"./certs"
| Flag | Purpose | |---|---| | --app_identifier | Bundle ID | | --output_path | Where to save certs | | --development | Development push cert | | --generate_p12 | Also generate .p12 file | | --p12_password | Password for .p12 | | --force | Create new even if existing is valid | | --team_id | Developer team ID |
> Agent guidance: For modern projects using token-based APNs (.p8 key), push certs are unnecessary. Only use pem if the project specifically uses certificate-based APNs.
Add device bezels and titles to screenshots for App Store presentation.
bashfastlane frameit --path "./screenshots"
With titles:
bashfastlane frameit silver --path "./screenshots"
Equivalent:
bashfastlane run frame_screenshots path:"./screenshots"
A Framefile.json in the screenshots directory controls titles, fonts, and colors.
bashfastlane gym \ --workspace "App.xcworkspace" \ --scheme "App" \ --export_method "app-store" \ --output_directory "./build" && \ fastlane pilot upload \ --ipa "./build/App.ipa" \ --changelog "Latest build from CI"
bashfastlane gym \ --workspace "App.xcworkspace" \ --scheme "App" \ --export_method "app-store" \ --output_directory "./build" && \ fastlane deliver \ --ipa "./build/App.ipa" \ --submit_for_review \ --automatic_release \ --force
bashfastlane match appstore \ --app_identifier "com.example.app" \ --readonly && \ fastlane gym \ --workspace "App.xcworkspace" \ --scheme "App" \ --export_method "app-store" \ --output_directory "./build" && \ fastlane pilot upload \ --ipa "./build/App.ipa"
bashfastlane scan \ --workspace "App.xcworkspace" \ --scheme "AppTests" && \ fastlane gym \ --workspace "App.xcworkspace" \ --scheme "App" \ --export_method "app-store" \ --output_directory "./build" && \ fastlane pilot upload \ --ipa "./build/App.ipa"
bashfastlane snapshot \ --workspace "App.xcworkspace" \ --scheme "AppUITests" \ --output_directory "./screenshots" && \ fastlane frameit silver --path "./screenshots" && \ fastlane deliver --skip_binary_upload --skip_metadata
| Variable | Purpose | |---|---| | FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT | Timeout for xcodebuild settings (seconds) | | FASTLANE_XCODEBUILD_SETTINGS_RETRIES | Retry count for xcodebuild | | FASTLANE_OPT_OUT_USAGE | Set to YES to disable analytics | | FL_OUTPUT_DIR | Default output directory | | FASTLANE_SKIP_UPDATE_CHECK | Skip update prompts | | FASTLANE_HIDE_TIMESTAMP | Hide log timestamps | | FASTLANE_DISABLE_COLORS | Disable colored output |
| Variable | Purpose | |---|---| | CI | Set to true on CI environments | | FASTLANE_DONT_STORE_PASSWORD | Don't save passwords to keychain | | MATCH_KEYCHAIN_NAME | Keychain name for CI | | MATCH_KEYCHAIN_PASSWORD | Keychain password for CI |
| Variable | Purpose | |---|---| | GYM_WORKSPACE | Default workspace path | | GYM_SCHEME | Default scheme | | GYM_OUTPUT_DIRECTORY | Default output directory | | GYM_EXPORT_METHOD | Default export method | | SCAN_WORKSPACE | Default workspace for tests | | SCAN_SCHEME | Default test scheme | | SCAN_DEVICE | Default test device |
fastlane run parameters use key:value syntax (no dashes, no equals signs).fastlane gym, fastlane pilot) use --key value or --key "value" syntax.true/false for fastlane run, --flag/no flag for shorthand.devices:"iPhone 16,iPad Pro").fastlane spaceauth -u user@example.com or refresh API key.fastlane match to sync, or security find-identity -v -p codesigning to verify local certs.app_identifier matches the bundle ID registered in App Store Connect.FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT=120 and retry.fastlane sigh repair or fastlane match with --force.> When a user asks to "deploy" or "release" an iOS app, the typical flow is: match (sign) → gym (build) → pilot (TestFlight) or deliver (App Store).
> If the user has a Fastfile, respect it. But for one-off commands, always use the CLI syntax shown in this skill.
> Always check for an existing .xcworkspace before defaulting to .xcodeproj. Run ls *.xcworkspace to verify.
> For CI environments, always use --readonly with match and set the CI=true environment variable.
> When in doubt about which action to use, run fastlane actions or fastlane search_actions <keyword> to discover the right one.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +18 percentage points is the difference between those two pass rates over the 22 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.