skills/setup-fastlane/SKILL.md
Set up Fastlane for iOS/macOS app automation
npx skillsauth add greenstevester/fastlane-skill setup-fastlaneInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
┌─────────────────────────────────────────────────────────────────┐
│ ONE-TIME SETUP │
│ ══════════════ │
│ After this, you'll have: │
│ │
│ fastlane ios test → Run tests │
│ fastlane ios beta → Upload to TestFlight │
│ fastlane ios release → Submit to App Store │
│ │
│ Do this once per project. Takes ~10 minutes. │
└─────────────────────────────────────────────────────────────────┘
xcode-select -p 2>/dev/null && echo "✓" || echo "✗ Run: xcode-select --install"brew --version 2>/dev/null | head -1 || echo "✗ Run: /bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\""fastlane --version 2>/dev/null | grep -o "fastlane [0-9.]*" | head -1 || echo "✗ Run: brew install fastlane"find . -maxdepth 2 -name "*.xcodeproj" 2>/dev/null | head -1 || echo "None found"find . -maxdepth 2 -name "*.xcworkspace" ! -path "*/.build/*" ! -path "*/xcodeproj/*" 2>/dev/null | head -1 || echo "None"grep -r "PRODUCT_BUNDLE_IDENTIFIER" --include="*.pbxproj" . 2>/dev/null | head -1 | sed 's/.*= //' | tr -d '";' || echo "Not found"grep -r "DEVELOPMENT_TEAM" --include="*.pbxproj" . 2>/dev/null | head -1 | sed 's/.*= //' | tr -d '";' || echo "Not found"brew install fastlane
Why Homebrew? Bundler 4.x broke Fastlane's Ruby dependencies. Homebrew avoids all version conflicts.
fastlane/Appfileapp_identifier("{{BUNDLE_ID}}") # Your bundle ID
apple_id("{{APPLE_ID}}") # Your Apple ID email
team_id("{{TEAM_ID}}") # Your team ID
fastlane/Fastfiledefault_platform(:ios)
platform :ios do
desc "Run tests"
lane :test do
scan(scheme: "{{SCHEME}}")
end
desc "Upload to TestFlight (internal testers)"
lane :beta do |options|
increment_build_number unless options[:skip_build_increment]
gym(scheme: "{{SCHEME}}", export_method: "app-store")
pilot(skip_waiting_for_build_processing: true)
end
desc "Upload to TestFlight and distribute to external testers"
lane :beta_external do |options|
increment_build_number
gym(scheme: "{{SCHEME}}", export_method: "app-store")
pilot(
distribute_external: true,
groups: ["External Testers"],
changelog: options[:changelog] || "Bug fixes and improvements",
skip_waiting_for_build_processing: false
)
end
desc "Submit the latest TestFlight build for App Store review"
lane :release do
deliver(
build_number: latest_testflight_build_number.to_s,
submit_for_review: true,
automatic_release: false,
force: true,
skip_binary_upload: true,
skip_metadata: false,
skip_screenshots: false
)
end
desc "Build, upload, and submit a fresh build to the App Store"
lane :release_full do |options|
increment_version_number(version_number: options[:version]) if options[:version]
increment_build_number
gym(scheme: "{{SCHEME}}", export_method: "app-store")
deliver(
submit_for_review: true,
automatic_release: options[:auto_release] == true,
force: true
)
end
end
Replace {{SCHEME}} with your app's scheme name (usually the app name).
Download your existing App Store listing:
fastlane deliver download_metadata
fastlane deliver download_screenshots
This creates fastlane/metadata/ with editable text files for your app description, keywords, etc.
# Verify setup
fastlane lanes
# Run your first lane
fastlane ios test
| Command | What it does |
|---------|--------------|
| fastlane ios test | Run tests |
| fastlane ios beta | Build + TestFlight |
| fastlane ios release | Build + App Store |
| fastlane deliver download_metadata | Fetch App Store listing |
tools
--- name: snapshot description: Automate App Store screenshot capture across devices and languages argument-hint: [--devices "iPhone 15 Pro"] [--languages "en-US,ja"] allowed-tools: Bash, Read, Write, Edit --- ## Automated App Store Screenshots Set up Fastlane Snapshot to automatically capture App Store screenshots across multiple devices and languages. ### Pre-flight Checks - Fastlane installed: !`fastlane --version 2>/dev/null | grep "fastlane " | head -1 || echo "✗ Not installed - run: bre
tools
--- name: release description: Submit iOS app to App Store for review argument-hint: [--version "1.x.x"] [--auto-release] [--skip-metadata] allowed-tools: Bash, Read --- ## App Store Production Release Submit the iOS app to App Store Connect for review and release. ### Pre-flight Checks - Fastlane installed: !`fastlane --version 2>/dev/null | grep "fastlane " | head -1 || echo "✗ Not installed - run: brew install fastlane"` - Fastfile exists: !`ls fastlane/Fastfile 2>/dev/null && echo "✓ Foun
tools
--- name: match description: Set up Match for iOS code signing certificate management argument-hint: [--readonly] [--type development|appstore|adhoc] allowed-tools: Bash, Read, Write, Edit --- ## Code Signing with Match Set up Fastlane Match to manage iOS code signing certificates and provisioning profiles in a shared Git repository. ### Pre-flight Checks - Fastlane installed: !`fastlane --version 2>/dev/null | grep "fastlane " | head -1 || echo "✗ Not installed - run: brew install fastlane"`
tools
--- name: beta description: Build and upload iOS app to TestFlight argument-hint: [skip_build_increment:true] [changelog:"text"] allowed-tools: Bash, Read --- ## TestFlight Beta Release Build and upload the iOS app to TestFlight for beta testing. ### Pre-flight Checks - Fastlane installed: !`fastlane --version 2>/dev/null | grep "fastlane " | head -1 || echo "✗ Not installed - run: brew install fastlane"` - Fastfile exists: !`ls fastlane/Fastfile 2>/dev/null && echo "✓ Found" || echo "✗ Not f