The color schemes, tokens, and typefaces that make every Adom surface look like one company built it. This page is the extensive tour: what the five schemes look like, the exact background and foreground values, the fonts we install for the user, and how the system is wired into Hydrogen Desktop (including VS Code), Adom Desktop, and the wiki. The machine-readable contract an implementing agent should follow is SKILL.md on this same page (install: adom-wiki pkg install adom-theme-system).
Why this gets its own page: themes are a big part of whether Adom reads as a professional product or an amateur one. A user touches three of our surfaces in their first ten minutes (Hydrogen Desktop, Adom Desktop, the wiki), and any mismatch between them is instantly visible. So the palette, the names, the fonts, and the rules live in one place, with screenshots proving what each surface actually renders today.
This page is the whole Adom theme: docs, tokens, fonts, generators, and the VS Code theme pack. Two artifacts share ONE version, locked in the same commit, always:
| Artifact | Name | Version source |
|---|---|---|
| The wiki package (this page) | adom-theme |
package.json at the page root |
| The VS Code extension it installs | adom.adom-theme |
vscode/package.json, kept identical |
If the installed adom.adom-theme version differs from this package's version, the install is stale; run adom-wiki pkg update. That is the ONLY update channel: the extension is never published to the VS Code Marketplace or any gallery, so gallery update checks (latestVersion, updateAvailable) return null for it by design, and that null is not a defect.
History: before 2026-08-02 this page was adom-theme-system and the extension was adom.adom-themes with an independent 7.x version line. Both were renamed and version-locked at 2.0.0 while HD was still pre-release; install.sh purges the legacy extension id so theme pickers never show doubled entries.
One trap for auditors: extension files on disk carry the mtimes stored in the package tarball (publish time), not install time. Read timestamps with the date attached before concluding anything.
Every scheme has a product label (what users see) and a slug (the frozen storage key). Labels and slugs were unified on 2026-07-25 so the HD settings picker, the VS Code theme pack, and stored preferences all agree. The naming rule: the flagship is plain Adom Studio, and variants earn a suffix.
| Product label | Slug | Character |
|---|---|---|
| Adom Studio (default) | studio |
The editor sits on the lighter ground and the panels drop back, so the code you work in is the brightest thing on screen. Bright text ramp. |
| Adom Studio Dark (Brighter Text) | studio-bright |
Everything on the deep ground with the brighter interface text. Adom Studio is exactly this scheme with the two grounds traded. |
| Adom Studio Dark | studio-dark |
The original screen-tuned set with the quieter text ramp. This is the token base the other schemes override. |
| Adom Kickstand | kickstand |
The identity palette as the design firm delivered it: near-black #191919 ground, muted navy chrome, and the headline face used in prose. |
| Adom Slate | slate |
A calm, cool blue-grey. Uses the code font Windows already ships, so it feels native on a stock machine. |
The comparison that actually matters when you pick a theme: the same live Claude chat, same content, captured five times with only workbench.colorTheme changed (applied live through adom-vscode, no reload). The background is what dominates your eye all day; the text color is what you read non-stop. Exact values under each column.

Fair question, asked and verified 2026-08-02: in the 5-column comparison the two Dark variants look nearly identical, because a 12.3:1 vs 16.0:1 text lift compresses at small sizes (both are "light gray on dark"; the jump is 10 points of perceptual lightness, carried entirely in thin glyph strokes). The pixels in the shipped screenshots confirm the lift is real: glyph cores measure 190 luma (Dark) vs 218 luma (Brighter Text), a 15 percent lift exactly tracking the designed #c9d1d9 to #e6edf3 move. Same sentence, same background, zoomed:

