Developers · White label

Operator console
appearance.

Set dark or light mode, four colors, a sans family, and a raster logo. Or provision a fuller theme file. AAES runs on your infrastructure.

Settings appearance

The operator console is a React application served by the AAES process on a separate listener. Open Settings > Appearance to set dark or light mode, four colors (accent, background, surface, text), a sans family string, and a raster logo. Only an administrator may write appearance settings. Appearance is stored per tenant, not per user.

The Settings editor does not download a font file. The sans field is a family string for the system stack.

Appearance routes

These routes belong to the operator console listener. They are not part of the daemon API contract, and they are not available at AAES_ENDPOINT.

Operator appearance endpoints
Method and routeBehavior
GET /api/themeReturns the per-tenant theme JSON. Returns 404 if no theme store exists.
GET /api/settings/appearanceReads the Settings editor document over the stored theme.
POST /api/settings/appearanceWrites through the editor facade. Administrator access is required. Writes are revision-checked and return 409 on a stale revision.

Settings editor document

The Settings screen saves this narrower document. The example is the editor shape, not the revision-checked POST envelope, and not a provisioned theme file.

{
  "appearance": "dark",
  "accent": "#9295eb",
  "bg": "#08090a",
  "surface": "#101113",
  "text": "#f1f2f3",
  "font_sans": "Inter, sans-serif",
  "logo": {
    "data_url": "data:image/png;base64,...",
    "alt": "Organization logo"
  }
}

Logos are PNG, JPEG, WebP, or a raster data URL. SVG is refused. A theme cannot vet markup, and SVG can carry script.

Provisioned theme file

Provisioning can place a fuller theme file with more color tokens, optional font URLs, and a logo path under /tenant-assets/. Font files and managed assets are provisioning-only; the Settings editor does not upload them. This example illustrates the theme document. Do not infer a write envelope from it.

{
  "version": 1,
  "appearance": "dark",
  "colors": {
    "bg": "#08090a",
    "surface": "#101114",
    "surface2": "#18191d",
    "text": "#f2f2f4",
    "muted": "#b4b5be",
    "dim": "#858792",
    "line": "rgba(255,255,255,.08)",
    "accent": "#9295eb",
    "accent-soft": "rgba(146,149,235,.12)",
    "ok": "#91c8aa",
    "warn": "#d6bd83",
    "bad": "#dc9292"
  },
  "fonts": {
    "sans": {
      "family": "system-ui",
      "url": null
    },
    "mono": {
      "family": "monospace",
      "url": null
    }
  },
  "logo": {
    "url": "/tenant-assets/logo.png",
    "alt": "Organization logo"
  }
}

A null font URL selects the family's system stack. A non-null font URL must point at a managed asset under /tenant-assets/.

Managed assets

Provisioned font and logo URLs must point to files under /tenant-assets/{name}. External CDNs and path traversal are refused. Assets are placed by provisioning.

  • GET /tenant-assets/{name} serves the managed file.
  • Asset requests require operator authentication.
  • A theme asset URL is not a public, unauthenticated asset endpoint.

Not implemented

Custom domains, certificates, branded login, and embedding are not implemented. Theme support does not establish those integrations. Evidence provenance and verification keys remain identifiable when presentation is customized.

Scope a white-label evaluation with the surfaces and deployment model you need.

Build your own UI

Build an agent-facing interface against the daemon's OpenAPI 3.1 contract and the Go, Python, or TypeScript SDKs.

Daemon callers use AAES_ENDPOINT and present an operator-issued bearer token through AAES_TOKEN. The credential resolves the tenant. For /v1/action and /v1/brokered, request bodies include tenant_id and actor_id claims that must match the authenticated caller; the SDKs fill them. Other operations derive identity from authentication and may reject these fields. Follow each operation's schema.

A full administrative replacement needs the separate operator-session API, role checks, and CSRF protection. Agent SDKs do not provide policy publication, identity administration, or every console workflow.

Keep console JSON routes out of this integration contract. Routes such as /api/approvals, /api/spend, /api/records, and the appearance routes above belong to the operator console listener, not the daemon API.

Remaining integration notes ship with the evaluation package. Do not infer an appearance revision field or write payload from the theme example.

Need appearance integration details beyond this reference? Contact hello@aaes.ai.