Problem
The web app hardcodes NimbleBrain branding — logo, app name, colors, fonts, favicon. Tenants can customize agentName and theme (light/dark), but not the visual identity. A tenant should be able to have their own logo, colors, and app name without a fork.
Current State
Already parameterized (backend/infra):
tenant.agentName → agent display name in system prompt
tenant.theme → light/dark/system preference
ingress.customDomain / customDomainCertArn → custom domain support (defined in Helm, unused)
Hardcoded in web app:
Logo.tsx — imports nimblebrain-icon-color-square.png, renders "NimbleBrain" text
index.html — page title "NimbleBrain", favicon, font imports
bridge/theme.ts — fixed color tokens (primary blue #0055FF, surface colors)
Login.tsx — API key placeholder "nb_..."
Proposed Solution
1. Add tenant.brand to Helm values:
tenant:
brand:
name: "Acme"
logoUrl: "/assets/acme-logo.png" # or external URL
faviconUrl: "/assets/acme-favicon.png"
apiKeyPrefix: "acme_"
colors:
primary: "#6C3AED"
accent: "#A78BFA"
surfaceLight: "#FAF9F7"
surfaceDark: "#0A0A09"
fonts:
body: "Inter"
heading: "Cal Sans"
code: "JetBrains Mono"
2. Expose brand config via /v1/config API response (already serves tenant config to the web app).
3. Web app consumes brand config:
Logo.tsx reads brand.name and brand.logoUrl from config context
index.html title/favicon set dynamically on app init
- Theme tokens overridden with
brand.colors via CSS custom properties
Login.tsx uses brand.apiKeyPrefix for placeholder
- Font imports loaded dynamically or pre-built per tenant
4. Defaults: When tenant.brand is omitted, fall back to current NimbleBrain branding (zero breaking change for existing tenants).
Scope
Out of Scope (future)
- Custom CSS injection (full stylesheet override)
- Per-tenant email templates
- Custom agent persona/voice beyond
agentName
Problem
The web app hardcodes NimbleBrain branding — logo, app name, colors, fonts, favicon. Tenants can customize
agentNameandtheme(light/dark), but not the visual identity. A tenant should be able to have their own logo, colors, and app name without a fork.Current State
Already parameterized (backend/infra):
tenant.agentName→ agent display name in system prompttenant.theme→ light/dark/system preferenceingress.customDomain/customDomainCertArn→ custom domain support (defined in Helm, unused)Hardcoded in web app:
Logo.tsx— importsnimblebrain-icon-color-square.png, renders "NimbleBrain" textindex.html— page title "NimbleBrain", favicon, font importsbridge/theme.ts— fixed color tokens (primary blue#0055FF, surface colors)Login.tsx— API key placeholder"nb_..."Proposed Solution
1. Add
tenant.brandto Helm values:2. Expose brand config via
/v1/configAPI response (already serves tenant config to the web app).3. Web app consumes brand config:
Logo.tsxreadsbrand.nameandbrand.logoUrlfrom config contextindex.htmltitle/favicon set dynamically on app initbrand.colorsvia CSS custom propertiesLogin.tsxusesbrand.apiKeyPrefixfor placeholder4. Defaults: When
tenant.brandis omitted, fall back to current NimbleBrain branding (zero breaking change for existing tenants).Scope
brandschema to tenant values templatebrandin/v1/configAPI responseLogo.tsxto read from config contextbrand.colorsbrand.fontsLogin.tsxplaceholder from configOut of Scope (future)
agentName