If a bigger delta is ever wanted, the knob is the fg anchor in the generator (one value), but past ~14:1 dark-mode text starts to halo, and Brighter Text already sits at 16:1, so push with care.
The design intent (John, 2026-08-02): the active tab should share the chat body's background so the active conversation reads front-and-center, the tab flowing into its content.
Status: PASS as of 2.3.0, by the one-ground contract. Claude chats paint sideBar.background when resumed from history and editor.background in fullEditor (command-opened) mode, so the only rule that makes the active tab flow into EVERY chat, both modes, plus every file editor, is to unify the grounds: sideBar.background/foreground take the editor ground and text in all five themes. The active tab keeps 2026's anchor equality with the editor ground, so tab == chat == file body everywhere, and inactive tabs keep the raised 2026 chrome tone so the active one is unmistakable. (The interim 2.2.0 contract matched only the history mode; superseded the same day once the fullEditor mode was measured.) The sidebar/editor boundary is carried by the border, not a fill change.
The three-panel consistency proof (Adom Studio, one real screenshot, pixel-verified): an ACTIVE history-resumed chat, an INACTIVE history-resumed chat, and a BRAND-NEW command-opened chat side by side. Before the one-ground contract, the new-mode chat would render a different ground than the history chats; measured now, all three bodies are the identical Adom Studio ground (#161b22, capture-shifted #181b21 in all three panels), and every chat tab flows into its body.


One more measured nuance (2026-08-02): Claude Code has TWO chat surface modes, history-resumed (paints sideBar.background) and fullEditor/command-opened (paints editor.background). The one-ground contract above makes them identical by construction, so the mode difference is invisible in Adom themes.
Two operational notes for future auditors: VS Code caches computed theme data per extension VERSION, so editing theme files under an unchanged version renders nothing (bump to bust); and right after a theme switch, webviews restyle asynchronously, so tabs can wear different themes for a beat. Both are normal.
Each screenshot below is the real Hydrogen Desktop window, captured 2026-08-02 by driving HD's own Settings window: each scheme was selected in Settings > Appearance and Applied, which repaints HD's frontend AND pushes the mapped editor theme in one action. That flow doubled as the theme system's end-to-end unit test, and all five schemes passed on every axis: HD shell scheme attribute, the editor receiving the correct (current) theme label, and the chat body rendering the declared sideBar value within capture tolerance (downscaling shifts solid colors up to 3 channel counts; the hex values in this document are ground truth). Composition standard: sidebar closed, one Claude conversation open and ACTIVE with a second conversation as the inactive background tab, so every shot also proves the active vs inactive tab colors (active tab = the ground, flowing into the chat; inactive tab = the raised chrome tone). Each is the real window (VS Code plus the AI chat on the left, the wiki on the right) captured with that scheme applied end to end, then pixel-verified against the scheme's expected editor background before it was allowed on this page.

The flagship. The editor sheet is #161b22 and the surrounding chrome drops back to #0d1117. Attention lands on the content, not the frame. The chat renders in Satoshi (an AI conversation is prose), the code blocks in JetBrains Mono.

Same ramp as Adom Studio with the grounds swapped: deep #0d1117 everywhere, panels raised on #161b22. A build-time guard (check-scheme-parity.sh) fails the build if these two schemes ever differ by anything other than that swap. The relationship is a contract, not a hope: tune one and the guard makes you tune both.

The original palette, tuned for long sessions: same grounds as Bright but with the quieter secondary text (--text-2 drops from #c9d1d9 to #8b949e). In CSS this is the base :root block; it deliberately has no override block of its own.

The brand identity palette. Menus, dropdowns, and other overlay chrome use a muted navy #0e1c31, which is a derivation (a 45/55 mix of the brand navy #00204f into the #191919 ground), not a new color. Full-strength navy chrome read as "that weird blue" and was demoted. Prose leads with Familjen Grotesk, the headline face. One documented correction (2026-07-26): the firm's neutral Black ground stays byte-exact, but the chrome grays we derived from it carry a few points of blue, because a pure neutral gray sitting beside the blue-tinted sibling schemes is perceived as warm brown even when the pixels measure exactly neutral.

Cool blue-grey (#17212e ground) for people who find the black-on-black families too severe. Its code stack leads with Cascadia Code, which ships with Windows, so it never depends on our font install step.
VS Code color themes cannot carry fonts, so the pack alone could never deliver Satoshi or JetBrains Mono. HD does it with two mechanisms working together, both visible in the Settings window's Appearance section:
Delivery: the workspace serves the fonts itself. install-brand-fonts.sh (run by the golden-image bake, re-runnable after code-server upgrades) copies the woff2 files into code-server's own workbench directory and injects an @font-face block into workbench.html. The editor fetches the fonts over HTTP from code-server, so a fresh machine needs no Windows font install and can never silently fall back because a machine missed a setup step.
Selection: HD pushes VS Code settings keys. The Editor Code Font and Editor Prose Font pickers write editor.fontFamily, terminal.integrated.fontFamily, debug.console.fontFamily (code face) and chat.fontFamily, markdown.preview.fontFamily (prose face). The chat pair was mapped by decompiling the Claude Code extension: chat.fontFamily is the conversation PROSE and chat.editor.fontFamily is the chat's CODE BLOCKS; getting those two backwards renders prose in the system font while code blocks go proportional. "Match theme" follows the scheme's pairing (Satoshi prose + JetBrains Mono code for the Studio family); an explicit pick overrides it for every scheme.
The pickers, in the real Settings window:

And the proof it works, live: the same Claude chat with prose on Match theme (Satoshi) versus switched to Segoe UI from the Settings window, no reload:

Backgrounds and foreground text colors are the two things that matter most, so here is the whole generated table, rendered from the live styles.css rather than typed by hand:

How to read it:
--bg is the deepest sheet, --surface carries panels and toolbars, --elevated is hover states, raised cards, and always the active tab, --overlay is menus and popovers. The law that keeps Adom Studio usable: the active tab maps to --elevated (#1c2128), never to --surface, because in Adom Studio --surface is darker than the editor and a surface-mapped tab renders as a black hole.--text (#e6edf3 family) for emphasis only, --text-body (#c9d1d9) for running text, --text-2 for secondary. --text-3 exists but fails AA contrast as text; it is for disabled glyphs and borders only.#00b8b1 is the accent in all five schemes, with --accent-hover #00d4cb and a scheme-tinted --accent-bright. Status colors (green #3fb950, red #f85149, yellow #d29922, blue #64abff, purple #8c6bf7) never change between schemes, so "red means error" stays true everywhere.--on-accent (a near-black teal like #05221f), never white.The token-by-token table with every hex value, plus the measured constraints behind them (contrast bands, the halation ceiling, why there is no teal ground), is in SKILL.md.
Three faces, all licensed for redistribution, all shipped by us so no scheme silently falls back to Segoe UI:
| Face | Role | License |
|---|---|---|
| Satoshi | Prose: UI copy, chat, markdown preview | Fontshare ITF FFL |
| Familjen Grotesk | Headlines, and Kickstand's leading prose face | OFL |
| JetBrains Mono | Code: editor, terminal, code blocks | OFL |
The stacks are defined once in settings.ts and follow the scheme:
| Scheme | Code stack | Prose stack |
|---|---|---|
| studio, studio-bright, studio-dark | 'JetBrains Mono', 'Cascadia Code', Consolas, ui-monospace, monospace |
Satoshi, -apple-system, 'Segoe UI', sans-serif |
| kickstand | same code stack | 'Familjen Grotesk', Satoshi, -apple-system, 'Segoe UI', sans-serif |
| slate | 'Cascadia Code', Consolas, 'JetBrains Mono', ui-monospace, monospace |
Satoshi stack |
Who installs what, and where:
/_static/lib/vscode/...); a relative URL resolves against the /?folder= route and 404s silently.Licensing decides what this page can carry. JetBrains Mono and Familjen Grotesk are OFL 1.1, so their woff2 files live right here in fonts/ with their license texts beside them. Satoshi's Fontshare EULA explicitly forbids "uploading them in a public server", so its binaries are deliberately absent: fonts/satoshi/README.md documents the official Fontshare endpoints, and this page's install.sh fetches the faces from those servers automatically (the EULA-sanctioned channel). Read fonts/LICENSES.md for the full rules before copying font files anywhere.
Users can override both slots in Settings. Each picker shows a readout of the family the workbench actually resolved (measured inside the editor document, not assumed), and "Match theme" states which font that means right now. Picks narrate their progress ("Reloading VS Code to set font...", then "Done. JetBrains Mono loaded.") because an editor reload is slow enough to need a spinner:

:root block (which IS Adom Studio Dark) plus one [data-scheme='...'] override block per scheme. Components consume tokens only; a hardcoded hex in a component is a bug.<html data-scheme="...">. Boot paint reads a versioned localStorage cache (hd-color-scheme2) written by +layout.svelte, so there is no flash of the wrong scheme while stores load.studio with a different meaning, migrations are versioned: a one-shot boot migration stamps desktop.scheme_slug_version = 2, translates every legacy value (old studio becomes studio-dark; old studio-bright-inverse and inverse become studio; retired blueprint and graphite map to slate; contrast to studio-bright), then always reconciles the editor to match. The lesson: slugs are storage keys, and reusing one without a version bump corrupts every machine that saved the old meaning.The editor is the surface users stare at all day, so it gets the strictest contract:
adom.adom-themes extension (currently v7.1.0). Change a token in styles.css, regenerate, and the editor follows. It is also why app-side laws (like the active tab being the elevated sheet) hold inside VS Code automatically.workbench.colorTheme by label ("Adom Studio", "Adom Studio Dark (Brighter Text)", "Adom Studio Dark", "Adom Kickstand", "Adom Slate"). VS Code does not warn on an unknown theme name; it silently falls back to its default light theme. That failure turned the editor white three separate times during development, which is why two guards exist: check-installed-themes.sh verifies the pack on the machine and that the live setting resolves, and check-vscode-theme-names.sh gates the bootstrap's theme name against the pack at build time.editor.fontFamily, terminal.integrated.fontFamily, and chat code blocks get the code stack; chat.fontFamily and markdown.preview.fontFamily get the prose stack.The three surfaces a user actually looks at are Hydrogen Desktop, Adom Desktop, and the wiki. The theme system's job is to make them read as one product.
Hydrogen Desktop is the reference implementation: tokens, five schemes, generated VS Code pack, font installation, migrations. Everything above.
Adom Desktop already sits on the brand ground with teal accents and reads clearly as Adom:

What AD does not yet have is the token layer: its colors are its own CSS rather than the generated --bg / --surface / --text ramp, and it offers no scheme choice. The step-by-step checklist for bringing AD onto the system (adopt the token table, honor the five slugs, reuse the parity and naming laws, style approvals from the same tokens) is in SKILL.md, and the concrete artifacts to start from are on this page: tokens.css (drop-in CSS custom properties for all five schemes) and the generated vscode/ pack as a worked example of projecting the tokens onto another surface. Since HD and AD share one machine and one user, the near-term win is AD honoring the same slugs so a scheme choice in HD can carry across.
The wiki ships the dark ground, teal identity, and Satoshi-style type today:

Its values are close cousins of Studio Dark rather than literal token consumers (it is a separate codebase serving the public internet). The alignment worth holding: teal #00b8b1 as the only accent, near-black grounds, no second accent hue creeping in.
Every Adom user has an identity card (avatar, handle, accent treatment) that follows them across surfaces: profile chips in HD, author cards on the wiki, caller identity in AD's approval prompts. The theme system and the identity card divide the work cleanly:
That separation is why the same card reads correctly in a #0d1117 Studio Bright panel and on Kickstand's navy overlay. The card assets and rules live in the adom/adom brand hub under skills/identity-card/; any surface rendering user identity should pull from there rather than restyling it per app.
The places a person meets Adom before installing anything should look like the same company as the product. Current state, screenshots taken 2026-07-26:
adom.inc homepage: consistent. Dark circuit-board ground, teal headline type, product shot of Hydrogen Desktop. On-system.

The auth page: consistent. hydrogen.adom.inc/auth/login is where the wiki's Login button lands. Adom logo, near-black ground, teal primary button. Minor nit: the button teal runs slightly lighter than #00b8b1, worth a token pass someday, but nobody would read it as a different company.

One real finding: adom.inc/login is an unbranded 404. A person who guesses the login URL (a normal guess) gets the framework's default purple rocket instead of anything Adom:

Two cheap fixes, either works: redirect /login to hydrogen.adom.inc/auth/login, or give adom.inc a branded 404 (ground #0d1117, teal accent, Satoshi). Ideally both, since a branded 404 covers every future bad URL, not just this one.
Everything an implementer needs is ON this page, because the living repo below is private and other agents cannot read it. The page copies are pinned at commit a4c764be (theme pack v7.2.0); browse the full tree on the page's Files tab.
vscode/: the complete generated theme pack (package.json plus five theme JSONs). Cloud containers and any code-server install can copy this directly into ~/.local/share/code-server/extensions/adom.adom-themes-7.2.0/.fonts/: the redistributable brand fonts with their licenses. JetBrains Mono (4 faces) and Familjen Grotesk (variable), each with OFL.txt beside them. Satoshi has a folder too, holding only fonts/satoshi/README.md (where to get it and why no binaries live here); fonts/LICENSES.md explains the exact license situation for all three faces and what you may copy where.reference/: byte-exact copies of the machinery, since the repo is private: the theme generator, its template, the font installer, and all three guard scripts, with a provenance README.adom-wiki pkg install adom-theme-system installs the skill, and where code-server is present also installs the theme pack (making the five Adom themes selectable, without changing the active theme), the OFL fonts, and Satoshi fetched live from Fontshare's official servers with wOF2 verification. Verified end to end in a standard Adom cloud container.docs/scheme-*.png: the rendered token sheet and the five verified captures.Source of truth in the Hydrogen Desktop repo (private; the copies above exist because of that):
Related pages: adom/adom brand hub (brand + identity card), Adom Desktop, Adom Wiki Skill Pack (publishing conventions, including the wiki-bloat rule this page was weighed against before it earned its own slug).