The Specimen design system.
How doctorreid.com looks, sounds and behaves — the tokens, the type, the components and the rules — so every new page, post, PDF or slide reads as one lab. This page is the living reference; the PDF is a snapshot.
Download the PDFdr.css — the shared stylesheetWordmark · wideWordmark · tall
The idea: a research lab for the mind.
Doctor Reid is not a clinic website and not a personal brand page. It is a lab notebook turned inside out — a place where a psychiatrist who reads too many papers puts the instruments, the training, the references and the trials in public, for free. The design should feel like a bright, well-kept laboratory on a good morning: clean paper, cool sky light, a little warm sienna ink, and one acid-yellow highlighter.
Three wings organize everything: Tools (measure & train), Blog (field notes & the library) and Discover (trials, podcast, papers). If a new thing doesn't fit a wing, it probably doesn't belong on the site.
Voice & the house rule.
The house rule: every claim cites its source — or says "we don't know yet." It appears in the hero, in the gauge widget, on every results page, and it governs copy everywhere. A number without a source is not allowed on this site. If it can't be cited, it gets phrased qualitatively or cut.
How Reid sounds
- A friend who reads too many papers. Plain words first, the technical term second, the citation third.
- Honest about uncertainty. "The evidence is strong here" and "this is where the physiology runs out" are both house phrases.
- Warm, never saccharine. On results pages the reader may be scared; lead with support, then the score, then what it means, then what to do.
- Lightly self-deprecating. "The specimen most frequently tested here." "Rounded down for humility." One joke per screen, never on a crisis message.
- No hype, no fear. Psychedelics, ketamine and GLP-1s are described as drugs with dose-response curves, not miracles or menaces.
The wordmark.
The "Doctor Reid" mark is Reid's own handwriting. It ships as two transparent PNGs (wide and tall) and is always applied as a CSS mask, so it can be tinted any token color without ever being redrawn, traced, or converted to a font.
| Use | File | Tint | Size |
|---|---|---|---|
| Nav (all pages) | wide | Ink · sienna on hover | 190×32 desktop · 150×26 mobile |
| Footer | wide | Sub | 140×24 |
| Signature (about, PI's note) | tall | Sienna | 180–200 wide |
| Blog-post top bar | wide | Ink | 120×20 |
| Print / PDF / slides | either | Ink or sienna | Never below 90 px wide |
.wm{display:inline-block;background-color:var(--ink);
-webkit-mask:url("/assets/wm_wide.png") no-repeat center / contain;
mask:url("/assets/wm_wide.png") no-repeat center / contain}
.wm.tall{-webkit-mask-image:url("/assets/wm_tall.png");mask-image:url("/assets/wm_tall.png")}
Color.
Warm paper, cool sky, one sienna accent and one acid highlight. Ink does the heavy lifting; sienna is for the things you can click; acid is the highlighter you use twice a page. Everything is exposed as CSS custom properties in dr.css.
Core palette
#231A12Text, dark surfaces, primary buttons#4C4238Body copy on light surfaces#6E6157Secondary text, kickers, labels#9A8E80Tertiary text, dates, footnotes#F5F1E4Page mid-tone · text on ink#F1E7D2Page base (bottom of gradient)#EAF0F4Page top (top of gradient)#8C4D2EThe accent: links, arrows, hover, signature#EAED78Highlight: underlines, selection, primary CTA on ink#B3C3D0Cool tint: blobs, gauges, data#3E9B5FLive/positive: enrolling dot, progress#E7CDB8Warm blob tintPage background
The page is never flat: linear-gradient(180deg, Sky 0%, Paper 40%, Paper 2 100%) plus three fixed blurred blobs (mist, pale acid, tan) at 55% opacity, filter: blur(70px). Glass cards read against it; solid white cards do not (use rgba(255,255,255,.62), never #fff, for surfaces).
Severity bands (screeners only)
Bands carry meaning, so they are the one place saturated color appears. Each band has an ink and a tint; the ink is used for text and the dot, the tint for the pill background and range-bar segment.
#3E9B5F · #E4F1E8Minimal / negative screen#B98A2A · #F7EDCFMild#C9784E · #F6E1D2Moderate#A83A2E · #F3D6D1Severe / positive screen#4A6E9B · #DDE7F2Informational (personality, tasks)#6E4E9B · #E6DEF2Experience scales (MEQ, CEQ)Typography.
Three families from Google Fonts, loaded once in the head of every page. Fraunces carries the ideas (display, headings, big numbers, italic emphasis at weight 300). Instrument Sans carries the reading. JetBrains Mono, small and uppercase with wide tracking, carries labels, kickers, citations, dates and anything that should feel like a specimen tag.
h1 · Fraunces 400 · opsz 144 · clamp(2.5rem, 6.2vw, 4.8rem) · lh 1.04 · ls −.02emInner space, under the microscope.
h2 · Fraunces 400 · clamp(1.9rem, 4.2vw, 3rem)The lab has three wings.
h3 · Fraunces 600 · 1.35–1.8remMeasure
h4 · Fraunces 600 · 1.2–1.4rem · card titlesWhy placebo keeps beating our best antidepressants
score · Fraunces 600 · 4.2rem · ls −.04em18 out of 27body · Instrument Sans 400 · 17px · lh 1.55Free, evidence-based tools to help you understand yourself, ease mental and emotional suffering, and learn to thrive.lede · Instrument Sans 400 · 1.1rem · ink-2 · max 60chEvery claim cites its source — or says "we don't know yet."kicker · JetBrains Mono 400 · .64rem · ls .12em · uppercase · subDoctor Reid · a research lab for the mind · Orem, Utahchip / source · Mono · .56–.6rem · pill borderBerman 2000 · Zarate 2006 psychedelicsItalic Fraunces at weight 300 is the emphasis device — one italic phrase per heading, never a whole heading. Bold in body copy is Instrument Sans 600; never bold a serif heading further. Numbers in running text use the sans; numbers that are the point (scores, counts, years in a fact tile) use Fraunces 600.
<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300;0,9..144,400;0,9..144,600;1,9..144,300;1,9..144,400;1,9..144,600&family=Instrument+Sans:ital,wght@0,400;0,500;0,600;1,400&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
Surfaces & depth.
Two surfaces only. Glass — rgba(255,255,255,.62) fill, rgba(255,255,255,.85) 1px border, backdrop-filter: blur(12–14px), radius 20–28px, shadow 0 18px 40px −18px rgba(35,26,18,.30). Ink — solid #231A12, paper text, an acid radial glow in the top-right corner, radius 28px, used once per page for the one thing you most want clicked.
Everything sits on this.
Radius 20 · blur 12 · border .85 white
One per page. Make it count.
Acid glow top-right, paper text.
| Token | Value | Used for |
|---|---|---|
--r-sm | 12px | inputs, notes, small callouts |
--r | 20px | cards, widgets, question blocks |
--r-lg | 26px | wings, result box |
--r-xl | 28px | ink surfaces, photo bottom corners |
--r-pill | 999px | buttons, chips, bands, options |
--shadow | 0 18px 40px −18px rgba(35,26,18,.30) | resting cards |
--shadow-lg | 0 30px 60px −25px rgba(35,26,18,.45) | ink surfaces, modals, the photo |
--hair / --hair-2 | rgba(35,26,18,.10 / .18) | dividers, borders on pale surfaces |
Components.
Pills (buttons & nav)
One dark pill per screen (the primary action). Acid pill only on an ink surface. Sienna pill only for crisis/urgent actions. Hover lifts 1px; dark pills turn sienna on hover.
Chips, kickers, links
Links inside prose are .ulink: ink text, 2px acid underline, sienna on hover. Arrows are the → character, never an icon font. "🔗 link" chips copy a deep link to the section.
Rows (the wing lists)
Name left, plain-language descriptor right in sub color. Coming-soon items sit at 55% opacity and gain a sienna "· soon" suffix automatically.
Cards & widgets
A card is glass with a mono kicker, a serif h4, a sans paragraph and a sienna "→" line pinned to the bottom. A widget (homepage) is a 216px glass card that floats (6–7s ease, ±10px), always links somewhere real, and shows only a real, cited fact: title row with a white icon tile, the visual (gauge, bars, line, list), a source chip, a sienna "go" line.
Forms
Inputs are .field: translucent white, hairline border, sienna focus ring, 12px radius. Answer options are pills; the selected option inverts to ink.
Callouts
Screener results.
The results page is the most important screen on the site and follows a fixed order, top to bottom. Nothing may be inserted above the crisis block.
- Head — kicker "PHQ-9 results", serif h2 "Your PHQ-9 results", privacy line.
- Crisis block (only if the scale has a crisis item and it was answered above 0) — red tint, 988 / 911 pills.
- Score card — band pill · instrument name · big Fraunces score "out of N" · range bar with the reader's marker · interpretation paragraph · clinical note · action row (Copy results link · Print / save PDF · Email · Retake · Try another · Send a friend a blank X) · save-to-account prompt.
- Takeaway cards — "What this means" (acid dot) and "What to do next" (green dot, numbered).
- Review your answers — collapsed accordion; crisis item answer shown in red.
- About the scale & how scoring works — collapsed: about, scoring, ranges table, check-a-score box, worth knowing, citation.
- Important — please read — the four fixed disclaimers.
Range-bar segment widths are proportional to the band's share of the score range. The marker is ink with a white ring. Band labels use the instrument's own words ("Moderately severe", "Probable PTSD", "Screen positive"), never invented ones.
Content lives in two objects in screeners/index.html: SCALE_META[id] (bands, about, scoring, worthKnowing, citation, crisisItem) and RESULT_INFO[id_style] (what, next[]). Every scale has a _default entry. Adding a scale means adding both.
Layout & motion.
| Token | Value | Notes |
|---|---|---|
--wrap | 1220px | homepage, blog grid, podcast, tools |
--narrow | 820px | screeners app, long reading |
--gutter | 1.4rem | side padding at every width |
| Breakpoints | 1020 · 980 · 900 · 760 · 700 · 600 | widgets stack ≤1020 · wings stack ≤980 · nav collapses ≤900 · about stacks ≤760 |
| Section rhythm | 3.6rem top · 1.6rem below heading | .shead centered serif h2 + sub paragraph ≤52ch |
Motion is quiet. Sections reveal on scroll (16px rise, .6s ease, once). Homepage widgets float ±10px over 6–7s. Cards lift 4px on hover, pills 1px. The "now enrolling" dot pulses. Everything respects prefers-reduced-motion, which disables reveal and float entirely. No parallax, no scroll-jacking, no autoplay.
Imagery.
One photograph of Reid (the seated studio portrait, reid_web.jpg, 880×1329) is the site's only photo. It is cropped into the arch — border-radius: 180px 180px 28px 28px — with a soft white halo behind it and the long shadow. The 300×300 crop (face.jpg) exists for avatars and social cards only. Data visuals are drawn in CSS/SVG in the palette (gauge, bars, line); illustrations, if any, are line-based and single-color sienna. Emoji are allowed as small icon tiles (white 22–36px rounded squares) but never inline in headings.
Writing patterns.
| Element | Pattern | Example |
|---|---|---|
| Page kicker | Wing · what this is · optional place | "Wing 01 · Tools" · "Discover · the podcast · since 2021" |
| Page h1 | Plain statement, one italic turn | "Measure it. Then train it." · "I'm Reid. This is the lab." |
| Section h2 | Sentence case, ends with a period, italic tail | "Field notes, fresh from the bench." |
| Card kicker | Wing · topic | "Understand · placebo" · "Train · tummo" |
| Row descriptor | lowercase · what · time | "depression · 2 min" · "yogi claims, graded" |
| Go line | Verb + object + → | "Take a screener →" · "Open the wiki →" |
| Source chip | Author Year · Author Year | "Zeidan 2010 · Jha 2007" |
| Coming soon | Never "coming soon!" in copy — use the .soon row or the ink "On the bench" band | "ROCS · the 7-item OCD screen · soon" |
| Disclaimer | Mono, uppercase, centered, one line | "Educational only · not a diagnosis · crisis: call or text 988" |
Spelling: American. Oxford comma. "eating disorder" (no hyphen as a noun), "eating-disorder science" (hyphen as a modifier). "Psychedelic-assisted therapy". Numbers: numerals for scores, counts and minutes ("2 min", "30 instruments"); words for anything under ten in prose. Dates in mono as "Sep 2026".
Site map & files.
| Route | Page | Built from |
|---|---|---|
/ | Homepage — hero, widgets, three wings, field notes, enroll band, PI's note, sources | build/home.py |
/tools/ | Measure & Train hub | build/tools.py |
/screeners/ · #phq9 · #anxious · #history · ?r=… | The instruments app (Supabase auth) | edit screeners/index.html directly |
/blog/ · /blog/<slug>/ | Field notes index and posts | build/add_post.py → blog.py |
/podcast/ | Psychedelic Therapy Frontiers archive (live RSS) | build/podcast.py |
/cv/ | The CV Library (its own design system, intentionally) | standalone |
/about/ · /style-guide/ · /404.html | About, this guide, not-found | build/about.py · build/styleguide.py |
/assets/ | dr.css · wm_wide.png · wm_tall.png · reid_web.jpg · face.jpg · favicon.svg · this guide as PDF | shared by every page |
Deploy: drag the site_v3 folder onto Netlify (Deploys → drag & drop). _headers sets no-cache on HTML and a day of cache on assets; _redirects forwards the retired /resources to /blog/. The domain stays pointed at Netlify from Squarespace DNS.
Adding a page: copy the head from build/common.py (fonts + /assets/dr.css), use nav() and FOOTER, write page-specific CSS in the page's own <style>, keep tokens from dr.css. Adding a blog post: python3 build/add_post.py post.html --slug my-post --tag "Understand · topic" --wing understand.