Works with the AI tools you already use

    Claude CodeClaude CodeCursorCursorCodex CLICodex CLIMuseMuseDotsDots+22 more

    iOS Release to TestFlight (Flutter & React Native)

    1

    Take a Flutter, React Native or Expo app from a fresh fork to a build in App Store review, in the order Apple enforces, with a known fix for each error on the way.

    $15

    Secure checkout via Stripe

    30-day refund guarantee

    Converts to your local currency at checkout

    Security scanned
    iOS Release to TestFlight (Flutter & React Native)

    iOS Release to TestFlight (Flutter & React Native)

    Example session with this skill installed

    Ship chore-jar to TestFlight. It was forked from my-app-template last week.

    • Read your context and instructions
    • Compiled the ios release to

    What the skill printed

    The preflight, before anything was built or uploaded:

    ok    config       using ~/apps/.flutter-store-pipeline.json
    ok    version      pubspec version 1.0.0+1
    ok    bundle-id    com.example.basicapp
    WARN  bundle-id    com.example.basicapp does not start with bundle_id_prefix com.buyertest
    FAIL  bundle-id    same bundle id as the parent (com.example.basicapp): the build would upload to the parent's record
    FAIL  firebase     same Firebase project number as the parent (123456789012, id basic-app): analytics and crashes report into its project
    FAIL  admob        2 ad unit id(s) shared with the parent: ca-app-pub-0000000000000000/1111111111, ca-app-pub-0000000000000000/1111111111. Inherited units serve, against the parent's app. Blank them until this app's exist.
    WARN  admob        AdMob app id shared with the parent (ca-app-pub-0000000000000000~1111111111, ca-app-pub-0000000000000000~1111111111). It cannot be blanked (the SDK refuses to start), so staging is fine; replace before prod.
    WARN  flavor       scripts/release_ios.sh builds without --dart-define=APP_FLAVOR, so a release build gets whatever the code falls back to (usually prod: live ad units on an app whose AdMob records may not be live)
    WARN  flutter-sdk  scripts/release_ios.sh takes flutter from PATH but the app pins a version in .fvmrc; the build uses whichever SDK the machine has
    WARN  signing      no ios/ExportOptions*.plist; `flutter build ipa` will pick a distribution identity itself and this keychain holds 2: name the certificate in full
    ok    icon         Icon-App-1024x1024@1x.png has no alpha
    info  ipad         TARGETED_DEVICE_FAMILY includes iPad (1,2): iPad screenshots are required
    WARN  metadata     no fastlane/metadata/ios tree; listing text will be entered by hand
    WARN  fastlane     FASTLANE_SESSION is set in this shell: any lane that reaches Spaceship session auth acts as that Apple ID, whichever account it belongs to. Unset it; use the API key.
    
    3 fail, 7 warn
    

    Connects securely to your tools. The creator never sees your data.

    About this skill

    Getting a Flutter, React Native or Expo app from a local build to a build in App Store review means signing, profiles, store records, upload, metadata and screenshots, and each step fails with an error that only makes sense once you have seen it before. Skip a step and the error shows up three steps later.

    This skill runs the iOS release in the order Apple enforces: preflight, Firebase, bundle id, App Store Connect record, AdMob, build, verify the signature, upload, metadata and screenshots, then the items to collect before submission.

    What it handles

    • A preflight that compares your app with the one it was forked from: shared bundle id, Firebase project number, ad units and AdMob app id, a release script with no flavor, an unpinned Flutter SDK, no export options with two distribution identities in the keychain, an icon with alpha, iPad screenshots that will be required, and a stray FASTLANE_SESSION. Run it again on the built .ipa with --ipa.
    • Registering the bundle id and creating and installing the App Store provisioning profile through the App Store Connect API (asc.py register-bundle, create-profile, install-profile).
    • Checking which certificate actually signed the .ipa.
    • Upload with altool, then asc.py build-status and next-build for processing and build numbers.
    • Metadata and screenshots with fastlane deliver, and prune-screenshots for duplicates. Known failures written out: "No profiles for", "No Accounts", "No Builds Available", metadata that uploads nothing, a build missing from the version's picker, and "App is missing required pricing" (the price dropdown is a search box; "Free" matches nothing, pick $0.00).
    • Age rating: the two API calls are documented and asc.py get reads the declaration back to confirm the band. The privacy label has no API; the skill tells you how to derive it from the app's code.

    asc.py signs its own token with openssl, so there is nothing to pip install. Every write needs --yes, and --dry-run prints the request first. It never submits for review; that stays your click.

    React Native and Expo

    For Expo it builds with eas build and uploads with eas submit; for bare React Native it runs pod install and xcodebuild archive and export. The preflight reads version and build numbers from wherever the build takes them (app.json, or the Xcode project when ios/ is committed), checks that app.json and a committed ios/ project agree on the bundle id, checks Firebase setup (@react-native-firebase or the Expo config plugin) and AdMob app ids (react-native-google-mobile-ads), and with --parent fails on the parent's EAS projectId, updates URL or ascAppId.

    What you need: Claude Code, a Mac with Xcode, Python 3.9+, openssl, an App Store Connect API key (.p8), and Flutter, React Native (CocoaPods) or Expo (EAS CLI). For Flutter, the Firebase and FlutterFire CLIs for the Firebase step, and fastlane only for metadata and screenshots. No Firebase or no ads? Skip those two steps.

    Part of the Indie Mobile Release Pipeline (Flutter & React Native) bundle ($39 for four skills: new-app, bug-hunt, ship-ios, daily-update).

    I build small apps on my own and have a shelf of them on the App Store and Google Play. Each known error in this skill is one I hit on a real release.

    How to use

    Skills on Agensi run inside your AI agent. Copy the prompt, paste it into your agent, and it connects to Agensi and installs this skill for you. If a payment is needed, your agent shows it to you first.

    Reviews

    No reviews yet

    Be one of the first to try it. Every listed skill passes our trust checks below.

    Security scanned

    Passed our 8-point scan before listing

    Fresh listing

    Recently published to Agensi

    30-day refund

    Not a fit? Get your money back

    Trust & safety

    Security scanned

    Verified clean 4 days ago

    • Passed all security checks, Safe to install

    Needs access to

    Apple

    Listed6 days ago
    Updated4 days ago

    What's inside

    Frequently Asked Questions