Customize Branding (Whitelabel)
Set your own app name, logo, favicon, footer disclaimer, and policy URLs for Self-Managed Kindo. Use environment-variable defaults for branding across the install, and the CUSTOM_WHITELABEL feature flag for per-organization changes.
How branding resolves
Section titled “How branding resolves”Branding uses the first available value in this order:
- The
CUSTOM_WHITELABELvariant payload matching the organization’sorgId. - The environment-variable default for that field.
- The built-in Kindo default for an optional field without an environment-variable value.
Omit a payload field to inherit its environment-variable default. appName also changes the API documentation titles; the other fields affect only the web app.
Environment-variable defaults
Section titled “Environment-variable defaults”The charts ship Kindo defaults for every field, so no branding settings are required to install. Set the values below to rebrand. Services use these defaults when CUSTOM_WHITELABEL is off or a payload omits a field.
| Environment variable | Service | Set to rebrand | Purpose |
|---|---|---|---|
NEXT_PUBLIC_DEFAULT_APP_NAME | next | Yes | Product name in the web app |
NEXT_PUBLIC_DEFAULT_LOGO_URL | next | Yes | HTTPS URL to the logo image |
NEXT_PUBLIC_DEFAULT_FAVICON_URL | next | Yes | HTTPS URL to the favicon |
NEXT_PUBLIC_DEFAULT_PRIVACY_URL | next | Yes | HTTPS URL to the privacy policy |
NEXT_PUBLIC_DEFAULT_TERMS_OF_USE_URL | next | Yes | HTTPS URL to the terms of use |
NEXT_PUBLIC_DEFAULT_TERMS_OF_SERVICE_URL | next | Yes | HTTPS URL to the terms of service |
NEXT_PUBLIC_DEFAULT_MARKETING_WEBSITE_CONTACT_URL | next | Yes | HTTPS URL for the “Contact us” link |
NEXT_PUBLIC_DEFAULT_PUBLIC_DOCS_URL | next | No | HTTPS URL to your Kindo Docs site |
NEXT_PUBLIC_DEFAULT_DISCLAIMER | next | No | Footer disclaimer text |
NEXT_PUBLIC_DEFAULT_DISCLAIMER_POLICY_URL | next | No | HTTPS URL linked from the disclaimer |
DEFAULT_APP_NAME | api, task-worker-ts | Yes | Product name in API documentation and server-rendered text |
DEFAULT_PUBLIC_DOCS_URL | task-worker-ts | No | Base URL for Kindo Docs search results |
Configured URL fields must use HTTPS. DEFAULT_PUBLIC_DOCS_URL is empty by default on Self-Managed Kindo installs, so documentation search stays off until you set it.
To set global defaults:
-
Set and apply the web app’s branding:
Terminal window kindo config override set next NEXT_PUBLIC_DEFAULT_APP_NAME="Acme AI" NEXT_PUBLIC_DEFAULT_LOGO_URL=https://cdn.acme.example.com/logo.svgkindo config override apply next -
Set and apply the corresponding application name on the backend services:
Terminal window kindo config override set api DEFAULT_APP_NAME="Acme AI"kindo config override apply apikindo config override set task-worker-ts DEFAULT_APP_NAME="Acme AI"kindo config override apply task-worker-ts -
Set the remaining values from the table with the same commands for their named services. See Service overrides.
With an external secrets store, kindo config override refuses to run. Set the same keys as chart values and apply them:
kindo config helm-override set next 'envData.NEXT_PUBLIC_DEFAULT_APP_NAME=Acme AI' envData.NEXT_PUBLIC_DEFAULT_LOGO_URL=https://cdn.acme.example.com/logo.svgkindo config helm-override apply nextkindo config helm-override set api 'envData.DEFAULT_APP_NAME=Acme AI'kindo config helm-override apply apikindo config helm-override set task-worker-ts 'envData.DEFAULT_APP_NAME=Acme AI'kindo config helm-override apply task-worker-tsKindo Docs search requires the KINDO_DOCS_SEARCH flag, a DEFAULT_PUBLIC_DOCS_URL pointing to a Kindo Docs site from the same documentation release as your install, and a disabled CUSTOM_WHITELABEL variant for the requesting organization. An enabled variant disables documentation search, including when publicDocsUrl is set or the payload is invalid.
Variant payload schema
Section titled “Variant payload schema”Use a JSON payload to override fields for an organization. All fields are optional; omitted fields inherit the environment-variable defaults.
| Field | Type | Purpose |
|---|---|---|
appName | string | Product name in the web app, API documentation, and server-rendered titles |
logoUrl | HTTPS URL | Top navigation and login logo |
faviconUrl | HTTPS URL | Browser tab favicon |
disclaimer | string | Footer disclaimer text |
dashboardDisclaimer | string | Dashboard disclaimer; falls back to disclaimer when omitted |
disclaimerPolicyUrl | HTTPS URL | Link from the disclaimer |
privacyUrl | HTTPS URL | Privacy policy link |
termsOfUseUrl | HTTPS URL | Terms of use link |
termsOfServiceUrl | HTTPS URL | Terms of service link |
marketingWebsiteContactUrl | HTTPS URL | ”Contact us” link |
publicDocsUrl | HTTPS URL | Public docs link |
An invalid payload, such as malformed JSON, a non-HTTPS URL, or a wrong type, produces a warning in the logs. Branding falls back to the environment-variable defaults for the entire payload.
Example payload
Section titled “Example payload”{ "appName": "Acme AI", "logoUrl": "https://cdn.acme.example.com/branding/logo.svg", "faviconUrl": "https://cdn.acme.example.com/branding/favicon.png", "disclaimer": "Acme AI is for internal use only. Do not paste customer PII.", "disclaimerPolicyUrl": "https://acme.example.com/legal/ai-policy", "privacyUrl": "https://acme.example.com/legal/privacy", "termsOfUseUrl": "https://acme.example.com/legal/terms", "termsOfServiceUrl": "https://acme.example.com/legal/tos", "marketingWebsiteContactUrl": "https://acme.example.com/contact", "publicDocsUrl": "https://docs.acme.example.com"}Configure branding for an org
Section titled “Configure branding for an org”-
Sign in to Unleash at
https://unleash.<your-base-domain>with usernameadmin. Readunleash.adminPasswordin the secrets config, then quit the editor without saving:Terminal window kindo config edit -
Find the
CUSTOM_WHITELABELflag. -
Add a variant named for the target organization, such as
acme-prod. Select payload typestringand paste the JSON payload from the example above into the Payload field. -
Add a strategy matching the target organization. Use a Gradual rollout strategy with an
orgId IN [<org-uuid>]constraint and 100% rollout so every request from that organization uses the variant. -
Enable the flag in the target environment, typically
production. -
Verify the branding. Sign in to Kindo as a user of the target organization and check the app name, logo, favicon, and disclaimer. Sign in as a user of another organization and confirm the environment-variable defaults still apply there.
Global branding without per-org overrides
Section titled “Global branding without per-org overrides”For the same branding across all organizations, leave CUSTOM_WHITELABEL off and set NEXT_PUBLIC_DEFAULT_* and DEFAULT_APP_NAME using the override commands above. Set DEFAULT_PUBLIC_DOCS_URL on task-worker-ts when documentation search results should link to your Kindo Docs site from the same documentation release as your install.
Troubleshooting
Section titled “Troubleshooting”| Symptom | Likely cause | Fix |
|---|---|---|
| Branding shows Kindo defaults even with the flag enabled | Branding defaults are unset and the payload does not supply them | Set and apply the values using the override commands above |
| Logo or favicon does not load | Asset URL uses http:// | Re-host the asset over HTTPS |
| Variant payload is ignored | Invalid JSON, URL, or field type | Check api and next pod logs for Invalid CUSTOM_WHITELABEL payload or Failed to parse warnings |
| Wrong organization sees the branding | Variant strategy is missing the orgId constraint | Add a Gradual rollout strategy with an orgId IN [...] constraint and 100% rollout |
| Branding flickers between defaults and the override | Branding can take a short time to appear after a payload change | Wait briefly and check again |
