OpenClaw EnterpriseDOCSGitHub

Console theme bundles

Set the API's OCC_CONSOLE_THEME_DIR to an absolute directory containing theme.json and referenced image files. Themes apply to the whole deployment, including public sign-in and error pages. They configure presentation; they do not change Installation identity, permissions, or Agent runtime interfaces. See Apply a console theme for mounting and recovery.

With the variable absent, the console uses bundled OpenClaw Enterprise branding. Startup reads the complete bundle before listening and retains those bytes until the API restarts. Invalid configured bundles stop startup with CONSOLE_THEME_INVALID; omitted fields inherit bundled defaults.

Manifest

json
{  "schemaVersion": 1,  "displayName": "Example Agents",  "logo": "logo.png",  "favicon": "favicon.png",  "appleTouchIcon": "touch.png",  "colors": {    "accent": "#2457C5",    "accentHover": "#19439F",    "accentSubtle": "#2457C514",    "onAccent": "#FFFFFF"  }}

Only schemaVersion is required; its value must be 1. Unknown fields and color roles are rejected. displayName is nonblank text of at most 80 Unicode code points, without control or formatting characters. It appears in desktop and mobile navigation, sign-in and public errors, the browser title, and initial loading text. Long names wrap in the sidebar and truncate in the mobile bar; their full text remains accessible. Build diagnostics retain OCC/OCE terminology.

Image fields are simple filenames, not URLs or paths. Logo and touch icons accept PNG and WebP; favicons accept PNG and ICO. Extensions must match file signatures. SVG, custom CSS/JavaScript, external image URLs, custom fonts, and browser uploads are unsupported. Unreferenced files are neither loaded nor served. Referenced files, including ConfigMap projection symlinks, must resolve inside the directory. The bundle is trusted deployment configuration. Only deployment administrators may write its files or replace directories in its path; the loader's path checks do not isolate files from an untrusted process that can change the mount during startup.

The manifest limit is 64 KiB; each image is limited to 256 KiB. The manifest and distinct referenced images together must fit 768 KiB. These bounds support a single operator-managed Kubernetes ConfigMap. Supply appropriately sized images: navigation logos fit within 48 × 48 pixels and keep their aspect ratio. Sign-in logos fit within 40 × 40 pixels.

Color roles

Colors accept #RRGGBB or #RRGGBBAA. CSS expressions are rejected. The generated stylesheet overrides semantic tokens after the bundled styles without changing typography, spacing, or layout. A translucent bg blends once with the browser’s canvas color. A modal dims that same background across the page and any empty scrollbar gutter.

Roles Surfaces
bg, surface, surface2, surfaceHover Page, cards, secondary panels, hover backgrounds
border, borderStrong Separators and control borders
text, textStrong, textMuted Body text, headings, secondary text
accent, accentHover, accentSubtle, onAccent Primary controls, hover, accent backgrounds, text on accent
link, focus Links and keyboard focus rings
success, successSubtle Success text and backgrounds
warning, warningSubtle Warning text and backgrounds
danger, dangerSubtle Destructive actions, failures, and their backgrounds
info, infoSubtle Informational text and backgrounds
overlay Modal backdrop

Provider and plugin artwork keeps its own colors. Operators must check their palette's contrast for text, disabled and enabled controls, focus rings, and status messages. Retain text labels that distinguish success, warning, and failure; color alone must not communicate their meaning.

Public assets and lifecycle

All theme content is public before authentication. Never put credentials or private information in a bundle. The API serves generated CSS and referenced images under /console/theme/; it does not publish theme.json or a directory listing. Missing theme assets return a plain 404, not the console shell. The shell and assets use Cache-Control: no-store.

Replacing files does not change a running API's snapshot. Restart the API after replacement; in Helm, change the ConfigMap name or api.consoleTheme.checksum. Workers, bootstrap, migrations, and Agent Pods do not load the theme. See the console flow for implementation and browser checks for verification boundaries.

Search documentation