Start here

A page that speaks before it is read

This page gathers the whole system in one place: how Erik Kennedy's rules read on a screen, how a teaching document reads on a page, and the ready block vocabulary to build one. Every rule below is shown, not just told.

3
Design layers
4
Sources reviewed
20
Patterns captured
0
Dependencies added
The Kennedy method

Erik Kennedy's rules govern the screen, not the document: one job per screen, hierarchy by de-emphasis, grayscale before colour, double the whitespace, controls placed where they act. Seven rules, each shown here.

One job - the squint test

Per hundred visits, one thing happens about ninety-five times. Find it, make it the loudest thing on the screen, and quiet everything else. Kennedy's own case study cut a form from ten visible fields to five.

Everything shouts

Ten fields, three buttons, two banners, all the same size - the eye doesn't know where to land first.

One thing wins

One field, one button, full size. Everything else runs smaller and quieter, or is gone.

Grayscale first

Design in black, white and grey until spacing and weight alone carry the hierarchy. Add colour last, and only where it means something. Try it on a callout already on this page:

Passes. This callout still reads as "a callout" in grayscale - the left border and the bold lead carry the meaning, not the blue tint alone.

Double the whitespace

Default markup has almost no air. Group gaps should visibly beat element gaps - not by a little, by double.

Before
Row one
Row two
Row three
After, doubled
Row one
Row two
Row three

Pop and un-pop

Every text style leans up (bigger, bolder, darker) or down (smaller, lighter, greyer). Only the page's own title gets to be all the way up.

Page title
Meta line, date, author

Locality, and anything but dropdowns

A control sits where it acts. The farther it sits from its effect, the more it has to shout to be found - the real fix is moving it back, not making it louder.

Far from its effect
+ Add row
At the point of use
+ Add row

Dropdowns hide options and cost a tap. Replace them by option count:

OptionsUse instead
2Segmented buttons, a checkbox, or a switch
2 to 5Vertical segmented buttons, radios, or visual cards
ManyTypeahead search
DatesCalendar for near dates, a text field for wide-spread ones

Colour as scarce accent

One base colour, varied by brightness and saturation - never a wheel of decorative hues. The same four tags, coloured two ways:

Colour everywhere

Every tag a different hue - so none of them means anything.

New Open Late Hold
One accent

Grey by default; the accent marks only the one that matters.

New Open Late Hold

Alignment

Left-aligned text has a weak, ragged right edge - never hang a new element off it; align to the shared left edge instead. And the light marks - bullets, icons, punctuation - hang outside the text's left edge, as print has done since Gutenberg.

Reading measure keeps every line a comfortable length,
but the right edge stays uneven, on purpose.
  • The bullet sits out in the margin, outside the text column.
  • So the sentences themselves keep one clean, shared left edge.
  • The eye follows the text, not the marks beside it.
Documentation patterns

Kennedy's rules govern the screen. A teaching document is a different shape, read top to bottom, sometimes long. Four patterns keep a long page calm.

Reading

Body text you are reading now runs at 18 pixels, line height 1.6, capped at 68 characters so the eye finds the return path on every line - this paragraph is set in .prose. Reference material is scanned, not read, so it runs smaller and tighter in .dense:

Dense regime, for comparison. Fifteen pixels, line height 1.4, the plain UI font instead of the reading serif. A paragraph and a data table should never fight for one register.

Three fonts, three jobs, set once at the top of the file: a serif for reading, a plain sans for labels and controls, a monospace for anything literal - an ID, a field name, a line of code.

css - the three fonts, set once
:root {
  --font-body: Georgia, serif;        /* prose */
  --font-ui:   system-ui, sans-serif; /* labels, nav, controls */
  --font-mono: 'SF Mono', monospace;  /* code, IDs, literal values */
}
Aa Bb 123
serif - reading
Aa Bb 123
sans - labels
Aa Bb 123
mono - code

Orientation

A long page loses the reader unless it keeps answering "where am I, how much is left." Three quiet devices do this without asking for attention: the thin bar at the top of this page that stays while you scroll, the list of headings on the right that tracks your position, and the small # that appears when you rest the pointer on any heading here - try it on this one.

Why this reads well. MDN's own writers converged on the same three devices on their own. The page never makes the reader guess where they are.

The rail collapses into a plain toggle on a narrow screen - the same markup, one media query, no script beyond what the browser's own <details> element already does.

The block vocabulary

Eight shapes cover almost everything a teaching page needs to say. None come from a framework - each is a dozen lines of hand-written CSS, borrowed as an idea from Semantic UI and refused as a dependency.

.segment.raised

A bordered box groups related content into a visible topic before a word is read.

A hairline border plus one soft shadow, one elevation only. Use it to lift a block above the page - a summary, a highlighted example, a pull quote.
.callout.warning / .success

The one place colour is allowed to mean something. Three tints, never more.

Watch for colour-only signals. A callout told apart purely by a tint, with no border weight behind it, is invisible without colour vision - and on a bad projector, to everyone.
Confirmed, not new. This is the same grayscale-first rule already run above - the digest just gave it a mechanical step: filter:grayscale(1).

