← Docs hub

Editorial brand system

Status: canonical reference for llmwiki's visual system (v1.2.0 · #115). If you're changing how any part of the generated site looks — or exporting a screenshot / OG image / PDF / slide deck — this document is the source of truth.

llmwiki is a reading-first product. The site is rendered locally from markdown, then handed to the user like a book they wrote. The brand does three things in service of that:

  1. Get out of the way of the prose.
  2. Make every page feel unmistakably like "an llmwiki page" — so the static site, the PDF export, a screenshot in a tweet, and a slide deck all read as a single product.
  3. Work identically in light mode, dark mode, print, and Obsidian.

All tokens live in llmwiki/render/css.py as CSS custom properties on :root + [data-theme="dark"]. This doc mirrors them so contributors don't have to grep the CSS.


1. Typography

Scale Typeface Weight Use
Body Inter, with -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif fallback 400 Body copy (line-height 1.7)
Strong Inter 600 Bold inline, labels, nav items
Headings Inter 600–700 h1–h6; weight scales down with level
Code / mono JetBrains Mono, with 'SF Mono', 'Fira Code', monospace fallback 400 Inline code, pre blocks, keyboard shortcuts, CLI transcripts

CSS tokens: --font (body/headings), --mono (code).

Rules

Why these two


2. Color palette

Every surface is a CSS variable so the whole palette flips in one place when you toggle light/dark.

Light mode (default)

Token Hex Role
--bg #ffffff Primary page background
--bg-alt #f8fafc Secondary surfaces (tables, sidebars)
--bg-card #ffffff Cards, modals — same as bg but bordered
--bg-code #edf0f5 Code block background (slightly darker than --bg-alt for contrast)
--text #0f172a Primary text (WCAG AAA on --bg)
--text-secondary #475569 Labels, captions (WCAG AA+ on --bg)
--text-muted #6b7280 Timestamps, de-emphasized info (WCAG AA)
--border #d1d5db Card borders, emphasized separators
--border-subtle #e2e8f0 Hairline dividers
--accent #7C3AED Links, buttons, focus rings, brand marks
--accent-light #a78bfa Hover state, active tab underline
--accent-bg #f5f3ff Tinted background for accent-scoped blocks

Dark mode

Applied via either @media (prefers-color-scheme: dark) or explicit :root[data-theme="dark"]:

Token Hex
--bg #0c0a1d
--bg-alt #110f26
--bg-card #16142d
--bg-code #1a1836
--text #e2e8f0
--text-secondary #94a3b8
--text-muted #8b9bb5 (WCAG AA: 6.97:1)
--border #2d2b4a
--border-subtle #1f1d3a
--accent-bg #1e1a3a

Accent #7C3AED stays the same in both themes — it's the through-line that makes a screenshot recognizable even without the rest of the palette.

Rules


3. Elevation + radius

Token Value Use
--radius 8px Cards, buttons, inputs, code blocks
--shadow 0 10px 25px -5px rgba(15,23,42,.1), 0 8px 10px -6px rgba(15,23,42,.04) Heavy elements (command palette, modal)
--shadow-card 0 1px 3px rgba(15,23,42,.08), 0 1px 2px rgba(15,23,42,.04) Default card resting state
--shadow-card-hover 0 4px 12px rgba(15,23,42,.12), 0 2px 4px rgba(15,23,42,.06) Card hover

Dark-mode shadows use the same geometry with higher alpha (0.350.45) so they read against the deep backgrounds.

Rules

Smaller radius variants

Used inline, not as tokens (small surface area, low reuse):


4. Motion

llmwiki is a reading surface — motion should be almost invisible. Every timing, duration, and easing choice below is deliberately boring.

Token Value Use
--transition-micro 0.1s ease Heatmap cell tooltip, tool-chart bar tooltip
--transition-fast 0.15s ease Card hover, nav link, deep-link anchor, button
--transition-med 0.2s ease Theme toggle background, palette mount
--transition-slow 0.3s ease Reserved for command palette fade

These aren't yet extracted as tokens in css.py — individual rules inline the literal seconds. Extracting is tracked as a future cleanup.

Rules


5. Spacing

No scale token yet — spacing is inlined in rules (padding/gap/margin). The canonical steps used across the codebase:

A future token pass (--space-1--space-6) is on the roadmap; until then, stay inside this set when adding rules to keep the rhythm consistent.


6. Export consistency

All generated artifacts must inherit the same tokens:

Artifact Inherits
Static HTML site (site/) Full CSS from llmwiki/render/css.py
Graph viewer (site/graph.html) --g-* palette mirroring the main site
PDF export (future) Print stylesheet adds explicit black-on-white + page breaks
Marp slide export Keeps Inter + JetBrains Mono + #7C3AED accent
QMD export Quarto theme sets body = Inter, mono = JetBrains Mono
Obsidian vault (via symlink) Reads .obsidian/themes/llmwiki.css (future)
Screenshots in README Taken in light mode for consistency

Social preview image

When a page links externally (OpenGraph / twitter:image):


7. Do / don't

Do - Let the text breathe — line-height 1.7 for any paragraph > 3 lines. - Keep cards borderless-ish — 1 px --border-subtle with --shadow-card. - Use --accent for one thing per section (a link, a badge, a button — not all three). - Flip the whole palette via data-theme, not per-component opt-ins. - Match existing radius/shadow tokens before inventing new values.

Don't - Don't mix mono and sans in the same run of prose. Pick Inter, drop into mono only for code. - Don't use accent on body copy. - Don't add a third shadow level. - Don't use custom web fonts — Inter + JetBrains Mono are the only two. - Don't build contrast into the HTML (e.g. <span style="color:white">); always go through a variable so the theme toggle works.


8. Changelog for this doc

When you change a token or add a scale step, add a one-line entry to CHANGELOG.md under ### Changed with the new token name + value + where it's used. That keeps the brand history traceable in the release notes.