community-ff-mcp 0.4.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 (116) hide show
  1. package/README.md +300 -0
  2. package/build/api/flutterflow.d.ts +11 -0
  3. package/build/api/flutterflow.js +61 -0
  4. package/build/index.d.ts +2 -0
  5. package/build/index.js +78 -0
  6. package/build/prompts/dev-workflow.d.ts +2 -0
  7. package/build/prompts/dev-workflow.js +68 -0
  8. package/build/prompts/generate-page.d.ts +2 -0
  9. package/build/prompts/generate-page.js +37 -0
  10. package/build/prompts/inspect-project.d.ts +2 -0
  11. package/build/prompts/inspect-project.js +30 -0
  12. package/build/prompts/modify-component.d.ts +2 -0
  13. package/build/prompts/modify-component.js +40 -0
  14. package/build/resources/docs.d.ts +2 -0
  15. package/build/resources/docs.js +76 -0
  16. package/build/resources/projects.d.ts +3 -0
  17. package/build/resources/projects.js +60 -0
  18. package/build/tools/find-component-usages.d.ts +21 -0
  19. package/build/tools/find-component-usages.js +216 -0
  20. package/build/tools/find-page-navigations.d.ts +26 -0
  21. package/build/tools/find-page-navigations.js +220 -0
  22. package/build/tools/get-api-endpoints.d.ts +2 -0
  23. package/build/tools/get-api-endpoints.js +126 -0
  24. package/build/tools/get-app-settings.d.ts +2 -0
  25. package/build/tools/get-app-settings.js +169 -0
  26. package/build/tools/get-app-state.d.ts +2 -0
  27. package/build/tools/get-app-state.js +96 -0
  28. package/build/tools/get-component-summary.d.ts +22 -0
  29. package/build/tools/get-component-summary.js +195 -0
  30. package/build/tools/get-custom-code.d.ts +2 -0
  31. package/build/tools/get-custom-code.js +380 -0
  32. package/build/tools/get-data-models.d.ts +2 -0
  33. package/build/tools/get-data-models.js +266 -0
  34. package/build/tools/get-editing-guide.d.ts +7 -0
  35. package/build/tools/get-editing-guide.js +185 -0
  36. package/build/tools/get-general-settings.d.ts +2 -0
  37. package/build/tools/get-general-settings.js +116 -0
  38. package/build/tools/get-in-app-purchases.d.ts +2 -0
  39. package/build/tools/get-in-app-purchases.js +51 -0
  40. package/build/tools/get-integrations.d.ts +2 -0
  41. package/build/tools/get-integrations.js +137 -0
  42. package/build/tools/get-page-by-name.d.ts +3 -0
  43. package/build/tools/get-page-by-name.js +56 -0
  44. package/build/tools/get-page-summary.d.ts +22 -0
  45. package/build/tools/get-page-summary.js +205 -0
  46. package/build/tools/get-project-config.d.ts +2 -0
  47. package/build/tools/get-project-config.js +216 -0
  48. package/build/tools/get-project-setup.d.ts +2 -0
  49. package/build/tools/get-project-setup.js +212 -0
  50. package/build/tools/get-theme.d.ts +2 -0
  51. package/build/tools/get-theme.js +199 -0
  52. package/build/tools/get-yaml-docs.d.ts +6 -0
  53. package/build/tools/get-yaml-docs.js +116 -0
  54. package/build/tools/get-yaml.d.ts +2 -0
  55. package/build/tools/get-yaml.js +53 -0
  56. package/build/tools/list-files.d.ts +3 -0
  57. package/build/tools/list-files.js +49 -0
  58. package/build/tools/list-pages.d.ts +25 -0
  59. package/build/tools/list-pages.js +101 -0
  60. package/build/tools/list-projects.d.ts +3 -0
  61. package/build/tools/list-projects.js +23 -0
  62. package/build/tools/search-project-files.d.ts +2 -0
  63. package/build/tools/search-project-files.js +69 -0
  64. package/build/tools/sync-project.d.ts +3 -0
  65. package/build/tools/sync-project.js +147 -0
  66. package/build/tools/update-yaml.d.ts +3 -0
  67. package/build/tools/update-yaml.js +24 -0
  68. package/build/tools/validate-yaml.d.ts +3 -0
  69. package/build/tools/validate-yaml.js +39 -0
  70. package/build/utils/batch-process.d.ts +2 -0
  71. package/build/utils/batch-process.js +10 -0
  72. package/build/utils/cache.d.ts +58 -0
  73. package/build/utils/cache.js +199 -0
  74. package/build/utils/decode-yaml.d.ts +7 -0
  75. package/build/utils/decode-yaml.js +31 -0
  76. package/build/utils/page-summary/action-summarizer.d.ts +24 -0
  77. package/build/utils/page-summary/action-summarizer.js +291 -0
  78. package/build/utils/page-summary/formatter.d.ts +13 -0
  79. package/build/utils/page-summary/formatter.js +129 -0
  80. package/build/utils/page-summary/node-extractor.d.ts +24 -0
  81. package/build/utils/page-summary/node-extractor.js +227 -0
  82. package/build/utils/page-summary/tree-walker.d.ts +6 -0
  83. package/build/utils/page-summary/tree-walker.js +55 -0
  84. package/build/utils/page-summary/types.d.ts +58 -0
  85. package/build/utils/page-summary/types.js +4 -0
  86. package/build/utils/parse-folders.d.ts +9 -0
  87. package/build/utils/parse-folders.js +29 -0
  88. package/build/utils/resolve-data-type.d.ts +2 -0
  89. package/build/utils/resolve-data-type.js +18 -0
  90. package/build/utils/topic-map.d.ts +7 -0
  91. package/build/utils/topic-map.js +122 -0
  92. package/docs/ff-yaml/00-overview.md +166 -0
  93. package/docs/ff-yaml/01-project-files.md +2309 -0
  94. package/docs/ff-yaml/02-pages.md +572 -0
  95. package/docs/ff-yaml/03-components.md +784 -0
  96. package/docs/ff-yaml/04-widgets/README.md +122 -0
  97. package/docs/ff-yaml/04-widgets/button.md +444 -0
  98. package/docs/ff-yaml/04-widgets/container.md +358 -0
  99. package/docs/ff-yaml/04-widgets/dropdown.md +579 -0
  100. package/docs/ff-yaml/04-widgets/form.md +256 -0
  101. package/docs/ff-yaml/04-widgets/image.md +276 -0
  102. package/docs/ff-yaml/04-widgets/layout.md +355 -0
  103. package/docs/ff-yaml/04-widgets/misc.md +553 -0
  104. package/docs/ff-yaml/04-widgets/text-field.md +326 -0
  105. package/docs/ff-yaml/04-widgets/text.md +302 -0
  106. package/docs/ff-yaml/05-actions.md +953 -0
  107. package/docs/ff-yaml/06-variables.md +849 -0
  108. package/docs/ff-yaml/07-data.md +591 -0
  109. package/docs/ff-yaml/08-custom-code.md +736 -0
  110. package/docs/ff-yaml/09-theming.md +638 -0
  111. package/docs/ff-yaml/10-editing-guide.md +497 -0
  112. package/docs/ff-yaml/README.md +105 -0
  113. package/package.json +59 -0
  114. package/skills/community-ff-mcp/SKILL.md +201 -0
  115. package/skills/ff-widget-patterns.md +141 -0
  116. package/skills/ff-yaml-dev.md +70 -0
