Theme System
14 built-in themes, the perceptual-contrast token engine behind light mode, live preview and crossfade, accent overrides with contrast warnings, 25 terminal color schemes, and the accessibility modes.
Overview
The theme system controls every piece of app chrome: surfaces, text, borders, accents, shadows, status colors, terminal ANSI output, and the frosted-glass materials. A theme is authored as a palette of roughly 40 inputs, which the token engine compiles into the ~145 semantic tokens the whole app reads. Nothing in the UI picks its own color.
Daintree ships with 14 built-in themes, 7 dark and 7 light. Daintree is the default dark theme; Bondi Beach is the default light theme. On first launch the app picks whichever matches your operating system's appearance.
There are three places to switch. The Settings picker is an inline listbox under Settings → Appearance → App. The theme palette (Cmd+K Cmd+T) is a floating fuzzy-search switcher for keyboard-first changes. The Theme Browser is a drawer with hero images, built for comparing before you commit. All three preview live across the whole app before you commit.
This page covers choosing and using themes. If you want to build one (the file format, the token contract, the validators, and sharing), see Theme Authoring.
App themes and terminal color schemes are two separate settings. The app theme controls all UI chrome: sidebar, toolbar, panels, dock. Terminal color schemes control ANSI output rendering inside terminal panels. Both live under Settings > Appearance, on different subtabs.
Built-in Themes
Every built-in theme draws its palette from a real-world ecosystem, and each one carries a location string that the Theme Browser renders under its hero image. The accent anchors the identity; surfaces and text are tuned around it rather than the other way round. Material blur, saturation and radius scale are per-theme values too, so switching themes changes the feel of the glass, not just the hue.
Dark themes
| Theme | Accent | Character |
|---|---|---|
| Daintree | #36CE94 eucalyptus green | Near-black neutral-earthy charcoal field; the biome green lives only in the accent, focus light and data lanes. Daintree Rainforest, Queensland, Australia. |
| Arashiyama | #C46240 terracotta copper | Warm dark bamboo browns with a pale leaf-gold hover wash. Arashiyama Bamboo Grove, Kyoto, Japan. |
| Fiordland | #3AB7C5 fjord teal | The coldest, most desaturated of the dark set: near-black blue-greens with tight lightness steps. Fiordland, South Island, New Zealand. |
| Galápagos | #4A9E7F ocean teal-green | Volcanic dark greens with a coral second lane held clear of the danger hue. Galápagos Islands, Ecuador. |
| Highlands | #B487D8 heather violet | A cool, very low-chroma violet field with a single warm surface as a grace note. Scottish Highlands, Scotland. |
| Namib | #3E91DA desert sky blue | Warm sand-dark surfaces under a twilight-indigo accent, the widest warm/cool split in the set. Namib Desert, Namibia. |
| Redwoods | #50A24D forest green | Deep bark browns with one signal amber shared by cursor, waiting state and secondary accent. Redwood National Park, California, USA. |
Light themes
| Theme | Accent | Character |
|---|---|---|
| Bondi Beach | #178463 deep teal-green | The reference light theme. One warm sand-and-stone family; water color appears only as accent, search and status detail. Bondi Beach, Sydney, Australia. |
| Table Mountain | #B0466F fynbos rose | Golden sandstone surfaces with fynbos rose as the only chromatic detail. Table Mountain, Cape Town, South Africa. |
| Atacama | #B25024 rust terracotta | Warm desert-crust surfaces; lagoon turquoise doubles as the info and search lane. Atacama Desert, Chile. |
| Bali | #218546 paddy green | A green-tinted paper field with gold reserved for search, cursor and heat. Bali, Indonesia. |
| Hokkaido | #6E57DB frost indigo | Lavender-snow surfaces whose chroma drains as they lift, shadowed snow to achromatic crust. Hokkaido, Japan. |
| Serengeti | #8B6D08 savanna gold | Golden-grass surfaces with acacia green as the only second color. Serengeti National Park, Tanzania. |
| Svalbard | #0077A3 arctic blue | Glacial blues losing chroma from sea ice up to snow; warmth appears only in search, warning and cursor. Svalbard Archipelago, Norway. |
Why Light Mode Was Rebuilt
Dark and light are not symmetric, and treating them as if they were is what made light mode feel like an afterthought in earlier versions. On a dark canvas, depth is additive: a glow, a lighter overlay, a soft shadow all read immediately because there is room above the surface. On a near-white canvas that room is gone. The eye's luminance discrimination is compressed against the white ceiling, so the additive machinery has roughly two to three times less perceptual space to work in. Light themes built by inverting dark ones end up with five surface planes that collapse into one undifferentiated sheet.
The fix was to rebuild the light themes on a perceptual-contrast token engine that measures in OKLCH rather than hex arithmetic. Instead of trusting that two colors "look different enough", the engine converts them to a perceptual lightness axis and enforces explicit floors:
- A just-noticeable-difference floor per step. Every adjacent pair in the five-plane surface ramp (grid → sidebar → canvas → panel → elevated) has to clear a minimum perceptual lightness delta, or the two planes merge.
- A total span floor. The whole grid-to-elevated ramp has to cover enough perceptual range that the stack still reads as a stack.
- A runaway ceiling. No single step may dominate the ramp, or the elevation progression reads as uneven.
- Panel → elevated must not be the smallest step. The floating tier needs the strongest lift. The pre-rebuild light themes had inverted this, giving popovers and dialogs no luminance lift at all.
- Accent separation. Accents need a chroma floor (below it they read as a tinted neutral), a lightness gap from the canvas so they survive grayscale, and a minimum perceptual distance from every other same-polarity theme's accent so two themes never look like the same theme.
Alongside the ramp work came status-surface tokens (the tinted washes behind banners, pills and form validation) derived per polarity rather than hardcoded, and a set of per-theme design knobs on the palette's strategy object: shadow style, noise opacity, material blur and saturation, radius scale, a border-ink override for warm or cool light palettes, a status-surface opacity multiplier, and the grain texture character. A light theme can now dial its own border temperature and wash intensity without redefining tokens by hand.
Bondi Beach was rebuilt first and became the gold-standard template; the other six light themes were rebuilt on it. Every one of them follows the same rule, stated in each theme file: one material family carries the field, content lifts toward white rather than sitting in a darker fill on a light container, and the theme's chromatic color is detail only (accent, search, status, terminal), never a field surface. That is why light mode in Daintree does not look like dark mode with the colors flipped.
The same validators run against the dark themes, but the hard failures are light-only. Dark palettes natively run wider ramps and several of them sit below the just-noticeable-difference threshold on a single step deliberately.
Working with themes
- Choose and customize a theme for switching themes, the palette and the browser, overriding the accent, matching your system appearance, and the accessibility modes.
- Terminal color schemes for the ANSI palette your terminals use, which is chosen separately from the app theme.
- Theme authoring for writing one of your own: the file format, the token contract, validation, export and sharing with a team.