Tenant storefront — demo
Theme resolved via brands.theme_slug + brands.theme_config (SSR layout.tsx §17.5). Query ?theme=slug or header X-Brand-Slug overrides for preview; fallback is clinic-clean.
Current override param: astro-mystic • Try: ?theme=astro-mystic · ?theme=derma-soft · ?theme=legal-trust
GET /api/v1/brand/config
Returns theme_slug + theme_config so Flutter stays in sync (same --brand-* vars). ISR 60s + Cache-Tag: brand:{id}
{
"brand": "demo",
"theme_slug": "astro-mystic",
"theme_config": { "radius": "…", "colors": { "primary": "…"} }
}Brand Admin → Appearance
Pick theme → Apply (localStorage) → POST /api/v1/admin/appearance/theme → Cache-Tag bust.
Open Appearance → Web Theme