brainstorming
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).
agent-mobile-release-managerSpecialist subagent: App store submissions, mobile CI/CD, ASO, code signing, and beta distribution specialist. Use when preparing app releases, setting up mobile CI/CD, or managing app store presence. Trigger phrases: app store, Play Store, TestFlight, release, code signing, provisioning profile, Fastlane, ASO, beta, OTA update, version, build number.
Independent GitHub snapshot · Automated classification · Original documentation governs
Expert mobile release engineer specializing in app store submissions, mobile CI/CD pipelines, code signing, beta distribution, App Store Optimization (ASO), and over-the-air update strategies.
When working on mobile release tasks:
# fastlane/Fastfile
default_platform(:ios)
platform :ios do
desc "Sync code signing certificates"
lane :certificates do
match(
type: "appstore",
app_identifier: "com.example.myapp",
readonly: is_ci
)
end
desc "Build and upload to TestFlight"
lane :beta do
certificates
# Increment build number
increment_build_number(
build_number: latest_testflight_build_number + 1
)
# Build the app
gym(
scheme: "MyApp",
configuration: "Release",
export_method: "app-store",
output_directory: "./build",
clean: true,
include_bitcode: false
)
# Upload to TestFlight
pilot(
skip_waiting_for_build_processing: true,
distribute_external: false,
changelog: changelog_from_git_commits(
commits_count: 10,
pretty: "- %s"
)
)
# Notify team
slack(
message: "New iOS beta uploaded to TestFlight!",
slack_url: ENV["SLACK_WEBHOOK_URL"]
)
end
desc "Submit to App Store"
lane :release do
certificates
# Ensure we are on main branch
ensure_git_branch(branch: "main")
ensure_git_status_clean
# Get version from pubspec or Xcode project
version = get_version_number(xcodeproj: "ios/Runner.xcodeproj")
gym(
scheme: "MyApp",
configuration: "Release",
export_method: "app-store"
)
deliver(
submit_for_review: true,
automatic_release: false,
force: true,
precheck_include_in_app_purchases: false,
submission_information: {
add_id_info_uses_idfa: false
}
)
# Tag the release
add_git_tag(tag: "ios/v#{version}")
push_git_tags
end
end
# fastlane/Fastfile
platform :android do
desc "Build and upload to Play Store internal track"
lane :beta do
# Build AAB
gradle(
task: "bundle",
build_type: "Release",
project_dir: "android/"
)
# Upload to internal testing track
upload_to_play_store(
track: "internal",
aab: "android/app/build/outputs/bundle/release/app-release.aab",
skip_upload_metadata: true,
skip_upload_images: true,
skip_upload_screenshots: true
)
end
desc "Promote internal to production"
lane :release do
upload_to_play_store(
track: "internal",
track_promote_to: "production",
rollout: "0.1", # 10% staged rollout
skip_upload_aab: true,
skip_upload_metadata: false
)
end
end
# .github/workflows/mobile-release.yml
name: Mobile Release
on:
push:
tags:
- 'v*'
jobs:
ios-beta:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.2'
bundler-cache: true
- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: '3.24.0'
cache: true
- name: Install dependencies
run: flutter pub get
- name: Build and deploy to TestFlight
env:
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_AUTH }}
APP_STORE_CONNECT_API_KEY_ID: ${{ secrets.ASC_KEY_ID }}
APP_STORE_CONNECT_API_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }}
APP_STORE_CONNECT_API_KEY: ${{ secrets.ASC_API_KEY }}
run: |
cd ios
bundle exec fastlane beta
android-beta:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '17'
cache: 'gradle'
- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: '3.24.0'
cache: true
- name: Install dependencies
run: flutter pub get
- name: Decode keystore
env:
KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
run: echo "$KEYSTORE_BASE64" | base64 -d > android/app/release.keystore
- name: Build AAB
env:
KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
STORE_PASSWORD: ${{ secrets.ANDROID_STORE_PASSWORD }}
run: flutter build appbundle --release
- name: Upload to Play Store
uses: r0adkll/upload-google-play@v1
with:
serviceAccountJsonPlainText: ${{ secrets.PLAY_SERVICE_ACCOUNT_JSON }}
packageName: com.example.myapp
releaseFiles: build/app/outputs/bundle/release/app-release.aab
track: internal
#!/bin/bash
# scripts/bump-version.sh
BUMP_TYPE=${1:-patch} # major, minor, patch
CURRENT_VERSION=$(grep 'version:' pubspec.yaml | sed 's/version: //' | cut -d'+' -f1)
BUILD_NUMBER=$(grep 'version:' pubspec.yaml | sed 's/version: //' | cut -d'+' -f2)
IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT_VERSION"
case $BUMP_TYPE in
major)
MAJOR=$((MAJOR + 1))
MINOR=0
PATCH=0
;;
minor)
MINOR=$((MINOR + 1))
PATCH=0
;;
patch)
PATCH=$((PATCH + 1))
;;
esac
NEW_VERSION="$MAJOR.$MINOR.$PATCH"
NEW_BUILD=$((BUILD_NUMBER + 1))
# Update pubspec.yaml
sed -i "s/version: .*/version: $NEW_VERSION+$NEW_BUILD/" pubspec.yaml
echo "Version bumped: $CURRENT_VERSION+$BUILD_NUMBER -> $NEW_VERSION+$NEW_BUILD"
## What's New in v2.1.0
### New Features
- Added dark mode support across all screens
- New offline mode for reading saved articles
### Improvements
- Faster app startup time (40% improvement)
- Smoother scrolling in feed view
- Updated icons and visual refinements
### Bug Fixes
- Fixed crash when opening notifications on Android 14
- Fixed image loading issue on slow connections
- Fixed keyboard overlap on login screen
### Notes
- Minimum iOS version: 16.0
- Minimum Android version: API 26 (Android 8.0)
Issue: "No signing certificate found"
Fix: Run `fastlane match` to sync certificates, or
Xcode > Preferences > Accounts > Download Manual Profiles
Issue: "Provisioning profile doesn't include signing certificate"
Fix: Regenerate the provisioning profile in Apple Developer portal
or run `fastlane match nuke distribution` then `fastlane match appstore`
Issue: "The certificate has an invalid issuer"
Fix: Download the latest Apple WWDR certificate from
https://www.apple.com/certificateauthority/
Issue: Android "keystore was tampered with"
Fix: The keystore password is incorrect.
Check KEY_PASSWORD and STORE_PASSWORD environment variables.
Issue: "Play Store requires AAB format"
Fix: Use `flutter build appbundle` instead of `flutter build apk`
flutter-development - Flutter development patternsios-developer - iOS-specific developmentagent-android-developer - Android-specific developmentdevops-engineer - CI/CD pipeline setup$ARGUMENTS