flutterflow-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +124 -0
  2. package/build/api/flutterflow.d.ts +11 -0
  3. package/build/api/flutterflow.js +61 -0
  4. package/build/index.d.ts +2 -0
  5. package/build/index.js +54 -0
  6. package/build/prompts/dev-workflow.d.ts +2 -0
  7. package/build/prompts/dev-workflow.js +68 -0
  8. package/build/prompts/generate-page.d.ts +2 -0
  9. package/build/prompts/generate-page.js +36 -0
  10. package/build/prompts/inspect-project.d.ts +2 -0
  11. package/build/prompts/inspect-project.js +30 -0
  12. package/build/prompts/modify-component.d.ts +2 -0
  13. package/build/prompts/modify-component.js +39 -0
  14. package/build/resources/docs.d.ts +2 -0
  15. package/build/resources/docs.js +76 -0
  16. package/build/resources/projects.d.ts +3 -0
  17. package/build/resources/projects.js +60 -0
  18. package/build/tools/find-component-usages.d.ts +7 -0
  19. package/build/tools/find-component-usages.js +225 -0
  20. package/build/tools/find-page-navigations.d.ts +7 -0
  21. package/build/tools/find-page-navigations.js +228 -0
  22. package/build/tools/get-component-summary.d.ts +22 -0
  23. package/build/tools/get-component-summary.js +193 -0
  24. package/build/tools/get-page-by-name.d.ts +3 -0
  25. package/build/tools/get-page-by-name.js +56 -0
  26. package/build/tools/get-page-summary.d.ts +22 -0
  27. package/build/tools/get-page-summary.js +220 -0
  28. package/build/tools/get-yaml-docs.d.ts +6 -0
  29. package/build/tools/get-yaml-docs.js +217 -0
  30. package/build/tools/get-yaml.d.ts +3 -0
  31. package/build/tools/get-yaml.js +47 -0
  32. package/build/tools/list-files.d.ts +3 -0
  33. package/build/tools/list-files.js +30 -0
  34. package/build/tools/list-pages.d.ts +25 -0
  35. package/build/tools/list-pages.js +101 -0
  36. package/build/tools/list-projects.d.ts +3 -0
  37. package/build/tools/list-projects.js +19 -0
  38. package/build/tools/sync-project.d.ts +3 -0
  39. package/build/tools/sync-project.js +144 -0
  40. package/build/tools/update-yaml.d.ts +3 -0
  41. package/build/tools/update-yaml.js +24 -0
  42. package/build/tools/validate-yaml.d.ts +3 -0
  43. package/build/tools/validate-yaml.js +22 -0
  44. package/build/utils/cache.d.ts +48 -0
  45. package/build/utils/cache.js +162 -0
  46. package/build/utils/decode-yaml.d.ts +7 -0
  47. package/build/utils/decode-yaml.js +31 -0
  48. package/build/utils/page-summary/action-summarizer.d.ts +9 -0
  49. package/build/utils/page-summary/action-summarizer.js +291 -0
  50. package/build/utils/page-summary/formatter.d.ts +13 -0
  51. package/build/utils/page-summary/formatter.js +121 -0
  52. package/build/utils/page-summary/node-extractor.d.ts +17 -0
  53. package/build/utils/page-summary/node-extractor.js +207 -0
  54. package/build/utils/page-summary/tree-walker.d.ts +6 -0
  55. package/build/utils/page-summary/tree-walker.js +55 -0
  56. package/build/utils/page-summary/types.d.ts +56 -0
  57. package/build/utils/page-summary/types.js +4 -0
  58. package/build/utils/parse-folders.d.ts +9 -0
  59. package/build/utils/parse-folders.js +29 -0
  60. package/docs/ff-yaml/00-overview.md +137 -0
  61. package/docs/ff-yaml/01-project-files.md +513 -0
  62. package/docs/ff-yaml/02-pages.md +572 -0
  63. package/docs/ff-yaml/03-components.md +413 -0
  64. package/docs/ff-yaml/04-widgets/README.md +122 -0
  65. package/docs/ff-yaml/04-widgets/button.md +444 -0
  66. package/docs/ff-yaml/04-widgets/container.md +358 -0
  67. package/docs/ff-yaml/04-widgets/dropdown.md +579 -0
  68. package/docs/ff-yaml/04-widgets/form.md +256 -0
  69. package/docs/ff-yaml/04-widgets/image.md +276 -0
  70. package/docs/ff-yaml/04-widgets/layout.md +355 -0
  71. package/docs/ff-yaml/04-widgets/misc.md +553 -0
  72. package/docs/ff-yaml/04-widgets/text-field.md +326 -0
  73. package/docs/ff-yaml/04-widgets/text.md +302 -0
  74. package/docs/ff-yaml/05-actions.md +843 -0
  75. package/docs/ff-yaml/06-variables.md +834 -0
  76. package/docs/ff-yaml/07-data.md +591 -0
  77. package/docs/ff-yaml/08-custom-code.md +715 -0
  78. package/docs/ff-yaml/09-theming.md +592 -0
  79. package/docs/ff-yaml/10-editing-guide.md +454 -0
  80. package/docs/ff-yaml/README.md +105 -0
  81. package/package.json +55 -0
  82. package/skills/ff-widget-patterns.md +141 -0
  83. package/skills/ff-yaml-dev.md +58 -0
