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.
- package/build/index.js +24 -0
- package/build/prompts/generate-page.js +6 -5
- package/build/prompts/modify-component.js +6 -5
- package/build/tools/find-component-usages.js +1 -10
- package/build/tools/find-page-navigations.js +1 -9
- package/build/tools/get-api-endpoints.d.ts +2 -0
- package/build/tools/get-api-endpoints.js +126 -0
- package/build/tools/get-app-settings.d.ts +2 -0
- package/build/tools/get-app-settings.js +169 -0
- package/build/tools/get-app-state.d.ts +2 -0
- package/build/tools/get-app-state.js +96 -0
- package/build/tools/get-custom-code.d.ts +2 -0
- package/build/tools/get-custom-code.js +380 -0
- package/build/tools/get-data-models.d.ts +2 -0
- package/build/tools/get-data-models.js +266 -0
- package/build/tools/get-editing-guide.d.ts +7 -0
- package/build/tools/get-editing-guide.js +185 -0
- package/build/tools/get-general-settings.d.ts +2 -0
- package/build/tools/get-general-settings.js +116 -0
- package/build/tools/get-in-app-purchases.d.ts +2 -0
- package/build/tools/get-in-app-purchases.js +51 -0
- package/build/tools/get-integrations.d.ts +2 -0
- package/build/tools/get-integrations.js +137 -0
- package/build/tools/get-page-summary.js +1 -18
- package/build/tools/get-project-setup.d.ts +2 -0
- package/build/tools/get-project-setup.js +212 -0
- package/build/tools/get-theme.d.ts +2 -0
- package/build/tools/get-theme.js +199 -0
- package/build/tools/get-yaml-docs.js +1 -111
- package/build/tools/list-files.js +22 -3
- package/build/tools/search-project-files.d.ts +2 -0
- package/build/tools/search-project-files.js +69 -0
- package/build/tools/sync-project.js +4 -1
- package/build/tools/update-yaml.js +1 -1
- package/build/tools/validate-yaml.js +19 -2
- package/build/utils/batch-process.d.ts +2 -0
- package/build/utils/batch-process.js +10 -0
- package/build/utils/cache.d.ts +5 -0
- package/build/utils/cache.js +16 -1
- package/build/utils/resolve-data-type.d.ts +2 -0
- package/build/utils/resolve-data-type.js +18 -0
- package/build/utils/topic-map.d.ts +7 -0
- package/build/utils/topic-map.js +115 -0
- package/docs/ff-yaml/00-overview.md +30 -1
- package/docs/ff-yaml/01-project-files.md +1380 -4
- package/docs/ff-yaml/08-custom-code.md +77 -1
- package/docs/ff-yaml/09-theming.md +46 -0
- 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.
|
|
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
|
|
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:
|
|
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`.
|