Plate № 20 · Typography · report masthead

A pattern from the gf.cx specimen book

Report header · quiet by default

A report's masthead should sound like the document beneath it. The dare.co.uk report header drifted away from its own body — louder, more designed, in a different voice. This is the pattern that brings it back, developed live before it graduates.

Source · Dan, 2026-06-25

"The body of the report seems solid — whereas the header seems playful, overly complicated… I think it's the italic headline, oversized, that's doing the drift work."

The problem

Reports are rendered by two generators (seo_render_html.py for the markdown corpus, dare_cf_analytics.py for the analytics dashboard), each carrying its own hand-rolled header CSS. Neither referenced the shared page-header primitive — the canonical breadcrumb + kicker + h1 + stamp typography the rest of the portfolio uses. So the header drifted while the body stayed solid.

The specific tell: a serif italic h1 scaling up to ~54px sat above a body whose own headings are restrained Atkinson sans. The title spoke a different language from the document — that mismatch reads as "playful, overcomplicated." The body was never the problem; the masthead was.

The shape

The specimens, in-page

Same content, same primitive, three h1 treatments. These are real iframes loading assets.gf.cx/page-header/page-header.css + the gf.cx palette; only the headline rule differs. Pick the voice.

Specimen A · Sans — matches the body voice

Atkinson sans, ~28px, weight 600 — the same family and weight as the report's h2 headings. The header now speaks the body's language; the most de-drifted of the three.

Specimen B · Upright serif — editorial but quiet · ✓ chosen + shipped 2026-06-25

Newsreader serif but upright, ~30px, weight 500. Keeps a document feel for the title without the playful italic. A middle path between the body's sans and the old oversized italic.

Specimen C · Primitive italic — canonical, the trait flagged

The shared primitive exactly as it ships today: Newsreader serif italic, 38px — already smaller than the ~54px the report ran. Matches status.gf.cx. Shown for honest comparison; it keeps the italic Dan called out.

The category chip

The reports colour-code by category. That chip — colour variants (and optional icons) — graduates into the shared primitive as page-header.css v0.2.0, so every surface can use it without re-forking. The report wears the quiet, text-only form:

Health Signal Ideas

The graduation path

Shipped 2026-06-25 — Specimen B (.upright-title) graduated in three moves; nowhere else holds a copy:

  1. Asset. The .upright-title variant + the .kicker--health/signal/ideas colour variants shipped in assets.gf.cx/page-header/page-header.css v0.2.0.
  2. Generator. seo_render_html.py now imports the primitive, lifts the <h1> into a canonical <header class="upright-title">, emits .nav · .kicker · h1 · .stamp, and the bespoke header CSS is gone.
  3. Backfill. The full corpus (461 reports) was force-re-rendered through dare_dev_reports_publish.py on the Mac and redeployed to dev.dare.co.uk — not the dashboard-refresh GHA, which builds the analytics dashboard, a separate output.

The report header is the primitive now — no second source to drift from.

Shipped 2026-07-14 — a third title voice, .roman-title, joined the sibling family on the primitive: masthead-scale upright serif (slant only removed, 38px / weight 400 kept), so an italic <em> accent word inside the h1 distinguishes itself by both slant and colour. First adopter growth.gf.cx/reading — h1 "A product-designer reading list, decoded."

When it breaks

Sibling of the built-with provenance footer and the back-to-top jump icon — same single-source, control-plane discipline, applied to the top of the page instead of the bottom.

Where it applies

Reusable elements

Reference

Source
Dan, 2026-06-25 · emerged from a live drift audit of the dare.co.uk report masthead.
In use / example
devreports.dare.co.uk — 461-report corpus rendered via seo_render_html.py, using the .upright-title variant shipped 2026-06-25; also at dash.gf.cx/reports/. Copy the header snippet from seo_render_html.py as the starting template.
Reusable elements
page-header.css · .upright-title / .sans-title / .roman-title h1 voice variants · .kicker--health/signal/ideas colour chips · nav.nav breadcrumb · div.stamp render line.
Origin
dare.co.uk report corpus, 2026-06-25 — Specimen B graduated corpus-wide the same session; page-header.css v0.2.0 added the voice variants and colour chips.