typography slop

Thirteen type patterns that mark a page as rushed or machine-generated, each shown live next to the fix. The rule behind all thirteen: type carries hierarchy, and hierarchy is a decision. A page that lets a default decide (the eyebrow, the huge hero, the uppercase paragraph) tells the reader nobody did. Pattern source: impeccable.style/slop; the reasoning, demos and samples are ours.

label above heading

A tiny uppercase category label sits above a heading that already says it. The rule: a heading names its section; a label above it must add information the heading does not carry, or it is noise. The cost is real even when it is small: the reader parses two texts to receive one idea, and every section of the page grows a redundant preamble, so nothing stands out anymore.

A: the label repeats the heading

features

Everything you need to ship

Builds, previews and deploys from one command, with a URL for every branch.

the reader reads 'features', then reads a heading that says the same thing in eleven more words.

B: the heading stands alone

Everything you need to ship

Builds, previews and deploys from one command, with a URL for every branch.

same content, one text. the section starts where meaning starts.

ruling
Delete the eyebrow unless it carries a fact the heading does not (a count, a state, an owner). If the page keeps one, it never repeats a word of the heading.
<h3 class="text-base text-zinc-100">Everything you need to ship</h3>
<p class="pt-2 text-sm text-zinc-400">
Builds, previews and deploys from one command, with a URL for every branch.
</p>

tiny interface text

Metadata and captions set below 12px. The rule: 12px is the floor for any text a reader must actually read, because mono and condensed faces fall apart below it and low-vision readers lose it entirely. The slop is a metadata line at 10px "to make it quiet". Quiet comes from color, not from size: the same line at 12px in zinc-500 recedes just as far and stays legible.

A: 10px metadata

deploy complete

build #4812 · ran 2m 14s · deployed by ci

legible on a retina display at arm's length, gone on anything else.

B: 12px, quiet by color

deploy complete

build #4812 · ran 2m 14s · deployed by ci

same recede, same content, readable.

ruling
Never set readable text below 12px. De-emphasize with the muted color step, never with a size step past the floor.
<p class="pt-2 text-xs text-zinc-500">build #4812 · ran 2m 14s · deployed by ci</p>

flat hierarchy

Title, lede and body all set at one size and one color, so the eye has no entry point. The rule: a text block needs at least two visible steps (size or color) between its title and its body, because a reader decides whether to read by scanning the title first. Flat hierarchy costs the scan: every block reads at the same priority, which is the same as having no priority.

A: one size, one color

Rollbacks take one click

Every deploy is immutable. The last ten builds stay warm, so restoring a previous version is a click, not a rebuild. Rollbacks run in under a second because the artifacts never left the edge.

nothing leads; the title and the third sentence carry the same weight.

B: title leads, body recedes

Rollbacks take one click

Every deploy is immutable. The last ten builds stay warm, so restoring a previous version is a click, not a rebuild. Rollbacks run in under a second because the artifacts never left the edge.

two steps: the title is larger and brighter, the body muted. the scan works.

ruling
Give every title at least one visible step over its body (size or the ink/muted color step). If a block does not need a title at that step, it does not need the title.
<h3 class="text-base text-zinc-100">Rollbacks take one click</h3>
<p class="pt-2 text-sm text-zinc-400">Every deploy is immutable...</p>

icon tile above heading

A rounded gradient square with an icon, stacked above a heading, repeated per card. The rule: an icon that decorates its own tile before a heading is filler; it adds a shape the reader must parse but no information the heading lacks. It is the fingerprint of generated card grids: every card gets a tile, so every card looks the same, so none is readable as a choice. The cost is vertical space and sameness.

A: the tile is the card's opening act

Instant previews

Every branch gets a URL the moment it pushes.

a quarter of the card is a decoration; the three cards below it would look identical.

B: the heading opens the card

Instant previews

Every branch gets a URL the moment it pushes.

same content, the icon earns its place only when it sits beside the meaning it marks.

ruling
No stacked icon tile above a heading. An icon joins the heading's line at text size, or it does not appear.
<h3 class="flex items-center gap-2 text-base text-zinc-100">
Instant previews
<svg class="size-4 text-zinc-500" ...></svg>
</h3>
<p class="pt-2 text-sm text-zinc-400">Every branch gets a URL the moment it pushes.</p>

