Skip to content

Theming

Claudette ships with 14 built-in themes — built on the Claude Design token system — and supports custom themes you can create and share.

Open Settings > Appearance (or press ⌘/Ctrl + ,) and select a theme from the dropdown.

Claudette Appearance settings showing the theme picker dropdown with built-in theme options

Enable Follow system to let Claudette automatically switch themes based on your OS light/dark preference. When active, two independent theme selectors appear — one for dark mode and one for light mode — so you can pair any built-in or custom theme with either OS state.

Claudette Appearance settings with Follow system enabled, showing separate dark and light theme selectors

The switch takes effect immediately whenever your OS preference changes, with no restart required.

ThemeStyle
Default DarkClaudette’s signature theme — coral on warm charcoal (default)
Default LightCream paper with deep coral accents
JellybeansDark Vim-inspired palette with cool slate accent
High ContrastMaximum legibility with cyan accent
Rosé PineSoho-vibes dark with iris accent
Rosé Pine MoonRosé Pine on warmer navy base
Rosé Pine DawnRosé Pine light — cream parchment with iris accent
Solarized DarkSchoonover’s canonical dark with blue accent
Solarized LightSolarized inverted monotones with identical accents
BrinkMid-tone warm chrome with Ristretto-style gold accent
Jellybeans MutedSofter, desaturated take on Jellybeans
Midnight BlueCool blue-tinted dark theme
Warm EmberWarm amber-toned dark theme
SidekickShip Sidekick brand — deep navy with electric violet

Create your own themes by placing JSON files in:

~/.claudette/themes/

Each file must be valid JSON with the following structure:

{
"id": "my-custom-theme",
"name": "My Custom Theme",
"author": "Your Name",
"description": "A brief description of the theme",
"colors": {
"color-scheme": "dark",
"accent-primary": "#e07850",
"accent-primary-rgb": "224, 120, 80",
"app-bg": "rgb(28, 24, 21)",
"text-primary": "rgb(240, 235, 229)"
}
}
FieldTypeDescription
idstringUnique identifier (used internally)
namestringDisplay name shown in the theme picker
colorsobjectMap of CSS custom property names to values
FieldTypeDescription
authorstringTheme author name
descriptionstringBrief description
  • Maximum file size: 1 MB
  • File format: JSON (.json extension)
  • Custom themes with the same id as a built-in theme will override the built-in

Any property you omit inherits the value from the Default Dark theme. You only need to specify the tokens you want to change — a theme file containing a single accent override is valid and will render correctly, with every other surface falling back to the default palette.

Claudette auto-detects and imports themes from the Base16 family — a community palette format that defines a theme with just 16 colors (base00base0F). Drop a canonical Base16 JSON file into ~/.claudette/themes/, restart, and it shows up in the theme picker alongside any native Claudette themes.

Two on-disk shapes are recognized:

  1. Flatbase00, base01, … directly at the top level. This is the legacy Base16 JSON shape used by many community generators.

  2. Nested under palette — the current Tinted Theming spec (0.11+) wraps the base keys in a palette object alongside top-level system, name, variant, author fields:

    {
    "system": "base16",
    "name": "Tomorrow Night",
    "variant": "dark",
    "palette": {
    "base00": "1d1f21",
    "base01": "282a2e",
    "...": "...",
    "base0F": "a3685a"
    }
    }

    YAML schemes from tinted-theming/schemes use this shape; running them through any YAML→JSON converter and dropping the result into ~/.claudette/themes/ works directly.