Its job is to flag the one sentence that matters - done by quieting the rest and lifting that line out, not by making it louder:

Buried

The form has several fields and takes about ten minutes. Applicants complete it online. The deadline is 31 March, after which the service closes for the year. Supporting documents are optional. A confirmation email is sent on submission.

Flagged

The form has several fields and takes about ten minutes. Applicants complete it online. Supporting documents are optional. A confirmation email is sent on submission.

The deadline is 31 March. After that, the service closes for the year.
.steps / .step.active

A row of numbered stages turns "first, then, finally" into something scannable in two seconds:

1
Read
The applicant fills the form.
2
Check
The officer reviews it.
3
Register
The record is written.
.stat / .stat-row

A large number with a small caption lands the one figure a page wants remembered:

60+
Countries
3
Steps
€0
To register
dl.desc-list

A word, then what it means, structurally paired with the real <dl> tag rather than a callout pretending to be one:

Measure
The length of a line of text, capped near 68 characters so the eye keeps its place.
Regime
A reading mode - prose for teaching paragraphs, dense for tables and specs.
.divider / .label.accent
Small marks

A divider splits a page without a full heading - like the one just above. A label is a tiny status tag: Draft Confirmed - one grey, one accent, no dozen variants.

figure.code

A filename or language tag above the block, horizontal scroll, never wrap - wrapping destroys the code's own structure:

callout.css
.callout { border-left: 4px solid var(--accent); background: #f7f7f7; }
.table-wrap

Sticky header, zebra rows, scroll in their own box on a narrow screen:

BlockIts one job
SegmentGroup a topic into a visible box
CalloutFlag the one sentence that matters
StatisticLand the one figure worth remembering
.compare

Wrong-way beside right-way, in matched columns with equal weight - see every "before/after" pair on this page, including the one right below.

Without the kit

One long paragraph, full viewport width, every fact the same size and weight, no space between ideas, a table that squeezes instead of scrolling.

With the kit

A capped reading column, a segment around each topic, one callout for the sentence that matters, a table that scrolls sideways in its own box.

How to build one

The same four moves, in order, on every teaching page:

1
Pick the two regimes
Prose for teaching paragraphs, dense for tables and specs. Never mixed in one block.
2
Add orientation
Sticky header, on-this-page rail, hover anchors on every heading.
3
Reach for the vocabulary
Segment, callout, steps, statistic, definitions, divider, label, code, table.
4
Review in grayscale
Drop the filter. Anything that goes flat was leaning on colour to do structural work.

What makes a page tiring

Eight ways a document loses its reader, gathered from the same four sources:

Anti-patternWhy it tires the reader
Full-width body textNo measure cap - the eye loses its place on every wrap.
Colour-only signallingA status or a code block told apart purely by hue, invisible without colour vision.
Font tourismThree or more display fonts on one page compete instead of guiding.
Loud saturated calloutsFilled high-chroma boxes for routine notes - everything screams, nothing lands.
No local orientationNo rail, no sticky header, no anchors - a scroll of unknown length.
Prose and reference at one sizeA paragraph and a data table fighting for one register.
Word-wrapped codeLong lines wrap and break the code's own structure.
Wiki chromeNav, tags and "last edited by" competing with the content for the first five seconds.

The naming habit

Semantic UI's real contribution was never its CSS - it was the habit of a class name reading like English: raised segment, info callout, step active. Anyone opening the file later reads intent straight off the tag, no framework required.

Sources and verdicts

This kit did not invent its vocabulary. It reviewed four sources and kept what survived contact with the house rules.

SourceVerdictWhat we took
r/UXDesign - top documentation UI/UXKept - the spineThe exemplar list and the reading/orientation patterns on this page.
Semantic UIKept the ideaSegment, callout, steps, statistic, definitions, divider, label - hand-written, not the framework. The dead 2013-era jQuery build itself is skipped.
uibakery - HTML UI librariesKept three ideasReading measure, the prose class, the alert box.
screensdesign.comSkippedApp-paywall gallery, no transfer to documents.

Named exemplars

The doc sites that read well, and what each one is worth stealing:

LaTeX.css
One link tag turns plain HTML into a book-like page. Proof that typography and spacing alone, zero components, can look finished.
MDN Web Docs
Persistent "In this article" rail, breadcrumb above the title, soft-tinted status callouts. The page never makes you guess where you are.
Astro Starlight
Grouped collapsible sidebar, "on this page" control, coloured-left-border admonitions - the clean reference for the orientation kit on this page.
GitHub Markdown CSS
The semi-nice baseline everyone measures a documentation page against.
Stripe docs, Vercel, Tailwind, Prisma, Supabase, Radix, Anthropic docs
The current frontier of developer-tool documentation, competing hard on layout discipline over typeface fashion.
Confluence
Named only as the anti-example - wiki chrome, not a designed page. What not to imitate.

Full digests: documentation-design.md and kennedy/, both in this same folder.