Skip to content

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.

ConditionResult
enterprise.enabled is false, or dashboard.branding.productName is emptyThe chart emits no NEXT_PUBLIC_BRAND_* variables. The dashboard shows the Omnia brand.
Enterprise is on and the licence carries the whiteLabel entitlementThe 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 whiteLabelThe 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.

All values sit under dashboard.branding. Every leaf value is a string; colors and colorsDark are maps of strings.

ValueEnv varEffect
productNameNEXT_PUBLIC_BRAND_PRODUCT_NAMESidebar title, browser tab title (<productName> Dashboard), sign-in and sign-up headings, upgrade copy. Required: the chart emits nothing without it.
logoDarkUrlNEXT_PUBLIC_BRAND_LOGO_DARKLogo in the sidebar (rendered 28 px square). Default /logo-omnia.svg.
faviconUrlNEXT_PUBLIC_BRAND_FAVICONBrowser tab icon. Default /favicon.svg.
ogImageUrlOMNIA_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.
colorsNEXT_PUBLIC_BRAND_COLORSColour map, as JSON in the variable. Applies in both themes.
colorsDarkNEXT_PUBLIC_BRAND_COLORS_DARKColour map for the dark theme, as JSON in the variable.
fonts.familyNEXT_PUBLIC_BRAND_FONT_FAMILYInterface font. Sets --font-sans to the family followed by ui-sans-serif, system-ui, sans-serif.
fonts.monoNEXT_PUBLIC_BRAND_FONT_MONOMonospace font. Sets --font-mono to the family followed by ui-monospace, "SF Mono", monospace.
fonts.urlNEXT_PUBLIC_BRAND_FONT_URLStylesheet URL, loaded with a <link rel="stylesheet">. A raw font file does not work.
links.salesNEXT_PUBLIC_BRAND_SALESSales contact on licence gates.
links.upgradeUrlNEXT_PUBLIC_BRAND_UPGRADE_URLUpgrade link on licence gates and advisories.
customCssNEXT_PUBLIC_BRAND_CUSTOM_CSSDeclarations 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.

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.

KeyCSS variableUsed for
primary--primaryInline emphasis and links styled text-primary, flow-graph edges and handles. Feeds --accent-inter.
primaryAction--brand-goldThe gold primary-action accent (--accent-primary): the primary button variant, star icons.
accent--accentHover and focus background in menus and ghost buttons.
sidebar--sidebarSidebar surface.
background, foreground--background, --foregroundPage canvas and text.
card--cardCard and panel surface.
muted, mutedForeground--muted, --muted-foregroundSubdued surface and text.
border--borderBorders.
success, warning, info--success, --warning, --infoStatus colours.
chart1 to chart5--chart-1 to --chart-5Data-series colours.
category1 to category8--category-1 to --category-8Categorical colours (graph nodes, badges).

No key sets --destructive, --input or --ring.

The dashboard emits three rules, in this order:

  1. colors and fonts in :root, :root[data-theme].
  2. colorsDark in :root.dark, :root[data-theme="dark"]. It wins over colors in the dark theme.
  3. customCss in :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 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:

AliasFollows
--bg-appbackground
--surface-1, --surface-cardcard
--surface-2muted
--border-defaultborder
--accent-primaryprimaryAction
--accent-interprimary
--status-healthysuccess
--status-pendingwarning

--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:

RoleKeys
Text, brightest to faintesttextStrong, textHeading, textBody, textEmphasis, textSecondary, textSubtle, textMuted, textInactive, textFaint, textFine, textDisabled
Text, specialtextData, textLink, textOnGold, neutralTint
Surfaces and borderssurfaceCode, surfaceTile, borderFaint
Key accent (gold)accentPrimaryText, accentPrimaryTint, accentPrimaryBorder, accentPrimaryGlow
Second accentaccentSecondary, accentSecondaryTint
InteractionaccentInterSoft, accentInterTint, accentInterBorder, accentNode
StatusstatusHealthyText, 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.

ItemRule
Logo and favicon valuesA URL the browser fetches, or a path served by the dashboard. The chart uploads nothing.
Dashboard static pathFiles 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 CSPThe default img-src allows 'self', data:, blob: and https:. A plain http: image URL is blocked.
Font CSPThe default style-src allows https://fonts.googleapis.com and font-src allows https://fonts.gstatic.com.
Custom CSPOMNIA_CSP_POLICY replaces the whole default policy. Include every directive you still need.

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.

ControlBehaviour
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/themeRenders status badges, buttons, a card, category and chart swatches, and a graph sample. Returns 404 outside dev and demo mode.
NEXT_PUBLIC_BRAND_PRESETPins a preset on the server. It takes effect only with NEXT_PUBLIC_DEMO_MODE=true. Values: omnia, acme, nebula.

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.