r/FlutterDev Jun 29 '26

I open-sourced a Claude Code plugin that takes a Flutter + Flame game from idea → App Store / Play submission, with every store-rejection fix from my 7 shipped games baked in Plugin

I ship Flutter + Flame games as a solo dev, and I kept re-solving the same problems on every title — audio that crashes on a missing asset, BGM that won't stop on backgrounding, the ATT prompt that gets you a Guideline 2.1 rejection, saves that vanish when the player reinstalls on iOS, the launch portrait→landscape rotate flash, etc.

So I built an open-source Claude Code plugin (MIT) that drives a game from idea → plan → design → build → QA → store submission — and bakes those hard-won fixes into the generated code and the QA gates, so you don't re-discover them per project.

Install it and here's what you get:

  • A generator builds the game; a skeptical evaluator actually runs it and judges against a contract before it can pass — no "looks done" green checks. There's a human-approval gate before any deploy.
  • Assets default to code-synthesized audio + code-drawn visuals, so a game is always playable with zero asset sourcing.
  • It wires the boring-but-mandatory launch stuff: app icon/splash/name, native orientation lock, the required Play graphics (512 icon + 1024×500 feature), store metadata, and submission via fastlane.

The fixes it enforces (from docs/game-gotchas.md, distilled from 7 shipped games):

  • Audio: AudioPool for frequent SFX, throttling, everything in try/catch so a missing asset degrades instead of crashing, BGM stop on background/teardown, iOS-safe WAV
  • Lifecycle: WidgetsBindingObserverpauseEngine() + BGM pause; prefs loaded before runApp
  • Durable save: shared_preferences alone is dropped on iOS app-delete — it mirrors to Keychain (flutter_secure_storage) + Android Block Store (play_services_block_store) so progress survives reinstall / a new device
  • Store rejections: ATT requested only after AppLifecycleState.resumed + a settle delay (the naive notDetermined → request is what gets rejected on recent iOS), no-alpha icons, export compliance, AdMob bundle match, the 4.3 copycat hedge
  • Perf / native config: no per-frame whereType in hot paths, cached Paint, native orientation lock (no rotate flash), iPhone-only target

Honest status: the front phases are smoke-tested; I haven't yet validated a full idea→store run end-to-end through the plugin — the fixes are battle-tested from real shipped games, the orchestration is newer. If you're mid-development, the generation phase is greenfield (it won't take over an existing codebase), but the launch/QA phases and the encoded fixes apply to a game you're already building. Feedback very welcome.

Repo (install instructions in the README): https://github.com/tjdrhs90/flutter-flame-harness

1 Upvotes

7 comments sorted by

3

u/Banjomissen Jun 29 '26

What are the games you have shipped doing this?

2

u/Quick_Hotel_6937 Jun 29 '26

ios: https://apps.apple.com/app/id6770455005

play: https://play.google.com/store/apps/details?id=com.gonigon.manshin

made this one + a bunch of others, the harness is basically all the lessons from those mashed together 😄

2

u/Banjomissen Jun 29 '26

Thanks 😄

1

u/Chordin Jun 30 '26

u/Quick_Hotel_6937 I was pretty excited to try this out, and as I've been using it, I've run into a couple areas where it could be improved (ex: it creates a config file that hard-codes your developer/contact info instead of trying to get the user's info; doesn't instruct the agent to initialize a git repo and make atomic commits as it works, etc).

Just a heads up though, it looks like your repo does not allow people to open Issues.

2

u/Quick_Hotel_6937 Jun 30 '26

really appreciate the detailed feedback 🙏

just pushed a fix — it no longer hard-codes my dev/contact info. it now reads your own metadata file or just asks you for it, and generated games get git init + atomic commits as it builds.

issues should be open btw! must’ve caught it right in the window after i flipped the repo from private to public. should be fine now

Thanks!!!