Themes
What the themes marketplace is, how it relates to mini-apps, and the in-app theming model the car applies.
A theme restyles the i99dash head-unit: colors, wallpapers, corner
radii, and typography. Unlike a mini-app, a theme runs no code — it is a
single ThemeSpec JSON document the car reads and maps onto its own
ThemeData. Users browse, install, and switch themes from
Settings → Appearance → Themes.
Themes reuse the mini-app catalog machinery wholesale: the same publish
CLI shape, the same .i99theme bundle packer, the same
requires/evaluateCompatibility compatibility gate, and the same
versioned-CDN distribution. If you have shipped a mini-app, the theme
flow will feel identical — i99dash theme <init|validate|build|publish>.
Themes vs mini-apps
| Mini-app | Theme | |
|---|---|---|
| What it is | A sandboxed web bundle (HTML/JS/CSS) | A ThemeSpec JSON design-token document |
| Runs code | Yes (in a web view) | No — the car paints from the spec |
| Manifest field that drives it | url (the WebView origin) | spec (inline design tokens) |
| Permissions / driving surface | permissions, safeWhileDriving | None — a theme only paints |
| Bundle | .tar.gz of static files | .i99theme (tar.gz of theme.json + assets) |
| CLI group | i99dash <init|build|validate|publish> | i99dash theme <init|build|validate|publish> |
| Catalog | GET /api/v1/mini-apps | GET /api/v1/themes |
A theme has no host privilege. It is not an Android RRO overlay and it does not touch the system; it only changes how the i99dash app draws its own surfaces.
The theming model
A theme is the inline spec object inside a ThemeManifest.
The car's AppTheme.fromSpec() reads it and builds a Flutter
ThemeData:
- The 8 surface colors map 1:1 onto the car's internal palette
(background through
onSurfaceVariant). accent/secondary/errormap onto the MaterialColorScheme.- Optional
wallpaper,typography,shape, andgaugeblocks layer on top; omit any of them to keep today's look.
brightness ("light" or "dark") selects the base. The feature ships
inert: with no theme selected the car renders exactly its built-in
default, because that default is itself expressed as a built-in spec.
See the full token tables in the ThemeSpec reference.
Where users pick themes
Themes install from the catalog and apply instantly — no reboot. The
car persists the active theme's id locally; switching to another theme
or back to the built-in default is a one-tap change under
Settings → Appearance → Themes. Because id is what the car stores,
it is immutable post-publish — bump version to ship an update, never
rotate id.
Start here
Building a theme
Scaffold, author the ThemeSpec, validate, build the .i99theme bundle, and publish.
ThemeManifest reference
Every field of theme.json — id, name, icon, version, category, requires, and the inline spec.
ThemeSpec reference
The design tokens the car paints: colors, wallpaper, typography, shape, gauge.
Categories
The 11 closed theme-category slugs the catalog groups by.