Migrate from FlutterFlow with a cutover Run Mode cannot fake
A FlutterFlow project is a widget tree, Custom Actions, Firebase or Supabase bindings, and often store metadata glued to FlutterFlow’s build cloud. Migration is extracting that tree via Code Download into org Git, translating editor assumptions into lockfile-based Flutter CI, and landing on a conventional `flutter build ipa` or `flutter build appbundle`. You keep product behavior; you stop needing FlutterFlow’s GUI and Run Mode assumptions to archive.
CodeCross LLC calls migrate-from-flutterflow a Code-Download-plus-normalization job: extract generated Dart, pin Flutter SDK and pubspec locks, turn FlutterFlow Firebase or Supabase bindings into env plus security rules you review, and prove flutter test then flutter build on a clean runner. Success is an IPA or AAB without the FlutterFlow editor open.
Why Code Download fails as a cutover
Run Mode cannot fake cutover parity
Not every FlutterFlow project needs a full dump. Every project needs to decide what FlutterFlow owned versus disposable widget seed — and how Firebase or Supabase subjects are recognized on the destination.
A FlutterFlow user id is treated as enough
Firebase Auth sessions, Supabase JWTs, password hashes, and consent flags need separate treatment. Destination recognition is not a primary-key copy.
Store tracks move before destination env exists
Stand up destination environments first. FlutterFlow pane values must not be copied into --dart-define client bags. Certificates, push, OAuth, and email senders are one graph.
Rollback is “we still have the FlutterFlow project”
Rollback means Firestore or Supabase — or the prior write authority — can again accept writes without split-brain. Freeze FlutterFlow schema at cutover and time-box reversal.
Parity skips fixtures Run Mode never exercised
An old Firebase account, a brand-new signup, edge roles, empty states, Storage attachments, and store deep links.
The FlutterFlow cutover sequence
Inventory FlutterFlow, rehearse imports, then switch write authority
We will not flip store tracks to prove velocity. We flip them after a signed Run Mode parity report and a rehearsed rollback to the last known-good FlutterFlow write authority.
01
Classify FlutterFlow records as authoritative, derived, or throwaway
Decide what Firestore or Supabase owned versus widget seed. Missing classifications surprise you when real FlutterFlow accounts hit the destination.
02
Preserve identity links FlutterFlow Auth issued
Sessions, brokered OAuth subjects, hashes, and consent get their own line. A FlutterFlow user id alone is rarely enough.
03
Rehearse store and secret cutover before testers leave the editor binary
Sealed FlutterFlow and destination env map. Verify push and OAuth, then rotate keys after the destination can receive FlutterFlow traffic.
04
Sign the Run Mode parity report, then time-box FlutterFlow reversal
Representative accounts, permissions, media, store-listing samples, and who decides FlutterFlow is authoritative again. Destination writes FlutterFlow never saw stay reserved for reconciliation.
How to
Migrate from FlutterFlow with a cutover Run Mode cannot fake
A FlutterFlow-to-owned transfer of records, secrets, and store IDs. Success is a signed Run Mode parity report plus a rehearsed rollback.
Step 01
Inventory FlutterFlow and classify every record type
Authoritative, derived, or throwaway. Firebase Auth sessions, Supabase JWTs, password hashes, and consent flags each get a line.
Step 02
Stand up destination environments before store tracks move
Keep FlutterFlow and destination env names in a sealed map. Project-pane values must not land in client --dart-define bags. Schedule Auth allowlists, email senders, and callbacks as one graph.
Step 03
Build FlutterFlow fixtures Run Mode never exercised
Old Firebase account, brand-new signup, edge roles, empty states, Storage attachments, and store deep links.
Step 04
Replay FlutterFlow journeys and record the editor cursor
Compare visible outcomes and side effects FlutterFlow triggered (emails, pushes). Freeze Firestore or Supabase schema at cutover. Preserve destination writes FlutterFlow never saw.
Step 05
Kill FlutterFlow’s write role only after the parity report is signed
Quiet tester-cohort monitoring through a traffic rehearsal. Support knows FlutterFlow-era failure modes on the new binary. Time-box reversal so both sides do not mint accounts.
Read next
Proof, the essay, and sibling intents
These pages are already on the site. Use them to pressure-test the bet before a call.
What belongs in the FlutterFlow extract versus what stays behind?
Take application Dart, pubspec.lock, Custom Actions, and a written map of Firebase or Supabase projects and run commands. Leave FlutterFlow editor caches, local Secret files, and unpublished widget experiments out of the remote. Capture Firestore export or connection requirements separately so CI does not invent schema. Unpublished widget experiments that never hit a device need an explicit “include or drop” pass.
How do you turn FlutterFlow Run Mode into standard Flutter CI?
List Flutter SDK and package versions the editor assumed. Pin them in the toolchain file. Replace “available because FlutterFlow bundled it” packages with pubspec locks on the image. Encode the editor’s run/start as `flutter test` and `flutter build ipa` or `appbundle`. Fail the pipeline if install only succeeds inside FlutterFlow’s cloud.
How should Firebase or Supabase cutover work during the extract?
Export secret names from the FlutterFlow pane into an env template; mint new values on the destination; never commit editor `.env`. Point the app at a destination project (restored or dual-written) and verify rules on a clean runner. Update Auth callbacks that still hardcode FlutterFlow-era bundle IDs before store tracks move. Rotate old pane values after cutover so leaked editor copies die.
Why does “git push Code Download” without normalization fail on standard hosts?
CI images lack FlutterFlow-bundled assets the editor hid, start paths assume FlutterFlow’s working directory, Run Mode process shape disappears, and secrets arrive empty. Auth and push still expect editor-era bundle IDs. Normalize install, process model, and env first; then push. A green Run Mode session is not a portable build.
Cut over FlutterFlow with a parity report, not hope.
Bring FlutterFlow record classes, Auth subjects, and the fixture accounts. We will put store tracks last — and name the FlutterFlow write authority you roll back to.
“What impressed us most about CodeCross was their ability to deeply understand our vision and translate it into a complete digital solution. Unlike many agencies that just focus on technical delivery, CodeCross approached our project like true partners.”