@@ -0,0 +1,513 @@
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
+ **Top-level keys:**
136
+ - `permissionMessages`
137
+ - `userDefinedPermissions`
138
+
139
+ **Schema:**
140
+ ```yaml
141
+ permissionMessages:
142
+ - permissionType: CAMERA # FF built-in permission enum
143
+ message:
144
+ translationIdentifier:
145
+ key: k2j9ttsz # i18n key
146
+ textValue:
147
+ inputValue: "This app requires camera access..."
148
+
149
+ userDefinedPermissions:
150
+ - names:
151
+ iosName: NSCameraUsageDescription # iOS Info.plist key
152
+ androidName: android.permission. # Android manifest permission
153
+ message:
154
+ translationIdentifier:
155
+ key: 6c6yuxd5
156
+ textValue:
157
+ inputValue: "This app requires camera access..."
158
+ ```
159
+
160
+ **Key fields:**
161
+
162
+ | Field | Type | Notes |
163
+ |---|---|---|
164
+ | `permissionMessages` | list | Built-in FF permission types: `CAMERA`, `PHOTO_LIBRARY`, `MICROPHONE`, `LOCATION`, `NOTIFICATIONS`, etc. |
165
+ | `permissionMessages[].permissionType` | enum string | Required. Must be a recognized FF permission type. |
166
+ | `userDefinedPermissions` | list | Custom platform-level permission entries. |
167
+ | `userDefinedPermissions[].names.iosName` | string | iOS `Info.plist` key (e.g., `NSPhotoLibraryUsageDescription`). |
168
+ | `userDefinedPermissions[].names.androidName` | string | Android manifest permission string. |
169
+ | `*.message.textValue.inputValue` | string | User-facing permission rationale string. |
170
+ | `*.message.translationIdentifier.key` | string | Links to `languages.yaml` translations. |
171
+
172
+ ---
173
+
174
+ ## nav-bar.yaml
175
+
176
+ **Purpose:** Bottom navigation bar color configuration.
177
+
178
+ **Top-level keys:**
179
+ - `backgroundColor`
180
+ - `selectedIconColor`
181
+ - `unselectedIconColor`
182
+
183
+ **Schema:**
184
+ ```yaml
185
+ backgroundColor:
186
+ themeColor: PRIMARY_BACKGROUND # Theme color token
187
+
188
+ selectedIconColor:
189
+ themeColor: PRIMARY # Active tab icon color
190
+
191
+ unselectedIconColor:
192
+ themeColor: SECONDARY_TEXT # Inactive tab icon color
193
+ ```
194
+
195
+ **Key fields:**
196
+
197
+ | Field | Type | Notes |
198
+ |---|---|---|
199
+ | `backgroundColor.themeColor` | theme token | One of: `PRIMARY`, `SECONDARY`, `PRIMARY_BACKGROUND`, `SECONDARY_BACKGROUND`, `PRIMARY_TEXT`, `SECONDARY_TEXT`, `ACCENT1`-`ACCENT4`, etc. |
200
+ | `selectedIconColor` | color ref | Color when tab is active. |
201
+ | `unselectedIconColor` | color ref | Color when tab is inactive. |
202
+
203
+ > Note: Nav bar page tabs are configured per-page in the page scaffold YAML, not here. This file only controls colors.
204
+
205
+ ---
206
+
207
+ ## app-bar.yaml
208
+
209
+ **Purpose:** Default app bar template applied to new pages.
210
+
211
+ **Top-level keys:**
212
+ - `templateType`
213
+ - `backgroundColor`
214
+ - `elevation`
215
+ - `defaultIcon`
216
+ - `textStyle`
217
+ - `addOnNewPages`
218
+
219
+ **Schema:**
220
+ ```yaml
221
+ templateType: LARGE_HEADER # LARGE_HEADER | SMALL_HEADER | NONE
222
+
223
+ backgroundColor:
224
+ value: "4930031" # Raw ARGB int as string (no 0x prefix)
225
+
226
+ elevation: 0 # Shadow elevation (0 = flat)
227
+
228
+ defaultIcon:
229
+ sizeValue:
230
+ inputValue: 30 # Icon size in logical pixels
231
+ colorValue:
232
+ inputValue:
233
+ themeColor: PRIMARY_TEXT # Icon color
234
+ iconDataValue:
235
+ inputValue:
236
+ codePoint: 62834 # Unicode code point
237
+ family: MaterialIcons # Icon font family
238
+ matchTextDirection: true
239
+ name: arrow_back_rounded # Icon name
240
+
241
+ textStyle:
242
+ themeStyle: HEADLINE_MEDIUM # Theme text style token
243
+ fontSizeValue:
244
+ inputValue: 22 # Font size override
245
+ colorValue:
246
+ inputValue:
247
+ themeColor: PRIMARY_TEXT
248
+
249
+ addOnNewPages: true # Auto-add this app bar to newly created pages
250
+ ```
251
+
252
+ **Key fields:**
253
+
254
+ | Field | Type | Notes |
255
+ |---|---|---|
256
+ | `templateType` | enum | Required. `LARGE_HEADER`, `SMALL_HEADER`, or `NONE`. |
257
+ | `backgroundColor.value` | string | Raw ARGB integer as string (e.g., `"4930031"` = dark color). Not hex. |
258
+ | `elevation` | int | Material elevation. 0 = no shadow. |
259
+ | `defaultIcon.iconDataValue.inputValue.codePoint` | int | Material icon Unicode code point. |
260
+ | `defaultIcon.iconDataValue.inputValue.name` | string | Flutter icon name (e.g., `arrow_back_rounded`). |
261
+ | `textStyle.themeStyle` | theme token | `HEADLINE_SMALL`, `HEADLINE_MEDIUM`, `HEADLINE_LARGE`, `TITLE_SMALL`, etc. |
262
+ | `addOnNewPages` | bool | Whether this app bar is auto-added to new pages. |
263
+
264
+ ---
265
+
266
+ ## miscellaneous.yaml
267
+
268
+ **Purpose:** Miscellaneous app-level settings and feature flags.
269
+
270
+ **Top-level keys:**
271
+ - `appSettings`
272
+
273
+ **Schema:**
274
+ ```yaml
275
+ appSettings:
276
+ checkCustomCodeReferences: true # Validate custom code references on build
277
+ ```
278
+
279
+ **Key fields:**
280
+
281
+ | Field | Type | Notes |
282
+ |---|---|---|
283
+ | `appSettings.checkCustomCodeReferences` | bool | When true, FF validates that all custom code references resolve at build time. |
284
+
285
+ > Note: This file is a catch-all. Additional keys may appear depending on project features enabled.
286
+
287
+ ---
288
+
289
+ ## revenue-cat.yaml
290
+
291
+ **Purpose:** RevenueCat in-app purchase/subscription integration configuration.
292
+
293
+ **Top-level keys:**
294
+ - `enabled`
295
+ - `appStoreKey`
296
+ - `playStoreKey`
297
+ - `debugLoggingEnabled`
298
+ - `loadDataAfterAppLaunch`
299
+
300
+ **Schema:**
301
+ ```yaml
302
+ enabled: true # Master toggle
303
+ appStoreKey: appl_XXXXXXXXXXXX # RevenueCat Apple API key
304
+ playStoreKey: goog_XXXXXXXXXXXX # RevenueCat Google API key
305
+ debugLoggingEnabled: false # Enable RC debug logs
306
+ loadDataAfterAppLaunch: true # Fetch entitlements on app start
307
+ ```
308
+
309
+ **Key fields:**
310
+
311
+ | Field | Type | Notes |
312
+ |---|---|---|
313
+ | `enabled` | bool | Required. Enables RevenueCat integration. |
314
+ | `appStoreKey` | string | RevenueCat public API key for Apple App Store. Prefix: `appl_`. |
315
+ | `playStoreKey` | string | RevenueCat public API key for Google Play. Prefix: `goog_`. |
316
+ | `debugLoggingEnabled` | bool | Verbose RC SDK logging. Should be `false` in production. |
317
+ | `loadDataAfterAppLaunch` | bool | If true, RC data is fetched immediately at app launch. |
318
+
319
+ ---
320
+
321
+ ## languages.yaml
322
+
323
+ **Purpose:** Internationalization (i18n) configuration, supported languages, and all preset/system text strings.
324
+
325
+ **Top-level keys:**
326
+ - `languages`
327
+ - `primaryLanguage`
328
+ - `displayLanguage`
329
+ - `presetTexts`
330
+ - `persistLanguageSelection`
331
+
332
+ **Schema:**
333
+ ```yaml
334
+ languages:
335
+ - language: en # ISO 639-1 language code
336
+ - language: es
337
+
338
+ primaryLanguage:
339
+ language: en # Default/fallback language
340
+
341
+ displayLanguage:
342
+ language: en # Language shown in FF editor
343
+
344
+ presetTexts:
345
+ authMessages: # Auth-related system strings
346
+ error:
347
+ translationIdentifier:
348
+ key: 7mu1hspb # Unique i18n key
349
+ textValue:
350
+ inputValue: "Invalid credentials!"
351
+ passwordResetEmailSent:
352
+ translationIdentifier:
353
+ key: 59zs8v4b
354
+ textValue:
355
+ inputValue: "Password reset email sent!"
356
+ emailRequired: { ... }
357
+ phoneNumberValidation: { ... }
358
+ passwordsDoNotMatch: { ... }
359
+ enterSmsVerificationCode: { ... }
360
+ reauthenticateForUserDelete: { ... }
361
+ reauthenticateForEmailUpdate: { ... }
362
+ emailChangeConfirmation: { ... }
363
+ emailAlreadyInUse: { ... }
364
+ invalidCredentials: { ... }
365
+
366
+ uploadDataMessages: # File upload system strings
367
+ invalidFileFormat: { ... }
368
+ uploadingFile: { ... }
369
+ success: { ... }
370
+ error: { ... }
371
+ sendingPhoto: { ... }
372
+ chooseSource: { ... }
373
+ gallery: { ... }
374
+ galleryPhoto: { ... }
375
+ galleryVideo: { ... }
376
+ camera: { ... }
377
+ empty: { ... }
378
+
379
+ paymentMessages: # Payment system strings
380
+ processingMessage: { ... }
381
+ success: { ... }
382
+ error: { ... }
383
+
384
+ persistLanguageSelection: true # Remember user's language choice
385
+ ```
386
+
387
+ **Key fields:**
388
+
389
+ | Field | Type | Notes |
390
+ |---|---|---|
391
+ | `languages` | list | Required. All supported languages as ISO 639-1 codes. |
392
+ | `primaryLanguage.language` | string | Required. Fallback language code. |
393
+ | `displayLanguage.language` | string | Language used in the FF editor UI. |
394
+ | `presetTexts.authMessages` | object | System-generated auth UI strings (errors, prompts). |
395
+ | `presetTexts.uploadDataMessages` | object | File/media upload UI strings. |
396
+ | `presetTexts.paymentMessages` | object | Payment flow UI strings. |
397
+ | `persistLanguageSelection` | bool | If true, selected language is saved to device. |
398
+
399
+ > Translation text pattern: Every translatable string uses `{ translationIdentifier: { key }, textValue: { inputValue } }`. The `key` links to translation entries in the FF translation system.
400
+
401
+ ---
402
+
403
+ ## app-state.yaml
404
+
405
+ **Purpose:** App-level state variables (global state accessible from any page/component).
406
+
407
+ **Top-level keys:**
408
+ - `fields`
409
+ - `securePersistedValues`
410
+
411
+ **Schema:**
412
+ ```yaml
413
+ fields:
414
+ - parameter:
415
+ identifier:
416
+ name: email # Variable name (camelCase)
417
+ key: x2tvdt22 # Unique key
418
+ dataType:
419
+ scalarType: String # Scalar: String, Integer, Double, Boolean, LatLng, Enum, etc.
420
+ description: "" # Optional description
421
+ persisted: true # Survives app restart (local storage)
422
+ serializedDefaultValue:
423
+ - "" # Default value as single-element list of strings
424
+
425
+ - parameter:
426
+ identifier:
427
+ name: Favorites
428
+ key: noxdj87d
429
+ dataType:
430
+ listType: # List type instead of scalar
431
+ scalarType: String
432
+ persisted: true
433
+ # No serializedDefaultValue = empty list default
434
+
435
+ - parameter:
436
+ identifier:
437
+ name: NavBarStatus
438
+ key: p4n8k8yh
439
+ dataType:
440
+ scalarType: Enum
441
+ subType: # Required for Enum type
442
+ enumIdentifier:
443
+ name: NavBar
444
+ key: qik04
445
+ description: ""
446
+ persisted: false
447
+ serializedDefaultValue:
448
+ - fxjp3 # Enum value key (not label)
449
+
450
+ securePersistedValues: false # If true, persisted values use secure storage
451
+ ```
452
+
453
+ **Key fields:**
454
+
455
+ | Field | Type | Notes |
456
+ |---|---|---|
457
+ | `fields` | list | Required. All app state variables. |
458
+ | `fields[].parameter.identifier.name` | string | Variable name. Used in code and bindings. |
459
+ | `fields[].parameter.identifier.key` | string | Immutable unique key. Used in YAML references. |
460
+ | `fields[].parameter.dataType.scalarType` | enum | `String`, `Integer`, `Double`, `Boolean`, `LatLng`, `Enum`, `DateTime`, `Color`, `JSON`, etc. |
461
+ | `fields[].parameter.dataType.listType` | object | Present instead of `scalarType` for list-typed variables. Contains its own `scalarType`. |
462
+ | `fields[].parameter.dataType.subType` | object | Required for `Enum` scalar type. References the enum definition. |
463
+ | `fields[].persisted` | bool | Required. If true, value is saved to local storage across app restarts. |
464
+ | `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. |
465
+ | `securePersistedValues` | bool | Use platform secure storage (Keychain/Keystore) for persisted values. |
466
+
467
+ ---
468
+
469
+ ## app-constants.yaml
470
+
471
+ **Purpose:** Compile-time constants accessible app-wide. Unlike app state, these cannot be changed at runtime.
472
+
473
+ **Top-level keys:**
474
+ - `fields`
475
+
476
+ **Schema:**
477
+ ```yaml
478
+ fields:
479
+ - parameter:
480
+ identifier:
481
+ name: Distances # Constant name
482
+ key: eghxy5 # Unique key
483
+ dataType:
484
+ listType:
485
+ scalarType: Integer # List of integers
486
+ description: ""
487
+ serializedValue: # Constant value (not "default" -- this IS the value)
488
+ - "50"
489
+ - "100"
490
+ - "200"
491
+ - "500"
492
+
493
+ - parameter:
494
+ identifier:
495
+ name: isLive
496
+ key: a0hp9r
497
+ dataType:
498
+ scalarType: Boolean
499
+ description: ""
500
+ serializedValue:
501
+ - "true"
502
+ ```
503
+
504
+ **Key fields:**
505
+
506
+ | Field | Type | Notes |
507
+ |---|---|---|
508
+ | `fields` | list | Required. All app constants. |
509
+ | `fields[].parameter.identifier` | object | Same `{ name, key }` pattern as app-state. |
510
+ | `fields[].parameter.dataType` | object | Same type system as app-state (`scalarType` or `listType`). |
511
+ | `fields[].serializedValue` | list of strings | The constant value. For scalars: single-element list. For lists: one element per item. All values are strings regardless of type. |
512
+
513
+ > 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.