Skip to content
4 min read · 773 words

Design System

Defined in frontend/DESIGN.md and wired into Tailwind: a Material Design 3–style token system with an indigo primary, tonal surface elevation, Inter for text, JetBrains Mono for data.

Principles

  1. Tokens, not values. Components never use raw hex or arbitrary pixel sizes — they use semantic classes (bg-surface-container-low, text-on-surface-variant, p-stack-md).
  2. Tonal elevation. Depth comes from progressively tinted surface containers, not box shadows.
  3. Every color has an "on-" partner. Text on primary is on-primary; never pair tokens across roles.
  4. Mono for machine data. IDs, tool names, costs, and code render in JetBrains Mono (font-mono-sm).

Color tokens (light theme)

Core roles

TokenHexUsed for
primary#3525cdCTAs, active nav, links, key accents
on-primary#fffffftext/icons on primary
primary-container#4f46e5hover state for primary buttons
secondary#006c49success states, positive helpers
secondary-container#6cf8bbsuccess chips/badges backgrounds
tertiary#684000warning-ish accents (quality, in-progress)
error#ba1a1aerrors, failed counts, destructive hints
error-container#ffdad6error panels/banners backgrounds

Surfaces (elevation ladder)

TokenHexTypical use
background / surface#f9f9ffpage background
surface-container-lowest#ffffffcards, panels
surface-container-low#f0f3ffhover fills, subtle wells
surface-container#e7eefeicon chips, active nav fill
surface-container-high#e2e8f8avatar fill, deeper wells
surface-container-highest#dce2f3progress-bar tracks
on-surface#151c27primary text
on-surface-variant#464555secondary text
outline#777587tertiary text, placeholder icons
outline-variant#c7c4d8borders, dividers

The rule of thumb visible throughout the components: card = surface-container-lowest + border-outline-variant; hover = one step up the ladder.

Typography

Token classFontSize / lineWeightUse
displayInter36 / 44600dashboard hero numbers
headline-lgInter24 / 32600page titles
headline-mdInter18 / 26600card/section titles
body-lgInter16 / 24400prominent body
body-mdInter14 / 20400default body
label-mdInter12 / 16500labels, meta, badges
mono-smJetBrains Mono12 / 18400IDs, tools, costs

Applied as paired classes in the codebase, e.g. font-headline-md text-headline-md. Fonts load via Google Fonts <link>s in app/layout.tsx, alongside Material Symbols Outlined for icons (<span className="material-symbols-outlined">dashboard</span>; active nav uses fontVariationSettings: "'FILL' 1").

Spacing & layout

An 8px-based scale exposed as semantic utilities used everywhere in the components:

Class familyExamples in use
stack-* (vertical rhythm)space-y-stack-md, p-stack-lg, mb-stack-sm, gap-stack-md
gutterpage padding md:p-gutter, grid gap-gutter
fixed chromesidebar w-sidebar-width (260px), topbar height 64px (h-16), content offset md:ml-[260px] pt-20
containermax-w-container-max centered main column

Radii: cards rounded-xl, inputs/buttons rounded-md/rounded-lg, chips rounded-full.

Recurring patterns (copy these)

tsx
<section className="rounded-xl border border-outline-variant
                    bg-surface-container-lowest p-stack-md">
  ...
</section>

Tone semantics

Used consistently by RecentActivity and the stat cards:

ToneTokensMeans
successsecondary familycompleted work, healthy runs
primaryprimary familyinformational, in-product entities
warningtertiary familyneeds attention, quality metrics
errorerror familyfailures
neutralsurface/outline familycounts without judgment

Dark mode

The root layout pins className="light" on <html> — a dark palette is not implemented in the app (the docs site you are reading has one; the product does not). Roadmap item.

  • Components — the tokens in action
  • frontend/DESIGN.md — the source token file (colors, typography, radii as YAML)