Skip to content
Back

Why I Built Grade

Typography lessons with interactive demos.

A friend told me he was squinting at timestamps on a settings page I'd shipped. The helper text was #9E9E9E on white — 2.7:1 contrast. WCAG wants 4.5:1 for body-sized type. I had treated typography as taste until then. Pick a font, nudge spacing, ship. Once I had a number, I could fix it. Vague taste could not.

That is why I built Grade: a free typography site for people who ship interfaces. Fourteen lessons, demos inside the articles, each one ending with a CSS default you can paste. In the first two weeks it got 1,400+ visitors and 5,000+ page views.

What was missing

Typography advice is easy to find and hard to use while you're in the editor. Blogs explain a rule, then send you to a calculator in another tab. Checklists get skimmed. Auditors can flag contrast, maybe, but they do not teach what a line that is too wide feels like, and they do not hand you max-width: 65ch when you need it.

I wanted the rule and the break on the same page. Drag something. Watch the text get worse. Paste a default that already works.

What's in it

Two tracks. Basics cover the variables that decide whether text is readable at all: measure, contrast, scale, leading, weight, spacing, consistency. Intermediate covers what broke once I left static mockups — fluid type with clamp(), container queries, oklch() for dark mode, link underlines, tabular figures, text-box-trim.

Most of the second track came from specific mistakes. I inverted a hex palette for dark mode and noticed secondary text glowing on black two weeks later. I had four breakpoints per heading and got tired of maintaining them. Those problems became lessons.

Grade landing page in light mode, showing the hero headline The Fundamentals of Readable Type and Start with Measure call to action
Grade landing page, light and dark.

How a lesson works

Each lesson is a long article with a demo in the middle of the prose — not a sidebar, not a separate playground. In measure, you drag a width slider and watch a paragraph get harder to read as the line grows. The character count updates while you drag. The article lands on max-width: 65ch, with a comfort range of 45–75 characters.

In contrast, you push gray text against a background until it crosses 4.5:1. The lesson also covers dark mode, where pure white on pure black passes every checker and still hurts on OLED at night. Grade uses warm neutrals at oklch hue 80 — #fcfcfa background, #63635e secondary text — and I moved this portfolio onto the same tokens once they held up in both themes.

One default, not five options

Every lesson ends with one number or token. Type scale is a perfect fourth at 1.333×. Body line-height sits between 1.5 and 1.65. Body weight stays at 400; headings use 600. Heading margins attach to the paragraph below, not the one above.

I could have built a URL auditor with a letter grade. It would look more like a product and teach less. I could have listed five alternatives per lesson and left you deciding again. I picked one starting point, explained why, and put the control where the argument is.

Grade started with seven basic lessons. I added the intermediate track when I realized the basics assume a fixed viewport and a single theme. Both fall apart in production.

Still open

The intermediate track still feels like a sequel. It should feel like the production half of the same system. Measure and contrast earn a live readout on screen. A few later lessons still explain more than they let you break in ten seconds. That is the next pass.

I shared the launch on LinkedIn and with people already shipping interfaces. The feedback that stuck was simple: the interactive bits made the concepts click. That matched the bet. If you want to try it, start with measure. Drag the slider. Paste max-width: 65ch into your next project.