When you export from the service, it generates an LVGL project in your configured projectDir. The structure is organized to match LVGL's component layout and separates design tokens, components, screens, and assets.
Directory Map
your-project/
├── project.xml # project root: display size, required
├── globals.xml # tokens: colors, fonts, images, styles
├── components/
│ ├── card_summary/
│ │ └── card_summary.xml # one folder per component
│ ├── nav_button/
│ │ └── nav_button.xml
│ └── base/
│ └── … # shared base library (row, column, panel, h1–h4)
├── screens/
│ ├── screen_home.xml # one file per screen, safe-named
│ └── screen_settings.xml
├── images/
│ └── logo.png # extracted image + vector assets
├── fonts/
│ └── FONTS-MISSING.md # written only when a font can't be resolved
└── .lvgl-flow/ # internal state, leave it alone
Key Files and Ownership
| File | Description | Ownership |
|---|
project.xml | The project root containing the <display> block. | Service-owned |
globals.xml | Contains design tokens (colors, numbers, strings, fonts, styles). Rewritten on every export that includes tokens. | Service-owned |
components/<name>/<name>.xml | Nested folder per component. Variants are handled as states inside the XML. | Service-owned |
components/base/ | A demand-driven library of layout primitives (row, column, panel) used by your components. | Service-owned |
screens/<name>.xml | Normalized screen files. | User/Service |
images/<name>.png | Extracted images and vector fills, re-encoded to PNG for LVGL compatibility. | User/Service |
.lvgl-flow/ | Internal bookkeeping (manifests, asset sidecars, name records). Do not edit manually. | Service-owned |
your-project/
├── project.xml
├── globals.xml
├── components/
│ ├── card_summary/
│ │ └── card_summary.xml
│ ├── nav_button/
│ │ └── nav_button.xml
│ └── base/
│ └── …
├── screens/
│ ├── screen_home.xml
│ └── screen_settings.xml
├── images/
│ └── logo.png
├── fonts/
│ └── FONTS-MISSING.md
└── .lvgl-flow/