flutterflow-mcp 0.2.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/build/index.js +24 -0
  2. package/build/prompts/generate-page.js +6 -5
  3. package/build/prompts/modify-component.js +6 -5
  4. package/build/tools/find-component-usages.js +1 -10
  5. package/build/tools/find-page-navigations.js +1 -9
  6. package/build/tools/get-api-endpoints.d.ts +2 -0
  7. package/build/tools/get-api-endpoints.js +126 -0
  8. package/build/tools/get-app-settings.d.ts +2 -0
  9. package/build/tools/get-app-settings.js +169 -0
  10. package/build/tools/get-app-state.d.ts +2 -0
  11. package/build/tools/get-app-state.js +96 -0
  12. package/build/tools/get-custom-code.d.ts +2 -0
  13. package/build/tools/get-custom-code.js +380 -0
  14. package/build/tools/get-data-models.d.ts +2 -0
  15. package/build/tools/get-data-models.js +266 -0
  16. package/build/tools/get-editing-guide.d.ts +7 -0
  17. package/build/tools/get-editing-guide.js +185 -0
  18. package/build/tools/get-general-settings.d.ts +2 -0
  19. package/build/tools/get-general-settings.js +116 -0
  20. package/build/tools/get-in-app-purchases.d.ts +2 -0
  21. package/build/tools/get-in-app-purchases.js +51 -0
  22. package/build/tools/get-integrations.d.ts +2 -0
  23. package/build/tools/get-integrations.js +137 -0
  24. package/build/tools/get-page-summary.js +1 -18
  25. package/build/tools/get-project-setup.d.ts +2 -0
  26. package/build/tools/get-project-setup.js +212 -0
  27. package/build/tools/get-theme.d.ts +2 -0
  28. package/build/tools/get-theme.js +199 -0
  29. package/build/tools/get-yaml-docs.js +1 -111
  30. package/build/tools/list-files.js +22 -3
  31. package/build/tools/search-project-files.d.ts +2 -0
  32. package/build/tools/search-project-files.js +69 -0
  33. package/build/tools/sync-project.js +4 -1
  34. package/build/tools/update-yaml.js +1 -1
  35. package/build/tools/validate-yaml.js +19 -2
  36. package/build/utils/batch-process.d.ts +2 -0
  37. package/build/utils/batch-process.js +10 -0
  38. package/build/utils/cache.d.ts +5 -0
  39. package/build/utils/cache.js +16 -1
  40. package/build/utils/resolve-data-type.d.ts +2 -0
  41. package/build/utils/resolve-data-type.js +18 -0
  42. package/build/utils/topic-map.d.ts +7 -0
  43. package/build/utils/topic-map.js +115 -0
  44. package/docs/ff-yaml/00-overview.md +30 -1
  45. package/docs/ff-yaml/01-project-files.md +1380 -4
  46. package/docs/ff-yaml/08-custom-code.md +77 -1
  47. package/docs/ff-yaml/09-theming.md +46 -0
  48. package/package.json +1 -1
@@ -132,6 +132,14 @@ widgetClassKeyToFolderKey:
132
132
 
133
133
  **Purpose:** Platform permission declarations with user-facing explanation messages.
134
134
 
135
+ > **Important — this is an abstraction layer, not a native file.**
136
+ > This file is NOT the `AndroidManifest.xml` or `Info.plist` — it is FlutterFlow's own configuration that gets **mapped to native platform files at build time**. When FF generates the app:
137
+ > - `permissionMessages` entries are mapped to the correct native declarations on both platforms (e.g., `LOCATION` → `<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>` in AndroidManifest.xml + `NSLocationWhenInUseUsageDescription` in Info.plist).
138
+ > - `userDefinedPermissions` entries let you specify the exact iOS (`iosName`) and Android (`androidName`) keys when FF's built-in types don't cover your needs.
139
+ > - The `message.textValue.inputValue` strings become the permission rationale text shown to users when the app requests access.
140
+ >
141
+ > You cannot directly edit `AndroidManifest.xml`, `Info.plist`, or `build.gradle` through the FlutterFlow API. This file is the input that drives their generation.
142
+
135
143
  **Top-level keys:**
136
144
  - `permissionMessages`
137
145
  - `userDefinedPermissions`
@@ -145,18 +153,33 @@ permissionMessages:
145
153
  key: k2j9ttsz # i18n key
146
154
  textValue:
147
155
  inputValue: "This app requires camera access..."
156
+ mostRecentInputValue: "This app requires camera access..."
148
157
 
149
158
  userDefinedPermissions:
150
159
  - names:
151
160
  iosName: NSCameraUsageDescription # iOS Info.plist key
152
- androidName: android.permission. # Android manifest permission
161
+ androidName: android.permission.CAMERA # Android manifest permission
153
162
  message:
154
163
  translationIdentifier:
155
164
  key: 6c6yuxd5
156
165
  textValue:
157
166
  inputValue: "This app requires camera access..."
167
+ - type: NOTIFICATIONS # Alternative: type-based custom permission
168
+ message:
169
+ translationIdentifier:
170
+ key: fsh8sleo
171
+ textValue:
172
+ inputValue: "We use push notifications..."
173
+ mostRecentInputValue: "We use push notifications..."
158
174
  ```
159
175
 
176
+ **Two sections, different use cases:**
177
+
178
+ | Section | When to use | How FF maps it |
179
+ |---|---|---|
180
+ | `permissionMessages` | Standard permissions (CAMERA, LOCATION, etc.) | FF knows the exact native keys for both platforms — you just pick the type and provide a message. |
181
+ | `userDefinedPermissions` | Custom or platform-specific permissions | You manually specify the `iosName` (Info.plist key) and/or `androidName` (Android permission string). Can also use `type` for known types like `NOTIFICATIONS`. |
182
+
160
183
  **Key fields:**
161
184
 
162
185
  | Field | Type | Notes |
@@ -164,24 +187,41 @@ userDefinedPermissions:
164
187
  | `permissionMessages` | list | Built-in FF permission types: `CAMERA`, `PHOTO_LIBRARY`, `MICROPHONE`, `LOCATION`, `NOTIFICATIONS`, etc. |
165
188
  | `permissionMessages[].permissionType` | enum string | Required. Must be a recognized FF permission type. |
166
189
  | `userDefinedPermissions` | list | Custom platform-level permission entries. |
190
+ | `userDefinedPermissions[].type` | enum string | Optional. Known type like `NOTIFICATIONS`. Alternative to specifying `names`. |
167
191
  | `userDefinedPermissions[].names.iosName` | string | iOS `Info.plist` key (e.g., `NSPhotoLibraryUsageDescription`). |
168
- | `userDefinedPermissions[].names.androidName` | string | Android manifest permission string. |
192
+ | `userDefinedPermissions[].names.androidName` | string | Android manifest permission string (e.g., `android.permission.CAMERA`). |
169
193
  | `*.message.textValue.inputValue` | string | User-facing permission rationale string. |
194
+ | `*.message.textValue.mostRecentInputValue` | string | Should match `inputValue` — keep both in sync. |
170
195
  | `*.message.translationIdentifier.key` | string | Links to `languages.yaml` translations. |
171
196
 
172
197
  ---
173
198
 
174
199
  ## nav-bar.yaml
175
200
 
176
- **Purpose:** Bottom navigation bar color configuration.
201
+ **Purpose:** Bottom navigation bar configuration including visibility, style, page tabs, labels, and colors.
177
202
 
178
203
  **Top-level keys:**
204
+ - `show`
205
+ - `navBarType`
206
+ - `pageKeyRefOrder`
207
+ - `labels`
179
208
  - `backgroundColor`
180
209
  - `selectedIconColor`
181
210
  - `unselectedIconColor`
182
211
 
183
212
  **Schema:**
184
213
  ```yaml
214
+ show: true # Whether the nav bar is visible
215
+
216
+ navBarType: FLOATING # Nav bar style: FLOATING | GOOGLE | MATERIAL3
217
+
218
+ pageKeyRefOrder: # Ordered list of pages shown as nav bar tabs
219
+ - key: Scaffold_XXXXXXXX # Scaffold key ref for first tab
220
+ - key: Scaffold_YYYYYYYY # Scaffold key ref for second tab
221
+ - key: Scaffold_ZZZZZZZZ # Scaffold key ref for third tab
222
+
223
+ labels: true # Show text labels beneath tab icons
224
+
185
225
  backgroundColor:
186
226
  themeColor: PRIMARY_BACKGROUND # Theme color token
187
227
 
@@ -196,11 +236,15 @@ unselectedIconColor:
196
236
 
197
237
  | Field | Type | Notes |
198
238
  |---|---|---|
239
+ | `show` | bool | Master visibility toggle for the bottom nav bar. |
240
+ | `navBarType` | enum | Nav bar style variant. Known values: `FLOATING`, `GOOGLE`, `MATERIAL3`. |
241
+ | `pageKeyRefOrder` | list | Ordered list of scaffold key refs defining the tab order. Each entry has a `key` field referencing a `Scaffold_*` ID. |
242
+ | `labels` | bool | Whether text labels are displayed beneath tab icons. |
199
243
  | `backgroundColor.themeColor` | theme token | One of: `PRIMARY`, `SECONDARY`, `PRIMARY_BACKGROUND`, `SECONDARY_BACKGROUND`, `PRIMARY_TEXT`, `SECONDARY_TEXT`, `ACCENT1`-`ACCENT4`, etc. |
200
244
  | `selectedIconColor` | color ref | Color when tab is active. |
201
245
  | `unselectedIconColor` | color ref | Color when tab is inactive. |
202
246
 