@@ -0,0 +1,2309 @@
1
+ # 01 - FlutterFlow Project-Level YAML Files
2
+
3
+ Reference catalog of project-level YAML files returned by the FlutterFlow API. These files configure app-wide settings and are not tied to individual pages or components.
4
+
5
+ ---
6
+
7
+ ## app-details.yaml
8
+
9
+ **Purpose:** Core app identity, routing configuration, and environment-specific package names.
10
+
11
+ **Top-level keys:**
12
+ - `name`
13
+ - `authPageInfo`
14
+ - `appSettings`
15
+ - `routingSettings`
16
+ - `initialPageKeyRef`
17
+ - `allAppNames`
18
+
19
+ **Schema:**
20
+ ```yaml
21
+ name: "MyApp" # App display name in FF editor
22
+
23
+ authPageInfo:
24
+ homePageNodeKeyRef:
25
+ key: Scaffold_XXXXXXXX # Scaffold ID of the post-auth landing page
26
+ signInPageNodeKeyRef:
27
+ key: Scaffold_XXXXXXXX # Scaffold ID of the sign-in page
28
+
29
+ appSettings:
30
+ advancedSettings:
31
+ webBuildSettings: {} # Web-specific build config (often empty)
32
+
33
+ routingSettings:
34
+ enableRouting: true # Enable named routes
35
+ pagesAreSubroutesOfRoot: false # If true, pages are nested under root
36
+
37
+ initialPageKeyRef:
38
+ key: Scaffold_XXXXXXXX # Scaffold ID of the app entry page (often same as homePage)
39
+
40
+ allAppNames:
41
+ appNames:
42
+ PROD: # Environment key (PROD, DEV, etc.)
43
+ packageName: com.example.app # Android package / iOS bundle ID
44
+ displayName: "MyApp" # App store display name
45
+ ```
46
+
47
+ **Key fields:**
48
+
49
+ | Field | Type | Notes |
50
+ |---|---|---|
51
+ | `name` | string | Required. Editor-level app name. |
52
+ | `authPageInfo.homePageNodeKeyRef.key` | Scaffold ID | Required when auth is active. Where users land after login. |
53
+ | `authPageInfo.signInPageNodeKeyRef.key` | Scaffold ID | Required when auth is active. Login/signup page. |
54
+ | `initialPageKeyRef.key` | Scaffold ID | Required. First page loaded on app start. |
55
+ | `allAppNames.appNames.<ENV>.packageName` | string | Bundle/package identifier per environment. |
56
+ | `routingSettings.enableRouting` | bool | Enables Flutter named routes. |
57
+
58
+ ---
59
+
60
+ ## authentication.yaml
61
+
62
+ **Purpose:** Authentication provider configuration (Firebase, Supabase) and platform credentials.
63
+
64
+ **Top-level keys:**
65
+ - `active`
66
+ - `supabase`
67
+ - `firebaseConfigFileInfos`
68
+
69
+ **Schema:**
70
+ ```yaml
71
+ active: true # Whether auth is enabled
72
+
73
+ supabase: {} # Supabase config (empty if not used)
74
+
75
+ firebaseConfigFileInfos:
76
+ - androidPath: users/.../google-services.json # GCS path to Android config
77
+ iosPath: users/.../GoogleService-Info.plist # GCS path to iOS config
78
+ webConfig: "firebase.initializeApp({...});\n" # Inline JS init snippet
79
+ androidPackageNames:
80
+ - com.example.app # Registered Android packages
81
+ iosBundleId: com.example.app # iOS bundle identifier
82
+ environment:
83
+ name: Production # Environment label
84
+ key: PROD # Environment key
85
+ ```
86
+
87
+ **Key fields:**
88
+
89
+ | Field | Type | Notes |
90
+ |---|---|---|
91
+ | `active` | bool | Required. Master toggle for auth features. |
92
+ | `firebaseConfigFileInfos` | list | One entry per environment. Contains platform credentials. |
93
+ | `firebaseConfigFileInfos[].webConfig` | string | Raw JS snippet with Firebase config object. Escaped newlines. |
94
+ | `firebaseConfigFileInfos[].environment.key` | string | Matches keys in `app-details.yaml > allAppNames.appNames`. |
95
+ | `supabase` | object | Populated when Supabase is the auth provider instead of Firebase. |
96
+
97
+ ---
98
+
99
+ ## folders.yaml
100
+
101
+ **Purpose:** Defines page/component folder structure and maps each widget class (Scaffold/Container) to its folder.
102
+
103
+ **Top-level keys:**
104
+ - `rootFolders`
105
+ - `widgetClassKeyToFolderKey`
106
+
107
+ **Schema:**
108
+ ```yaml
109
+ rootFolders:
110
+ - key: abcd1234 # Unique folder key
111
+ name: auth # Human-readable folder name
112
+ - key: efgh5678
113
+ name: pages
114
+
115
+ widgetClassKeyToFolderKey:
116
+ Scaffold_XXXXXXXX: abcd1234 # Page scaffold -> folder key
117
+ Container_XXXXXXXX: efgh5678 # Component container -> folder key
118
+ ```
119
+
120
+ **Key fields:**
121
+
122
+ | Field | Type | Notes |
123
+ |---|---|---|
124
+ | `rootFolders` | list | Required. Defines all top-level folders. |
125
+ | `rootFolders[].key` | string | 8-char alphanumeric key. Referenced by widget mappings. |
126
+ | `rootFolders[].name` | string | Folder name displayed in FF editor sidebar. |
127
+ | `widgetClassKeyToFolderKey` | map | Maps every `Scaffold_*` (page) and `Container_*` (component) to a folder key. |
128
+
129
+ ---
130
+
131
+ ## permissions.yaml
132
+
133
+ **Purpose:** Platform permission declarations with user-facing explanation messages.
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
+
143
+ **Top-level keys:**
144
+ - `permissionMessages`
145
+ - `userDefinedPermissions`
146
+
147
+ **Schema:**
148
+ ```yaml
149
+ permissionMessages:
150
+ - permissionType: CAMERA # FF built-in permission enum
151
+ message:
152
+ translationIdentifier:
153
+ key: k2j9ttsz # i18n key
154
+ textValue:
155
+ inputValue: "This app requires camera access..."
156
+ mostRecentInputValue: "This app requires camera access..."
157
+
158
+ userDefinedPermissions:
159
+ - names:
160
+ iosName: NSCameraUsageDescription # iOS Info.plist key
161
+ androidName: android.permission.CAMERA # Android manifest permission
162
+ message:
163
+ translationIdentifier:
164
+ key: 6c6yuxd5
165
+ textValue:
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..."
174
+ ```
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
+
183
+ **Key fields:**
184
+
185
+ | Field | Type | Notes |
186
+ |---|---|---|
187
+ | `permissionMessages` | list | Built-in FF permission types: `CAMERA`, `PHOTO_LIBRARY`, `MICROPHONE`, `LOCATION`, `NOTIFICATIONS`, etc. |
188
+ | `permissionMessages[].permissionType` | enum string | Required. Must be a recognized FF permission type. |
189
+ | `userDefinedPermissions` | list | Custom platform-level permission entries. |
190
+ | `userDefinedPermissions[].type` | enum string | Optional. Known type like `NOTIFICATIONS`. Alternative to specifying `names`. |
191
+ | `userDefinedPermissions[].names.iosName` | string | iOS `Info.plist` key (e.g., `NSPhotoLibraryUsageDescription`). |
192
+ | `userDefinedPermissions[].names.androidName` | string | Android manifest permission string (e.g., `android.permission.CAMERA`). |
193
+ | `*.message.textValue.inputValue` | string | User-facing permission rationale string. |
194
+ | `*.message.textValue.mostRecentInputValue` | string | Should match `inputValue` — keep both in sync. |
195
+ | `*.message.translationIdentifier.key` | string | Links to `languages.yaml` translations. |
196
+
197
+ ---
198
+
199
+ ## nav-bar.yaml
200
+
201
+ **Purpose:** Bottom navigation bar configuration including visibility, style, page tabs, labels, and colors.
202
+
203
+ **Top-level keys:**
204
+ - `show`
205
+ - `navBarType`
206
+ - `pageKeyRefOrder`
207
+ - `labels`
208
+ - `backgroundColor`
209
+ - `selectedIconColor`
210
+ - `unselectedIconColor`
211
+
212
+ **Schema:**
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
+
225
+ backgroundColor:
226
+ themeColor: PRIMARY_BACKGROUND # Theme color token
227
+
228
+ selectedIconColor:
229
+ themeColor: PRIMARY # Active tab icon color
230
+
231
+ unselectedIconColor:
232
+ themeColor: SECONDARY_TEXT # Inactive tab icon color
233
+ ```
234
+
235
+ **Key fields:**
236
+
237
+ | Field | Type | Notes |
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. |
243
+ | `backgroundColor.themeColor` | theme token | One of: `PRIMARY`, `SECONDARY`, `PRIMARY_BACKGROUND`, `SECONDARY_BACKGROUND`, `PRIMARY_TEXT`, `SECONDARY_TEXT`, `ACCENT1`-`ACCENT4`, etc. |
244
+ | `selectedIconColor` | color ref | Color when tab is active. |
245
+ | `unselectedIconColor` | color ref | Color when tab is inactive. |
246
+
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.
248
+
249
+ ---
250
+
251
+ ## app-bar.yaml
252
+
253
+ **Purpose:** Default app bar template applied to new pages.
254
+
255
+ **Top-level keys:**
256
+ - `templateType`
257
+ - `backgroundColor`
258
+ - `elevation`
259
+ - `defaultIcon`
260
+ - `textStyle`
261
+ - `addOnNewPages`
262
+
263
+ **Schema:**
264
+ ```yaml
265
+ templateType: LARGE_HEADER # LARGE_HEADER | SMALL_HEADER | NONE
266
+
267
+ backgroundColor:
268
+ value: "4930031" # Raw ARGB int as string (no 0x prefix)
269
+
270
+ elevation: 0 # Shadow elevation (0 = flat)
271
+
272
+ defaultIcon:
273
+ sizeValue:
274
+ inputValue: 30 # Icon size in logical pixels
275
+ colorValue:
276
+ inputValue:
277
+ themeColor: PRIMARY_TEXT # Icon color
278
+ iconDataValue:
279
+ inputValue:
280
+ codePoint: 62834 # Unicode code point
281
+ family: MaterialIcons # Icon font family
282
+ matchTextDirection: true
283
+ name: arrow_back_rounded # Icon name
284
+
285
+ textStyle:
286
+ themeStyle: HEADLINE_MEDIUM # Theme text style token
287
+ fontSizeValue:
288
+ inputValue: 22 # Font size override
289
+ colorValue:
290
+ inputValue:
291
+ themeColor: PRIMARY_TEXT
292
+
293
+ addOnNewPages: true # Auto-add this app bar to newly created pages
294
+ ```
295
+
296
+ **Key fields:**
297
+
298
+ | Field | Type | Notes |
299
+ |---|---|---|
300
+ | `templateType` | enum | Required. `LARGE_HEADER`, `SMALL_HEADER`, or `NONE`. |
301
+ | `backgroundColor.value` | string | Raw ARGB integer as string (e.g., `"4930031"` = dark color). Not hex. |
302
+ | `elevation` | int | Material elevation. 0 = no shadow. |
303
+ | `defaultIcon.iconDataValue.inputValue.codePoint` | int | Material icon Unicode code point. |
304
+ | `defaultIcon.iconDataValue.inputValue.name` | string | Flutter icon name (e.g., `arrow_back_rounded`). |
305
+ | `textStyle.themeStyle` | theme token | `HEADLINE_SMALL`, `HEADLINE_MEDIUM`, `HEADLINE_LARGE`, `TITLE_SMALL`, etc. |
306
+ | `addOnNewPages` | bool | Whether this app bar is auto-added to new pages. |
307
+
308
+ ---
309
+
310
+ ## miscellaneous.yaml
311
+
312
+ **Purpose:** Miscellaneous app-level settings and feature flags.
313
+
314
+ **Top-level keys:**
315
+ - `appSettings`
316
+
317
+ **Schema:**
318
+ ```yaml
319
+ appSettings:
320
+ checkCustomCodeReferences: true # Validate custom code references on build
321
+ ```
322
+
323
+ **Key fields:**
324
+
325
+ | Field | Type | Notes |
326
+ |---|---|---|
327
+ | `appSettings.checkCustomCodeReferences` | bool | When true, FF validates that all custom code references resolve at build time. |
328
+
329
+ > Note: This file is a catch-all. Additional keys may appear depending on project features enabled.
330
+
331
+ ---
332
+
333
+ ## revenue-cat.yaml
334
+
335
+ **Purpose:** RevenueCat in-app purchase/subscription integration configuration.
336
+
337
+ **Top-level keys:**
338
+ - `enabled`
339
+ - `appStoreKey`
340
+ - `playStoreKey`
341
+ - `debugLoggingEnabled`
342
+ - `loadDataAfterAppLaunch`
343
+
344
+ **Schema:**
345
+ ```yaml
346
+ enabled: true # Master toggle
347
+ appStoreKey: appl_XXXXXXXXXXXX # RevenueCat Apple API key
348
+ playStoreKey: goog_XXXXXXXXXXXX # RevenueCat Google API key
349
+ debugLoggingEnabled: false # Enable RC debug logs
350
+ loadDataAfterAppLaunch: true # Fetch entitlements on app start
351
+ ```
352
+
353
+ **Key fields:**
354
+
355
+ | Field | Type | Notes |
356
+ |---|---|---|
357
+ | `enabled` | bool | Required. Enables RevenueCat integration. |
358
+ | `appStoreKey` | string | RevenueCat public API key for Apple App Store. Prefix: `appl_`. |
359
+ | `playStoreKey` | string | RevenueCat public API key for Google Play. Prefix: `goog_`. |
360
+ | `debugLoggingEnabled` | bool | Verbose RC SDK logging. Should be `false` in production. |
361
+ | `loadDataAfterAppLaunch` | bool | If true, RC data is fetched immediately at app launch. |
362
+
363
+ ---
364
+
365
+ ## languages.yaml
366
+
367
+ **Purpose:** Internationalization (i18n) configuration, supported languages, and all preset/system text strings.
368
+
369
+ **Top-level keys:**
370
+ - `languages`
371
+ - `primaryLanguage`
372
+ - `displayLanguage`
373
+ - `presetTexts`
374
+ - `persistLanguageSelection`
375
+
376
+ **Schema:**
377
+ ```yaml
378
+ languages:
379
+ - language: en # ISO 639-1 language code
380
+ - language: es
381
+
382
+ primaryLanguage:
383
+ language: en # Default/fallback language
384
+
385
+ displayLanguage:
386
+ language: en # Language shown in FF editor
387
+
388
+ presetTexts:
389
+ authMessages: # Auth-related system strings
390
+ error:
391
+ translationIdentifier:
392
+ key: 7mu1hspb # Unique i18n key
393
+ textValue:
394
+ inputValue: "Invalid credentials!"
395
+ passwordResetEmailSent:
396
+ translationIdentifier:
397
+ key: 59zs8v4b
398
+ textValue:
399
+ inputValue: "Password reset email sent!"
400
+ emailRequired: { ... }
401
+ phoneNumberValidation: { ... }
402
+ passwordsDoNotMatch: { ... }
403
+ enterSmsVerificationCode: { ... }
404
+ reauthenticateForUserDelete: { ... }
405
+ reauthenticateForEmailUpdate: { ... }
406
+ emailChangeConfirmation: { ... }
407
+ emailAlreadyInUse: { ... }
408
+ invalidCredentials: { ... }
409
+
410
+ uploadDataMessages: # File upload system strings
411
+ invalidFileFormat: { ... }
412
+ uploadingFile: { ... }
413
+ success: { ... }
414
+ error: { ... }
415
+ sendingPhoto: { ... }
416
+ chooseSource: { ... }
417
+ gallery: { ... }
418
+ galleryPhoto: { ... }
419
+ galleryVideo: { ... }
420
+ camera: { ... }
421
+ empty: { ... }
422
+
423
+ paymentMessages: # Payment system strings
424
+ processingMessage: { ... }
425
+ success: { ... }
426
+ error: { ... }
427
+
428
+ persistLanguageSelection: true # Remember user's language choice
429
+ ```
430
+
431
+ **Key fields:**
432
+
433
+ | Field | Type | Notes |
434
+ |---|---|---|
435
+ | `languages` | list | Required. All supported languages as ISO 639-1 codes. |
436
+ | `primaryLanguage.language` | string | Required. Fallback language code. |
437
+ | `displayLanguage.language` | string | Language used in the FF editor UI. |
438
+ | `presetTexts.authMessages` | object | System-generated auth UI strings (errors, prompts). |
439
+ | `presetTexts.uploadDataMessages` | object | File/media upload UI strings. |
440
+ | `presetTexts.paymentMessages` | object | Payment flow UI strings. |
441
+ | `persistLanguageSelection` | bool | If true, selected language is saved to device. |
442
+
443
+ > Translation text pattern: Every translatable string uses `{ translationIdentifier: { key }, textValue: { inputValue } }`. The `key` links to translation entries in the FF translation system.
444
+
445
+ ---
446
+
447
+ ## languages/translation/id-{key} (Translation Files)
448
+
449
+ **Purpose:** Individual translation entries for user-defined translatable strings. Each file maps a unique key to translated text across all supported languages.
450
+
451
+ **File key pattern:** `languages/translation/id-<key>` (e.g., `languages/translation/id-ttk654j0`)
452
+
453
+ **Schema:**
454
+ ```yaml
455
+ translationIdentifier:
456
+ key: ttk654j0 # Unique translation key (8-char alphanumeric)
457
+ translations:
458
+ - language:
459
+ language: en # ISO 639-1 code (must match languages.yaml)
460
+ text: Continue # Translated text for this language
461
+ - language:
462
+ language: es
463
+ text: Continuar
464
+ isFixed: false # false = user-editable, true = system/preset string
465
+ ```
466
+
467
+ **Key fields:**
468
+
469
+ | Field | Type | Notes |
470
+ |---|---|---|
471
+ | `translationIdentifier.key` | string | Unique key matching the file key suffix. Referenced by widgets and parameter passes. |
472
+ | `translations` | list | One entry per language. Must include all languages from `languages.yaml`. |
473
+ | `translations[].language.language` | string | ISO 639-1 code (`en`, `es`, `fr`, etc.) |
474
+ | `translations[].text` | string | Translated text. Empty string `""` = untranslated (falls back to primary language). |
475
+ | `isFixed` | bool | `true` for system preset strings, `false` for user-defined translations. |
476
+
477
+ ### Where translation keys are referenced
478
+
479
+ Translation keys appear in two contexts:
480
+
481
+ **1. On Text widgets** — via `translationIdentifier` in the `text` prop:
482
+ ```yaml
483
+ # Widget-level translation (static, per-widget)
484
+ text:
485
+ translationIdentifier:
486
+ key: ttk654j0
487
+ textValue:
488
+ inputValue: Continue # English default / editor preview
489
+ ```
490
+
491
+ **2. On component parameter passes** — via `translatableText` inside `inputValue`:
492
+ ```yaml
493
+ # Parameter-level translation (per-instance, used when passing
494
+ # translated strings to component parameters)
495
+ paramIdentifier:
496
+ name: title
497
+ key: p1titl
498
+ inputValue:
499
+ translatableText:
500
+ translationIdentifier:
501
+ key: ms01ttl1
502
+ textValue:
503
+ inputValue: Histamine / Low DAO # English default
504
+ ```
505
+
506
+ > **Important:** The `translatableText` wrapper is the correct way to pass translated strings as component parameters. Do NOT use `translationIdentifier` directly on the parameterPass (it will fail validation with "Unknown field name"). Instead, nest it inside `inputValue.translatableText`.
507
+
508
+ ---
509
+
510
+ ## app-state.yaml
511
+
512
+ **Purpose:** App-level state variables (global state accessible from any page/component).
513
+
514
+ **Top-level keys:**
515
+ - `fields`
516
+ - `securePersistedValues`
517
+
518
+ **Schema:**
519
+ ```yaml
520
+ fields:
521
+ - parameter:
522
+ identifier:
523
+ name: email # Variable name (camelCase)
524
+ key: x2tvdt22 # Unique key
525
+ dataType:
526
+ scalarType: String # Scalar: String, Integer, Double, Boolean, LatLng, Enum, etc.
527
+ description: "" # Optional description
528
+ persisted: true # Survives app restart (local storage)
529
+ serializedDefaultValue:
530
+ - "" # Default value as single-element list of strings
531
+
532
+ - parameter:
533
+ identifier:
534
+ name: Favorites
535
+ key: noxdj87d
536
+ dataType:
537
+ listType: # List type instead of scalar
538
+ scalarType: String
539
+ persisted: true
540
+ # No serializedDefaultValue = empty list default
541
+
542
+ - parameter:
543
+ identifier:
544
+ name: NavBarStatus
545
+ key: p4n8k8yh
546
+ dataType:
547
+ scalarType: Enum
548
+ subType: # Required for Enum type
549
+ enumIdentifier:
550
+ name: NavBar
551
+ key: qik04
552
+ description: ""
553
+ persisted: false
554
+ serializedDefaultValue:
555
+ - fxjp3 # Enum value key (not label)
556
+
557
+ securePersistedValues: false # If true, persisted values use secure storage
558
+ ```
559
+
560
+ **Key fields:**
561
+
562
+ | Field | Type | Notes |
563
+ |---|---|---|
564
+ | `fields` | list | Required. All app state variables. |
565
+ | `fields[].parameter.identifier.name` | string | Variable name. Used in code and bindings. |
566
+ | `fields[].parameter.identifier.key` | string | Immutable unique key. Used in YAML references. |
567
+ | `fields[].parameter.dataType.scalarType` | enum | `String`, `Integer`, `Double`, `Boolean`, `LatLng`, `Enum`, `DateTime`, `Color`, `JSON`, etc. |
568
+ | `fields[].parameter.dataType.listType` | object | Present instead of `scalarType` for list-typed variables. Contains its own `scalarType`. |
569
+ | `fields[].parameter.dataType.subType` | object | Required for `Enum` scalar type. References the enum definition. |
570
+ | `fields[].persisted` | bool | Required. If true, value is saved to local storage across app restarts. |
571
+ | `fields[].serializedDefaultValue` | list of strings | Default value. Always a single-element string list (even for numbers/bools). Booleans: `"true"`/`"false"`. Enums: the enum value key. |
572
+ | `securePersistedValues` | bool | Use platform secure storage (Keychain/Keystore) for persisted values. |
573
+
574
+ ---
575
+
576
+ ## app-constants.yaml
577
+
578
+ **Purpose:** Compile-time constants accessible app-wide. Unlike app state, these cannot be changed at runtime.
579
+
580
+ **Top-level keys:**
581
+ - `fields`
582
+
583
+ **Schema:**
584
+ ```yaml
585
+ fields:
586
+ - parameter:
587
+ identifier:
588
+ name: Distances # Constant name
589
+ key: eghxy5 # Unique key
590
+ dataType:
591
+ listType:
592
+ scalarType: Integer # List of integers
593
+ description: ""
594
+ serializedValue: # Constant value (not "default" -- this IS the value)
595
+ - "50"
596
+ - "100"
597
+ - "200"
598
+ - "500"
599
+
600
+ - parameter:
601
+ identifier:
602
+ name: isLive
603
+ key: a0hp9r
604
+ dataType:
605
+ scalarType: Boolean
606
+ description: ""
607
+ serializedValue:
608
+ - "true"
609
+ ```
610
+
611
+ **Key fields:**
612
+
613
+ | Field | Type | Notes |
614
+ |---|---|---|
615
+ | `fields` | list | Required. All app constants. |
616
+ | `fields[].parameter.identifier` | object | Same `{ name, key }` pattern as app-state. |
617
+ | `fields[].parameter.dataType` | object | Same type system as app-state (`scalarType` or `listType`). |
618
+ | `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. |
619
+
620
+ > 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.
621
+
622
+ ---
623
+
624
+ ## environment-settings.yaml
625
+
626
+ **Purpose:** Per-environment configuration values (API URLs, API keys, feature flags, etc.) that can vary between environments like Production and Development.
627
+
628
+ **Top-level keys:**
629
+ - `currentEnvironment`
630
+ - `environmentValues`
631
+
632
+ **Schema:**
633
+ ```yaml
634
+ currentEnvironment:
635
+ name: Production # Human-readable environment name
636
+ key: PROD # Environment key (matches app-details allAppNames)
637
+
638
+ environmentValues:
639
+ - parameter:
640
+ identifier:
641
+ name: PublicSupabaseURL # Variable name
642
+ key: actmw6 # Unique key
643
+ dataType:
644
+ scalarType: String # Data type (String, Integer, etc.)
645
+ valuesMap:
646
+ PROD:
647
+ serializedValue: https://example.supabase.co
648
+ isPrivate: false # If true, value is hidden in the FF UI
649
+ ```
650
+
651
+ **Key fields:**
652
+
653
+ | Field | Type | Notes |
654
+ |---|---|---|
655
+ | `currentEnvironment.key` | string | Active environment key (e.g., `PROD`, `DEV`). Determines which values are used at runtime. |
656
+ | `currentEnvironment.name` | string | Display name for the active environment. |
657
+ | `environmentValues` | list | All environment-specific variables. |
658
+ | `environmentValues[].parameter.identifier` | object | Same `{ name, key }` pattern as app-state variables. |
659
+ | `environmentValues[].parameter.dataType.scalarType` | enum | Variable data type (`String`, `Integer`, `Double`, `Boolean`, etc.). |
660
+ | `environmentValues[].valuesMap.<ENV>.serializedValue` | string | The value for a specific environment key. |
661
+ | `environmentValues[].isPrivate` | bool | When true, the value is obscured in the FF editor UI. Useful for API keys. |
662
+
663
+ ---
664
+
665
+ ## dependencies.yaml
666
+
667
+ **Purpose:** FlutterFlow library/package dependencies -- other FlutterFlow projects imported and used as reusable libraries.
668
+
669
+ **Top-level keys:**
670
+ - `dependencies`
671
+
672
+ **Schema:**
673
+ ```yaml
674
+ dependencies:
675
+ - projectId: common-utility-lib-hy7wrl # FF project ID of the library
676
+ name: common-utility-lib # Library display name
677
+ version: 0.0.15 # Pinned version
678
+ commitId: 4ydionKBbeDiBENNLcAf # Specific commit in the library project
679
+ ```
680
+
681
+ **Key fields:**
682
+
683
+ | Field | Type | Notes |
684
+ |---|---|---|
685
+ | `dependencies` | list | All imported FlutterFlow library dependencies. |
686
+ | `dependencies[].projectId` | string | The FlutterFlow project ID of the library being imported. |
687
+ | `dependencies[].name` | string | Human-readable library name. |
688
+ | `dependencies[].version` | string | Semver version string of the pinned library version. |
689
+ | `dependencies[].commitId` | string | Specific commit hash in the library project that this version references. |
690
+
691
+ ---
692
+
693
+ ## custom-code-dependencies.yaml
694
+
695
+ **Purpose:** Dart/Flutter pub package dependencies used by custom code within the project.
696
+
697
+ **Top-level keys:**
698
+ - `pubspecDependencies`
699
+
700
+ **Schema:**
701
+ ```yaml
702
+ pubspecDependencies:
703
+ - name: blurhash_dart # Pub package name
704
+ version: 1.2.1 # Exact version
705
+ - name: geocoding
706
+ version: ^3.0.0 # Version constraint (caret syntax)
707
+ ```
708
+
709
+ **Key fields:**
710
+
711
+ | Field | Type | Notes |
712
+ |---|---|---|
713
+ | `pubspecDependencies` | list | All Dart/Flutter pub packages added for custom code. |
714
+ | `pubspecDependencies[].name` | string | Package name as it appears on pub.dev. |
715
+ | `pubspecDependencies[].version` | string | Version constraint. Supports exact (`1.2.1`), caret (`^3.0.0`), and range syntax. |
716
+
717
+ ---
718
+
719
+ ## supabase.yaml
720
+
721
+ **Purpose:** Supabase project connection configuration and full database schema including table definitions, field types, primary keys, and foreign key relationships.
722
+
723
+ **Top-level keys:**
724
+ - `projectConfig`
725
+ - `databaseConfig`
726
+
727
+ **Schema:**
728
+ ```yaml
729
+ projectConfig:
730
+ enabled: true # Whether Supabase integration is active
731
+ supabaseUrl:
732
+ variable:
733
+ source: DEV_ENVIRONMENT # Pulls value from environment-settings
734
+ baseVariable:
735
+ environmentValue:
736
+ identifier:
737
+ name: PublicSupabaseURL
738
+ key: actmw6
739
+ anonKey:
740
+ variable:
741
+ source: DEV_ENVIRONMENT
742
+ baseVariable:
743
+ environmentValue:
744
+ identifier:
745
+ name: PublicSupabaseAnonKey
746
+ key: q60j8s
747
+
748
+ databaseConfig:
749
+ tables:
750
+ - identifier:
751
+ name: lists # Table name
752
+ fields:
753
+ - identifier:
754
+ name: id # Column name
755
+ type:
756
+ dataType:
757
+ scalarType: String
758
+ isPrimaryKey: true
759
+ hasDefault: true # Has a DB-level default value
760
+ isRequired: true # NOT NULL constraint
761
+ postgresType: uuid # Postgres-specific type
762
+ - identifier:
763
+ name: owner_id
764
+ type:
765
+ dataType:
766
+ scalarType: String
767
+ postgresType: uuid
768
+ foreignKey: users.id # Foreign key reference (table.column)
769
+ ```
770
+
771
+ **Key fields:**
772
+
773
+ | Field | Type | Notes |
774
+ |---|---|---|
775
+ | `projectConfig.enabled` | bool | Master toggle for the Supabase integration. |
776
+ | `projectConfig.supabaseUrl` | variable ref | Supabase project URL. Typically references an environment variable via `source: DEV_ENVIRONMENT`. |
777
+ | `projectConfig.anonKey` | variable ref | Supabase anonymous/public key. Same environment variable pattern. |
778
+ | `databaseConfig.tables` | list | Full database schema. One entry per table. |
779
+ | `databaseConfig.tables[].identifier.name` | string | Postgres table name. |
780
+ | `databaseConfig.tables[].fields` | list | All columns in the table. |
781
+ | `databaseConfig.tables[].fields[].identifier.name` | string | Column name. |
782
+ | `databaseConfig.tables[].fields[].type.dataType.scalarType` | enum | FF data type mapping (`String`, `Integer`, `Double`, `Boolean`, etc.). |
783
+ | `databaseConfig.tables[].fields[].isPrimaryKey` | bool | Whether this column is the primary key. |
784
+ | `databaseConfig.tables[].fields[].hasDefault` | bool | Whether the column has a database-level default value. |
785
+ | `databaseConfig.tables[].fields[].isRequired` | bool | Whether the column has a NOT NULL constraint. |
786
+ | `databaseConfig.tables[].fields[].postgresType` | string | Raw Postgres type (e.g., `uuid`, `text`, `int4`, `timestamptz`). |
787
+ | `databaseConfig.tables[].fields[].foreignKey` | string | Foreign key reference in `table.column` format (e.g., `users.id`). |
788
+
789
+ ---
790
+
791
+ ## Firebase Services
792
+
793
+ Three separate YAML files configure Firebase service integrations. Each follows a simple `enabled` toggle pattern.
794
+
795
+ ### firebase-analytics.yaml
796
+
797
+ **Purpose:** Firebase Analytics event tracking configuration.
798
+
799
+ **Schema:**
800
+ ```yaml
801
+ enabled: true # Master toggle
802
+
803
+ automaticEventSettings:
804
+ onPageLoad: true # Log screen_view on page navigation
805
+ onIndividualActions: true # Log events for individual user actions
806
+ onAuth: true # Log auth-related events (login, signup)
807
+ ```
808
+
809
+ **Key fields:**
810
+
811
+ | Field | Type | Notes |
812
+ |---|---|---|
813
+ | `enabled` | bool | Master toggle for Firebase Analytics. |
814
+ | `automaticEventSettings.onPageLoad` | bool | Automatically log `screen_view` events on page transitions. |
815
+ | `automaticEventSettings.onIndividualActions` | bool | Log events for user interactions with individual widgets/actions. |
816
+ | `automaticEventSettings.onAuth` | bool | Log authentication events (sign-in, sign-up, sign-out). |
817
+
818
+ ### firebase-crashlytics.yaml
819
+
820
+ **Purpose:** Firebase Crashlytics crash reporting.
821
+
822
+ **Schema:**
823
+ ```yaml
824
+ enabled: true # Master toggle
825
+ ```
826
+
827
+ **Key fields:**
828
+
829
+ | Field | Type | Notes |
830
+ |---|---|---|
831
+ | `enabled` | bool | Enables crash reporting via Firebase Crashlytics. |
832
+
833
+ ### firebase-performance-monitoring.yaml
834
+
835
+ **Purpose:** Firebase Performance Monitoring for network and rendering metrics.
836
+
837
+ **Schema:**
838
+ ```yaml
839
+ enabled: true # Master toggle
840
+ ```
841
+
842
+ **Key fields:**
843
+
844
+ | Field | Type | Notes |
845
+ |---|---|---|
846
+ | `enabled` | bool | Enables performance monitoring traces and network request metrics. |
847
+
848
+ ---
849
+
850
+ ## push-notifications.yaml
851
+
852
+ **Purpose:** Push notification settings including whether to auto-prompt users for notification permissions.
853
+
854
+ **Top-level keys:**
855
+ - `enabled`
856
+ - `autoPromptUsersForNotificationsPermission`
857
+
858
+ **Schema:**
859
+ ```yaml
860
+ enabled: false # Master toggle
861
+ autoPromptUsersForNotificationsPermission: true # Show permission dialog on app launch
862
+ ```
863
+
864
+ **Key fields:**
865
+
866
+ | Field | Type | Notes |
867
+ |---|---|---|
868
+ | `enabled` | bool | Master toggle for push notification support. |
869
+ | `autoPromptUsersForNotificationsPermission` | bool | If true, automatically prompts the user for notification permissions on first launch. |
870
+
871
+ ---
872
+
873
+ ## google-maps.yaml
874
+
875
+ **Purpose:** Google Maps API key configuration per platform.
876
+
877
+ **Top-level keys:**
878
+ - `androidKey`
879
+ - `iosKey`
880
+ - `webKey`
881
+
882
+ **Schema:**
883
+ ```yaml
884
+ androidKey: AIzaSy... # Google Maps API key for Android
885
+ iosKey: AIzaSy... # Google Maps API key for iOS
886
+ webKey: AIzaSy... # Google Maps API key for Web
887
+ ```
888
+
889
+ **Key fields:**
890
+
891
+ | Field | Type | Notes |
892
+ |---|---|---|
893
+ | `androidKey` | string | Google Maps JavaScript/Android API key. |
894
+ | `iosKey` | string | Google Maps iOS SDK API key. |
895
+ | `webKey` | string | Google Maps JavaScript API key for web builds. |
896
+
897
+ ---
898
+
899
+ ## ad-mob.yaml
900
+
901
+ **Purpose:** Google AdMob advertising integration configuration.
902
+
903
+ **Top-level keys:**
904
+ - `showTestAds`
905
+ - `enabled`
906
+
907
+ **Schema:**
908
+ ```yaml
909
+ showTestAds: true # Use test ad units (for development)
910
+ enabled: false # Master toggle
911
+ ```
912
+
913
+ **Key fields:**
914
+
915
+ | Field | Type | Notes |
916
+ |---|---|---|
917
+ | `enabled` | bool | Master toggle for AdMob integration. |
918
+ | `showTestAds` | bool | When true, displays Google test ads instead of real ads. Should be `true` during development, `false` in production. |
919
+
920
+ ---
921
+
922
+ ## app-assets.yaml
923
+
924
+ **Purpose:** App icon, splash screen, error placeholder image, and adaptive icon configuration.
925
+
926
+ **Top-level keys:**
927
+ - `appIconPath`
928
+ - `splashImage`
929
+ - `errorImagePath`
930
+ - `androidAdaptiveIcon`
931
+
932
+ **Schema:**
933
+ ```yaml
934
+ appIconPath: projects/xxx/assets/icon.jpg # GCS path to app icon
935
+
936
+ splashImage:
937
+ path: projects/xxx/assets/splash.png # GCS path to splash image
938
+ fit: FF_BOX_FIT_COVER # Image fit mode
939
+ dimensions:
940
+ width:
941
+ percentOfScreenSizeValue:
942
+ inputValue: 60 # Width as % of screen
943
+ height: {} # Auto height
944
+ backgroundColor:
945
+ themeColor: PRIMARY_BACKGROUND # Splash background color
946
+ preLoadingColor:
947
+ value: "4294967295" # Color shown before splash loads (white)
948
+ disableForWeb: true # Skip splash on web platform
949
+
950
+ errorImagePath: projects/xxx/assets/default-image.png # Fallback image for broken images
951
+
952
+ androidAdaptiveIcon:
953
+ foregroundImagePath: projects/xxx/assets/icon.jpg # Adaptive icon foreground layer
954
+ backgroundColor:
955
+ value: "4294967295" # Adaptive icon background color (white)
956
+ ```
957
+
958
+ **Key fields:**
959
+
960
+ | Field | Type | Notes |
961
+ |---|---|---|
962
+ | `appIconPath` | string | GCS storage path to the main app icon image. |
963
+ | `splashImage.path` | string | GCS storage path to the splash screen image. |
964
+ | `splashImage.fit` | enum | Image box fit. `FF_BOX_FIT_COVER`, `FF_BOX_FIT_CONTAIN`, `FF_BOX_FIT_FILL`, etc. |
965
+ | `splashImage.dimensions.width.percentOfScreenSizeValue.inputValue` | int | Splash image width as a percentage of screen width. |
966
+ | `splashImage.backgroundColor` | color ref | Background color behind the splash image. Uses theme token or raw ARGB value. |
967
+ | `splashImage.preLoadingColor.value` | string | Raw ARGB int shown before splash assets load. `"4294967295"` = white. |
968
+ | `splashImage.disableForWeb` | bool | If true, splash screen is not shown on web builds. |
969
+ | `errorImagePath` | string | GCS path to the placeholder image shown when an image fails to load. |
970
+ | `androidAdaptiveIcon.foregroundImagePath` | string | Foreground layer image for Android adaptive icons. |
971
+ | `androidAdaptiveIcon.backgroundColor` | color ref | Background layer color for Android adaptive icons. |
972
+
973
+ ---
974
+
975
+ ## platforms.yaml
976
+
977
+ **Purpose:** Platform build target toggles.
978
+
979
+ **Top-level keys:**
980
+ - `enableWeb`
981
+
982
+ **Schema:**
983
+ ```yaml
984
+ enableWeb: true # Enable web platform build target
985
+ ```
986
+
987
+ **Key fields:**
988
+
989
+ | Field | Type | Notes |
990
+ |---|---|---|
991
+ | `enableWeb` | bool | Whether the project supports web as a build target. |
992
+
993
+ ---
994
+
995
+ ## library-values.yaml
996
+
997
+ **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.
998
+
999
+ **Top-level keys:**
1000
+ - `libraryValues`
1001
+
1002
+ **Schema:**
1003
+ ```yaml
1004
+ libraryValues:
1005
+ - parameter:
1006
+ identifier:
1007
+ name: appName # Parameter name defined by the library
1008
+ key: vdy3rp # Parameter key
1009
+ projectId: flogger-lib-oanjax # Library project ID that owns this param
1010
+ defaultValue: {} # Library-defined default (often empty)
1011
+ dataType:
1012
+ scalarType: String
1013
+ nonNullable: true # Whether null is allowed
1014
+ value:
1015
+ inputValue:
1016
+ serializedValue: veriXXa # The value this project passes to the library
1017
+ ```
1018
+
1019
+ **Key fields:**
1020
+
1021
+ | Field | Type | Notes |
1022
+ |---|---|---|
1023
+ | `libraryValues` | list | All parameter values being passed to imported libraries. |
1024
+ | `libraryValues[].parameter.identifier.name` | string | Parameter name as defined by the library. |
1025
+ | `libraryValues[].parameter.identifier.key` | string | Unique parameter key. |
1026
+ | `libraryValues[].parameter.identifier.projectId` | string | The FF project ID of the library that defines this parameter. |
1027
+ | `libraryValues[].parameter.dataType` | object | Same type system as app-state (`scalarType`, `listType`, `nonNullable`). |
1028
+ | `libraryValues[].value.inputValue.serializedValue` | string | The actual value this project supplies to the library parameter. |
1029
+
1030
+ ---
1031
+
1032
+ ## library-configurations/
1033
+
1034
+ **Purpose:** Route overrides for pages imported from FlutterFlow library dependencies. One file per imported library.
1035
+
1036
+ **File pattern:** `library-configurations/id-{projectId}.yaml`
1037
+
1038
+ **Schema:**
1039
+ ```yaml
1040
+ projectId: common-utility-lib-hy7wrl # Library project ID
1041
+
1042
+ routeOverrides:
1043
+ - pageKey: Scaffold_5j0fh6iw # Scaffold key of the library page to override
1044
+ ```
1045
+
1046
+ **Key fields:**
1047
+
1048
+ | Field | Type | Notes |
1049
+ |---|---|---|
1050
+ | `projectId` | string | The FF project ID of the library. Matches the file name pattern. |
1051
+ | `routeOverrides` | list | Pages from the library whose routes are overridden in this project. |
1052
+ | `routeOverrides[].pageKey` | Scaffold ID | The scaffold key of the library page being overridden. |
1053
+
1054
+ > Note: Each imported library gets its own file under `library-configurations/`. The file key follows the pattern `library-configurations/id-{projectId}`.
1055
+
1056
+ ---
1057
+
1058
+ ## download-code-settings.yaml
1059
+
1060
+ **Purpose:** Settings controlling how code is generated and exported when downloading or pushing to GitHub.
1061
+
1062
+ **Top-level keys:**
1063
+ - `applyFixesToGithub`
1064
+ - `applyFixesToDownload`
1065
+
1066
+ **Schema:**
1067
+ ```yaml
1068
+ applyFixesToGithub: true # Apply FF auto-fixes when pushing to GitHub
1069
+ applyFixesToDownload: false # Apply FF auto-fixes when downloading code
1070
+ ```
1071
+
1072
+ **Key fields:**
1073
+
1074
+ | Field | Type | Notes |
1075
+ |---|---|---|
1076
+ | `applyFixesToGithub` | bool | When true, FlutterFlow applies automatic code fixes during GitHub push. |
1077
+ | `applyFixesToDownload` | bool | When true, FlutterFlow applies automatic code fixes when downloading code as a ZIP. |
1078
+
1079
+ ---
1080
+
1081
+ ## tests.yaml
1082
+
1083
+ **Purpose:** FlutterFlow integration test definitions.
1084
+
1085
+ **Top-level keys:**
1086
+ - `rootGroup`
1087
+
1088
+ **Schema:**
1089
+ ```yaml
1090
+ rootGroup: {} # Root test group (empty when no tests defined)
1091
+ ```
1092
+
1093
+ **Key fields:**
1094
+
1095
+ | Field | Type | Notes |
1096
+ |---|---|---|
1097
+ | `rootGroup` | object | The root test group container. Empty object `{}` when no integration tests have been created. |
1098
+
1099
+ > 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.
1100
+
1101
+ ---
1102
+
1103
+ ## custom-file/id-MAIN
1104
+
1105
+ **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`.
1106
+
1107
+ > **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.
1108
+
1109
+ > **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).
1110
+
1111
+ > **Important — this is an abstraction layer.**
1112
+ > 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.
1113
+
1114
+ > **`isUnlocked` behavior:**
1115
+ > - `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.
1116
+ > - `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.
1117
+ >
1118
+ > **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**.
1119
+
1120
+ **Top-level keys:**
1121
+ - `type`
1122
+ - `identifier` (appears once the file has been customized in FF editor)
1123
+ - `isUnlocked`
1124
+ - `fullContent` (only when `isUnlocked: true`)
1125
+ - `actions`
1126
+ - `parameters`
1127
+
1128
+ **Schema:**
1129
+ ```yaml
1130
+ type: MAIN # File type identifier (always MAIN for this file)
1131
+ identifier:
1132
+ name: main.dart # Appears once the file has been customized in FF editor
1133
+ isUnlocked: false # Whether custom Dart edits are unlocked in FF editor
1134
+
1135
+ actions:
1136
+ - type: INITIAL_ACTION # Runs BEFORE app initialization
1137
+ identifier:
1138
+ name: changeStatusBarColorRed # Custom action name
1139
+ key: d8rqwp # Unique action key
1140
+ - type: FINAL_ACTION # Runs AFTER app initialization but before runApp()
1141
+ identifier:
1142
+ key: 4lla8 # Name is optional if action has no display name
1143
+ - type: INITIAL_ACTION
1144
+ identifier:
1145
+ name: refreshRemoteConfigForDev
1146
+ key: hfpkf
1147
+ - type: FINAL_ACTION
1148
+ identifier:
1149
+ name: pushfireInitialize (PushFire-Lib)
1150
+ key: mtd59
1151
+ projectId: push-fire-lib-mblt3v # Library project ID (present for library actions)
1152
+
1153
+ parameters: # Template variables (same structure as ANDROID_MANIFEST)
1154
+ kdq2rm: # Parameter ID
1155
+ parameter:
1156
+ identifier:
1157
+ name: myVar # Variable name — use {{myVar}} in unlocked code
1158
+ dataType:
1159
+ scalarType: String # Data type
1160
+ value:
1161
+ inputValue:
1162
+ serializedValue: some value # Default value
1163
+ ```
1164
+
1165
+ **Key fields:**
1166
+
1167
+ | Field | Type | Notes |
1168
+ |---|---|---|
1169
+ | `type` | string | Always `MAIN` for this file. |
1170
+ | `identifier.name` | string | Always `main.dart`. Appears once the file has been customized. |
1171
+ | `isUnlocked` | bool | If `false`, FF manages `main.dart` automatically. If `true`, raw Dart editing is enabled in FF editor and `fullContent` field appears. |
1172
+ | `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. |
1173
+ | `actions` | list | Ordered list of custom actions that run during app startup. |
1174
+ | `actions[].type` | enum | `INITIAL_ACTION` (runs before app init) or `FINAL_ACTION` (runs after app init, before `runApp()`). |
1175
+ | `actions[].identifier.name` | string | Human-readable action name. Optional — some actions only have a key. |
1176
+ | `actions[].identifier.key` | string | Unique action key. Required. |
1177
+ | `actions[].identifier.projectId` | string | Present only for library actions. References the FF project ID of the library that defines the action. |
1178
+ | `parameters` | map | Template variables, keyed by parameter ID. Same structure as `custom-file/id-ANDROID_MANIFEST` parameters. Use `{{variableName}}` syntax in unlocked Dart code. |
1179
+
1180
+ ### Generated Dart execution order
1181
+
1182
+ 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:
1183
+
1184
+ ```
1185
+ 1. Library value setup (library FINAL_ACTIONs with projectId — e.g. pushfire API key)
1186
+ 2. await initFirebase()
1187
+ 3. // Start initial custom actions code
1188
+ 4. await actions.changeStatusBarColorRed() ← INITIAL_ACTION
1189
+ 5. await actions.refreshRemoteConfigForDev() ← INITIAL_ACTION
1190
+ 6. // End initial custom actions code
1191
+ 7. FFAppState init + persisted state
1192
+ 8. RevenueCat init
1193
+ 9. Crashlytics setup
1194
+ 10. RemoteConfig + AppCheck init
1195
+ 11. // Start final custom actions code
1196
+ 12. await actions.oneSignalInitializer() ← FINAL_ACTION
1197
+ 13. // End final custom actions code
1198
+ 14. runApp()
1199
+ ```
1200
+
1201
+ - **INITIAL_ACTIONs** run early — after Firebase init but **before** app state, RevenueCat, Crashlytics, and other service initialization.
1202
+ - **FINAL_ACTIONs** run late — **after** all service initialization, just before `runApp()`.
1203
+ - **Library actions** (with `projectId`) are handled separately via library value setup at the top of `main()`, not in the initial/final action blocks.
1204
+ - 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.
1205
+
1206
+ ---
1207
+
1208
+ ## custom-file/id-ANDROID_MANIFEST
1209
+
1210
+ **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).
1211
+
1212
+ > **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.
1213
+
1214
+ > **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).
1215
+
1216
+ > **Important — this is NOT the AndroidManifest.xml itself.**
1217
+ > 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).
1218
+
1219
+ **Top-level keys:**
1220
+ - `type`
1221
+ - `identifier`
1222
+ - `hooks`
1223
+ - `parameters`
1224
+
1225
+ ### Hook Types
1226
+
1227
+ Three hook types control where XML is injected in the generated `AndroidManifest.xml`:
1228
+
1229
+ | Hook Type | Where it injects in AndroidManifest.xml |
1230
+ |---|---|
1231
+ | `MANIFEST_ACTIVITY_TAG` | Inside the `<activity>` tag — use for intent filters, meta-data on the main activity |
1232
+ | `MANIFEST_APPLICATION_TAG` | Inside the `<application>` tag — use for services, receivers, meta-data at app level |
1233
+ | `MANIFEST_APP_COMPONENT_TAG` | Top-level, outside `<application>` — use for `<uses-permission>`, `<queries>`, or other root-level elements |
1234
+
1235
+ ### Parameters (Template Variables)
1236
+
1237
+ - Parameters are template variables defined with a name, data type, and value.
1238
+ - Referenced in hook `content` using `{{variableName}}` syntax (double curly braces).
1239
+ - At build time, FF replaces `{{variableName}}` with the parameter's value in the generated manifest.
1240
+ - Useful for keeping values like API keys, hosts, or schemes configurable without editing each hook.
1241
+
1242
+ **Schema:**
1243
+ ```yaml
1244
+ type: ANDROID_MANIFEST # File type identifier (always ANDROID_MANIFEST)
1245
+ identifier:
1246
+ name: AndroidManifest.xml # Always AndroidManifest.xml
1247
+
1248
+ hooks: # List of XML injection hooks
1249
+ - type: MANIFEST_ACTIVITY_TAG # Injects inside <activity> tag
1250
+ identifier:
1251
+ name: metadata # Human-readable hook name
1252
+ key: uren6h # Unique 6-char alphanumeric key
1253
+ content: <data android:scheme="http" android:host="perkspass.page.link"/> # Raw XML to inject
1254
+
1255
+ - type: MANIFEST_APPLICATION_TAG # Injects inside <application> tag
1256
+ identifier:
1257
+ name: appplication tag
1258
+ key: 9kbunj
1259
+ content: <data android:scheme="http" android:host="perkspass.page.link"/>
1260
+
1261
+ - type: MANIFEST_APP_COMPONENT_TAG # Injects at top level, outside <application>
1262
+ identifier:
1263
+ name: app component tag
1264
+ key: 2tw0gd
1265
+ content: <data android:scheme="http" android:host="perkspass.page.link"/>
1266
+
1267
+ parameters: # Template variables referenced in hook content
1268
+ upm7wd: # Parameter key
1269
+ parameter:
1270
+ identifier:
1271
+ name: newVar # Variable name (referenced as {{newVar}} in hook content)
1272
+ dataType:
1273
+ scalarType: String # Data type (String, Integer, etc.)
1274
+ value:
1275
+ inputValue:
1276
+ serializedValue: This is the var value # The variable's value at build time
1277
+ ```
1278
+
1279
+ **Key fields:**
1280
+
1281
+ | Field | Type | Notes |
1282
+ |---|---|---|
1283
+ | `type` | string | Always `ANDROID_MANIFEST` for this file. |
1284
+ | `identifier.name` | string | Always `AndroidManifest.xml`. |
1285
+ | `hooks` | list | List of XML injection hooks. Each hook injects content at a specific location in the manifest. |
1286
+ | `hooks[].type` | enum | `MANIFEST_ACTIVITY_TAG`, `MANIFEST_APPLICATION_TAG`, or `MANIFEST_APP_COMPONENT_TAG`. |
1287
+ | `hooks[].identifier.name` | string | Human-readable hook name. **Must not contain hyphens** — the FF editor rejects them but the API accepts them (validation gap). |
1288
+ | `hooks[].identifier.key` | string | Unique 6-char alphanumeric key. |
1289
+ | `hooks[].content` | string | Raw XML string to inject. Must be properly quoted in YAML when containing angle brackets or special characters. |
1290
+ | `parameters` | map | Map of parameter key to parameter definition. |
1291
+ | `parameters.<key>.parameter.identifier.name` | string | Variable name. Referenced in hook `content` as `{{variableName}}`. |
1292
+ | `parameters.<key>.parameter.dataType.scalarType` | enum | Data type (`String`, `Integer`, `Double`, `Boolean`, etc.). |
1293
+ | `parameters.<key>.value.inputValue.serializedValue` | string | The variable's value, substituted into hook content at build time. |
1294
+
1295
+ **API capabilities:**
1296
+
1297
+ | Operation | Status | Notes |
1298
+ |---|---|---|
1299
+ | Reading | Works | Full config with hooks and parameters is readable. |
1300
+ | Adding hooks via API | Works | New hooks pushed successfully and appear in FF editor. |
1301
+ | Adding parameters via API | Works | New variables pushed successfully and appear in FF editor. |
1302
+ | Editing existing hooks | Works | Content and name changes are reflected. |
1303
+ | 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. |
1304
+ | 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. |
1305
+
1306
+ ---
1307
+
1308
+ ## custom-file/id-INFO_PLIST
1309
+
1310
+ **Purpose:** Allows injecting custom properties into the generated `Info.plist` for iOS builds, and defining template variables for dynamic values. Like `ANDROID_MANIFEST`, this is an abstraction layer — you define "hooks" (plist property injection) and "parameters" (template variables).
1311
+
1312
+ > **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.
1313
+
1314
+ > **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, 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).
1315
+
1316
+ > **Important — this is NOT the Info.plist itself.**
1317
+ > This is FlutterFlow's configuration that controls **property injection into the generated Info.plist** at build time. The file only appears after a user adds at least one property in the FF editor (Settings > Custom Code > Custom Files > Info.plist).
1318
+
1319
+ **Top-level keys:**
1320
+ - `type`
1321
+ - `identifier`
1322
+ - `hooks`
1323
+ - `parameters`
1324
+
1325
+ ### Hook Types
1326
+
1327
+ Only one hook type:
1328
+
1329
+ | Hook Type | Where it injects in Info.plist |
1330
+ |---|---|
1331
+ | `INFO_PLIST_PROPERTY` | Inside the root `<dict>` — use for adding `<key>`/`<value>` pairs (strings, booleans, arrays, etc.) |
1332
+
1333
+ ### Parameters (Template Variables)
1334
+
1335
+ Same pattern as ANDROID_MANIFEST — parameters are template variables that can be referenced in hook `content` using `{{variableName}}` syntax. Values can come from literal input or environment variables.
1336
+
1337
+ ### Schema
1338
+
1339
+ ```yaml
1340
+ type: INFO_PLIST
1341
+ identifier:
1342
+ name: Info.plist
1343
+
1344
+ hooks: # List of plist property injection hooks
1345
+ - type: INFO_PLIST_PROPERTY # Only hook type for Info.plist
1346
+ identifier:
1347
+ name: livetag # Human-readable hook name
1348
+ key: gh2m0b # Unique 6-char alphanumeric key
1349
+ content: "<key>live</key>\n<string>value</string>" # Raw plist XML to inject
1350
+
1351
+ parameters: # Template variables
1352
+ zini8l: # Parameter key
1353
+ parameter:
1354
+ identifier:
1355
+ name: fsdafd # Variable name — use {{fsdafd}} in hook content
1356
+ dataType:
1357
+ scalarType: String # Data type (String, Integer, etc.)
1358
+ value:
1359
+ inputValue:
1360
+ serializedValue: safdsaf # Literal value
1361
+ ```
1362
+
1363
+ **Key fields:**
1364
+
1365
+ | Field | Type | Notes |
1366
+ |---|---|---|
1367
+ | `type` | string | Always `INFO_PLIST` for this file. |
1368
+ | `identifier.name` | string | Always `Info.plist`. |
1369
+ | `hooks` | list | List of plist property injection hooks. Each hook injects a key-value pair into the root `<dict>`. |
1370
+ | `hooks[].type` | enum | Always `INFO_PLIST_PROPERTY`. |
1371
+ | `hooks[].identifier.name` | string | Human-readable hook name. |
1372
+ | `hooks[].identifier.key` | string | Unique 6-char alphanumeric key. |
1373
+ | `hooks[].content` | string | Raw plist XML to inject. Typically `<key>name</key>\n<string>value</string>` or similar plist entries. Must be properly escaped in YAML. |
1374
+ | `parameters` | map | Map of parameter key to parameter definition. |
1375
+ | `parameters.<key>.parameter.identifier.name` | string | Variable name. Referenced in hook `content` as `{{variableName}}`. |
1376
+ | `parameters.<key>.parameter.dataType.scalarType` | enum | Data type (`String`, `Integer`, `Double`, `Boolean`, etc.). |
1377
+ | `parameters.<key>.value` | object | Value source — either `inputValue.serializedValue` (literal) or `variable` (environment reference). |
1378
+
1379
+ ### Parameter value sources
1380
+
1381
+ Parameters support two value sources:
1382
+
1383
+ **Literal value:**
1384
+ ```yaml
1385
+ value:
1386
+ inputValue:
1387
+ serializedValue: my-value # Hardcoded value
1388
+ ```
1389
+
1390
+ **Environment variable reference:**
1391
+ ```yaml
1392
+ value:
1393
+ variable:
1394
+ source: DEV_ENVIRONMENT
1395
+ baseVariable:
1396
+ environmentValue:
1397
+ identifier:
1398
+ name: myEnvVar # References environment-settings.yaml
1399
+ key: eji5p6
1400
+ ```
1401
+
1402
+ ### Hook content examples
1403
+
1404
+ **Simple string property:**
1405
+ ```yaml
1406
+ content: "<key>MyCustomKey</key>\n<string>MyCustomValue</string>"
1407
+ ```
1408
+
1409
+ **Boolean property:**
1410
+ ```yaml
1411
+ content: "<key>MyFeatureFlag</key>\n<true/>"
1412
+ ```
1413
+
1414
+ **Array property:**
1415
+ ```yaml
1416
+ content: "<key>LSApplicationQueriesSchemes</key>\n<array>\n <string>myapp</string>\n <string>myapp-dev</string>\n</array>"
1417
+ ```
1418
+
1419
+ **API capabilities:**
1420
+
1421
+ | Operation | Status | Notes |
1422
+ |---|---|---|
1423
+ | Reading config | Works | Full hook and parameter data returned. |
1424
+ | Adding hooks via API | Expected to work | Same structure as ANDROID_MANIFEST hooks. |
1425
+ | Adding parameters via API | Expected to work | Same structure as other custom file parameters. |
1426
+ | Hook name validation gap | Caution | Same as ANDROID_MANIFEST — avoid hyphens in names, use camelCase or spaces. |
1427
+
1428
+ ### Code sub-file (`custom-file/id-INFO_PLIST/custom-file-code.dart`)
1429
+
1430
+ Contains the full generated `Info.plist` XML. This is the complete plist including all standard iOS keys (bundle identifiers, permissions, URL schemes, etc.) plus any injected hook content. It is **read-only** — modifications should be made through the hooks/parameters config, not by editing the XML directly.
1431
+
1432
+ ---
1433
+
1434
+ ## custom-file/id-ENTITLEMENTS
1435
+
1436
+ **Purpose:** Allows injecting custom entitlements into the generated `Runner.entitlements` file for iOS builds. Entitlements declare app capabilities such as push notifications, App Groups, iCloud, associated domains, and other iOS-specific permissions.
1437
+
1438
+ > **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 entitlement or parameter in the FF editor.
1439
+
1440
+ > **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, INFO_PLIST, 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).
1441
+
1442
+ > **Important — this is an abstraction layer.**
1443
+ > This config controls **entitlement injection into the generated `Runner.entitlements`** at build time. The file only appears after a user adds at least one entitlement in the FF editor (Settings > Custom Code > Custom Files > Runner.entitlements).
1444
+
1445
+ **Top-level keys:**
1446
+ - `type`
1447
+ - `identifier`
1448
+ - `hooks`
1449
+ - `parameters`
1450
+
1451
+ ### Hook Types
1452
+
1453
+ Only one hook type:
1454
+
1455
+ | Hook Type | Where it injects in Runner.entitlements |
1456
+ |---|---|
1457
+ | `ENTITLEMENT` | Inside the root `<dict>` of the entitlements plist — use for adding capability key-value pairs |
1458
+
1459
+ ### Schema
1460
+
1461
+ ```yaml
1462
+ type: ENTITLEMENTS
1463
+ identifier:
1464
+ name: Runner.entitlements
1465
+
1466
+ hooks:
1467
+ - type: ENTITLEMENT # Only hook type for entitlements
1468
+ identifier:
1469
+ name: environemnt # Human-readable hook name
1470
+ key: 5x527x # Unique 6-char alphanumeric key
1471
+ content: "<key>aps-environment</key>\n<string>development</string>" # Plist XML to inject
1472
+
1473
+ parameters: # Template variables — same as all other custom files
1474
+ f4cahu:
1475
+ parameter:
1476
+ identifier:
1477
+ name: variable1 # Variable name — use {{variable1}} in hook content
1478
+ dataType:
1479
+ scalarType: String
1480
+ value:
1481
+ inputValue:
1482
+ serializedValue: clear value # Default value
1483
+ ```
1484
+
1485
+ **Key fields:**
1486
+
1487
+ | Field | Type | Notes |
1488
+ |---|---|---|
1489
+ | `type` | string | Always `ENTITLEMENTS` for this file. |
1490
+ | `identifier.name` | string | Always `Runner.entitlements`. |
1491
+ | `hooks` | list | List of entitlement injection hooks. Each hook injects a capability key-value pair into the entitlements plist. |
1492
+ | `hooks[].type` | enum | Always `ENTITLEMENT`. |
1493
+ | `hooks[].identifier.name` | string | Human-readable name for the entitlement. |
1494
+ | `hooks[].identifier.key` | string | Unique 6-char alphanumeric key. |
1495
+ | `hooks[].content` | string | Raw plist XML to inject. Typically `<key>capability-name</key>` followed by a value (`<string>`, `<true/>`, `<array>`, etc.). Must be properly escaped in YAML. |
1496
+ | `parameters` | map | Template variables keyed by parameter ID. Use `{{variableName}}` in `content` to reference them. Same structure as all other custom files. |
1497
+
1498
+ ### Common entitlement content examples
1499
+
1500
+ **Push notifications (development):**
1501
+ ```yaml
1502
+ content: "<key>aps-environment</key>\n<string>development</string>"
1503
+ ```
1504
+
1505
+ **Push notifications (production):**
1506
+ ```yaml
1507
+ content: "<key>aps-environment</key>\n<string>production</string>"
1508
+ ```
1509
+
1510
+ **Associated domains (for universal links):**
1511
+ ```yaml
1512
+ content: "<key>com.apple.developer.associated-domains</key>\n<array>\n <string>applinks:example.com</string>\n</array>"
1513
+ ```
1514
+
1515
+ **App Groups:**
1516
+ ```yaml
1517
+ content: "<key>com.apple.security.application-groups</key>\n<array>\n <string>group.com.example.myapp</string>\n</array>"
1518
+ ```
1519
+
1520
+ ### API capabilities
1521
+
1522
+ | Operation | Status | Notes |
1523
+ |---|---|---|
1524
+ | Reading config | Works | Full hook and parameter data returned. |
1525
+ | Adding hooks via API | Expected to work | Same structure as other custom file hooks. |
1526
+ | Adding parameters via API | Expected to work | Same structure as other custom file parameters. |
1527
+ | Hook name validation gap | Caution | Same as other custom files — avoid hyphens in names, use camelCase or spaces. |
1528
+
1529
+ ---
1530
+
1531
+ ## custom-file/id-APP_DELEGATE
1532
+
1533
+ **Purpose:** Allows injecting custom Swift code into the generated `AppDelegate.swift` for iOS builds. Supports import statements and initialization code that runs during the iOS app launch sequence.
1534
+
1535
+ > **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.
1536
+
1537
+ > **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, INFO_PLIST, 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).
1538
+
1539
+ > **Important — this is an abstraction layer.**
1540
+ > This config controls **Swift code injection into the generated `AppDelegate.swift`** at build time. The file only appears after a user adds at least one hook in the FF editor (Settings > Custom Code > Custom Files > AppDelegate.swift).
1541
+
1542
+ **Top-level keys:**
1543
+ - `type`
1544
+ - `identifier`
1545
+ - `hooks`
1546
+ - `parameters`
1547
+
1548
+ ### Hook Types
1549
+
1550
+ Two hook types control where Swift code is injected in the generated `AppDelegate.swift`:
1551
+
1552
+ | Hook Type | Where it injects in AppDelegate.swift |
1553
+ |---|---|
1554
+ | `APP_DELEGATE_IMPORT_HOOK` | At the top of the file — use for `import` statements |
1555
+ | `APP_DELEGATE_INITIALIZATION_HOOK` | Inside `application(_:didFinishLaunchingWithOptions:)` — use for SDK init calls and setup code |
1556
+
1557
+ ### Schema
1558
+
1559
+ ```yaml
1560
+ type: APP_DELEGATE
1561
+ identifier:
1562
+ name: AppDelegate.swift
1563
+
1564
+ hooks:
1565
+ - type: APP_DELEGATE_IMPORT_HOOK # Injects at the top of the file (imports)
1566
+ identifier:
1567
+ name: UIkitimprot # Human-readable hook name
1568
+ key: rtmoen # Unique 6-char alphanumeric key
1569
+ content: import UIKit # Swift import statement
1570
+
1571
+ - type: APP_DELEGATE_INITIALIZATION_HOOK # Injects inside didFinishLaunchingWithOptions
1572
+ identifier:
1573
+ name: logsinit # Human-readable hook name
1574
+ key: 2b582i # Unique 6-char alphanumeric key
1575
+ content: Logs.init() # Swift initialization code
1576
+
1577
+ parameters: # Template variables — same as all other custom files
1578
+ 74q7xg:
1579
+ parameter:
1580
+ identifier:
1581
+ name: vars1 # Variable name — use {{vars1}} in hook content
1582
+ dataType:
1583
+ scalarType: String
1584
+ value:
1585
+ inputValue:
1586
+ serializedValue: var val # Default value
1587
+ ```
1588
+
1589
+ **Key fields:**
1590
+
1591
+ | Field | Type | Notes |
1592
+ |---|---|---|
1593
+ | `type` | string | Always `APP_DELEGATE` for this file. |
1594
+ | `identifier.name` | string | Always `AppDelegate.swift`. |
1595
+ | `hooks` | list | List of Swift code injection hooks. |
1596
+ | `hooks[].type` | enum | `APP_DELEGATE_IMPORT_HOOK` (imports) or `APP_DELEGATE_INITIALIZATION_HOOK` (init code). |
1597
+ | `hooks[].identifier.name` | string | Human-readable name for the hook. |
1598
+ | `hooks[].identifier.key` | string | Unique 6-char alphanumeric key. |
1599
+ | `hooks[].content` | string | Raw Swift code to inject. For imports: a single `import` statement. For initialization: Swift code that runs during app launch. |
1600
+ | `parameters` | map | Template variables keyed by parameter ID. Use `{{variableName}}` in `content` to reference them. Same structure as all other custom files. |
1601
+
1602
+ ### Generated AppDelegate execution order
1603
+
1604
+ The generated `AppDelegate.swift` follows this structure:
1605
+
1606
+ ```
1607
+ 1. import Flutter ← Standard Flutter import
1608
+ 2. import UIKit ← APP_DELEGATE_IMPORT_HOOK entries
1609
+ 3. import MySDK ← APP_DELEGATE_IMPORT_HOOK entries
1610
+ 4.
1611
+ 5. @UIApplicationMain
1612
+ 6. class AppDelegate: FlutterAppDelegate {
1613
+ 7. override func application(...) -> Bool {
1614
+ 8. GeneratedPluginRegistrant.register(with: self)
1615
+ 9. Logs.init() ← APP_DELEGATE_INITIALIZATION_HOOK entries
1616
+ 10. MySDK.configure() ← APP_DELEGATE_INITIALIZATION_HOOK entries
1617
+ 11. return super.application(...)
1618
+ 12. }
1619
+ 13. }
1620
+ ```
1621
+
1622
+ - **Import hooks** are placed at the top of the file alongside the standard Flutter/UIKit imports.
1623
+ - **Initialization hooks** are placed inside `application(_:didFinishLaunchingWithOptions:)` after plugin registration but before the `return` statement.
1624
+
1625
+ ### Common hook content examples
1626
+
1627
+ **Import a framework:**
1628
+ ```yaml
1629
+ - type: APP_DELEGATE_IMPORT_HOOK
1630
+ identifier:
1631
+ name: firebaseImport
1632
+ key: abc123
1633
+ content: import Firebase
1634
+ ```
1635
+
1636
+ **Initialize an SDK:**
1637
+ ```yaml
1638
+ - type: APP_DELEGATE_INITIALIZATION_HOOK
1639
+ identifier:
1640
+ name: firebaseInit
1641
+ key: def456
1642
+ content: FirebaseApp.configure()
1643
+ ```
1644
+
1645
+ **Multi-line initialization:**
1646
+ ```yaml
1647
+ - type: APP_DELEGATE_INITIALIZATION_HOOK
1648
+ identifier:
1649
+ name: oneSignalSetup
1650
+ key: ghi789
1651
+ content: "OneSignal.initialize(\"{{appId}}\")\nOneSignal.Notifications.requestPermission({ accepted in })"
1652
+ ```
1653
+
1654
+ ### API capabilities
1655
+
1656
+ | Operation | Status | Notes |
1657
+ |---|---|---|
1658
+ | Reading config | Works | Full hook and parameter data returned. |
1659
+ | Adding hooks via API | Expected to work | Same structure as other custom file hooks. |
1660
+ | Adding parameters via API | Expected to work | Same structure as other custom file parameters. |
1661
+ | Hook name validation gap | Caution | Same as other custom files — avoid hyphens in names, use camelCase or spaces. |
1662
+
1663
+ ---
1664
+
1665
+ ## custom-file/id-PROGUARD
1666
+
1667
+ **Purpose:** Allows injecting custom ProGuard rules into the generated `proguard-rules.pro` file for Android builds. Controls code shrinking, obfuscation, and optimization rules.
1668
+
1669
+ > **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.
1670
+
1671
+ > **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).
1672
+
1673
+ > **Important — this is an abstraction layer.**
1674
+ > 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.
1675
+
1676
+ **Top-level keys:**
1677
+ - `type`
1678
+ - `identifier`
1679
+ - `hooks`
1680
+ - `parameters`
1681
+
1682
+ ### Hook Types
1683
+
1684
+ Only one hook type:
1685
+
1686
+ | Hook Type | What it injects |
1687
+ |---|---|
1688
+ | `PROGUARD_RULE` | A ProGuard rule line (e.g., `-keep class com.example.** { *; }`) |
1689
+
1690
+ ### Schema
1691
+
1692
+ ```yaml
1693
+ type: PROGUARD
1694
+ identifier:
1695
+ name: proguard-rules.pro
1696
+
1697
+ hooks:
1698
+ - type: PROGUARD_RULE # Only hook type for ProGuard
1699
+ identifier:
1700
+ name: roleComment # Human-readable name
1701
+ key: z735am # Unique hook key
1702
+ content: "-keep class com.example.myapp.** { *; }" # The ProGuard rule text
1703
+
1704
+ parameters: # Template variables — same as MAIN and ANDROID_MANIFEST
1705
+ hgnzpn:
1706
+ parameter:
1707
+ identifier:
1708
+ name: myVar # Variable name — use {{myVar}} in rule content
1709
+ dataType:
1710
+ scalarType: String
1711
+ value:
1712
+ inputValue:
1713
+ serializedValue: some value # Default value
1714
+ ```
1715
+
1716
+ **Key fields:**
1717
+
1718
+ | Field | Type | Notes |
1719
+ |---|---|---|
1720
+ | `type` | string | Always `PROGUARD` for this file. |
1721
+ | `identifier.name` | string | Always `proguard-rules.pro`. |
1722
+ | `hooks` | list | ProGuard rules to inject into the generated file. |
1723
+ | `hooks[].type` | enum | Always `PROGUARD_RULE`. |
1724
+ | `hooks[].identifier.name` | string | Human-readable name for the rule. |
1725
+ | `hooks[].identifier.key` | string | Unique key (6 alphanumeric chars). |
1726
+ | `hooks[].content` | string | The ProGuard rule text. |
1727
+ | `parameters` | map | Template variables keyed by parameter ID. Use `{{variableName}}` in `content` to reference them. Same structure as MAIN and ANDROID_MANIFEST parameters. |
1728
+
1729
+ ### API capabilities
1730
+
1731
+ | Operation | Status | Notes |
1732
+ |---|---|---|
1733
+ | Reading config | Works | Full hook and parameter data returned. |
1734
+ | Adding hooks via API | Expected to work | Same structure as ANDROID_MANIFEST hooks. |
1735
+ | Adding parameters via API | Expected to work | Same structure as MAIN/ANDROID_MANIFEST parameters. |
1736
+ | Hook name validation gap | Caution | Same as ANDROID_MANIFEST — avoid hyphens in names, use camelCase or spaces. |
1737
+
1738
+ ---
1739
+
1740
+ ## custom-file/id-BUILD_GRADLE
1741
+
1742
+ **Purpose:** Allows injecting custom entries into specific sections of the generated `build.gradle` file for Android builds — plugins, dependencies, and repositories.
1743
+
1744
+ > **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.
1745
+
1746
+ > **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).
1747
+
1748
+ > **Important — this is an abstraction layer.**
1749
+ > 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.
1750
+
1751
+ **Top-level keys:**
1752
+ - `type`
1753
+ - `identifier`
1754
+ - `hooks`
1755
+ - `parameters`
1756
+
1757
+ ### Hook Types
1758
+
1759
+ Three hook types control where content is injected in the generated `build.gradle`:
1760
+
1761
+ | Hook Type | Where it injects in build.gradle |
1762
+ |---|---|
1763
+ | `BUILD_GRADLE_PLUGIN_HOOK` | Inside the `plugins { }` block — use for Gradle plugin declarations |
1764
+ | `BUILD_GRADLE_DEPENDENCY_HOOK` | Inside the `dependencies { }` block — use for library dependencies |
1765
+ | `BUILD_GRADLE_REPOSITORY_HOOK` | Inside the `repositories { }` block — use for custom Maven/artifact repositories |
1766
+
1767
+ ### Schema
1768
+
1769
+ ```yaml
1770
+ type: BUILD_GRADLE
1771
+ identifier:
1772
+ name: build.gradle
1773
+
1774
+ hooks:
1775
+ - type: BUILD_GRADLE_PLUGIN_HOOK
1776
+ identifier:
1777
+ name: gms # Human-readable name
1778
+ key: t36afz # Unique hook key
1779
+ content: id 'com.google.gms' version '4.4.2' apply false
1780
+
1781
+ - type: BUILD_GRADLE_DEPENDENCY_HOOK
1782
+ identifier:
1783
+ name: gmsImpl
1784
+ key: 4bdxxs
1785
+ content: implementation 'com.google.firebase:firebase-analytics:21.5.0'
1786
+
1787
+ - type: BUILD_GRADLE_REPOSITORY_HOOK
1788
+ identifier:
1789
+ name: maven
1790
+ key: mnz0zx
1791
+ content: "maven { url 'https://maven.google.com' }"
1792
+
1793
+ parameters: # Template variables — use {{variableName}} in content
1794
+ 9r3k4a:
1795
+ parameter:
1796
+ identifier:
1797
+ name: firstvar
1798
+ dataType:
1799
+ scalarType: String
1800
+ value:
1801
+ inputValue:
1802
+ serializedValue: var val
1803
+ ```
1804
+
1805
+ **Key fields:**
1806
+
1807
+ | Field | Type | Notes |
1808
+ |---|---|---|
1809
+ | `type` | string | Always `BUILD_GRADLE` for this file. |
1810
+ | `identifier.name` | string | Always `build.gradle`. |
1811
+ | `hooks` | list | Entries to inject into the generated build.gradle. |
1812
+ | `hooks[].type` | enum | `BUILD_GRADLE_PLUGIN_HOOK`, `BUILD_GRADLE_DEPENDENCY_HOOK`, or `BUILD_GRADLE_REPOSITORY_HOOK`. |
1813
+ | `hooks[].identifier.name` | string | Human-readable name for the entry. |
1814
+ | `hooks[].identifier.key` | string | Unique key (6 alphanumeric chars). |
1815
+ | `hooks[].content` | string | The Gradle code to inject. Quote values containing braces or special chars. |
1816
+ | `parameters` | map | Template variables keyed by parameter ID. Use `{{variableName}}` in `content` to reference them. Same structure as all other custom files. |
1817
+
1818
+ ### API capabilities
1819
+
1820
+ | Operation | Status | Notes |
1821
+ |---|---|---|
1822
+ | Reading config | Works | Full hook and parameter data returned. |
1823
+ | Adding hooks via API | Expected to work | Same structure as ANDROID_MANIFEST hooks. |
1824
+ | Adding parameters via API | Expected to work | Same structure as other custom file parameters. |
1825
+ | Hook name validation gap | Caution | Same as ANDROID_MANIFEST — avoid hyphens in names, use camelCase or spaces. |
1826
+ | Content quoting | Caution | Gradle syntax with braces (e.g., `maven { url '...' }`) should be wrapped in double quotes in the YAML. |
1827
+
1828
+ ---
1829
+
1830
+ ## mobile-deployment.yaml
1831
+
1832
+ **Purpose:** Mobile deployment configuration for Codemagic CI/CD, including App Store Connect credentials, build versioning, and Play Store settings.
1833
+
1834
+ > **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.
1835
+
1836
+ **Top-level keys:**
1837
+ - `codemagicSettingsMap`
1838
+
1839
+ **Schema:**
1840
+ ```yaml
1841
+ codemagicSettingsMap:
1842
+ PROD: # Environment key (PROD, DEV, etc.)
1843
+ appStoreSettings:
1844
+ ascKeyId: AKUAKF2ZCH # App Store Connect API Key ID
1845
+ ascIssuerId: 57e34d27-22ff-47c3-a187-a2cf6b1807b7 # ASC Issuer ID (UUID)
1846
+ ascPrivateKey: "<redacted>" # ASC private key (PEM format) — SENSITIVE
1847
+ ascAppId: "6466313325" # App Store app ID
1848
+ buildVersion:
1849
+ buildVersion: 1.1.8 # Marketing version (CFBundleShortVersionString)
1850
+ buildNumber: 110 # Build number (CFBundleVersion / versionCode)
1851
+ lastSubmitted: 1.0.99+96 # Last version+build submitted to store
1852
+ playStoreSettings:
1853
+ playTrack: INTERNAL # Play Store track: INTERNAL, ALPHA, BETA, PRODUCTION
1854
+ playstoreCredentialsPath: codemagic/.../.../playstore_credentials.json # GCS path to credentials
1855
+ alias: mykey # Signing key alias
1856
+ ```
1857
+
1858
+ **Key fields:**
1859
+
1860
+ | Field | Type | Notes |
1861
+ |---|---|---|
1862
+ | `codemagicSettingsMap` | map | Keyed by environment (`PROD`, `DEV`, etc.). One entry per deployment environment. |
1863
+ | `appStoreSettings.ascKeyId` | string | App Store Connect API Key ID. |
1864
+ | `appStoreSettings.ascIssuerId` | string | App Store Connect Issuer ID (UUID format). |
1865
+ | `appStoreSettings.ascPrivateKey` | string | **SENSITIVE.** App Store Connect private key in PEM format. |
1866
+ | `appStoreSettings.ascAppId` | string | Numeric App Store app identifier. |
1867
+ | `buildVersion.buildVersion` | string | Marketing version string (e.g., `1.1.8`). |
1868
+ | `buildVersion.buildNumber` | int | Incremental build number. |
1869
+ | `buildVersion.lastSubmitted` | string | Last version+build submitted to stores (format: `version+buildNumber`). |
1870
+ | `playStoreSettings.playTrack` | enum | Play Store release track: `INTERNAL`, `ALPHA`, `BETA`, `PRODUCTION`. |
1871
+ | `playStoreSettings.playstoreCredentialsPath` | string | GCS path to the Play Store service account credentials JSON. |
1872
+ | `playStoreSettings.alias` | string | Android signing key alias. |
1873
+
1874
+ ---
1875
+
1876
+ ## web-publishing.yaml
1877
+
1878
+ **Purpose:** Web-specific publishing settings including SEO metadata, page title, status bar color, and screen orientation.
1879
+
1880
+ **Top-level keys:**
1881
+ - `webSettings`
1882
+
1883
+ **Schema:**
1884
+ ```yaml
1885
+ webSettings:
1886
+ PROD: # Environment key (PROD, DEV, etc.)
1887
+ seoDescription: "Idaho's #1 Discount Pass" # Meta description for SEO
1888
+ pageTitle: GoldPass # HTML <title> tag content
1889
+ statusBarColor:
1890
+ value: "4294046968" # Status bar color (raw ARGB int as string)
1891
+ darkModeColor:
1892
+ value: "4280099880" # Status bar color in dark mode
1893
+ orientation: PORTRAIT_PRIMARY # Preferred screen orientation
1894
+ ```
1895
+
1896
+ **Key fields:**
1897
+
1898
+ | Field | Type | Notes |
1899
+ |---|---|---|
1900
+ | `webSettings` | map | Keyed by environment (`PROD`, `DEV`, etc.). |
1901
+ | `webSettings.<ENV>.seoDescription` | string | Meta description tag content for search engines. |
1902
+ | `webSettings.<ENV>.pageTitle` | string | HTML `<title>` value shown in browser tabs. |
1903
+ | `webSettings.<ENV>.statusBarColor.value` | string | Raw ARGB integer as string for the browser theme/status bar color. |
1904
+ | `webSettings.<ENV>.statusBarColor.darkModeColor.value` | string | Dark mode variant of the status bar color. |
1905
+ | `webSettings.<ENV>.orientation` | enum | Preferred screen orientation. Known values: `PORTRAIT_PRIMARY`, `LANDSCAPE_PRIMARY`. |
1906
+
1907
+ ---
1908
+
1909
+ ## firebase-app-check.yaml
1910
+
1911
+ **Purpose:** Firebase App Check configuration for app attestation and abuse prevention.
1912
+
1913
+ **Top-level keys:**
1914
+ - `enabled`
1915
+ - `runTestModeDebugToken`
1916
+
1917
+ **Schema:**
1918
+ ```yaml
1919
+ enabled: true # Master toggle for App Check
1920
+ runTestModeDebugToken: 9218DDCD-D417-4E71-AFFF-A8A8616AECC6 # Debug token for test mode
1921
+ ```
1922
+
1923
+ **Key fields:**
1924
+
1925
+ | Field | Type | Notes |
1926
+ |---|---|---|
1927
+ | `enabled` | bool | Master toggle for Firebase App Check. |
1928
+ | `runTestModeDebugToken` | string | UUID debug token used during development/testing. Allows bypassing App Check attestation in debug builds. |
1929
+
1930
+ ---
1931
+
1932
+ ## firebase-remote-config.yaml
1933
+
1934
+ **Purpose:** Firebase Remote Config field definitions with default values. Defines the parameters that can be fetched from Firebase Remote Config at runtime.
1935
+
1936
+ **Top-level keys:**
1937
+ - `enabled`
1938
+ - `fields`
1939
+
1940
+ **Schema:**
1941
+ ```yaml
1942
+ enabled: true # Master toggle for Remote Config
1943
+
1944
+ fields:
1945
+ - parameter:
1946
+ identifier:
1947
+ name: newiOSVersion # Parameter name
1948
+ dataType:
1949
+ scalarType: String # Data type (String, Integer, Double, Boolean, etc.)
1950
+ serializedDefaultValue: 1.1.1 # Default value used when remote fetch fails
1951
+ - parameter:
1952
+ identifier:
1953
+ name: newAndroidVersion
1954
+ dataType:
1955
+ scalarType: String
1956
+ serializedDefaultValue: 1.1.1
1957
+ - parameter:
1958
+ identifier:
1959
+ name: minIosVersion
1960
+ dataType:
1961
+ scalarType: String
1962
+ serializedDefaultValue: 1.1.1
1963
+ - parameter:
1964
+ identifier:
1965
+ name: minAndroidVersion
1966
+ dataType:
1967
+ scalarType: String
1968
+ serializedDefaultValue: 1.1.1
1969
+ ```
1970
+
1971
+ **Key fields:**
1972
+
1973
+ | Field | Type | Notes |
1974
+ |---|---|---|
1975
+ | `enabled` | bool | Master toggle for Firebase Remote Config integration. |
1976
+ | `fields` | list | All Remote Config parameter definitions. |
1977
+ | `fields[].parameter.identifier.name` | string | Parameter name as it appears in the Firebase Remote Config console. |
1978
+ | `fields[].parameter.dataType.scalarType` | enum | Data type: `String`, `Integer`, `Double`, `Boolean`, etc. |
1979
+ | `fields[].serializedDefaultValue` | string | Default value used when the remote fetch fails or the parameter is not set in the Firebase console. |
1980
+
1981
+ ---
1982
+
1983
+ ## firestore-settings.yaml
1984
+
1985
+ **Purpose:** Firestore security rules, collection-level permissions, read visibility settings, validation hashes, and Cloud Storage rules configuration.
1986
+
1987
+ **Top-level keys:**
1988
+ - `rules`
1989
+ - `validation`
1990
+ - `storageRules`
1991
+
1992
+ **Schema:**
1993
+ ```yaml
1994
+ rules:
1995
+ collectionRules:
1996
+ k2ktdun9: # Collection key (matches Firestore collection key)
1997
+ creat: # NOTE: spelled "creat" not "create" — this is how FF spells it
1998
+ authenticatedUsers: {}
1999
+ read:
2000
+ everyone: {}
2001
+ update:
2002
+ authenticatedUsers: {}
2003
+ delete:
2004
+ noOne: {}
2005
+ isPublic: true # Whether the collection is publicly readable
2006
+ vz94s0kh:
2007
+ creat:
2008
+ authenticatedUsers: {}
2009
+ read:
2010
+ authenticatedUsers: {}
2011
+ update:
2012
+ authenticatedUsers: {}
2013
+ delete:
2014
+ authenticatedUsers: {}
2015
+ deleteWhenUserIsDeleted: true # Cascade delete when the owning user is deleted
2016
+ usersCollectionReadVisibility: READ_VISIBILITY_SELF # Users can only read their own document
2017
+
2018
+ validation:
2019
+ lastValidatedCollectionHash:
2020
+ Establishments: "106055806" # Hash of last validated schema per collection
2021
+ Users: "130657010"
2022
+ mode: DISABLED # Validation mode: DISABLED, ENABLED, etc.
2023
+
2024
+ storageRules:
2025
+ excludeFromStorageRules: true # Exclude this project from generating storage rules
2026
+ rules:
2027
+ userUploadsArePrivate: false # Whether user-uploaded files are private by default
2028
+ ```
2029
+
2030
+ > **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.
2031
+
2032
+ **Permission values:** Each permission field (`creat`, `read`, `update`, `delete`) accepts one of three values: `everyone: {}`, `authenticatedUsers: {}`, or `noOne: {}`.
2033
+
2034
+ **Key fields:**
2035
+
2036
+ | Field | Type | Notes |
2037
+ |---|---|---|
2038
+ | `rules.collectionRules` | map | Keyed by collection key. One entry per Firestore collection. |
2039
+ | `rules.collectionRules.<key>.creat` | permission | Create permission. Note: spelled `creat`, not `create`. |
2040
+ | `rules.collectionRules.<key>.read` | permission | Read permission. |
2041
+ | `rules.collectionRules.<key>.update` | permission | Update permission. |
2042
+ | `rules.collectionRules.<key>.delete` | permission | Delete permission. |
2043
+ | `rules.collectionRules.<key>.isPublic` | bool | Whether the collection allows public (unauthenticated) reads. |
2044
+ | `rules.collectionRules.<key>.deleteWhenUserIsDeleted` | bool | Cascade delete: remove documents when the owning user account is deleted. |
2045
+ | `rules.usersCollectionReadVisibility` | enum | Read visibility for the Users collection. Known value: `READ_VISIBILITY_SELF` (users can only read their own document). |
2046
+ | `validation.lastValidatedCollectionHash` | map | Hash per collection name, used to detect schema changes since last validation. |
2047
+ | `validation.mode` | enum | Validation mode: `DISABLED`, `ENABLED`. |
2048
+ | `storageRules.excludeFromStorageRules` | bool | If true, this project does not generate Cloud Storage security rules. |
2049
+ | `storageRules.rules.userUploadsArePrivate` | bool | Whether user-uploaded files default to private access. |
2050
+
2051
+ ---
2052
+
2053
+ ## algolia.yaml
2054
+
2055
+ **Purpose:** Algolia search integration configuration, including API credentials and indexed Firestore collections.
2056
+
2057
+ **Top-level keys:**
2058
+ - `applicationId`
2059
+ - `searchApiKey`
2060
+ - `indexedCollections`
2061
+ - `enabled`
2062
+
2063
+ **Schema:**
2064
+ ```yaml
2065
+ applicationId: SUEUI0E453 # Algolia Application ID
2066
+ searchApiKey: 5c8d18d950352fcf5e66ec8d5df04a66 # Algolia Search API key (public/search-only)
2067
+ indexedCollections:
2068
+ - name: Establishments # Firestore collection name
2069
+ key: k2ktdun9 # Firestore collection key
2070
+ enabled: true # Master toggle
2071
+ ```
2072
+
2073
+ **Key fields:**
2074
+
2075
+ | Field | Type | Notes |
2076
+ |---|---|---|
2077
+ | `applicationId` | string | Algolia Application ID. Found in the Algolia dashboard. |
2078
+ | `searchApiKey` | string | Algolia Search-Only API key. This is the public key safe for client-side use — not the Admin API key. |
2079
+ | `indexedCollections` | list | Firestore collections that are synced to Algolia indices. |
2080
+ | `indexedCollections[].name` | string | Firestore collection name (human-readable). |
2081
+ | `indexedCollections[].key` | string | Firestore collection key (matches keys in `firestore-settings.yaml`). |
2082
+ | `enabled` | bool | Master toggle for Algolia search integration. |
2083
+
2084
+ ---
2085
+
2086
+ ## app-query-cache.yaml
2087
+
2088
+ **Purpose:** Configuration for cached database queries (request managers) that persist query results to avoid redundant fetches.
2089
+
2090
+ **Top-level keys:**
2091
+ - `databaseRequestManagers`
2092
+
2093
+ **Schema:**
2094
+ ```yaml
2095
+ databaseRequestManagers:
2096
+ - identifier:
2097
+ name: savedDeals # Cache entry name
2098
+ key: sefdr # Unique key
2099
+ originalNodeKeyRef:
2100
+ key: Container_s5rjtbgg # Widget key where the query originates
2101
+ ```
2102
+
2103
+ **Key fields:**
2104
+
2105
+ | Field | Type | Notes |
2106
+ |---|---|---|
2107
+ | `databaseRequestManagers` | list | All cached query definitions. |
2108
+ | `databaseRequestManagers[].identifier.name` | string | Human-readable name for the cached query. |
2109
+ | `databaseRequestManagers[].identifier.key` | string | Unique key for the cache entry. |
2110
+ | `databaseRequestManagers[].originalNodeKeyRef.key` | string | Widget key (typically `Container_*`) where the original database query is defined. Links the cache to its source widget. |
2111
+
2112
+ ---
2113
+
2114
+ ## material-theme.yaml
2115
+
2116
+ **Purpose:** Material Design version toggle controlling whether the app uses Material 2 or Material 3 design system.
2117
+
2118
+ **Top-level keys:**
2119
+ - `useMaterial2`
2120
+
2121
+ **Schema:**
2122
+ ```yaml
2123
+ useMaterial2: true # true = Material 2, false = Material 3
2124
+ ```
2125
+
2126
+ **Key fields:**
2127
+
2128
+ | Field | Type | Notes |
2129
+ |---|---|---|
2130
+ | `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. |
2131
+
2132
+ ---
2133
+
2134
+ ## storyboard.yaml
2135
+
2136
+ **Purpose:** Editor-only metadata storing page positions on the FlutterFlow storyboard canvas. Has no functional impact on the built app.
2137
+
2138
+ **Top-level keys:**
2139
+ - `storyboardPositions`
2140
+
2141
+ **Schema:**
2142
+ ```yaml
2143
+ storyboardPositions:
2144
+ Scaffold_q2hw5kk7: # Scaffold ID of the page
2145
+ x: 1172.0366954890674 # Horizontal position on canvas
2146
+ y: 583.8096385491203 # Vertical position on canvas
2147
+ Scaffold_ih504krn:
2148
+ x: 803.2030987008528
2149
+ y: 582.2951003122512
2150
+ ```
2151
+
2152
+ **Key fields:**
2153
+
2154
+ | Field | Type | Notes |
2155
+ |---|---|---|
2156
+ | `storyboardPositions` | map | Keyed by Scaffold ID. One entry per page placed on the storyboard. |
2157
+ | `storyboardPositions.<Scaffold_ID>.x` | double | Horizontal position (pixels) of the page on the storyboard canvas. |
2158
+ | `storyboardPositions.<Scaffold_ID>.y` | double | Vertical position (pixels) of the page on the storyboard canvas. |
2159
+
2160
+ > 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.
2161
+
2162
+ ---
2163
+
2164
+ ## date-picker.yaml
2165
+
2166
+ **Purpose:** Controls which Material date picker style is used in the app (legacy vs modern).
2167
+
2168
+ **Top-level keys:**
2169
+ - `useLegacyDatePicker`
2170
+
2171
+ **Schema:**
2172
+ ```yaml
2173
+ useLegacyDatePicker: false # false = modern Material date picker, true = legacy style
2174
+ ```
2175
+
2176
+ **Key fields:**
2177
+
2178
+ | Field | Type | Notes |
2179
+ |---|---|---|
2180
+ | `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. |
2181
+
2182
+ ---
2183
+
2184
+ ## theme/color-scheme
2185
+
2186
+ **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`.
2187
+
2188
+ **Top-level keys:**
2189
+ - `primary`, `secondary`, `tertiary`, `alternate`
2190
+ - `primaryBackground`, `secondaryBackground`
2191
+ - `primaryText`, `secondaryText`
2192
+ - `accent1`, `accent2`, `accent3`, `accent4`
2193
+ - `success`, `warning`, `error`, `info`
2194
+ - `customPaletteColors`
2195
+ - `darkModeEnabled`
2196
+ - `displayDarkMode`
2197
+
2198
+ **Schema:**
2199
+ ```yaml
2200
+ primary: # Core Material colors
2201
+ value: "4279461852" # Light mode ARGB integer as string
2202
+ darkModeColor:
2203
+ value: "4279461852" # Dark mode ARGB integer as string
2204
+ secondary:
2205
+ value: "4278190080"
2206
+ darkModeColor:
2207
+ value: "4294967295"
2208
+ tertiary:
2209
+ value: "4280582880"
2210
+ darkModeColor:
2211
+ value: "4280582880"
2212
+ alternate:
2213
+ value: "4282532418"
2214
+ darkModeColor:
2215
+ value: "4287937484"
2216
+
2217
+ primaryBackground: # Background colors
2218
+ value: "4294967295"
2219
+ darkModeColor:
2220
+ value: "4278190080"
2221
+ secondaryBackground:
2222
+ value: "4294111986"
2223
+ darkModeColor:
2224
+ value: "4282532418"
2225
+
2226
+ primaryText: # Text colors
2227
+ value: "4278190080"
2228
+ darkModeColor:
2229
+ value: "4294967295"
2230
+ secondaryText:
2231
+ value: "4282402630"
2232
+ darkModeColor:
2233
+ value: "4287996332"
2234
+
2235
+ accent1: # Accent colors (accent1 through accent4)
2236
+ value: "4284572001"
2237
+ darkModeColor:
2238
+ value: "4293848814"
2239
+ accent2:
2240
+ value: "4285887861"
2241
+ darkModeColor:
2242
+ value: "4292927712"
2243
+ accent3:
2244
+ value: "4292927712"
2245
+ darkModeColor:
2246
+ value: "4285887861"
2247
+ accent4:
2248
+ value: "4293848814"
2249
+ darkModeColor:
2250
+ value: "4284572001"
2251
+
2252
+ success: # Semantic colors
2253
+ value: "4278493772"
2254
+ darkModeColor:
2255
+ value: "4278493772"
2256
+ warning:
2257
+ value: "4294761484"
2258
+ darkModeColor:
2259
+ value: "4294761484"
2260
+ error:
2261
+ value: "4293008445"
2262
+ darkModeColor:
2263
+ value: "4293008445"
2264
+ info:
2265
+ value: "4280042644"
2266
+ darkModeColor:
2267
+ value: "4280042644"
2268
+
2269
+ customPaletteColors: # Project-specific named colors
2270
+ - value: "4294967295"
2271
+ paletteColorName: primaryBtnText # Custom color name (used in bindings)
2272
+ darkModeColor:
2273
+ value: "4294967295"
2274
+ - value: "4292467161"
2275
+ paletteColorName: lineColor
2276
+ darkModeColor:
2277
+ value: "4280428591"
2278
+ - value: "2550136832"
2279
+ paletteColorName: barrierColor
2280
+ darkModeColor:
2281
+ value: "2550136832"
2282
+
2283
+ darkModeEnabled: true # Whether dark mode is available in the app
2284
+ displayDarkMode: true # Whether dark mode toggle is shown in FF editor
2285
+ ```
2286
+
2287
+ **Key fields:**
2288
+
2289
+ | Field | Type | Notes |
2290
+ |---|---|---|
2291
+ | `primary` | color entry | Primary brand color. Each color entry has `value` (light mode) and `darkModeColor.value` (dark mode). |
2292
+ | `secondary` | color entry | Secondary brand color. |
2293
+ | `tertiary` | color entry | Tertiary accent color. |
2294
+ | `alternate` | color entry | Alternate/surface variant color. |
2295
+ | `primaryBackground` | color entry | Main background color. |
2296
+ | `secondaryBackground` | color entry | Secondary/card background color. |
2297
+ | `primaryText` | color entry | Primary text color. |
2298
+ | `secondaryText` | color entry | Secondary/subtitle text color. |
2299
+ | `accent1` - `accent4` | color entry | Four accent colors for highlights and decorations. |
2300
+ | `success` | color entry | Semantic color for success states. |
2301
+ | `warning` | color entry | Semantic color for warning states. |
2302
+ | `error` | color entry | Semantic color for error states. |
2303
+ | `info` | color entry | Semantic color for informational states. |
2304
+ | `customPaletteColors` | list | Project-specific named colors. Each entry has `value`, `paletteColorName`, and `darkModeColor`. |
2305
+ | `customPaletteColors[].paletteColorName` | string | Custom color name used in widget bindings and theme references. |
2306
+ | `darkModeEnabled` | bool | When `true`, dark mode is available as an option in the built app. |
2307
+ | `displayDarkMode` | bool | When `true`, the dark mode toggle is visible in the FlutterFlow editor. |
2308
+
2309
+ > 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`.