skills/match/SKILL.md
--- 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"`
npx skillsauth add greenstevester/fastlane-skill skills/matchInstall 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.
Set up Fastlane Match to manage iOS code signing certificates and provisioning profiles in a shared Git repository.
fastlane --version 2>/dev/null | grep "fastlane " | head -1 || echo "✗ Not installed - run: brew install fastlane"ls fastlane/Fastfile 2>/dev/null && echo "✓ Found" || echo "✗ Not found - run /setup-fastlane first"ls fastlane/Matchfile 2>/dev/null && echo "✓ Already configured" || echo "○ Not configured yet"git --version 2>/dev/null | head -1 || echo "✗ Git not installed"Match stores your iOS certificates and provisioning profiles in a private Git repository, encrypted with a passphrase. Benefits:
Create a private repository to store your encrypted certificates:
# GitHub CLI (recommended)
gh repo create certificates --private
# Or manually at github.com/new (select Private)
Repository naming conventions:
certificates or ios-certificatesfastlane-certs{company}-signingSecurity: This repo will contain encrypted certificates. Keep it private and limit access to team members who need to build the app.
Run match init to create your Matchfile:
fastlane match init
When prompted:
git[email protected]:yourorg/certificates.git)This creates fastlane/Matchfile:
git_url("[email protected]:yourorg/certificates.git")
storage_mode("git")
type("development") # Default type, can be overridden per-lane
# app_identifier(["com.yourcompany.app"]) # Optional: limit to specific apps
# username("[email protected]") # Optional: Apple ID
Generate certificates for each distribution type:
fastlane match development
fastlane match appstore
fastlane match adhoc
First run prompts:
Important: Save the passphrase in a password manager. You'll need it for CI/CD and new team members.
Update your lanes to use Match before building:
default_platform(:ios)
platform :ios do
desc "Sync all certificates"
lane :sync_signing do
match(type: "development")
match(type: "appstore")
end
desc "Build for TestFlight"
lane :beta do |options|
match(type: "appstore", readonly: true)
increment_build_number unless options[:skip_build_increment]
gym(scheme: "YourApp", export_method: "app-store")
pilot(skip_waiting_for_build_processing: true)
end
desc "Build for App Store"
lane :release do
match(type: "appstore", readonly: true)
increment_build_number
gym(scheme: "YourApp", export_method: "app-store")
deliver(submit_for_review: false, force: true)
end
end
Key pattern: Use readonly: true in build lanes to prevent accidental certificate regeneration.
New team members run:
# Clone and decrypt existing certificates (readonly)
fastlane match development --readonly
fastlane match appstore --readonly
They'll need:
Readonly mode ensures they can't accidentally revoke or regenerate certificates.
Set these environment variables in your CI/CD system:
# Required
MATCH_PASSWORD="your-match-passphrase"
MATCH_GIT_URL="[email protected]:yourorg/certificates.git"
# For App Store Connect (choose one method)
# Method 1: App-specific password
FASTLANE_USER="[email protected]"
FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD="xxxx-xxxx-xxxx-xxxx"
# Method 2: API Key (recommended for CI)
APP_STORE_CONNECT_API_KEY_KEY_ID="ABC123"
APP_STORE_CONNECT_API_KEY_ISSUER_ID="xyz-xyz-xyz"
APP_STORE_CONNECT_API_KEY_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----"
- name: Install certificates
run: fastlane match appstore --readonly
env:
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
MATCH_GIT_URL: ${{ secrets.MATCH_GIT_URL }}
Add to ci_scripts/ci_post_clone.sh:
# Install Fastlane and sync certificates
brew install fastlane
fastlane match appstore --readonly
Set MATCH_PASSWORD in Xcode Cloud environment variables.
Wrong passphrase. Verify MATCH_PASSWORD is correct.
Run fastlane match appstore (without --readonly) to generate profiles.
Someone revoked certs in Apple Developer portal. Regenerate:
fastlane match nuke development # Removes all development certs
fastlane match development # Regenerates
Specify team in Matchfile:
team_id("ABCD1234")
Register the app first (SKU and username are required):
fastlane produce create -u [email protected] -a com.yourcompany.app -n "Your App Name" --sku YOUR_SKU
# Setup
fastlane match init # Create Matchfile
fastlane match development # Generate dev certs
fastlane match appstore # Generate App Store certs
fastlane match adhoc # Generate Ad Hoc certs
# Team use (readonly - won't modify certs)
fastlane match development --readonly
fastlane match appstore --readonly
# Maintenance
fastlane match nuke development # Revoke all dev certs
fastlane match nuke distribution # Revoke all dist certs
fastlane match change_password # Change encryption passphrase
# Debugging
fastlane match development --verbose # Detailed output
match change_passwordfastlane/
└── Matchfile # Match configuration
# In your certificates repo:
certs/
├── development/ # Development certificates
└── distribution/ # App Store/Ad Hoc certificates
profiles/
├── development/ # Development provisioning profiles
├── appstore/ # App Store provisioning profiles
└── adhoc/ # Ad Hoc provisioning profiles
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
Set up Fastlane for iOS/macOS app automation
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: 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