Ship default logos so unbranded hosts render a real lockup

Fixkamolos
Shipped
May 18, 2026 at 2:58 AM UTC
Author
Kamo
Commit
6ba9770

Ported ThemeLogo dropped the local-file fallback the kamo-internal original had, so any host whose tenant MinIO bucket hadn't been provisioned (or doesn't exist at all) silently degraded to a text wordmark. The defaults were sitting in kamo-internal/public/ the whole time — copied them over. - public/logo.svg + public/logo-full.svg copied verbatim from kamo-internal's defaults (the K-leaf mark, primary green #98AA42). - ThemeLogo.candidates() now appends /logo-full.svg and /logo.svg to the fallback chain AFTER the tenant MinIO URLs. Tenant assets win when present; otherwise the local fallback renders. - ThemeLogo no longer bails when getThemePath() returns empty — local fallbacks alone are still a valid list. - Cache-bust is skipped for /-prefixed local paths (Next.js owns caching for those). - SSR <link rel="preload"> in app/layout.tsx targets /logo-full.svg when no tenant path resolves, so the header doesn't flash the wordmark before the image arrives. Build 32/32.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing