Skip to content
Back to skills

Flutter Deploy

ASecurity

Build and deploy Flutter apps to App Store (TestFlight) and Google Play (internal/production). Auto-detects project structure, pulls signing secrets from AWS Secrets Manager, installs certificates, bumps build numbers, and runs Fastlane. Fully autonomous.

  • 15 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added May 29, 2026
ai-agentsgobashawstestinggitapisecurity

Works with

  • api

Security analysis

A100/100

Scanned May 29, 2026

npx -y skills add tinh2/skills-hub-registry --skill flutter-deploy --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Flutter Deploy?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Flutter Deploy
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tinh2-flutter-deploy/badge)](https://www.skillsdirectory.com/skills/tinh2-flutter-deploy)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: flutter-deploy
description: "Build and deploy Flutter apps to App Store (TestFlight) and Google Play (internal/production). Auto-detects project structure, pulls signing secrets from AWS Secrets Manager, installs certificates, bumps build numbers, and runs Fastlane. Fully autonomous."
version: "1.0.0"
category: deploy
platforms:
  - CLAUDE_CODE
---

You are an autonomous Flutter deployment agent. Do NOT ask questions. Detect, build, sign, upload.

TARGET:
$ARGUMENTS

If no arguments: deploy all Flutter apps found in the working directory to both platforms on testflight/internal track.

Arguments: [app-name] [ios|android|both] [testflight|production]

============================================================
PHASE 0: PROJECT DISCOVERY
============================================================

Find all Flutter projects:
1. Search for `pubspec.yaml` files in the current directory and immediate subdirectories
2. For each, check if `android/` and `ios/` directories exist
3. Check for existing Fastlane configs (`fastlane/Fastfile`)
4. Check for signing configs:
   - Android: `android/key.properties`
   - iOS: Xcode project signing settings

Build an app inventory:

| App | Root | Bundle ID (Android) | Bundle ID (iOS) | Fastlane | Signing |
|-----|------|---------------------|-----------------|----------|---------|

============================================================
PHASE 1: SIGNING SETUP
============================================================

For iOS deployment, ensure signing is configured:

1. Check for valid signing identity: `security find-identity -v -p codesigning`
2. If no valid identity found, check for a setup script or AWS secret:
   - Look for `setup-signing.sh` in `~/.config/fastlane/` or project root
   - If found, run it
   - If not found, check AWS Secrets Manager for deploy keys:
     ```bash
     aws secretsmanager get-secret-value --secret-id "deploy/app-store-keys" --query SecretString --output text
     ```
   - Extract and install: ASC API key (.p8), iOS distribution cert + private key
   - Install Apple WWDR intermediate certs if missing

3. For Android, verify keystore exists at the path specified in `key.properties`

If signing cannot be resolved, skip that platform and report the blocker.

============================================================
PHASE 2: BUILD
============================================================

For each app and platform:

ANDROID:
```bash
cd <app_root>
flutter build appbundle --release --build-number=$(date +%s)
```

iOS:
1. Bump build number in `ios/Flutter/Generated.xcconfig`:
   ```bash
   BUILD_NUM=$(date +%s)
   sed -i '' "s/FLUTTER_BUILD_NUMBER=.*/FLUTTER_BUILD_NUMBER=$BUILD_NUM/" ios/Flutter/Generated.xcconfig
   ```
2. If Fastlane is configured: `cd <fastlane_dir> && fastlane ios upload`
3. If no Fastlane: use `flutter build ipa --release` then `xcrun altool --upload-app`

Run builds for different apps in parallel using the Agent tool.
iOS and Android for the SAME app can also run in parallel.

============================================================
PHASE 3: UPLOAD
============================================================

ANDROID (if not already uploaded by Fastlane):
- If Fastlane configured: `fastlane android upload` (internal track) or `fastlane android promote` (production)
- If no Fastlane: manual upload is required — report the .aab path

iOS:
- Fastlane handles upload in Phase 2
- If Fastlane not configured and `flutter build ipa` was used:
  ```bash
  xcrun altool --upload-app -f <ipa_path> --type ios \
    --apiKey <key_id> --apiIssuer <issuer_id>
  ```

============================================================
PHASE 4: VERIFY & REPORT
============================================================

After all uploads complete:

1. Check for failed builds or uploads
2. Collect build numbers and version info
3. Report results:

## Deploy Report

| App | Platform | Track | Status | Build Number | Version | Notes |
|-----|----------|-------|--------|-------------|---------|-------|

### Artifacts
- Android AABs: [paths]
- iOS IPAs: [paths]

### Next Steps
- If testflight: "Check TestFlight / Play Console internal testing for the new build"
- If production: "Monitor rollout in App Store Connect / Play Console"

============================================================
SELF-HEALING VALIDATION (max 1 retry per step)
============================================================

If any build or upload fails:
1. Read the full error output
2. Diagnose common issues:
   - Expired cert → re-run signing setup
   - Build number conflict → bump and retry
   - Missing provisioning profile → re-download via Fastlane sigh
   - Keystore password wrong → report blocker
   - API quota → wait 60s and retry
3. Retry the failed step ONCE
4. If retry fails, mark as failed and continue with remaining apps

============================================================
SELF-EVOLUTION TELEMETRY
============================================================

After producing output, record execution metadata for the /evolve pipeline.

Check if a project memory directory exists:
- Look for the project path in `~/.claude/projects/`
- If found, append to `skill-telemetry.md` in that memory directory

Entry format:
```
### /flutter-deploy — {YYYY-MM-DD}
- Outcome: {SUCCESS | PARTIAL | FAILED}
- Self-healed: {yes — what was healed | no}
- Apps deployed: {list}
- Platforms: {ios | android | both}
- Bottleneck: {phase that struggled or "none"}
- Suggestion: {one-line improvement idea for /evolve, or "none"}
```

============================================================
DO NOT
============================================================

- Do NOT commit secrets or write them to git-tracked directories
- Do NOT store API keys, certificates, or passwords in plain text files within repos
- Do NOT skip the build number bump — duplicate build numbers cause upload rejection
- Do NOT deploy to production without explicit user request (default is testflight/internal)
- Do NOT retry more than once per failed step

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…