italic serif display

Headlines set in an italic serif "for elegance". The rule: italic display type is harder to read at exactly the sizes display type exists for, and an italic headline plus an upright body is a second family smuggled in through posturing. The cost: the page's loudest text is its least legible, and the pairing reads as a template, not a decision.

A: italic serif headline

The quiet engine behind fast teams

Deploys, previews and rollbacks from one command.

the letters lean; the reader's eye does extra work at the one size built for scanning.

B: upright

The quiet engine behind fast teams

Deploys, previews and rollbacks from one command.

same family, same size, no lean. the words carry the tone.

ruling
Display type stays upright. If a page wants a serif voice, it commits to the serif family; it does not lean it.
<p class="font-serif text-2xl leading-snug text-zinc-100">
The quiet engine behind fast teams
</p>

badge above headline

A small pill ("new", "v2", "beta") stacked above a hero headline. The rule: a status badge is a property of the thing the headline names, so it belongs on the headline's own line, where the reader meets it in context. Stacked above, it becomes an eyebrow (see the first pattern) and costs a line of the hero's height on every screen.

A: the badge previews the headline

new

Pipelines: build once, deploy anywhere

One config produces every environment.

the hero spends its first line on three letters.

B: the badge rides with the headline

Pipelines: build once, deploy anywherenew

One config produces every environment.

same content, one line taller headline, and the badge reads as the headline's state.

ruling
A badge sits inline beside the text it qualifies, never stacked above it.
<p class="flex flex-wrap items-center gap-3 text-2xl leading-tight text-zinc-100">
Pipelines: build once, deploy anywhere
<span class="rounded border border-emerald-500/40 bg-emerald-500/10 px-2 py-0.5 text-xs font-normal text-emerald-300">
new
</span>
</p>

oversized hero headline

The hero headline set at 60-80px, wrapping to three lines and pushing every real sentence below the fold. The rule: a headline is sized by how much it must say, not by how much space it can take; at reading widths that means display sizes in the 24-40px range, not the 64px+ of a poster. The cost is measurable: everything the visitor actually needs starts one to two viewports lower.

A: 72px poster type

Ship with speed

Deploys, previews and rollbacks from one command.

five words fill the card; the sentence that says what the product does is nearly off-screen.

B: 30px, one line

Ship with speed

Deploys, previews and rollbacks from one command.

same words, the whole promise visible at once, the body sentence directly under it.

ruling
Size the headline to its sentence: 24-40px at reading widths. If the headline is five words and 72px, the page is admiring itself.
<p class="text-3xl leading-tight text-zinc-100">Ship with speed</p>

crushed tracking

Display text with letter-spacing tightened past about -0.02em, so letters touch. The rule: tight tracking only pays off on very large, very short all-caps runs, and even there it borrows legibility; on anything set at reading sizes it makes neighboring letters collide. The cost is misreading: "onboarding" reads as "onboa rding" at scan speed.

A: tracking tightened to collision

onboarding

the r and d nearly share a stem; the word needs a second look to parse.

B: the face's own spacing

onboarding

the mono face already ships even rhythm; zero adjustment reads cleaner and faster.

ruling
Leave letter-spacing alone below display sizes, and never tighter than -0.02em anywhere. The typeface's designer already set the rhythm.
<p class="text-3xl text-zinc-100">onboarding</p>

overused font

The whole page set in the same default sans every unconfigured project ships, because choosing a face felt like a decision for later. The rule: the family is part of the page's voice; a deliberate, consistently applied face (even a quiet one) reads as authored, and the default nobody chose reads as template. The cost is not ugliness, it is sameness: the page is indistinguishable from ten thousand others.

A: the default nobody chose

Release notes, week 38

Faster cold starts, a quieter deploy log, and rollbacks from the header menu.

nothing wrong with it; that is the problem. it matches every placeholder page ever shipped.

B: one deliberate family

Release notes, week 38

Faster cold starts, a quieter deploy log, and rollbacks from the header menu.

this site's own stance: one monospace, applied everywhere, so the page sounds like its author.

ruling
Pick one family on purpose, declare it in the theme, and apply it everywhere. Hierarchy comes from size, color and space, never from adding a second family.
/* one family, declared once, used everywhere */
--font-sans: "MonoLisa Nerd Font", "MonoLisa", ui-monospace, monospace;

