Typography
A sans for people, mono for machines
Titles are set in the display face (font-display, Space Grotesk); the interface in the UI font (font-sans), in sentence case at normal weight. The code font (font-mono) is only for code, file paths, IDs, hashes, keys and numbers that line up in tables. Both are user-selectable, so never name a family in a class.
Autonomous RL gym for agents
Generate trajectories, evaluate behavior, improve policies.
ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789
font-sans → var(--font-ui)trajectories_captured = 18240
ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 {}[]<>=/_
font-mono → var(--font-code)Page title, once per page
font-display text-[30px] font-medium tracking-[-0.03em]
Panel and card title
font-display text-[17px] font-semibold tracking-[-0.015em]
Empty-state title
font-display text-[16px] font-semibold
Nav item, row label
text-[14px] font-medium
Body, table cells
text-[13.5px]
Secondary text, panel subtitles
text-[13px] leading-5 text-muted-foreground
Caption, table header
text-[12px] font-medium text-muted-foreground
Hint, the smallest sans size
text-[11.5px] text-muted-foreground
Sidebar group labels and code-block language tags only
eyebrow
sentence case everywhere · 11.5px is the floorpnpm --filter web devweb/src/lib/appearance/presets.tsrun_7f3a9c2esha256:4be1…c09d18,240 · 96.2%font-mono · tabular-nums for anything that lines upNo uppercase tracking, no underscores, no lowercase-everything. Only display text changes — enum values, keys and test ids stay as they are.
settingsLabel() turns a dynamic machine label into words