Detection is automatic: a file is treated as Base16 if it provides all 16 base00base0F slots (either shape, hex values 3- or 6-char with or without a leading #) and does not also declare any native Claudette tokens like accent-primary or app-bg. A file with both is treated as a Claudette theme — its author already chose what to map.

The 16 base colors map onto Claudette’s token vocabulary as follows:

Base16Role→ Claudette tokens
base00default backgroundapp-bg, terminal-bg
base01lighter backgroundsidebar-bg, chat-header-bg, terminal-tab-bg
base02selection backgroundselected-bg, terminal-tab-active-bg, divider
base03comments / fainttext-faint, text-dim, syntax-comment, diff-line-number
base04dimmer foregroundtext-muted, accent-neutral
base05default foregroundtext-primary, terminal-fg
base06bright foreground emphasisunmapped — see note below
base07lighteston-accent
base08redaccent-error family, status-stopped, diff-removed-text, syntax-variable
base09orangeaccent-warning family, syntax-number
base0Ayellowbadge-ask, syntax-type
base0Bgreenaccent-success family, badge-done, diff-added-text, syntax-string
base0Ccyansyntax-operator
base0Dblueaccent-info family, badge-plan, diff-hunk-header, syntax-function
base0Epurpleaccent-primary, accent-tertiary family, syntax-keyword
base0Fbrownaccent-dim, accent-secondary family

“family” above means the base color plus its derived -bg / -border / -hover / -fg companions. The base16 converter sets only the base; the companions derive in :root via color-mix(), so the whole family adapts together.

The light/dark color-scheme is read from an optional variant: "light" or variant: "dark" field if present, otherwise inferred from base00’s relative luminance. Base key names are case-insensitive (base0A and base0a both work). The conversion happens in-memory at load time — no Claudette-format file is written back to disk.

You can customize any of the following CSS custom properties.

PropertyDescription
color-scheme"dark" or "light" — controls native UI elements and syntax highlighting
PropertyDescription
accent-primaryPrimary accent color (e.g., #e07850)
accent-primary-rgbRGB values for opacity variants (e.g., 224, 120, 80)
accent-dimDimmed accent for less prominent elements
accent-bgTransparent accent background (e.g., rgba(224, 120, 80, 0.08))
accent-bg-strongStronger accent background
accent-glowGlow/shadow effect (e.g., 0 0 12px rgba(224, 120, 80, 0.25))
mascot-pinkSecondary brand pink used for the mascot and highlight accents
mascot-pink-dimDimmed mascot pink for subtler highlights
PropertyDescription
text-primaryMain text color
text-mutedSecondary text
text-dimTertiary text
text-faintVery subtle text
text-separatorSeparator/divider text color
PropertyDescription
app-bgMain application background
sidebar-bgSidebar background
sidebar-borderSidebar border color
chat-input-bgChat input field background
chat-header-bgChat panel header
chat-user-bgUser message bubble background
chat-system-bgSystem message background
PropertyDescription
terminal-tab-bgInactive terminal tab background
terminal-tab-active-bgActive terminal tab background
terminal-bgTerminal panel background color
terminal-fgTerminal text (foreground) color
terminal-cursorTerminal cursor color
terminal-selectionTerminal text selection background
PropertyDescription
hover-bgHover background
hover-bg-subtleSubtle hover background
selected-bgSelected item background
PropertyDescription
status-runningRunning/active agent color
status-idleIdle agent color
status-stoppedStopped/error color
PropertyDescription
badge-doneAgent finished badge color
badge-planPlan awaiting review badge color
badge-askAgent question badge color

Semantic tokens express meaning, not color. New consumers should prefer these over the older badge-*, status-*, and error-* tokens. Each family is a five-token group: the base color, plus pre-derived -bg / -border / -hover / -fg layers. A chip-style component can compose a filled-and-bordered surface (with a hover state) from tokens alone — no color-mix() calls or per-component alpha math.

PropertyDescription
accent-successSuccessful action / positive confirmation. Aliases --badge-done by default.
accent-success-bgTinted surface (10% alpha of base, via color-mix())
accent-success-borderOutline (30% alpha)
accent-success-hoverHover state for interactive surfaces (15% alpha)
accent-success-fgForeground text color when used on accent-success-bg
accent-warningCaution / non-fatal warning (and -bg, -border, -hover, -fg)
accent-errorError / destructive action. Aliases --status-stopped by default. (and -bg, -border, -hover, -fg)
accent-infoInformational / neutral notice. Aliases --badge-plan by default. (and -bg, -border, -hover, -fg)
accent-neutralMuted emphasis text or icon — aliases --text-muted
accent-secondarySecondary brand accent. Aliases --mascot-pink by default. (and -bg, -border, -fg — no -hover)
accent-tertiaryTertiary brand accent (and -bg, -border, -fg — no -hover)

Eight pre-styled chip palettes for “item N of a set” UI — plugin badges, env-provider chips, future workspace tags. The default palette is brand-invariant: the same eight hues appear across most themes so the color identity of “category C” stays recognizable when users switch theme.

Themes with a strong canonical palette (Rosé Pine, Solarized) deliberately override these slots in their [data-theme] block so chips render in the theme’s own native colors. If you’re authoring a custom theme and your palette has its own identity, follow that pattern.

Each slot ships as a -bg / -border / -fg triplet (no -rgb companion — these aren’t expected to be alpha-composed at the call site). Use them directly:

.workspace-tag {
background: var(--category-c-bg);
border: 1px solid var(--category-c-border);
color: var(--category-c-fg);
}
PropertyDefault hue
category-a-bg / -border / -fgRose
category-b-bg / -border / -fgOrange
category-c-bg / -border / -fgAmber
category-d-bg / -border / -fgGreen
category-e-bg / -border / -fgTeal
category-f-bg / -border / -fgBlue
category-g-bg / -border / -fgPurple
category-h-bg / -border / -fgPink

Eight tokens that mirror Base16’s base08base0F semantic roles so syntax-highlight surfaces can share a vocabulary with imported Base16 themes. These are intentionally brand-invariant — they ship on :root and most themes inherit them unchanged.

PropertyDescription
syntax-keywordControl flow / if, for, return (base0E — purple)
syntax-stringString literals (base0B — green)
syntax-numberNumeric and boolean constants (base09 — orange)
syntax-commentComments and docs (base03 — faint)
syntax-functionFunction and method names (base0D — blue)
syntax-typeTypes, classes, search highlights (base0A — yellow)
syntax-variableVariables (base08 — red)
syntax-operatorOperators, punctuation, separators, terminators, braces, regexp (base0C — cyan)
PropertyDescription
diff-added-bgAdded line background
diff-removed-bgRemoved line background
diff-added-textAdded line text color
diff-removed-textRemoved line text color
diff-hunk-headerHunk header color
diff-line-numberLine number color
PropertyDescription
dividerDivider/separator lines
toolbar-activeActive toolbar button background
toolbar-active-textActive toolbar button text
error-bgError surface background
error-borderError surface border
error-hoverError surface hover state
overlay-bgScrim behind modals and popovers
overlay-bg-heavyStronger scrim for opaque overlays
shadow-smSmall box shadow
shadow-mdMedium box shadow
shadow-lgLarge box shadow
shadow-card-hoverCard hover shadow

Typography tokens are themeable but most themes leave them at the Default Dark stacks. Override them to ship a theme with its own typographic voice — user-level font preferences set in Settings > Appearance still take precedence over whatever a theme specifies.

PropertyDescription
font-sansUI sans-serif font stack (e.g., "Inter", system-ui, sans-serif)
font-monoMonospace font stack used by code blocks and terminal tabs
font-displayDisplay font stack for headings and brand surfaces

Here’s a complete example based on the built-in Warm Ember theme:

{
"id": "warm-ember",
"name": "Warm Ember",
"author": "Claudette",
"description": "A warm amber-toned dark theme",
"colors": {
"color-scheme": "dark",
"accent-primary": "#f0a050",
"accent-primary-rgb": "240, 160, 80",
"accent-dim": "#cc8840",
"accent-bg": "rgba(240, 160, 80, 0.08)",
"accent-bg-strong": "rgba(240, 160, 80, 0.15)",
"accent-glow": "0 0 12px rgba(240, 160, 80, 0.25)",
"sidebar-bg": "rgb(26, 22, 18)",
"sidebar-border": "rgb(48, 40, 32)",
"text-primary": "rgb(240, 232, 220)",
"text-muted": "rgb(160, 145, 130)",
"text-dim": "rgb(130, 118, 105)",
"text-faint": "rgb(100, 90, 78)",
"text-separator": "rgb(75, 65, 55)",
"hover-bg": "rgba(255, 200, 120, 0.06)",
"hover-bg-subtle": "rgba(255, 200, 120, 0.04)",
"selected-bg": "rgba(240, 160, 80, 0.1)",
"divider": "rgb(50, 42, 34)",
"status-running": "#f0a050",
"status-idle": "rgb(120, 110, 100)",
"status-stopped": "#e85050",
"diff-added-bg": "rgba(0, 180, 80, 0.12)",
"diff-removed-bg": "rgba(220, 40, 40, 0.12)",
"diff-added-text": "rgb(80, 210, 110)",
"diff-removed-text": "rgb(235, 100, 100)",
"diff-hunk-header": "rgb(120, 170, 230)",
"diff-line-number": "rgb(100, 90, 78)",
"chat-user-bg": "rgba(240, 160, 80, 0.05)",
"chat-system-bg": "rgba(240, 180, 60, 0.08)",
"chat-input-bg": "rgb(30, 26, 20)",
"chat-header-bg": "rgb(26, 22, 18)",
"terminal-tab-bg": "rgb(30, 26, 20)",
"terminal-tab-active-bg": "rgb(44, 38, 30)",
"terminal-bg": "rgb(18, 15, 12)",
"terminal-fg": "rgb(240, 232, 220)",
"terminal-cursor": "rgb(240, 232, 220)",
"terminal-selection": "rgba(240, 160, 80, 0.25)",
"toolbar-active": "rgba(240, 160, 80, 0.12)",
"toolbar-active-text": "#f0a050",
"app-bg": "rgb(18, 15, 12)",
"shadow-sm": "0 1px 2px rgba(0, 0, 0, 0.3)",
"shadow-md": "0 4px 12px rgba(0, 0, 0, 0.4)",
"shadow-lg": "0 8px 24px rgba(0, 0, 0, 0.5)",
"shadow-card-hover": "0 8px 24px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(240, 160, 80, 0.15)",
"badge-done": "#50d8a0",
"badge-plan": "rgb(120, 170, 230)",
"badge-ask": "#f0a050"
}
}

Save this file to ~/.claudette/themes/warm-ember.json, then select it from Settings > Appearance. Most custom themes are much shorter — only the tokens you want to change need to appear.