203
- > Note: Nav bar page tabs are configured per-page in the page scaffold YAML, not here. This file only controls colors.
247
+ > Note: The individual tab icon and label for each page are configured in the page scaffold YAML, not here. This file controls the nav bar structure, style, and colors.
204
248
 
205
249
  ---
206
250
 
@@ -511,3 +555,1335 @@ fields:
511
555
  | `fields[].serializedValue` | list of strings | The constant value. For scalars: single-element list. For lists: one element per item. All values are strings regardless of type. |
512
556
 
513
557
  > Key difference from `app-state.yaml`: Uses `serializedValue` (the actual value) instead of `serializedDefaultValue` (a default). No `persisted` field since constants are baked in at compile time.
558
+
559
+ ---
560
+
561
+ ## environment-settings.yaml
562
+
563
+ **Purpose:** Per-environment configuration values (API URLs, API keys, feature flags, etc.) that can vary between environments like Production and Development.
564
+
565
+ **Top-level keys:**
566
+ - `currentEnvironment`
567
+ - `environmentValues`
568
+
569
+ **Schema:**
570
+ ```yaml
571
+ currentEnvironment:
572
+ name: Production # Human-readable environment name
573
+ key: PROD # Environment key (matches app-details allAppNames)
574
+
575
+ environmentValues:
576
+ - parameter:
577
+ identifier:
578
+ name: PublicSupabaseURL # Variable name
579
+ key: actmw6 # Unique key
580
+ dataType:
581
+ scalarType: String # Data type (String, Integer, etc.)
582
+ valuesMap:
583
+ PROD:
584
+ serializedValue: https://example.supabase.co
585
+ isPrivate: false # If true, value is hidden in the FF UI
586
+ ```
587
+
588
+ **Key fields:**
589
+
590
+ | Field | Type | Notes |
591
+ |---|---|---|
592
+ | `currentEnvironment.key` | string | Active environment key (e.g., `PROD`, `DEV`). Determines which values are used at runtime. |
593
+ | `currentEnvironment.name` | string | Display name for the active environment. |
594
+ | `environmentValues` | list | All environment-specific variables. |
595
+ | `environmentValues[].parameter.identifier` | object | Same `{ name, key }` pattern as app-state variables. |
596
+ | `environmentValues[].parameter.dataType.scalarType` | enum | Variable data type (`String`, `Integer`, `Double`, `Boolean`, etc.). |
597
+ | `environmentValues[].valuesMap.<ENV>.serializedValue` | string | The value for a specific environment key. |
598
+ | `environmentValues[].isPrivate` | bool | When true, the value is obscured in the FF editor UI. Useful for API keys. |
599
+
600
+ ---
601
+
602
+ ## dependencies.yaml
603
+
604
+ **Purpose:** FlutterFlow library/package dependencies -- other FlutterFlow projects imported and used as reusable libraries.
605
+
606
+ **Top-level keys:**
607
+ - `dependencies`
608
+
609
+ **Schema:**
610
+ ```yaml
611
+ dependencies:
612
+ - projectId: common-utility-lib-hy7wrl # FF project ID of the library
613
+ name: common-utility-lib # Library display name
614
+ version: 0.0.15 # Pinned version
615
+ commitId: 4ydionKBbeDiBENNLcAf # Specific commit in the library project
616
+ ```
617
+
618
+ **Key fields:**
619
+
620
+ | Field | Type | Notes |
621
+ |---|---|---|
622
+ | `dependencies` | list | All imported FlutterFlow library dependencies. |
623
+ | `dependencies[].projectId` | string | The FlutterFlow project ID of the library being imported. |
624
+ | `dependencies[].name` | string | Human-readable library name. |
625
+ | `dependencies[].version` | string | Semver version string of the pinned library version. |
626
+ | `dependencies[].commitId` | string | Specific commit hash in the library project that this version references. |
627
+
628
+ ---
629
+
630
+ ## custom-code-dependencies.yaml
631
+
632
+ **Purpose:** Dart/Flutter pub package dependencies used by custom code within the project.
633
+
634
+ **Top-level keys:**
635
+ - `pubspecDependencies`
636
+
637
+ **Schema:**
638
+ ```yaml
639
+ pubspecDependencies:
640
+ - name: blurhash_dart # Pub package name
641
+ version: 1.2.1 # Exact version
642
+ - name: geocoding
643
+ version: ^3.0.0 # Version constraint (caret syntax)
644
+ ```
645
+
646
+ **Key fields:**
647
+
648
+ | Field | Type | Notes |
649
+ |---|---|---|
650
+ | `pubspecDependencies` | list | All Dart/Flutter pub packages added for custom code. |
651
+ | `pubspecDependencies[].name` | string | Package name as it appears on pub.dev. |
652
+ | `pubspecDependencies[].version` | string | Version constraint. Supports exact (`1.2.1`), caret (`^3.0.0`), and range syntax. |
653
+
654
+ ---
655
+
656
+ ## supabase.yaml
657
+
658
+ **Purpose:** Supabase project connection configuration and full database schema including table definitions, field types, primary keys, and foreign key relationships.
659
+
660
+ **Top-level keys:**
661
+ - `projectConfig`
662
+ - `databaseConfig`
663
+
664
+ **Schema:**
665
+ ```yaml
666
+ projectConfig:
667
+ enabled: true # Whether Supabase integration is active
668
+ supabaseUrl:
669
+ variable:
670
+ source: DEV_ENVIRONMENT # Pulls value from environment-settings
671
+ baseVariable:
672
+ environmentValue:
673
+ identifier:
674
+ name: PublicSupabaseURL
675
+ key: actmw6
676
+ anonKey:
677
+ variable:
678
+ source: DEV_ENVIRONMENT
679
+ baseVariable:
680
+ environmentValue:
681
+ identifier:
682
+ name: PublicSupabaseAnonKey
683
+ key: q60j8s
684
+
685
+ databaseConfig:
686
+ tables:
687
+ - identifier:
688
+ name: lists # Table name
689
+ fields:
690
+ - identifier:
691
+ name: id # Column name
692
+ type:
693
+ dataType:
694
+ scalarType: String
695
+ isPrimaryKey: true
696
+ hasDefault: true # Has a DB-level default value
697
+ isRequired: true # NOT NULL constraint
698
+ postgresType: uuid # Postgres-specific type
699
+ - identifier:
700
+ name: owner_id
701
+ type:
702
+ dataType:
703
+ scalarType: String
704
+ postgresType: uuid
705
+ foreignKey: users.id # Foreign key reference (table.column)
706
+ ```
707
+
708
+ **Key fields:**
709
+
710
+ | Field | Type | Notes |
711
+ |---|---|---|
712
+ | `projectConfig.enabled` | bool | Master toggle for the Supabase integration. |
713
+ | `projectConfig.supabaseUrl` | variable ref | Supabase project URL. Typically references an environment variable via `source: DEV_ENVIRONMENT`. |
714
+ | `projectConfig.anonKey` | variable ref | Supabase anonymous/public key. Same environment variable pattern. |
715
+ | `databaseConfig.tables` | list | Full database schema. One entry per table. |
716
+ | `databaseConfig.tables[].identifier.name` | string | Postgres table name. |
717
+ | `databaseConfig.tables[].fields` | list | All columns in the table. |
718
+ | `databaseConfig.tables[].fields[].identifier.name` | string | Column name. |
719
+ | `databaseConfig.tables[].fields[].type.dataType.scalarType` | enum | FF data type mapping (`String`, `Integer`, `Double`, `Boolean`, etc.). |
720
+ | `databaseConfig.tables[].fields[].isPrimaryKey` | bool | Whether this column is the primary key. |
721
+ | `databaseConfig.tables[].fields[].hasDefault` | bool | Whether the column has a database-level default value. |
722
+ | `databaseConfig.tables[].fields[].isRequired` | bool | Whether the column has a NOT NULL constraint. |
723
+ | `databaseConfig.tables[].fields[].postgresType` | string | Raw Postgres type (e.g., `uuid`, `text`, `int4`, `timestamptz`). |
724
+ | `databaseConfig.tables[].fields[].foreignKey` | string | Foreign key reference in `table.column` format (e.g., `users.id`). |
725
+
726
+ ---
727
+
728
+ ## Firebase Services
729
+
730
+ Three separate YAML files configure Firebase service integrations. Each follows a simple `enabled` toggle pattern.
731
+
732
+ ### firebase-analytics.yaml
733
+
734
+ **Purpose:** Firebase Analytics event tracking configuration.
735
+
736
+ **Schema:**
737
+ ```yaml
738
+ enabled: true # Master toggle
739
+
740
+ automaticEventSettings:
741
+ onPageLoad: true # Log screen_view on page navigation
742
+ onIndividualActions: true # Log events for individual user actions
743
+ onAuth: true # Log auth-related events (login, signup)
744
+ ```
745
+
746
+ **Key fields:**
747
+
748
+ | Field | Type | Notes |
749
+ |---|---|---|
750
+ | `enabled` | bool | Master toggle for Firebase Analytics. |
751
+ | `automaticEventSettings.onPageLoad` | bool | Automatically log `screen_view` events on page transitions. |
752
+ | `automaticEventSettings.onIndividualActions` | bool | Log events for user interactions with individual widgets/actions. |
753
+ | `automaticEventSettings.onAuth` | bool | Log authentication events (sign-in, sign-up, sign-out). |
754
+
755
+ ### firebase-crashlytics.yaml
756
+
757
+ **Purpose:** Firebase Crashlytics crash reporting.
758
+
759
+ **Schema:**
760
+ ```yaml
761
+ enabled: true # Master toggle
762
+ ```
763
+
764
+ **Key fields:**
765
+
766
+ | Field | Type | Notes |
767
+ |---|---|---|
768
+ | `enabled` | bool | Enables crash reporting via Firebase Crashlytics. |
769
+
770
+ ### firebase-performance-monitoring.yaml
771
+
772
+ **Purpose:** Firebase Performance Monitoring for network and rendering metrics.
773
+
774
+ **Schema:**
775
+ ```yaml
776
+ enabled: true # Master toggle
777
+ ```
778
+
779
+ **Key fields:**
780
+
781
+ | Field | Type | Notes |
782
+ |---|---|---|
783
+ | `enabled` | bool | Enables performance monitoring traces and network request metrics. |
784
+
785
+ ---
786
+
787
+ ## push-notifications.yaml
788
+
789
+ **Purpose:** Push notification settings including whether to auto-prompt users for notification permissions.
790
+
791
+ **Top-level keys:**
792
+ - `enabled`
793
+ - `autoPromptUsersForNotificationsPermission`
794
+
795
+ **Schema:**
796
+ ```yaml
797
+ enabled: false # Master toggle
798
+ autoPromptUsersForNotificationsPermission: true # Show permission dialog on app launch
799
+ ```
800
+
801
+ **Key fields:**
802
+
803
+ | Field | Type | Notes |
804
+ |---|---|---|
805
+ | `enabled` | bool | Master toggle for push notification support. |
806
+ | `autoPromptUsersForNotificationsPermission` | bool | If true, automatically prompts the user for notification permissions on first launch. |
807
+
808
+ ---
809
+
810
+ ## google-maps.yaml
811
+
812
+ **Purpose:** Google Maps API key configuration per platform.
813
+
814
+ **Top-level keys:**
815
+ - `androidKey`
816
+ - `iosKey`
817
+ - `webKey`
818
+
819
+ **Schema:**
820
+ ```yaml
821
+ androidKey: AIzaSy... # Google Maps API key for Android
822
+ iosKey: AIzaSy... # Google Maps API key for iOS
823
+ webKey: AIzaSy... # Google Maps API key for Web
824
+ ```
825
+
826
+ **Key fields:**
827
+
828
+ | Field | Type | Notes |
829
+ |---|---|---|
830
+ | `androidKey` | string | Google Maps JavaScript/Android API key. |
831
+ | `iosKey` | string | Google Maps iOS SDK API key. |
832
+ | `webKey` | string | Google Maps JavaScript API key for web builds. |
833
+
834
+ ---
835
+
836
+ ## ad-mob.yaml
837
+
838
+ **Purpose:** Google AdMob advertising integration configuration.
839
+
840
+ **Top-level keys:**
841
+ - `showTestAds`
842
+ - `enabled`
843
+
844
+ **Schema:**
845
+ ```yaml
846
+ showTestAds: true # Use test ad units (for development)
847
+ enabled: false # Master toggle
848
+ ```
849
+
850
+ **Key fields:**
851
+
852
+ | Field | Type | Notes |
853
+ |---|---|---|
854
+ | `enabled` | bool | Master toggle for AdMob integration. |
855
+ | `showTestAds` | bool | When true, displays Google test ads instead of real ads. Should be `true` during development, `false` in production. |
856
+
857
+ ---
858
+
859
+ ## app-assets.yaml
860
+
861
+ **Purpose:** App icon, splash screen, error placeholder image, and adaptive icon configuration.
862
+
863
+ **Top-level keys:**
864
+ - `appIconPath`
865
+ - `splashImage`
866
+ - `errorImagePath`
867
+ - `androidAdaptiveIcon`
868
+
869
+ **Schema:**
870
+ ```yaml
871
+ appIconPath: projects/xxx/assets/icon.jpg # GCS path to app icon
872
+
873
+ splashImage:
874
+ path: projects/xxx/assets/splash.png # GCS path to splash image
875
+ fit: FF_BOX_FIT_COVER # Image fit mode
876
+ dimensions:
877
+ width:
878
+ percentOfScreenSizeValue:
879
+ inputValue: 60 # Width as % of screen
880
+ height: {} # Auto height
881
+ backgroundColor:
882
+ themeColor: PRIMARY_BACKGROUND # Splash background color
883
+ preLoadingColor:
884
+ value: "4294967295" # Color shown before splash loads (white)
885
+ disableForWeb: true # Skip splash on web platform
886
+
887
+ errorImagePath: projects/xxx/assets/default-image.png # Fallback image for broken images
888
+
889
+ androidAdaptiveIcon:
890
+ foregroundImagePath: projects/xxx/assets/icon.jpg # Adaptive icon foreground layer
891
+ backgroundColor:
892
+ value: "4294967295" # Adaptive icon background color (white)
893
+ ```
894
+
895
+ **Key fields:**
896
+
897
+ | Field | Type | Notes |
898
+ |---|---|---|
899
+ | `appIconPath` | string | GCS storage path to the main app icon image. |
900
+ | `splashImage.path` | string | GCS storage path to the splash screen image. |
901
+ | `splashImage.fit` | enum | Image box fit. `FF_BOX_FIT_COVER`, `FF_BOX_FIT_CONTAIN`, `FF_BOX_FIT_FILL`, etc. |
902
+ | `splashImage.dimensions.width.percentOfScreenSizeValue.inputValue` | int | Splash image width as a percentage of screen width. |
903
+ | `splashImage.backgroundColor` | color ref | Background color behind the splash image. Uses theme token or raw ARGB value. |
904
+ | `splashImage.preLoadingColor.value` | string | Raw ARGB int shown before splash assets load. `"4294967295"` = white. |
905
+ | `splashImage.disableForWeb` | bool | If true, splash screen is not shown on web builds. |
906
+ | `errorImagePath` | string | GCS path to the placeholder image shown when an image fails to load. |
907
+ | `androidAdaptiveIcon.foregroundImagePath` | string | Foreground layer image for Android adaptive icons. |
908
+ | `androidAdaptiveIcon.backgroundColor` | color ref | Background layer color for Android adaptive icons. |
909
+
910
+ ---
911
+
912
+ ## platforms.yaml
913
+
914
+ **Purpose:** Platform build target toggles.
915
+
916
+ **Top-level keys:**
917
+ - `enableWeb`
918
+
919
+ **Schema:**
920
+ ```yaml
921
+ enableWeb: true # Enable web platform build target
922
+ ```
923
+
924
+ **Key fields:**
925
+
926
+ | Field | Type | Notes |
927
+ |---|---|---|
928
+ | `enableWeb` | bool | Whether the project supports web as a build target. |
929
+
930
+ ---
931
+
932
+ ## library-values.yaml
933
+
934
+ **Purpose:** Values passed to FlutterFlow library dependencies. When a project imports another FF project as a library, the library may define parameters that the consuming project must supply.
935
+
936
+ **Top-level keys:**
937
+ - `libraryValues`
938
+
939
+ **Schema:**
940
+ ```yaml
941
+ libraryValues:
942
+ - parameter:
943
+ identifier:
944
+ name: appName # Parameter name defined by the library
945
+ key: vdy3rp # Parameter key
946
+ projectId: flogger-lib-oanjax # Library project ID that owns this param
947
+ defaultValue: {} # Library-defined default (often empty)
948
+ dataType:
949
+ scalarType: String
950
+ nonNullable: true # Whether null is allowed
951
+ value:
952
+ inputValue:
953
+ serializedValue: veriXXa # The value this project passes to the library
954
+ ```
955
+
956
+ **Key fields:**
957
+
958
+ | Field | Type | Notes |
959
+ |---|---|---|
960
+ | `libraryValues` | list | All parameter values being passed to imported libraries. |
961
+ | `libraryValues[].parameter.identifier.name` | string | Parameter name as defined by the library. |
962
+ | `libraryValues[].parameter.identifier.key` | string | Unique parameter key. |
963
+ | `libraryValues[].parameter.identifier.projectId` | string | The FF project ID of the library that defines this parameter. |
964
+ | `libraryValues[].parameter.dataType` | object | Same type system as app-state (`scalarType`, `listType`, `nonNullable`). |
965
+ | `libraryValues[].value.inputValue.serializedValue` | string | The actual value this project supplies to the library parameter. |
966
+
967
+ ---
968
+
969
+ ## library-configurations/
970
+
971
+ **Purpose:** Route overrides for pages imported from FlutterFlow library dependencies. One file per imported library.
972
+
973
+ **File pattern:** `library-configurations/id-{projectId}.yaml`
974
+
975
+ **Schema:**
976
+ ```yaml
977
+ projectId: common-utility-lib-hy7wrl # Library project ID
978
+
979
+ routeOverrides:
980
+ - pageKey: Scaffold_5j0fh6iw # Scaffold key of the library page to override
981
+ ```
982
+
983
+ **Key fields:**
984
+
985
+ | Field | Type | Notes |
986
+ |---|---|---|
987
+ | `projectId` | string | The FF project ID of the library. Matches the file name pattern. |
988
+ | `routeOverrides` | list | Pages from the library whose routes are overridden in this project. |
989
+ | `routeOverrides[].pageKey` | Scaffold ID | The scaffold key of the library page being overridden. |
990
+
991
+ > Note: Each imported library gets its own file under `library-configurations/`. The file key follows the pattern `library-configurations/id-{projectId}`.
992
+
993
+ ---
994
+
995
+ ## download-code-settings.yaml
996
+
997
+ **Purpose:** Settings controlling how code is generated and exported when downloading or pushing to GitHub.
998
+
999
+ **Top-level keys:**
1000
+ - `applyFixesToGithub`
1001
+ - `applyFixesToDownload`
1002
+
1003
+ **Schema:**
1004
+ ```yaml
1005
+ applyFixesToGithub: true # Apply FF auto-fixes when pushing to GitHub
1006
+ applyFixesToDownload: false # Apply FF auto-fixes when downloading code
1007
+ ```
1008
+
1009
+ **Key fields:**
1010
+
1011
+ | Field | Type | Notes |
1012
+ |---|---|---|
1013
+ | `applyFixesToGithub` | bool | When true, FlutterFlow applies automatic code fixes during GitHub push. |
1014
+ | `applyFixesToDownload` | bool | When true, FlutterFlow applies automatic code fixes when downloading code as a ZIP. |
1015
+
1016
+ ---
1017
+
1018
+ ## tests.yaml
1019
+
1020
+ **Purpose:** FlutterFlow integration test definitions.
1021
+
1022
+ **Top-level keys:**
1023
+ - `rootGroup`
1024
+
1025
+ **Schema:**
1026
+ ```yaml
1027
+ rootGroup: {} # Root test group (empty when no tests defined)
1028
+ ```
1029
+
1030
+ **Key fields:**
1031
+
1032
+ | Field | Type | Notes |
1033
+ |---|---|---|
1034
+ | `rootGroup` | object | The root test group container. Empty object `{}` when no integration tests have been created. |
1035
+
1036
+ > Note: This file is a placeholder when no tests are defined. Test groups and individual test cases are nested within `rootGroup` when tests are created through the FF editor.
1037
+
1038
+ ---
1039
+
1040
+ ## custom-file/id-MAIN
1041
+
1042
+ **Purpose:** Startup action configuration for the app's `main()` function. Controls which custom actions run before and after app initialization (Firebase, state management, RevenueCat, etc.). The related sub-file `custom-file/id-MAIN/custom-file-code.dart` contains the generated Dart source for `main.dart`.
1043
+
1044
+ > **This file only exists when it has content.** If all actions and parameters are removed (via UI or API), the file disappears from the server (API returns 404). It reappears when a user adds an action or parameter in the FF editor.
1045
+
1046
+ > **WARNING: Pushing any `custom-file` deletes siblings.** The API treats all `custom-file/id-*` keys as a single collection. Pushing this file alone will delete all other custom files (ANDROID_MANIFEST, PROGUARD, BUILD_GRADLE, etc.). **Always include all existing `custom-file` entries in the same push payload.** See [API Limitation #10](../flutterflow-api-limitations.md#10-pushing-one-custom-file-deletes-all-other-custom-file-entries).
1047
+
1048
+ > **Important — this is an abstraction layer.**
1049
+ > The config file (`custom-file/id-MAIN`) controls what actions run at startup, and FlutterFlow generates the actual `main.dart` from it at build time. The Dart sub-file (`custom-file/id-MAIN/custom-file-code.dart`) is visible and readable but is **generated/read-only** — editing the config is the supported way to modify startup behavior.
1050
+
1051
+ > **`isUnlocked` behavior:**
1052
+ > - `false` (default) — FF fully manages `main.dart`. You can only add/remove INITIAL/FINAL actions via the config. The Dart code is regenerated from project settings at build time.
1053
+ > - `true` — Raw Dart editing is enabled in the FF editor. When unlocked, a `fullContent` field appears on the config containing the full Dart source as an escaped string. The Dart sub-file is still readable via the API.
1054
+ >
1055
+ > **Cannot push code via the API when unlocked.** Attempting to push to the `.dart` sub-file collapses the content into the `fullContent` field on the config and does not actually update the editor. To modify `main.dart` when unlocked, **instruct the user to edit it directly in the FlutterFlow editor**.
1056
+
1057
+ **Top-level keys:**
1058
+ - `type`
1059
+ - `identifier` (appears once the file has been customized in FF editor)
1060
+ - `isUnlocked`
1061
+ - `fullContent` (only when `isUnlocked: true`)
1062
+ - `actions`
1063
+ - `parameters`
1064
+
1065
+ **Schema:**
1066
+ ```yaml
1067
+ type: MAIN # File type identifier (always MAIN for this file)
1068
+ identifier:
1069
+ name: main.dart # Appears once the file has been customized in FF editor
1070
+ isUnlocked: false # Whether custom Dart edits are unlocked in FF editor
1071
+
1072
+ actions:
1073
+ - type: INITIAL_ACTION # Runs BEFORE app initialization
1074
+ identifier:
1075
+ name: changeStatusBarColorRed # Custom action name
1076
+ key: d8rqwp # Unique action key
1077
+ - type: FINAL_ACTION # Runs AFTER app initialization but before runApp()
1078
+ identifier:
1079
+ key: 4lla8 # Name is optional if action has no display name
1080
+ - type: INITIAL_ACTION
1081
+ identifier:
1082
+ name: refreshRemoteConfigForDev
1083
+ key: hfpkf
1084
+ - type: FINAL_ACTION
1085
+ identifier:
1086
+ name: pushfireInitialize (PushFire-Lib)
1087
+ key: mtd59
1088
+ projectId: push-fire-lib-mblt3v # Library project ID (present for library actions)
1089
+
1090
+ parameters: # Template variables (same structure as ANDROID_MANIFEST)
1091
+ kdq2rm: # Parameter ID
1092
+ parameter:
1093
+ identifier:
1094
+ name: myVar # Variable name — use {{myVar}} in unlocked code
1095
+ dataType:
1096
+ scalarType: String # Data type
1097
+ value:
1098
+ inputValue:
1099
+ serializedValue: some value # Default value
1100
+ ```
1101
+
1102
+ **Key fields:**
1103
+
1104
+ | Field | Type | Notes |
1105
+ |---|---|---|
1106
+ | `type` | string | Always `MAIN` for this file. |
1107
+ | `identifier.name` | string | Always `main.dart`. Appears once the file has been customized. |
1108
+ | `isUnlocked` | bool | If `false`, FF manages `main.dart` automatically. If `true`, raw Dart editing is enabled in FF editor and `fullContent` field appears. |
1109
+ | `fullContent` | string | Only present when `isUnlocked: true`. Contains the full Dart source as an escaped string. **Read-only via API** — cannot be pushed; instruct users to edit in FF editor. |
1110
+ | `actions` | list | Ordered list of custom actions that run during app startup. |
1111
+ | `actions[].type` | enum | `INITIAL_ACTION` (runs before app init) or `FINAL_ACTION` (runs after app init, before `runApp()`). |
1112
+ | `actions[].identifier.name` | string | Human-readable action name. Optional — some actions only have a key. |
1113
+ | `actions[].identifier.key` | string | Unique action key. Required. |
1114
+ | `actions[].identifier.projectId` | string | Present only for library actions. References the FF project ID of the library that defines the action. |
1115
+ | `parameters` | map | Template variables, keyed by parameter ID. Same structure as `custom-file/id-ANDROID_MANIFEST` parameters. Use `{{variableName}}` syntax in unlocked Dart code. |
1116
+
1117
+ ### Generated Dart execution order
1118
+
1119
+ The sub-file `custom-file/id-MAIN/custom-file-code.dart` contains the full generated `main()` function. Actions map to specific positions in the execution order:
1120
+
1121
+ ```
1122
+ 1. Library value setup (library FINAL_ACTIONs with projectId — e.g. pushfire API key)
1123
+ 2. await initFirebase()
1124
+ 3. // Start initial custom actions code
1125
+ 4. await actions.changeStatusBarColorRed() ← INITIAL_ACTION
1126
+ 5. await actions.refreshRemoteConfigForDev() ← INITIAL_ACTION
1127
+ 6. // End initial custom actions code
1128
+ 7. FFAppState init + persisted state
1129
+ 8. RevenueCat init
1130
+ 9. Crashlytics setup
1131
+ 10. RemoteConfig + AppCheck init
1132
+ 11. // Start final custom actions code
1133
+ 12. await actions.oneSignalInitializer() ← FINAL_ACTION
1134
+ 13. // End final custom actions code
1135
+ 14. runApp()
1136
+ ```
1137
+
1138
+ - **INITIAL_ACTIONs** run early — after Firebase init but **before** app state, RevenueCat, Crashlytics, and other service initialization.
1139
+ - **FINAL_ACTIONs** run late — **after** all service initialization, just before `runApp()`.
1140
+ - **Library actions** (with `projectId`) are handled separately via library value setup at the top of `main()`, not in the initial/final action blocks.
1141
+ - The Dart code is **regenerated by FF at build time**. When `isUnlocked: true`, the source also appears as `fullContent` on the config, but **pushing edits to either file does not work** — the API accepts the push but changes are not reflected correctly in the FF editor. Always instruct users to make `main.dart` edits directly in FlutterFlow.
1142
+
1143
+ ---
1144
+
1145
+ ## custom-file/id-ANDROID_MANIFEST
1146
+
1147
+ **Purpose:** Allows injecting custom XML snippets into specific locations of the generated `AndroidManifest.xml`. Like `permissions.yaml`, this is an abstraction layer — you don't edit the manifest directly. Instead you define "hooks" (XML injection points) and "parameters" (template variables).
1148
+
1149
+ > **This file only exists when it has content.** If all hooks and parameters are removed (via UI or API), the file disappears from the server (API returns 404). It reappears when a user adds a hook or parameter in the FF editor.
1150
+
1151
+ > **WARNING: Pushing any `custom-file` deletes siblings.** The API treats all `custom-file/id-*` keys as a single collection. Pushing this file alone will delete all other custom files (MAIN, PROGUARD, BUILD_GRADLE, etc.). **Always include all existing `custom-file` entries in the same push payload.** See [API Limitation #10](../flutterflow-api-limitations.md#10-pushing-one-custom-file-deletes-all-other-custom-file-entries).
1152
+
1153
+ > **Important — this is NOT the AndroidManifest.xml itself.**
1154
+ > This is FlutterFlow's configuration that controls **XML injection into the generated manifest** at build time. The file only appears after a user adds at least one custom tag in the FF editor (Settings > Custom Code > Custom Files > AndroidManifest.xml).
1155
+
1156
+ **Top-level keys:**
1157
+ - `type`
1158
+ - `identifier`
1159
+ - `hooks`
1160
+ - `parameters`
1161
+
1162
+ ### Hook Types
1163
+
1164
+ Three hook types control where XML is injected in the generated `AndroidManifest.xml`:
1165
+
1166
+ | Hook Type | Where it injects in AndroidManifest.xml |
1167
+ |---|---|
1168
+ | `MANIFEST_ACTIVITY_TAG` | Inside the `<activity>` tag — use for intent filters, meta-data on the main activity |
1169
+ | `MANIFEST_APPLICATION_TAG` | Inside the `<application>` tag — use for services, receivers, meta-data at app level |
1170
+ | `MANIFEST_APP_COMPONENT_TAG` | Top-level, outside `<application>` — use for `<uses-permission>`, `<queries>`, or other root-level elements |
1171
+
1172
+ ### Parameters (Template Variables)
1173
+
1174
+ - Parameters are template variables defined with a name, data type, and value.
1175
+ - Referenced in hook `content` using `{{variableName}}` syntax (double curly braces).
1176
+ - At build time, FF replaces `{{variableName}}` with the parameter's value in the generated manifest.
1177
+ - Useful for keeping values like API keys, hosts, or schemes configurable without editing each hook.
1178
+
1179
+ **Schema:**
1180
+ ```yaml
1181
+ type: ANDROID_MANIFEST # File type identifier (always ANDROID_MANIFEST)
1182
+ identifier:
1183
+ name: AndroidManifest.xml # Always AndroidManifest.xml
1184
+
1185
+ hooks: # List of XML injection hooks
1186
+ - type: MANIFEST_ACTIVITY_TAG # Injects inside <activity> tag
1187
+ identifier:
1188
+ name: metadata # Human-readable hook name
1189
+ key: uren6h # Unique 6-char alphanumeric key
1190
+ content: <data android:scheme="http" android:host="perkspass.page.link"/> # Raw XML to inject
1191
+
1192
+ - type: MANIFEST_APPLICATION_TAG # Injects inside <application> tag
1193
+ identifier:
1194
+ name: appplication tag
1195
+ key: 9kbunj
1196
+ content: <data android:scheme="http" android:host="perkspass.page.link"/>
1197
+
1198
+ - type: MANIFEST_APP_COMPONENT_TAG # Injects at top level, outside <application>
1199
+ identifier:
1200
+ name: app component tag
1201
+ key: 2tw0gd
1202
+ content: <data android:scheme="http" android:host="perkspass.page.link"/>
1203
+
1204
+ parameters: # Template variables referenced in hook content
1205
+ upm7wd: # Parameter key
1206
+ parameter:
1207
+ identifier:
1208
+ name: newVar # Variable name (referenced as {{newVar}} in hook content)
1209
+ dataType:
1210
+ scalarType: String # Data type (String, Integer, etc.)
1211
+ value:
1212
+ inputValue:
1213
+ serializedValue: This is the var value # The variable's value at build time
1214
+ ```
1215
+
1216
+ **Key fields:**
1217
+
1218
+ | Field | Type | Notes |
1219
+ |---|---|---|
1220
+ | `type` | string | Always `ANDROID_MANIFEST` for this file. |
1221
+ | `identifier.name` | string | Always `AndroidManifest.xml`. |
1222
+ | `hooks` | list | List of XML injection hooks. Each hook injects content at a specific location in the manifest. |
1223
+ | `hooks[].type` | enum | `MANIFEST_ACTIVITY_TAG`, `MANIFEST_APPLICATION_TAG`, or `MANIFEST_APP_COMPONENT_TAG`. |
1224
+ | `hooks[].identifier.name` | string | Human-readable hook name. **Must not contain hyphens** — the FF editor rejects them but the API accepts them (validation gap). |
1225
+ | `hooks[].identifier.key` | string | Unique 6-char alphanumeric key. |
1226
+ | `hooks[].content` | string | Raw XML string to inject. Must be properly quoted in YAML when containing angle brackets or special characters. |
1227
+ | `parameters` | map | Map of parameter key to parameter definition. |
1228
+ | `parameters.<key>.parameter.identifier.name` | string | Variable name. Referenced in hook `content` as `{{variableName}}`. |
1229
+ | `parameters.<key>.parameter.dataType.scalarType` | enum | Data type (`String`, `Integer`, `Double`, `Boolean`, etc.). |
1230
+ | `parameters.<key>.value.inputValue.serializedValue` | string | The variable's value, substituted into hook content at build time. |
1231
+
1232
+ **API capabilities:**
1233
+
1234
+ | Operation | Status | Notes |
1235
+ |---|---|---|
1236
+ | Reading | Works | Full config with hooks and parameters is readable. |
1237
+ | Adding hooks via API | Works | New hooks pushed successfully and appear in FF editor. |
1238
+ | Adding parameters via API | Works | New variables pushed successfully and appear in FF editor. |
1239
+ | Editing existing hooks | Works | Content and name changes are reflected. |
1240
+ | Hook name validation gap | Caution | The API accepts hook names with hyphens, but the FF editor rejects them as "Name contains invalid character." Use camelCase or spaces for names. |
1241
+ | XML content quoting | Caution | When hook content contains XML angle brackets (e.g., `<meta-data .../>`), wrap the content value in double quotes in the YAML to prevent parsing issues. |
1242
+
1243
+ ---
1244
+
1245
+ ## custom-file/id-PROGUARD
1246
+
1247
+ **Purpose:** Allows injecting custom ProGuard rules into the generated `proguard-rules.pro` file for Android builds. Controls code shrinking, obfuscation, and optimization rules.
1248
+
1249
+ > **This file only exists when it has content.** If all hooks and parameters are removed (via UI or API), the file disappears from the server (API returns 404). It reappears when a user adds a rule or parameter in the FF editor.
1250
+
1251
+ > **WARNING: Pushing any `custom-file` deletes siblings.** The API treats all `custom-file/id-*` keys as a single collection. Pushing this file alone will delete all other custom files (MAIN, ANDROID_MANIFEST, BUILD_GRADLE, etc.). **Always include all existing `custom-file` entries in the same push payload.** See [API Limitation #10](../flutterflow-api-limitations.md#10-pushing-one-custom-file-deletes-all-other-custom-file-entries).
1252
+
1253
+ > **Important — this is an abstraction layer.**
1254
+ > This config controls **rule injection into the generated `proguard-rules.pro`** at build time. The file only appears after a user adds at least one rule in the FF editor (Settings > Custom Code > Custom Files > proguard-rules.pro). Unlike `custom-file/id-MAIN`, there is no Dart code sub-file — ProGuard rules are plain text.
1255
+
1256
+ **Top-level keys:**
1257
+ - `type`
1258
+ - `identifier`
1259
+ - `hooks`
1260
+ - `parameters`
1261
+
1262
+ ### Hook Types
1263
+
1264
+ Only one hook type:
1265
+
1266
+ | Hook Type | What it injects |
1267
+ |---|---|
1268
+ | `PROGUARD_RULE` | A ProGuard rule line (e.g., `-keep class com.example.** { *; }`) |
1269
+
1270
+ ### Schema
1271
+
1272
+ ```yaml
1273
+ type: PROGUARD
1274
+ identifier:
1275
+ name: proguard-rules.pro
1276
+
1277
+ hooks:
1278
+ - type: PROGUARD_RULE # Only hook type for ProGuard
1279
+ identifier:
1280
+ name: roleComment # Human-readable name
1281
+ key: z735am # Unique hook key
1282
+ content: "-keep class com.example.myapp.** { *; }" # The ProGuard rule text
1283
+
1284
+ parameters: # Template variables — same as MAIN and ANDROID_MANIFEST
1285
+ hgnzpn:
1286
+ parameter:
1287
+ identifier:
1288
+ name: myVar # Variable name — use {{myVar}} in rule content
1289
+ dataType:
1290
+ scalarType: String
1291
+ value:
1292
+ inputValue:
1293
+ serializedValue: some value # Default value
1294
+ ```
1295
+
1296
+ **Key fields:**
1297
+
1298
+ | Field | Type | Notes |
1299
+ |---|---|---|
1300
+ | `type` | string | Always `PROGUARD` for this file. |
1301
+ | `identifier.name` | string | Always `proguard-rules.pro`. |
1302
+ | `hooks` | list | ProGuard rules to inject into the generated file. |
1303
+ | `hooks[].type` | enum | Always `PROGUARD_RULE`. |
1304
+ | `hooks[].identifier.name` | string | Human-readable name for the rule. |
1305
+ | `hooks[].identifier.key` | string | Unique key (6 alphanumeric chars). |
1306
+ | `hooks[].content` | string | The ProGuard rule text. |
1307
+ | `parameters` | map | Template variables keyed by parameter ID. Use `{{variableName}}` in `content` to reference them. Same structure as MAIN and ANDROID_MANIFEST parameters. |
1308
+
1309
+ ### API capabilities
1310
+
1311
+ | Operation | Status | Notes |
1312
+ |---|---|---|
1313
+ | Reading config | Works | Full hook and parameter data returned. |
1314
+ | Adding hooks via API | Expected to work | Same structure as ANDROID_MANIFEST hooks. |
1315
+ | Adding parameters via API | Expected to work | Same structure as MAIN/ANDROID_MANIFEST parameters. |
1316
+ | Hook name validation gap | Caution | Same as ANDROID_MANIFEST — avoid hyphens in names, use camelCase or spaces. |
1317
+
1318
+ ---
1319
+
1320
+ ## custom-file/id-BUILD_GRADLE
1321
+
1322
+ **Purpose:** Allows injecting custom entries into specific sections of the generated `build.gradle` file for Android builds — plugins, dependencies, and repositories.
1323
+
1324
+ > **This file only exists when it has content.** If all hooks and parameters are removed (via UI or API), the file disappears from the server (API returns 404). It reappears when a user adds an entry or parameter in the FF editor.
1325
+
1326
+ > **WARNING: Pushing any `custom-file` deletes siblings.** The API treats all `custom-file/id-*` keys as a single collection. Pushing this file alone will delete all other custom files (MAIN, ANDROID_MANIFEST, PROGUARD, etc.). **Always include all existing `custom-file` entries in the same push payload.** See [API Limitation #10](../flutterflow-api-limitations.md#10-pushing-one-custom-file-deletes-all-other-custom-file-entries).
1327
+
1328
+ > **Important — this is an abstraction layer.**
1329
+ > This config controls **injection into the generated `build.gradle`** at build time. The file only appears after a user adds at least one entry in the FF editor (Settings > Custom Code > Custom Files > build.gradle). No code sub-file — just config.
1330
+
1331
+ **Top-level keys:**
1332
+ - `type`
1333
+ - `identifier`
1334
+ - `hooks`
1335
+ - `parameters`
1336
+
1337
+ ### Hook Types
1338
+
1339
+ Three hook types control where content is injected in the generated `build.gradle`:
1340
+
1341
+ | Hook Type | Where it injects in build.gradle |
1342
+ |---|---|
1343
+ | `BUILD_GRADLE_PLUGIN_HOOK` | Inside the `plugins { }` block — use for Gradle plugin declarations |
1344
+ | `BUILD_GRADLE_DEPENDENCY_HOOK` | Inside the `dependencies { }` block — use for library dependencies |
1345
+ | `BUILD_GRADLE_REPOSITORY_HOOK` | Inside the `repositories { }` block — use for custom Maven/artifact repositories |
1346
+
1347
+ ### Schema
1348
+
1349
+ ```yaml
1350
+ type: BUILD_GRADLE
1351
+ identifier:
1352
+ name: build.gradle
1353
+
1354
+ hooks:
1355
+ - type: BUILD_GRADLE_PLUGIN_HOOK
1356
+ identifier:
1357
+ name: gms # Human-readable name
1358
+ key: t36afz # Unique hook key
1359
+ content: id 'com.google.gms' version '4.4.2' apply false
1360
+
1361
+ - type: BUILD_GRADLE_DEPENDENCY_HOOK
1362
+ identifier:
1363
+ name: gmsImpl
1364
+ key: 4bdxxs
1365
+ content: implementation 'com.google.firebase:firebase-analytics:21.5.0'
1366
+
1367
+ - type: BUILD_GRADLE_REPOSITORY_HOOK
1368
+ identifier:
1369
+ name: maven
1370
+ key: mnz0zx
1371
+ content: "maven { url 'https://maven.google.com' }"
1372
+
1373
+ parameters: # Template variables — use {{variableName}} in content
1374
+ 9r3k4a:
1375
+ parameter:
1376
+ identifier:
1377
+ name: firstvar
1378
+ dataType:
1379
+ scalarType: String
1380
+ value:
1381
+ inputValue:
1382
+ serializedValue: var val
1383
+ ```
1384
+
1385
+ **Key fields:**
1386
+
1387
+ | Field | Type | Notes |
1388
+ |---|---|---|
1389
+ | `type` | string | Always `BUILD_GRADLE` for this file. |
1390
+ | `identifier.name` | string | Always `build.gradle`. |
1391
+ | `hooks` | list | Entries to inject into the generated build.gradle. |
1392
+ | `hooks[].type` | enum | `BUILD_GRADLE_PLUGIN_HOOK`, `BUILD_GRADLE_DEPENDENCY_HOOK`, or `BUILD_GRADLE_REPOSITORY_HOOK`. |
1393
+ | `hooks[].identifier.name` | string | Human-readable name for the entry. |
1394
+ | `hooks[].identifier.key` | string | Unique key (6 alphanumeric chars). |
1395
+ | `hooks[].content` | string | The Gradle code to inject. Quote values containing braces or special chars. |
1396
+ | `parameters` | map | Template variables keyed by parameter ID. Use `{{variableName}}` in `content` to reference them. Same structure as all other custom files. |
1397
+
1398
+ ### API capabilities
1399
+
1400
+ | Operation | Status | Notes |
1401
+ |---|---|---|
1402
+ | Reading config | Works | Full hook and parameter data returned. |
1403
+ | Adding hooks via API | Expected to work | Same structure as ANDROID_MANIFEST hooks. |
1404
+ | Adding parameters via API | Expected to work | Same structure as other custom file parameters. |
1405
+ | Hook name validation gap | Caution | Same as ANDROID_MANIFEST — avoid hyphens in names, use camelCase or spaces. |
1406
+ | Content quoting | Caution | Gradle syntax with braces (e.g., `maven { url '...' }`) should be wrapped in double quotes in the YAML. |
1407
+
1408
+ ---
1409
+
1410
+ ## mobile-deployment.yaml
1411
+
1412
+ **Purpose:** Mobile deployment configuration for Codemagic CI/CD, including App Store Connect credentials, build versioning, and Play Store settings.
1413
+
1414
+ > **WARNING:** This file contains **sensitive credentials** including App Store Connect private keys and Play Store credentials paths. Exercise extreme caution when reading or editing this file. Never log or expose its contents.
1415
+
1416
+ **Top-level keys:**
1417
+ - `codemagicSettingsMap`
1418
+
1419
+ **Schema:**
1420
+ ```yaml
1421
+ codemagicSettingsMap:
1422
+ PROD: # Environment key (PROD, DEV, etc.)
1423
+ appStoreSettings:
1424
+ ascKeyId: AKUAKF2ZCH # App Store Connect API Key ID
1425
+ ascIssuerId: 57e34d27-22ff-47c3-a187-a2cf6b1807b7 # ASC Issuer ID (UUID)
1426
+ ascPrivateKey: "<redacted>" # ASC private key (PEM format) — SENSITIVE
1427
+ ascAppId: "6466313325" # App Store app ID
1428
+ buildVersion:
1429
+ buildVersion: 1.1.8 # Marketing version (CFBundleShortVersionString)
1430
+ buildNumber: 110 # Build number (CFBundleVersion / versionCode)
1431
+ lastSubmitted: 1.0.99+96 # Last version+build submitted to store
1432
+ playStoreSettings:
1433
+ playTrack: INTERNAL # Play Store track: INTERNAL, ALPHA, BETA, PRODUCTION
1434
+ playstoreCredentialsPath: codemagic/.../.../playstore_credentials.json # GCS path to credentials
1435
+ alias: mykey # Signing key alias
1436
+ ```
1437
+
1438
+ **Key fields:**
1439
+
1440
+ | Field | Type | Notes |
1441
+ |---|---|---|
1442
+ | `codemagicSettingsMap` | map | Keyed by environment (`PROD`, `DEV`, etc.). One entry per deployment environment. |
1443
+ | `appStoreSettings.ascKeyId` | string | App Store Connect API Key ID. |
1444
+ | `appStoreSettings.ascIssuerId` | string | App Store Connect Issuer ID (UUID format). |
1445
+ | `appStoreSettings.ascPrivateKey` | string | **SENSITIVE.** App Store Connect private key in PEM format. |
1446
+ | `appStoreSettings.ascAppId` | string | Numeric App Store app identifier. |
1447
+ | `buildVersion.buildVersion` | string | Marketing version string (e.g., `1.1.8`). |
1448
+ | `buildVersion.buildNumber` | int | Incremental build number. |
1449
+ | `buildVersion.lastSubmitted` | string | Last version+build submitted to stores (format: `version+buildNumber`). |
1450
+ | `playStoreSettings.playTrack` | enum | Play Store release track: `INTERNAL`, `ALPHA`, `BETA`, `PRODUCTION`. |
1451
+ | `playStoreSettings.playstoreCredentialsPath` | string | GCS path to the Play Store service account credentials JSON. |
1452
+ | `playStoreSettings.alias` | string | Android signing key alias. |
1453
+
1454
+ ---
1455
+
1456
+ ## web-publishing.yaml
1457
+
1458
+ **Purpose:** Web-specific publishing settings including SEO metadata, page title, status bar color, and screen orientation.
1459
+
1460
+ **Top-level keys:**
1461
+ - `webSettings`
1462
+
1463
+ **Schema:**
1464
+ ```yaml
1465
+ webSettings:
1466
+ PROD: # Environment key (PROD, DEV, etc.)
1467
+ seoDescription: "Idaho's #1 Discount Pass" # Meta description for SEO
1468
+ pageTitle: GoldPass # HTML <title> tag content
1469
+ statusBarColor:
1470
+ value: "4294046968" # Status bar color (raw ARGB int as string)
1471
+ darkModeColor:
1472
+ value: "4280099880" # Status bar color in dark mode
1473
+ orientation: PORTRAIT_PRIMARY # Preferred screen orientation
1474
+ ```
1475
+
1476
+ **Key fields:**
1477
+
1478
+ | Field | Type | Notes |
1479
+ |---|---|---|
1480
+ | `webSettings` | map | Keyed by environment (`PROD`, `DEV`, etc.). |
1481
+ | `webSettings.<ENV>.seoDescription` | string | Meta description tag content for search engines. |
1482
+ | `webSettings.<ENV>.pageTitle` | string | HTML `<title>` value shown in browser tabs. |
1483
+ | `webSettings.<ENV>.statusBarColor.value` | string | Raw ARGB integer as string for the browser theme/status bar color. |
1484
+ | `webSettings.<ENV>.statusBarColor.darkModeColor.value` | string | Dark mode variant of the status bar color. |
1485
+ | `webSettings.<ENV>.orientation` | enum | Preferred screen orientation. Known values: `PORTRAIT_PRIMARY`, `LANDSCAPE_PRIMARY`. |
1486
+
1487
+ ---
1488
+
1489
+ ## firebase-app-check.yaml
1490
+
1491
+ **Purpose:** Firebase App Check configuration for app attestation and abuse prevention.
1492
+
1493
+ **Top-level keys:**
1494
+ - `enabled`
1495
+ - `runTestModeDebugToken`
1496
+
1497
+ **Schema:**
1498
+ ```yaml
1499
+ enabled: true # Master toggle for App Check
1500
+ runTestModeDebugToken: 9218DDCD-D417-4E71-AFFF-A8A8616AECC6 # Debug token for test mode
1501
+ ```
1502
+
1503
+ **Key fields:**
1504
+
1505
+ | Field | Type | Notes |
1506
+ |---|---|---|
1507
+ | `enabled` | bool | Master toggle for Firebase App Check. |
1508
+ | `runTestModeDebugToken` | string | UUID debug token used during development/testing. Allows bypassing App Check attestation in debug builds. |
1509
+
1510
+ ---
1511
+
1512
+ ## firebase-remote-config.yaml
1513
+
1514
+ **Purpose:** Firebase Remote Config field definitions with default values. Defines the parameters that can be fetched from Firebase Remote Config at runtime.
1515
+
1516
+ **Top-level keys:**
1517
+ - `enabled`
1518
+ - `fields`
1519
+
1520
+ **Schema:**
1521
+ ```yaml
1522
+ enabled: true # Master toggle for Remote Config
1523
+
1524
+ fields:
1525
+ - parameter:
1526
+ identifier:
1527
+ name: newiOSVersion # Parameter name
1528
+ dataType:
1529
+ scalarType: String # Data type (String, Integer, Double, Boolean, etc.)
1530
+ serializedDefaultValue: 1.1.1 # Default value used when remote fetch fails
1531
+ - parameter:
1532
+ identifier:
1533
+ name: newAndroidVersion
1534
+ dataType:
1535
+ scalarType: String
1536
+ serializedDefaultValue: 1.1.1
1537
+ - parameter:
1538
+ identifier:
1539
+ name: minIosVersion
1540
+ dataType:
1541
+ scalarType: String
1542
+ serializedDefaultValue: 1.1.1
1543
+ - parameter:
1544
+ identifier:
1545
+ name: minAndroidVersion
1546
+ dataType:
1547
+ scalarType: String
1548
+ serializedDefaultValue: 1.1.1
1549
+ ```
1550
+
1551
+ **Key fields:**
1552
+
1553
+ | Field | Type | Notes |
1554
+ |---|---|---|
1555
+ | `enabled` | bool | Master toggle for Firebase Remote Config integration. |
1556
+ | `fields` | list | All Remote Config parameter definitions. |
1557
+ | `fields[].parameter.identifier.name` | string | Parameter name as it appears in the Firebase Remote Config console. |
1558
+ | `fields[].parameter.dataType.scalarType` | enum | Data type: `String`, `Integer`, `Double`, `Boolean`, etc. |
1559
+ | `fields[].serializedDefaultValue` | string | Default value used when the remote fetch fails or the parameter is not set in the Firebase console. |
1560
+
1561
+ ---
1562
+
1563
+ ## firestore-settings.yaml
1564
+
1565
+ **Purpose:** Firestore security rules, collection-level permissions, read visibility settings, validation hashes, and Cloud Storage rules configuration.
1566
+
1567
+ **Top-level keys:**
1568
+ - `rules`
1569
+ - `validation`
1570
+ - `storageRules`
1571
+
1572
+ **Schema:**
1573
+ ```yaml
1574
+ rules:
1575
+ collectionRules:
1576
+ k2ktdun9: # Collection key (matches Firestore collection key)
1577
+ creat: # NOTE: spelled "creat" not "create" — this is how FF spells it
1578
+ authenticatedUsers: {}
1579
+ read:
1580
+ everyone: {}
1581
+ update:
1582
+ authenticatedUsers: {}
1583
+ delete:
1584
+ noOne: {}
1585
+ isPublic: true # Whether the collection is publicly readable
1586
+ vz94s0kh:
1587
+ creat:
1588
+ authenticatedUsers: {}
1589
+ read:
1590
+ authenticatedUsers: {}
1591
+ update:
1592
+ authenticatedUsers: {}
1593
+ delete:
1594
+ authenticatedUsers: {}
1595
+ deleteWhenUserIsDeleted: true # Cascade delete when the owning user is deleted
1596
+ usersCollectionReadVisibility: READ_VISIBILITY_SELF # Users can only read their own document
1597
+
1598
+ validation:
1599
+ lastValidatedCollectionHash:
1600
+ Establishments: "106055806" # Hash of last validated schema per collection
1601
+ Users: "130657010"
1602
+ mode: DISABLED # Validation mode: DISABLED, ENABLED, etc.
1603
+
1604
+ storageRules:
1605
+ excludeFromStorageRules: true # Exclude this project from generating storage rules
1606
+ rules:
1607
+ userUploadsArePrivate: false # Whether user-uploaded files are private by default
1608
+ ```
1609
+
1610
+ > **Important:** The YAML uses `creat` (not `create`) for the create permission key. This is how FlutterFlow actually spells it in the YAML. Do NOT attempt to "fix" this spelling — it is intentional and expected by the FF system.
1611
+
1612
+ **Permission values:** Each permission field (`creat`, `read`, `update`, `delete`) accepts one of three values: `everyone: {}`, `authenticatedUsers: {}`, or `noOne: {}`.
1613
+
1614
+ **Key fields:**
1615
+
1616
+ | Field | Type | Notes |
1617
+ |---|---|---|
1618
+ | `rules.collectionRules` | map | Keyed by collection key. One entry per Firestore collection. |
1619
+ | `rules.collectionRules.<key>.creat` | permission | Create permission. Note: spelled `creat`, not `create`. |
1620
+ | `rules.collectionRules.<key>.read` | permission | Read permission. |
1621
+ | `rules.collectionRules.<key>.update` | permission | Update permission. |
1622
+ | `rules.collectionRules.<key>.delete` | permission | Delete permission. |
1623
+ | `rules.collectionRules.<key>.isPublic` | bool | Whether the collection allows public (unauthenticated) reads. |
1624
+ | `rules.collectionRules.<key>.deleteWhenUserIsDeleted` | bool | Cascade delete: remove documents when the owning user account is deleted. |
1625
+ | `rules.usersCollectionReadVisibility` | enum | Read visibility for the Users collection. Known value: `READ_VISIBILITY_SELF` (users can only read their own document). |
1626
+ | `validation.lastValidatedCollectionHash` | map | Hash per collection name, used to detect schema changes since last validation. |
1627
+ | `validation.mode` | enum | Validation mode: `DISABLED`, `ENABLED`. |
1628
+ | `storageRules.excludeFromStorageRules` | bool | If true, this project does not generate Cloud Storage security rules. |
1629
+ | `storageRules.rules.userUploadsArePrivate` | bool | Whether user-uploaded files default to private access. |
1630
+
1631
+ ---
1632
+
1633
+ ## algolia.yaml
1634
+
1635
+ **Purpose:** Algolia search integration configuration, including API credentials and indexed Firestore collections.
1636
+
1637
+ **Top-level keys:**
1638
+ - `applicationId`
1639
+ - `searchApiKey`
1640
+ - `indexedCollections`
1641
+ - `enabled`
1642
+
1643
+ **Schema:**
1644
+ ```yaml
1645
+ applicationId: SUEUI0E453 # Algolia Application ID
1646
+ searchApiKey: 5c8d18d950352fcf5e66ec8d5df04a66 # Algolia Search API key (public/search-only)
1647
+ indexedCollections:
1648
+ - name: Establishments # Firestore collection name
1649
+ key: k2ktdun9 # Firestore collection key
1650
+ enabled: true # Master toggle
1651
+ ```
1652
+
1653
+ **Key fields:**
1654
+
1655
+ | Field | Type | Notes |
1656
+ |---|---|---|
1657
+ | `applicationId` | string | Algolia Application ID. Found in the Algolia dashboard. |
1658
+ | `searchApiKey` | string | Algolia Search-Only API key. This is the public key safe for client-side use — not the Admin API key. |
1659
+ | `indexedCollections` | list | Firestore collections that are synced to Algolia indices. |
1660
+ | `indexedCollections[].name` | string | Firestore collection name (human-readable). |
1661
+ | `indexedCollections[].key` | string | Firestore collection key (matches keys in `firestore-settings.yaml`). |
1662
+ | `enabled` | bool | Master toggle for Algolia search integration. |
1663
+
1664
+ ---
1665
+
1666
+ ## app-query-cache.yaml
1667
+
1668
+ **Purpose:** Configuration for cached database queries (request managers) that persist query results to avoid redundant fetches.
1669
+
1670
+ **Top-level keys:**
1671
+ - `databaseRequestManagers`
1672
+
1673
+ **Schema:**
1674
+ ```yaml
1675
+ databaseRequestManagers:
1676
+ - identifier:
1677
+ name: savedDeals # Cache entry name
1678
+ key: sefdr # Unique key
1679
+ originalNodeKeyRef:
1680
+ key: Container_s5rjtbgg # Widget key where the query originates
1681
+ ```
1682
+
1683
+ **Key fields:**
1684
+
1685
+ | Field | Type | Notes |
1686
+ |---|---|---|
1687
+ | `databaseRequestManagers` | list | All cached query definitions. |
1688
+ | `databaseRequestManagers[].identifier.name` | string | Human-readable name for the cached query. |
1689
+ | `databaseRequestManagers[].identifier.key` | string | Unique key for the cache entry. |
1690
+ | `databaseRequestManagers[].originalNodeKeyRef.key` | string | Widget key (typically `Container_*`) where the original database query is defined. Links the cache to its source widget. |
1691
+
1692
+ ---
1693
+
1694
+ ## material-theme.yaml
1695
+
1696
+ **Purpose:** Material Design version toggle controlling whether the app uses Material 2 or Material 3 design system.
1697
+
1698
+ **Top-level keys:**
1699
+ - `useMaterial2`
1700
+
1701
+ **Schema:**
1702
+ ```yaml
1703
+ useMaterial2: true # true = Material 2, false = Material 3
1704
+ ```
1705
+
1706
+ **Key fields:**
1707
+
1708
+ | Field | Type | Notes |
1709
+ |---|---|---|
1710
+ | `useMaterial2` | bool | When `true`, the app uses Material 2 theming. When `false` (or absent), the app uses Material 3. Material 3 introduces updated color schemes, typography, and widget shapes. |
1711
+
1712
+ ---
1713
+
1714
+ ## storyboard.yaml
1715
+
1716
+ **Purpose:** Editor-only metadata storing page positions on the FlutterFlow storyboard canvas. Has no functional impact on the built app.
1717
+
1718
+ **Top-level keys:**
1719
+ - `storyboardPositions`
1720
+
1721
+ **Schema:**
1722
+ ```yaml
1723
+ storyboardPositions:
1724
+ Scaffold_q2hw5kk7: # Scaffold ID of the page
1725
+ x: 1172.0366954890674 # Horizontal position on canvas
1726
+ y: 583.8096385491203 # Vertical position on canvas
1727
+ Scaffold_ih504krn:
1728
+ x: 803.2030987008528
1729
+ y: 582.2951003122512
1730
+ ```
1731
+
1732
+ **Key fields:**
1733
+
1734
+ | Field | Type | Notes |
1735
+ |---|---|---|
1736
+ | `storyboardPositions` | map | Keyed by Scaffold ID. One entry per page placed on the storyboard. |
1737
+ | `storyboardPositions.<Scaffold_ID>.x` | double | Horizontal position (pixels) of the page on the storyboard canvas. |
1738
+ | `storyboardPositions.<Scaffold_ID>.y` | double | Vertical position (pixels) of the page on the storyboard canvas. |
1739
+
1740
+ > Note: This is purely editor-level metadata used by the FlutterFlow storyboard view. It has no effect on the built application. Modifying these values only changes where pages appear on the visual canvas in the FF editor.
1741
+
1742
+ ---
1743
+
1744
+ ## date-picker.yaml
1745
+
1746
+ **Purpose:** Controls which Material date picker style is used in the app (legacy vs modern).
1747
+
1748
+ **Top-level keys:**
1749
+ - `useLegacyDatePicker`
1750
+
1751
+ **Schema:**
1752
+ ```yaml
1753
+ useLegacyDatePicker: false # false = modern Material date picker, true = legacy style
1754
+ ```
1755
+
1756
+ **Key fields:**
1757
+
1758
+ | Field | Type | Notes |
1759
+ |---|---|---|
1760
+ | `useLegacyDatePicker` | bool | When `true`, the app uses the legacy Material date picker. When `false` (or absent), the app uses the modern Material date picker style. |
1761
+
1762
+ ---
1763
+
1764
+ ## theme/color-scheme
1765
+
1766
+ **Purpose:** Full color palette definition for the app. This is a **sub-file** of the `theme` file key — access it with file key `theme/color-scheme`, not just `theme`.
1767
+
1768
+ **Top-level keys:**
1769
+ - `primary`, `secondary`, `tertiary`, `alternate`
1770
+ - `primaryBackground`, `secondaryBackground`
1771
+ - `primaryText`, `secondaryText`
1772
+ - `accent1`, `accent2`, `accent3`, `accent4`
1773
+ - `success`, `warning`, `error`, `info`
1774
+ - `customPaletteColors`
1775
+ - `darkModeEnabled`
1776
+ - `displayDarkMode`
1777
+
1778
+ **Schema:**
1779
+ ```yaml
1780
+ primary: # Core Material colors
1781
+ value: "4279461852" # Light mode ARGB integer as string
1782
+ darkModeColor:
1783
+ value: "4279461852" # Dark mode ARGB integer as string
1784
+ secondary:
1785
+ value: "4278190080"
1786
+ darkModeColor:
1787
+ value: "4294967295"
1788
+ tertiary:
1789
+ value: "4280582880"
1790
+ darkModeColor:
1791
+ value: "4280582880"
1792
+ alternate:
1793
+ value: "4282532418"
1794
+ darkModeColor:
1795
+ value: "4287937484"
1796
+
1797
+ primaryBackground: # Background colors
1798
+ value: "4294967295"
1799
+ darkModeColor:
1800
+ value: "4278190080"
1801
+ secondaryBackground:
1802
+ value: "4294111986"
1803
+ darkModeColor:
1804
+ value: "4282532418"
1805
+
1806
+ primaryText: # Text colors
1807
+ value: "4278190080"
1808
+ darkModeColor:
1809
+ value: "4294967295"
1810
+ secondaryText:
1811
+ value: "4282402630"
1812
+ darkModeColor:
1813
+ value: "4287996332"
1814
+
1815
+ accent1: # Accent colors (accent1 through accent4)
1816
+ value: "4284572001"
1817
+ darkModeColor:
1818
+ value: "4293848814"
1819
+ accent2:
1820
+ value: "4285887861"
1821
+ darkModeColor:
1822
+ value: "4292927712"
1823
+ accent3:
1824
+ value: "4292927712"
1825
+ darkModeColor:
1826
+ value: "4285887861"
1827
+ accent4:
1828
+ value: "4293848814"
1829
+ darkModeColor:
1830
+ value: "4284572001"
1831
+
1832
+ success: # Semantic colors
1833
+ value: "4278493772"
1834
+ darkModeColor:
1835
+ value: "4278493772"
1836
+ warning:
1837
+ value: "4294761484"
1838
+ darkModeColor:
1839
+ value: "4294761484"
1840
+ error:
1841
+ value: "4293008445"
1842
+ darkModeColor:
1843
+ value: "4293008445"
1844
+ info:
1845
+ value: "4280042644"
1846
+ darkModeColor:
1847
+ value: "4280042644"
1848
+
1849
+ customPaletteColors: # Project-specific named colors
1850
+ - value: "4294967295"
1851
+ paletteColorName: primaryBtnText # Custom color name (used in bindings)
1852
+ darkModeColor:
1853
+ value: "4294967295"
1854
+ - value: "4292467161"
1855
+ paletteColorName: lineColor
1856
+ darkModeColor:
1857
+ value: "4280428591"
1858
+ - value: "2550136832"
1859
+ paletteColorName: barrierColor
1860
+ darkModeColor:
1861
+ value: "2550136832"
1862
+
1863
+ darkModeEnabled: true # Whether dark mode is available in the app
1864
+ displayDarkMode: true # Whether dark mode toggle is shown in FF editor
1865
+ ```
1866
+
1867
+ **Key fields:**
1868
+
1869
+ | Field | Type | Notes |
1870
+ |---|---|---|
1871
+ | `primary` | color entry | Primary brand color. Each color entry has `value` (light mode) and `darkModeColor.value` (dark mode). |
1872
+ | `secondary` | color entry | Secondary brand color. |
1873
+ | `tertiary` | color entry | Tertiary accent color. |
1874
+ | `alternate` | color entry | Alternate/surface variant color. |
1875
+ | `primaryBackground` | color entry | Main background color. |
1876
+ | `secondaryBackground` | color entry | Secondary/card background color. |
1877
+ | `primaryText` | color entry | Primary text color. |
1878
+ | `secondaryText` | color entry | Secondary/subtitle text color. |
1879
+ | `accent1` - `accent4` | color entry | Four accent colors for highlights and decorations. |
1880
+ | `success` | color entry | Semantic color for success states. |
1881
+ | `warning` | color entry | Semantic color for warning states. |
1882
+ | `error` | color entry | Semantic color for error states. |
1883
+ | `info` | color entry | Semantic color for informational states. |
1884
+ | `customPaletteColors` | list | Project-specific named colors. Each entry has `value`, `paletteColorName`, and `darkModeColor`. |
1885
+ | `customPaletteColors[].paletteColorName` | string | Custom color name used in widget bindings and theme references. |
1886
+ | `darkModeEnabled` | bool | When `true`, dark mode is available as an option in the built app. |
1887
+ | `displayDarkMode` | bool | When `true`, the dark mode toggle is visible in the FlutterFlow editor. |
1888
+
1889
+ > Color values are raw ARGB integers stored as strings (e.g., `"4294967295"` = white/0xFFFFFFFF, `"4278190080"` = black/0xFF000000). Every color has both a light mode `value` and a `darkModeColor` variant. This is a sub-file: access it with file key `theme/color-scheme`, not just `theme`.