all-caps body

Paragraphs (not labels) set in uppercase. The rule: lowercase word shapes are what fast reading uses; uppercase removes the ascenders and descenders that make words recognizable at a glance, so every sentence must be read letter by letter. A short all-caps run works as a label; a sentence of it is a wall. The cost is reading speed, immediately and for every reader.

A: the paragraph shouts

Deployments are immutable and every build stays warm, so a rollback is one click and takes under a second.

try to skim it. you cannot; every word has the same rectangular shape.

B: sentence case

Deployments are immutable and every build stays warm, so a rollback is one click and takes under a second.

same sentence, readable at scan speed. emphasis comes from weight or color if needed.

ruling
All-caps is a label treatment for runs of one to three words. Prose is always sentence case.
<p class="text-sm text-zinc-400">
Deployments are immutable and every build stays warm, so a rollback is one click.
</p>

wide tracking on body

Body text with letter-spacing stretched apart, usually to look "airy" or "editorial". The rule: wide tracking belongs to tiny uppercase labels, where it keeps small caps from merging; applied to sentence-case prose it breaks the word shapes readers use and drags the eye across gaps between letters that carry no meaning. The cost is slower reading and a page that tries too hard.

A: letters pushed apart

Every build stays warm for a week, so a rollback is one click.

the eye stumbles over every gap; the sentence reads at half speed.

B: default spacing

Every build stays warm for a week, so a rollback is one click.

the face's rhythm carries the line; airy comes from line-height and margins, not letterspacing.

ruling
Tracking is a small-label tool (uppercase, under 12px) and otherwise set to zero on prose.
<p class="text-sm text-zinc-400">Every build stays warm for a week.</p>
<!-- wide tracking only on tiny uppercase labels -->
<p class="text-xs uppercase tracking-widest text-zinc-500">status</p>

tight line height

Multi-line prose set under about 1.4 line-height, so lines of body text nearly touch. The rule: the eye needs air between lines to find the start of the next one; display sizes can survive 1.1-1.2 because their lines are short, but body text at 14px needs 1.5-1.7. The cost is rereading: on a dense paragraph the eye drops to the same line or skips one.

A: lines pressed together

Every deploy is immutable and the last ten builds stay warm. Restoring a previous version is a click, not a rebuild, because the artifacts never left the edge network. Rollbacks run in under a second even at peak traffic.

read the third line: at this leading the eye lands back on the second as often as the fourth.

B: 1.625 leading

Every deploy is immutable and the last ten builds stay warm. Restoring a previous version is a click, not a rebuild, because the artifacts never left the edge network. Rollbacks run in under a second even at peak traffic.

same paragraph; each line has a clear lane and the paragraph reads at full speed.

ruling
Body text gets 1.5-1.7 line-height (this site uses 1.625). Tight leading is for headlines whose lines are short enough that the return trip is trivial.
<p class="text-sm leading-relaxed text-zinc-400">
Every deploy is immutable and the last ten builds stay warm...
</p>

justified text

Body text justified to both margins on a web page. The rule: justification is a print tool that works when a typesetter can adjust every space and hyphenate every word; a browser stretches whatever gaps it has, so lines develop rivers of white that pull the eye down the page instead of across it. The cost is visible on almost any justified paragraph: ragged word spacing that reads as damage.

A: flush both edges

Every deploy is immutable and the last ten builds stay warm. Restoring a previous version is a click, not a rebuild, because the artifacts never left the edge network closest to the visitor who requested them.

follow the white gaps: some lines pack words, others scatter them. the river runs through line three.

B: flush left, ragged right

Every deploy is immutable and the last ten builds stay warm. Restoring a previous version is a click, not a rebuild, because the artifacts never left the edge network closest to the visitor who requested them.

even word spacing on every line; the ragged edge is the honest cost of even spacing.

ruling
Web prose is flush left with a ragged right edge. Justify only when the medium gives you hyphenation control that browsers do not.
<!-- left-aligned is the default; do not reach for text-justify -->
<p class="text-sm text-zinc-400">Every deploy is immutable...</p>

Pattern source: impeccable.style/slop. Read design for the rest of the design bank.

search pages

go to any page