---
title: "Anti-slop: 30 tells with before/after (craft)"
description: "Each tell reads as \"generated\" because the measured top sites don't do it. Numbers are from the 24-site teardown (2026-09-15)."
canonical: https://void-design.vercel.app/docs/craft/anti-slop
lastModified: 2026-09-16
---

# Anti-slop: 30 tells with before/after

Each tell reads as "generated" because the measured top sites don't do it. Numbers are from the 24-site teardown (2026-09-15). Run this list against screenshots at 1440 and 390.

## Color

**1. Purple→blue gradients.** 0 of 24 sites put a gradient on a CTA or headline at the fold; Stripe's gradient is an art-directed WebGL ribbon.
```tsx
// before
<a className="bg-gradient-to-r from-indigo-500 to-purple-600 text-white shadow-lg">Get started</a>
// after
<Button href="/signup" size="lg">Start free trial</Button>   // bg-brand, flat, inset highlight
```

**2. Gradient headline text.** (`design/gradient-text`)
```tsx
// before
<h1 className="bg-gradient-to-r from-sky-400 to-fuchsia-500 bg-clip-text text-transparent">The future of work</h1>
// after
<h1 className="max-w-[16ch] text-display-lg text-fg">Standups in 4 minutes. <span className="text-fg-muted">Written by the tickets.</span></h1>
```

**3. Rainbow accents.** Measured accent use ≤ 5% of elements, one hue. (`design/multiple-accents`)
```tsx
// before: <Zap className="text-yellow-500"/> <Shield className="text-green-500"/> <Globe className="text-purple-500"/>
// after:  every icon className="size-4 text-fg-muted"; brand only on the CTA and links
```

**4. Pure black on white + gray-500.** Foregrounds measured: #171717, #141413, #26251e; backgrounds #fafafa, #faf9f5.
```tsx
// before <body className="bg-white text-black"> <p className="text-gray-500">
// after  (nothing on body: base sets bg-bg text-fg) <p className="text-fg-muted">
```

**5. Solid gray borders everywhere.** Measured hairlines are 1px at 5–12% alpha.
```tsx
// before <div className="border border-gray-200 rounded-2xl shadow-md p-6">
// after  <div className="rounded-xl border border-line-subtle p-6">   // or surface-card
```

**6. Glass cards.** Blur measured only on headers (Linear 20px, Mercury 10px) and overlays.
```tsx
// before <div className="backdrop-blur-xl bg-white/10 border border-white/20 rounded-3xl">
// after  <div className="rounded-xl bg-surface border border-line-subtle">
```

**7. Blob/orb hero.**
```tsx
// before <div className="absolute -top-40 left-1/2 size-[600px] rounded-full bg-purple-500/30 blur-3xl" />
// after  one edge light at 12% brand, or none, plus a real product frame or a typographic hero
<div aria-hidden className="pointer-events-none absolute inset-x-0 top-0 -z-10 h-144 bg-[radial-gradient(60%_70%_at_20%_0%,color-mix(in_oklch,var(--brand)_12%,transparent),transparent_70%)]" />
```

**8. Default selection and focus.** 20/24 sites brand the selection. Fix: don't override base (`::selection`, `:focus-visible`); delete any `outline-none`.

## Typography

**9. Default tracking on big headings.** 14/18 sites with ≥ 40px display text use negative tracking. (`design/heading-tracking`)
```tsx
// before <h1 className="text-6xl font-bold tracking-normal leading-tight">
// after  <h1 className="text-display-lg">          // size, lh 0.96, −0.04em×knob, weight from direction
```

**10. Bold display.** 18/23 measured H1s ≤ 600. Remove `font-bold`/`font-extrabold` from headings.

**11. Loose display leading.** Measured 0.85–1.15. Never `leading-normal`/`leading-relaxed` on `text-display*`.

**12. No small-type texture.** Workhorse is 14px; mono labels add technical texture.
```tsx
// before <p className="text-base">Pipelines</p>
// after  <p className="label-mono text-fg-muted">01 · Pipelines</p>
```

**13. Wide grey hero sub.** Measured max-width 480–672px.
```tsx
// before <p className="mx-auto max-w-4xl text-xl text-gray-500">
// after  <p className="mt-6 max-w-[44ch] text-lg text-fg-muted">
```

**14. Orphans.** Base sets `text-wrap: balance` on h1–h4; also cap width: `max-w-[16ch]`.

**15. Too many fonts.** ≤ 2 families + mono (`design/too-many-font-families`, `lint/google-fonts-link`). Delete `<link href="fonts.googleapis.com…">`; use the direction's `next/font` loaders.

## Layout

**16. Everything centered.** Interior headings centered: Linear 1/14, Stripe 1/32.
```tsx
// before <div className="text-center"><h2>…</h2><p className="mx-auto">…</p></div>
// after  <div className="grid gap-6 lg:grid-cols-12"><h2 className="lg:col-span-5">…</h2><p className="lg:col-span-6 lg:col-start-7">…</p></div>
```

