Indie Mobile Release Pipeline (Flutter & React Native)
Four paid skills that take a small Flutter, React Native or Expo app from a fork of one you already ship to a build in App Store review, then keep a whole shelf of apps updating without a burst of submissions that looks like spam to Apple.
- New App from a Fork: copy one of your apps into a new one without carrying over the parent's Firebase project, ad ids or bundle ids. On Expo it also catches the parent's EAS project id, updates URL and App Store Connect app id.
- Bug Hunt: find the bugs that pass your analyzer and your whole test suite (flutter analyze, or tsc, eslint and jest), and fix each one with a test that fails first.
- iOS Release to TestFlight: signing, store records and upload in the order Apple enforces, with a fix written down for each known error. Flutter builds, bare React Native through xcodebuild, Expo through eas build and eas submit.
- Release Cadence for Many Apps: pick which app goes to review today, run the pre-release checks, and pace submissions across the account. Finds Flutter, React Native and Expo apps in the same folder.
The release checks these call (app similarity for guideline 4.3, listing accuracy, the Google Play release guide, polish and frame performance) are free on my profile and cover both stacks.
For solo developers shipping several mobile apps. I use these to ship my own. Written for and tested in Claude Code.
Works with every agent that reads SKILL.md — Claude Code, Cursor, Codex CLI, Gemini CLI, GitHub Copilot, Windsurf, OpenClaw, and more.
One payment, lifetime access. 4 skills unlock instantly in your library.
What's included
4 skillsStart a new Flutter, React Native or Expo app from one you already have, cut every Firebase, AdMob, EAS and bundle id it inherited, and carry it to TestFlight and Google Play.
Find the bugs in a Flutter, React Native or Expo app that pass your analyzer and your whole test suite, and fix each one with a test that fails first.
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.
For one account with several Flutter, React Native or Expo apps: picks today's app for review, runs the pre-release gates on it, and paces submissions so Apple's spam rule never sees a burst.
See it in action
New App from a Fork (Flutter & React Native)
Example session with this skill installed
Make a new app called Chore Jar from my-app-template. It's a simple counter for kids' chores.
- Read your context and instructions
- Compiled the new app from
What the skill printed
The residue check, run straight after the copy and before the rename:
Scanned 208 files in ~/apps/chore-jar
Tokens: basic-app, basicApp, BasicApp, basicapp, com.example.basicapp.RunnerTests, 123456789012, ca-app-pub-0000000000000000~1111111111, ca-app-pub-0000000000000000~1111111111
FAIL '123456789012' x12
android/app/google-services.json:3 "project_number": "123456789012",
android/app/google-services.json:10 "mobilesdk_app_id": "1:123456789012:android:a1b2c3d4e5f6a7b8c9d0e1",
firebase.json:7 "appId": "1:123456789012:android:a1b2c3d4e5f6a7b8c9d0e1",
firebase.json:14 "appId": "1:123456789012:ios:a1b2c3d4e5f6a7b8c9d0e1",
firebase.json:23 "android": "1:123456789012:android:a1b2c3d4e5f6a7b8c9d0e1",
... 7 more
FAIL 'basic-app' x15
.firebaserc:3 "default": "basic-app"
android/app/google-services.json:4 "project_id": "basic-app",
android/app/google-services.json:5 "storage_bucket": "basic-app.firebasestorage.app"
firebase.json:6 "projectId": "basic-app",
firebase.json:13 "projectId": "basic-app",
... 10 more
note 'basic-app' x1
CLAUDE.md:22 `lib/firebase_options.dart` points at a Firebase project alias (`basic-app`)
FAIL 'basicApp' x1
scripts/rename_app.sh:30 readonly OLD_CAMEL="basicApp" # iOS test target bundle id
FAIL 'basicapp' x15
android/app/build.gradle.kts:20 namespace = "com.example.basicapp"
android/app/build.gradle.kts:31 applicationId = "com.example.basicapp"
android/app/google-services.json:12 "package_name": "com.example.basicapp"
android/app/src/main/kotlin/com/example/basic_app/MainActivity.kt:1 package com.example.basicapp
ios/Runner.xcodeproj/project.pbxproj:521 PRODUCT_BUNDLE_IDENTIFIER = com.example.basicapp;
... 10 more
note 'basicapp' x1
scripts/release_android.sh:8 # - Google Play Console app created with package com.example.basicapp
FAIL 'ca-app-pub-0000000000000000~1111111111' x1
android/app/src/main/AndroidManifest.xml:32 android:value="ca-app-pub-0000000000000000~1111111111" />
FAIL 'ca-app-pub-0000000000000000~1111111111' x1
ios/Runner/Info.plist:28 <string>ca-app-pub-0000000000000000~1111111111</string>
FAIL 'com.example.basicapp.RunnerTests' x3
ios/Runner.xcodeproj/project.pbxproj:539 PRODUCT_BUNDLE_IDENTIFIER = com.example.basicapp.RunnerTests;
ios/Runner.xcodeproj/project.pbxproj:558 PRODUCT_BUNDLE_IDENTIFIER = com.example.basicapp.RunnerTests;
ios/Runner.xcodeproj/project.pbxproj:575 PRODUCT_BUNDLE_IDENTIFIER = com.example.basicapp.RunnerTests;
FAIL = rename it. regen = rerun the generator / pub get / pod install. note = docs or a comment; fine if it names the parent on purpose, stale if it describes the parent as this app.
Every FAIL line is a value the copy still shares with its parent.
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 these skills 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 skill in this bundle passes our trust checks.
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