Dashboard branding reference
The dashboard reads one brand configuration and writes it into the page as CSS
variables. The configuration comes from dashboard.branding in the Helm values.
For the steps, see White-label the dashboard.
Gating
Section titled “Gating”| Condition | Result |
|---|---|
enterprise.enabled is false, or dashboard.branding.productName is empty | The chart emits no NEXT_PUBLIC_BRAND_* variables. The dashboard shows the Omnia brand. |
Enterprise is on and the licence carries the whiteLabel entitlement | The dashboard applies the brand. |
| Enterprise is on, no licence (dev mode) | Dev mode grants every entitlement, so the dashboard applies the brand. |
Enterprise is on and the licence lacks whiteLabel | The dashboard shows the Omnia brand. |
The dashboard is static files built once for every install, so the first HTML
carries the Omnia brand. The page applies the brand /api/v1/config answers
once it has loaded, the browser tab title and favicon included, gated by the
licence the operator serves. A link-preview scraper runs no JavaScript, so a
pasted link unfurls with the Omnia title and the card at /og-image.png;
ogImageUrl points that card at your own.
Helm values
Section titled “Helm values”All values sit under dashboard.branding. Every leaf value is a string; colors and colorsDark are maps of strings.
| Value | Env var | Effect |
|---|---|---|
productName | NEXT_PUBLIC_BRAND_PRODUCT_NAME | Sidebar title, browser tab title (<productName> Dashboard), sign-in and sign-up headings, upgrade copy. Required: the chart emits nothing without it. |
logoDarkUrl | NEXT_PUBLIC_BRAND_LOGO_DARK | Logo in the sidebar (rendered 28 px square). Default /logo-omnia.svg. |
faviconUrl | NEXT_PUBLIC_BRAND_FAVICON | Browser tab icon. Default /favicon.svg. |
ogImageUrl | OMNIA_OG_IMAGE_URL (dashboard pod) | An HTTPS URL of your link-preview card, a 1200x630 PNG. /og-image.png redirects to it. Default: the Omnia card. |
colors | NEXT_PUBLIC_BRAND_COLORS | Colour map, as JSON in the variable. Applies in both themes. |
colorsDark | NEXT_PUBLIC_BRAND_COLORS_DARK | Colour map for the dark theme, as JSON in the variable. |
fonts.family | NEXT_PUBLIC_BRAND_FONT_FAMILY | Interface font. Sets --font-sans to the family followed by ui-sans-serif, system-ui, sans-serif. |
fonts.mono | NEXT_PUBLIC_BRAND_FONT_MONO | Monospace font. Sets --font-mono to the family followed by ui-monospace, "SF Mono", monospace. |
fonts.url | NEXT_PUBLIC_BRAND_FONT_URL | Stylesheet URL, loaded with a <link rel="stylesheet">. A raw font file does not work. |
links.sales | NEXT_PUBLIC_BRAND_SALES | Sales contact on licence gates. |
links.upgradeUrl | NEXT_PUBLIC_BRAND_UPGRADE_URL | Upgrade link on licence gates and advisories. |
customCss | NEXT_PUBLIC_BRAND_CUSTOM_CSS | Declarations appended inside a :root { } rule. |
Four single-colour variables override the same key in
NEXT_PUBLIC_BRAND_COLORS: NEXT_PUBLIC_BRAND_COLOR_PRIMARY,
NEXT_PUBLIC_BRAND_COLOR_PRIMARY_ACTION, NEXT_PUBLIC_BRAND_COLOR_ACCENT and
NEXT_PUBLIC_BRAND_COLOR_SIDEBAR. The chart emits the primary, accent and sidebar
ones from colors.primary, colors.accent and colors.sidebar.
A logo, favicon or link left empty falls back to the Omnia value.
Colour keys
Section titled “Colour keys”colors and colorsDark take the camelCase keys in the tables below, not the CSS
variable names. A key not listed here is ignored. A value that is not a non-empty
string is dropped.
| Key | CSS variable | Used for |
|---|---|---|
primary | --primary | Inline emphasis and links styled text-primary, flow-graph edges and handles. Feeds --accent-inter. |
primaryAction | --brand-gold | The gold primary-action accent (--accent-primary): the primary button variant, star icons. |
accent | --accent | Hover and focus background in menus and ghost buttons. |
sidebar | --sidebar | Sidebar surface. |
background, foreground | --background, --foreground | Page canvas and text. |
card | --card | Card and panel surface. |
muted, mutedForeground | --muted, --muted-foreground | Subdued surface and text. |
border | --border | Borders. |
success, warning, info | --success, --warning, --info | Status colours. |
chart1 to chart5 | --chart-1 to --chart-5 | Data-series colours. |
category1 to category8 | --category-1 to --category-8 | Categorical colours (graph nodes, badges). |
No key sets --destructive, --input or --ring.
Precedence
Section titled “Precedence”The dashboard emits three rules, in this order:
colorsandfontsin:root, :root[data-theme].colorsDarkin:root.dark, :root[data-theme="dark"]. It wins overcolorsin the dark theme.customCssin:root.
The :root rule has lower specificity than the first two. A variable set by
colors, or by the dashboard’s own :root[data-theme] alias rules, overrides
the same variable in customCss. The dashboard does not validate customCss.
Declare custom properties only. Targeting selectors or internal component
classes is unsupported.
The default theme is dark. The default sidebar stays dark in the light theme.
Atlas aliases
Section titled “Atlas aliases”Atlas components read semantic aliases, never the raw palette. A brand that sets an alias re-themes every component that reads it.
Some aliases follow the colour keys:
| Alias | Follows |
|---|---|
--bg-app | background |
--surface-1, --surface-card | card |
--surface-2 | muted |
--border-default | border |
--accent-primary | primaryAction |
--accent-inter | primary |
--status-healthy | success |
--status-pending | warning |
--border-strong follows --input and --status-error follows --destructive.
No colour key sets either, so set statusErrorText, statusErrorTint and
statusErrorBorder to change error colours.
The other aliases keep Atlas’s values unless you set them directly in colors
and colorsDark:
| Role | Keys |
|---|---|
| Text, brightest to faintest | textStrong, textHeading, textBody, textEmphasis, textSecondary, textSubtle, textMuted, textInactive, textFaint, textFine, textDisabled |
| Text, special | textData, textLink, textOnGold, neutralTint |
| Surfaces and borders | surfaceCode, surfaceTile, borderFaint |
| Key accent (gold) | accentPrimaryText, accentPrimaryTint, accentPrimaryBorder, accentPrimaryGlow |
| Second accent | accentSecondary, accentSecondaryTint |
| Interaction | accentInterSoft, accentInterTint, accentInterBorder, accentNode |
| Status | statusHealthyText, statusHealthyTint, statusHealthyBorder, statusPendingText, statusPendingTint, statusPendingBorder, statusErrorText, statusErrorTint, statusErrorBorder |
Each key maps to the kebab-case CSS variable of the same name, for example
accentPrimaryTint to --accent-primary-tint. A tint or border is its own
colour, not derived from its base. A brand that moves primaryAction should
also move accentPrimaryTint and accentPrimaryBorder.
Assets and fonts
Section titled “Assets and fonts”| Item | Rule |
|---|---|
| Logo and favicon values | A URL the browser fetches, or a path served by the dashboard. The chart uploads nothing. |
| Dashboard static path | Files in /usr/share/nginx/html/ are served at the site root. /usr/share/nginx/html/brand/logo.svg is served at /brand/logo.svg. |
| Bundled assets | /usr/share/nginx/html holds the dashboard itself: the default favicon, logos and the presets/ images among it. |
| Image CSP | The default img-src allows 'self', data:, blob: and https:. A plain http: image URL is blocked. |
| Font CSP | The default style-src allows https://fonts.googleapis.com and font-src allows https://fonts.gstatic.com. |
| Custom CSP | OMNIA_CSP_POLICY replaces the whole default policy. Include every directive you still need. |
Preview controls
Section titled “Preview controls”These controls exist only when the dashboard runs with NEXT_PUBLIC_DEV_MODE=true
(the chart sets it in dev mode) or NEXT_PUBLIC_DEMO_MODE=true.
| Control | Behaviour |
|---|---|
| More actions menu, Brand preset (dev) | Submenu with the presets Omnia (default), Acme Cloud and Nebula. Selecting one overrides the brand in the browser only. |
/dev/theme | Renders status badges, buttons, a card, category and chart swatches, and a graph sample. Returns 404 outside dev and demo mode. |
NEXT_PUBLIC_BRAND_PRESET | Pins a preset on the server. It takes effect only with NEXT_PUBLIC_DEMO_MODE=true. Values: omnia, acme, nebula. |
Contributor rule
Section titled “Contributor rule”Dashboard components use design tokens, never Tailwind palette classes such as
bg-blue-600. The CI step hack/check-no-hardcoded-palette.sh fails a change that
adds one in a file not listed in hack/no-hardcoded-palette.allowlist. The
allowlist covers third-party vendor and framework brand swatches, skeuomorphic
affordances and fixed-dark canvas chrome. The ESLint rule
atlas/no-raw-color-ramp fails the build on a read of a raw colour ramp such as
--star-600.