**17. The template page** (badge → centered H1 → 2 buttons → glow screenshot → 3 icon cards → logos → testimonials → pricing → FAQ → CTA). Fix: plan sections from the brief with archetypes (`website/references/section-archetypes.md`); each section must have a job.

**18. Three identical icon cards.** None of the top sites uses it as the primary feature explainer.
```tsx
// before
<div className="grid grid-cols-3 gap-8">{features.map(f => <div className="rounded-2xl p-8 shadow"><div className="size-12 rounded-full bg-indigo-100"><f.icon/></div><h3>{f.title}</h3><p>{f.body}</p></div>)}</div>
// after: feature rows with real UI, or an editorial divided list
<ul className="divide-y divide-line-subtle border-y border-line-subtle">
  {features.map((f, i) => (
    <li key={f.title} className="grid gap-3 py-6 lg:grid-cols-12">
      <span className="label-mono text-fg-subtle lg:col-span-2">{String(i + 1).padStart(2, "0")}</span>
      <h3 className="text-xl text-fg lg:col-span-4">{f.title}</h3>
      <p className="text-md text-fg-muted lg:col-span-6">{f.body}</p>
    </li>
  ))}
</ul>
```

**19. Random bento.** Spans must follow importance; each tile shows something real (UI, data, code). If tiles would hold only icon + title + text, use tell 18's list instead.

**20. Uniform section padding.** Measured 96–160px with variation. Replace every `py-20` with the rhythm table in `layout.md`.

**21. Unreadable line length.** `max-w-7xl` paragraphs → `max-w-prose` or `max-w-[60ch]` (`design/line-length-long`).

**22. Generic navbar** (80px, 5 centered links, gradient button). Measured headers 56–72px, CTA solid neutral or brand, small.
```tsx
// after: template SiteHeader — sticky h-(--header-h), text-sm links text-fg-muted, Button size="sm"
```

## Components and details

**23. `rounded-2xl shadow-xl` everywhere.** `shadow-xl` doesn't exist in void (emits nothing) and cards cap at `rounded-xl`.
```tsx
// before <div className="rounded-3xl shadow-2xl p-10">
// after  <Card className="p-6">          // surface-card: radius-xl + hairline + shadow-1
```

**24. Border + shadow + bg change on hover.**
```tsx
// before <a className="border shadow hover:shadow-xl hover:bg-gray-50 hover:border-indigo-500 hover:-translate-y-2">
// after  <a className="press rounded-xl border border-line-subtle p-6 transition-colors duration-(--duration-fast) hover:border-line-strong">
```

**25. Non-concentric corners.** `rounded-2xl` parent with `p-2` and `rounded-2xl` child → `radius-nested` on the parent.

**26. Emoji or circled icons.** (`design/emoji-icons`)
```tsx
// before <h3>🚀 Fast deploys</h3>   <div className="grid size-12 place-items-center rounded-full bg-blue-100"><Rocket/></div>
// after  <h3 className="flex items-center gap-2 text-xl"><Rocket aria-hidden className="size-4 text-fg-muted" strokeWidth={1.5}/>Fast deploys</h3>
```

**27. Hover scale-up and glowing buttons.** Measured press is scale **down** 0.96–0.98; hover is a color step in 100–200ms.
```tsx
// before <button className="transition-all duration-300 hover:scale-105 shadow-lg shadow-indigo-500/50">
// after  <Button>Deploy</Button>        // press utility + bg-brand → hover:bg-brand-hover
```

**28. Fake proof.** Invented logos, "10K+ users", 5-star carousels with stock avatars. Fix: real proof or omit. Placeholder protocol in `website` §3. A single long, specific, attributed quote beats a carousel.

## Motion and copy

**29. Fade-up on every section; `transition-all duration-300`.** (`lint/transition-all`, `smooth/transition-all`)
```tsx
// before <motion.section initial={{opacity:0,y:50}} whileInView={{opacity:1,y:0}} transition={{duration:1}}>
// after  <section className="section-y"> … <figure className="reveal">…</figure>   // 1–3 reveals per page, CSS only
```

**30. Buzzword copy.**
```
before  Unlock the power of AI to supercharge your workflow seamlessly.
after   Turns a 40-minute incident review into a 3-paragraph summary with links to every log line.
```
Banned list and headline formulas: `website/references/copy-and-content.md`.

## Omissions that also betray generation

No `:focus-visible` style · no dark `color-scheme` / flash of wrong theme · lorem ipsum or "John Doe" · no empty/error/loading states · arbitrary values (`p-[18px]`, `text-[#a1a1aa]`, `lint/tw-arbitrary-sprawl`) · mixed icon sets · missing favicon · `<title>` "Create Next App" · 12px tap targets · horizontal scroll at 390px.
