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.
- package/README.md +300 -0
- package/build/api/flutterflow.d.ts +11 -0
- package/build/api/flutterflow.js +61 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +78 -0
- package/build/prompts/dev-workflow.d.ts +2 -0
- package/build/prompts/dev-workflow.js +68 -0
- package/build/prompts/generate-page.d.ts +2 -0
- package/build/prompts/generate-page.js +37 -0
- package/build/prompts/inspect-project.d.ts +2 -0
- package/build/prompts/inspect-project.js +30 -0
- package/build/prompts/modify-component.d.ts +2 -0
- package/build/prompts/modify-component.js +40 -0
- package/build/resources/docs.d.ts +2 -0
- package/build/resources/docs.js +76 -0
- package/build/resources/projects.d.ts +3 -0
- package/build/resources/projects.js +60 -0
- package/build/tools/find-component-usages.d.ts +21 -0
- package/build/tools/find-component-usages.js +216 -0
- package/build/tools/find-page-navigations.d.ts +26 -0
- package/build/tools/find-page-navigations.js +220 -0
- package/build/tools/get-api-endpoints.d.ts +2 -0
- package/build/tools/get-api-endpoints.js +126 -0
- package/build/tools/get-app-settings.d.ts +2 -0
- package/build/tools/get-app-settings.js +169 -0
- package/build/tools/get-app-state.d.ts +2 -0
- package/build/tools/get-app-state.js +96 -0
- package/build/tools/get-component-summary.d.ts +22 -0
- package/build/tools/get-component-summary.js +195 -0
- package/build/tools/get-custom-code.d.ts +2 -0
- package/build/tools/get-custom-code.js +380 -0
- package/build/tools/get-data-models.d.ts +2 -0
- package/build/tools/get-data-models.js +266 -0
- package/build/tools/get-editing-guide.d.ts +7 -0
- package/build/tools/get-editing-guide.js +185 -0
- package/build/tools/get-general-settings.d.ts +2 -0
- package/build/tools/get-general-settings.js +116 -0
- package/build/tools/get-in-app-purchases.d.ts +2 -0
- package/build/tools/get-in-app-purchases.js +51 -0
- package/build/tools/get-integrations.d.ts +2 -0
- package/build/tools/get-integrations.js +137 -0
- package/build/tools/get-page-by-name.d.ts +3 -0
- package/build/tools/get-page-by-name.js +56 -0
- package/build/tools/get-page-summary.d.ts +22 -0
- package/build/tools/get-page-summary.js +205 -0
- package/build/tools/get-project-config.d.ts +2 -0
- package/build/tools/get-project-config.js +216 -0
- package/build/tools/get-project-setup.d.ts +2 -0
- package/build/tools/get-project-setup.js +212 -0
- package/build/tools/get-theme.d.ts +2 -0
- package/build/tools/get-theme.js +199 -0
- package/build/tools/get-yaml-docs.d.ts +6 -0
- package/build/tools/get-yaml-docs.js +116 -0
- package/build/tools/get-yaml.d.ts +2 -0
- package/build/tools/get-yaml.js +53 -0
- package/build/tools/list-files.d.ts +3 -0
- package/build/tools/list-files.js +49 -0
- package/build/tools/list-pages.d.ts +25 -0
- package/build/tools/list-pages.js +101 -0
- package/build/tools/list-projects.d.ts +3 -0
- package/build/tools/list-projects.js +23 -0
- package/build/tools/search-project-files.d.ts +2 -0
- package/build/tools/search-project-files.js +69 -0
- package/build/tools/sync-project.d.ts +3 -0
- package/build/tools/sync-project.js +147 -0
- package/build/tools/update-yaml.d.ts +3 -0
- package/build/tools/update-yaml.js +24 -0
- package/build/tools/validate-yaml.d.ts +3 -0
- package/build/tools/validate-yaml.js +39 -0
- package/build/utils/batch-process.d.ts +2 -0
- package/build/utils/batch-process.js +10 -0
- package/build/utils/cache.d.ts +58 -0
- package/build/utils/cache.js +199 -0
- package/build/utils/decode-yaml.d.ts +7 -0
- package/build/utils/decode-yaml.js +31 -0
- package/build/utils/page-summary/action-summarizer.d.ts +24 -0
- package/build/utils/page-summary/action-summarizer.js +291 -0
- package/build/utils/page-summary/formatter.d.ts +13 -0
- package/build/utils/page-summary/formatter.js +129 -0
- package/build/utils/page-summary/node-extractor.d.ts +24 -0
- package/build/utils/page-summary/node-extractor.js +227 -0
- package/build/utils/page-summary/tree-walker.d.ts +6 -0
- package/build/utils/page-summary/tree-walker.js +55 -0
- package/build/utils/page-summary/types.d.ts +58 -0
- package/build/utils/page-summary/types.js +4 -0
- package/build/utils/parse-folders.d.ts +9 -0
- package/build/utils/parse-folders.js +29 -0
- package/build/utils/resolve-data-type.d.ts +2 -0
- package/build/utils/resolve-data-type.js +18 -0
- package/build/utils/topic-map.d.ts +7 -0
- package/build/utils/topic-map.js +122 -0
- package/docs/ff-yaml/00-overview.md +166 -0
- package/docs/ff-yaml/01-project-files.md +2309 -0
- package/docs/ff-yaml/02-pages.md +572 -0
- package/docs/ff-yaml/03-components.md +784 -0
- package/docs/ff-yaml/04-widgets/README.md +122 -0
- package/docs/ff-yaml/04-widgets/button.md +444 -0
- package/docs/ff-yaml/04-widgets/container.md +358 -0
- package/docs/ff-yaml/04-widgets/dropdown.md +579 -0
- package/docs/ff-yaml/04-widgets/form.md +256 -0
- package/docs/ff-yaml/04-widgets/image.md +276 -0
- package/docs/ff-yaml/04-widgets/layout.md +355 -0
- package/docs/ff-yaml/04-widgets/misc.md +553 -0
- package/docs/ff-yaml/04-widgets/text-field.md +326 -0
- package/docs/ff-yaml/04-widgets/text.md +302 -0
- package/docs/ff-yaml/05-actions.md +953 -0
- package/docs/ff-yaml/06-variables.md +849 -0
- package/docs/ff-yaml/07-data.md +591 -0
- package/docs/ff-yaml/08-custom-code.md +736 -0
- package/docs/ff-yaml/09-theming.md +638 -0
- package/docs/ff-yaml/10-editing-guide.md +497 -0
- package/docs/ff-yaml/README.md +105 -0
- package/package.json +59 -0
- package/skills/community-ff-mcp/SKILL.md +201 -0
- package/skills/ff-widget-patterns.md +141 -0
- 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`.
|