# Anti-Slop Gallery

A contrastive catalog of AI-generated design fingerprints. Each entry shows the pattern that reads as AI-slop, explains why, and demonstrates a refined alternative that solves the same need with intent.

These patterns are not bad in isolation. They are bad because models converge on them by default. Using any one of them is a signal to stop and commit to an aesthetic direction from `aesthetic-directions.md` instead.

---

## 1. Glassmorphism everywhere

Frosted-glass cards with `backdrop-filter: blur()` and semi-transparent white fills were a genuine 2020 macOS Big Sur moment. Models now reach for them as decoration on any surface — navbars, modals, stat cards, landing pages — regardless of context. The tell is blur with no foreground to blur against, or blur stacked on blur with no depth logic. It reads as "I don't know what this surface should be, so I made it translucent."

```html
<!-- slop -->
<div class="rounded-2xl bg-white/20 backdrop-blur-xl border border-white/30 p-6 shadow-lg">
  <h3 class="text-white font-semibold">Revenue</h3>
  <p class="text-white/70 text-sm">This month</p>
  <p class="text-white text-4xl font-bold">$12,480</p>
</div>
```

```html
<!-- refined: opaque surface, real hierarchy, colour drawn from a committed palette -->
<article class="bg-[oklch(97%_0.01_80)] border-t-2 border-[oklch(25%_0.05_30)] p-8">
  <p class="font-mono text-xs uppercase tracking-[0.2em] text-[oklch(40%_0.05_30)]">Revenue / May</p>
  <p class="mt-4 font-serif text-5xl text-[oklch(20%_0.02_30)]">$12,480</p>
  <p class="mt-2 text-sm text-[oklch(40%_0.05_30)]">+18.2% vs April</p>
</article>
```

Use backdrop-filter only when a foreground object genuinely occludes a background (a sticky nav over scrolling content, a dialog over a photo). Never as a default surface fill.

---

## 2. Purple-to-blue gradient hero

The `from-purple-600 to-blue-600` hero is the single most recognised AI fingerprint of 2023-2025. It pairs with gradient text, a centered CTA, and three feature cards below. It appeared on every generated SaaS mock because it is the default of every starter template. A brand that looks like every other brand has no brand.

```html
<!-- slop -->
<section class="min-h-[60vh] bg-gradient-to-br from-purple-600 via-indigo-600 to-blue-600 flex items-center justify-center text-center">
  <div>
    <h1 class="text-6xl font-bold text-white">Build faster with AI</h1>
    <p class="mt-4 text-white/80">The platform for modern teams.</p>
    <button class="mt-8 bg-white text-purple-600 px-6 py-3 rounded-full font-semibold">Get Started →</button>
  </div>
</section>
```

```html
<!-- refined: single committed hue, asymmetric composition, typographic confidence -->
<section class="min-h-[70vh] bg-[oklch(96%_0.02_55)] grid grid-cols-12 gap-6 px-10 py-24">
  <div class="col-span-7">
    <p class="font-mono text-xs uppercase tracking-[0.3em] text-[oklch(45%_0.12_25)]">Issue 04 / Summer</p>
    <h1 class="mt-6 font-serif text-7xl leading-[0.95] text-[oklch(20%_0.03_40)]">
      The kitchen,<br/>
      <em class="italic text-[oklch(45%_0.12_25)]">slowly</em>.
    </h1>
  </div>
  <aside class="col-span-4 col-start-9 border-l border-[oklch(20%_0.03_40)] pl-6 self-end">
    <p class="text-sm leading-relaxed text-[oklch(30%_0.03_40)]">
      A quarterly about restaurants that refuse to rush.
    </p>
  </aside>
</section>
```

If the design calls for a gradient, use one drawn from the committed palette at low amplitude (within one hue, or between two analogous hues), not the default tailwind purple-blue.

---

## 3. Cyan-on-dark cyber theme

`bg-slate-950` with `text-cyan-400` accents and neon glows is the "technical product" reflex. It suggests rigor without earning it. It works exactly once, for a terminal emulator or a dev-ops dashboard that actually shows logs. For a marketing page about a scheduling app, it is costume.

```jsx
// slop
<div className="bg-slate-950 text-cyan-400 font-mono p-8 rounded-xl border border-cyan-500/30 shadow-[0_0_40px_rgba(34,211,238,0.3)]">
  <div className="flex items-center gap-2">
    <span className="h-2 w-2 rounded-full bg-cyan-400 animate-pulse" />
    <span>SYSTEM ACTIVE</span>
  </div>
  <p className="mt-4 text-4xl font-bold text-white">127 ops/sec</p>
</div>
```

```jsx
// refined: light palette, real monospace reason (it is a number readout), no glow
<div className="bg-[oklch(98%_0.005_80)] border border-[oklch(88%_0.01_80)] p-8">
  <div className="flex items-center gap-2">
    <span className="h-1.5 w-1.5 rounded-full bg-[oklch(55%_0.15_145)]" />
    <span className="font-mono text-[11px] uppercase tracking-[0.25em] text-[oklch(35%_0.02_80)]">Active</span>
  </div>
  <p className="mt-6 font-mono tabular-nums text-5xl text-[oklch(20%_0.02_80)]">127<span className="text-xl text-[oklch(45%_0.02_80)]"> ops/sec</span></p>
</div>
```

Dark mode is a legitimate choice. Cyan-on-dark with a glow shadow is not a design; it is a reflex.

---

## 4. Rounded icon chip above every heading

The 48x48 rounded-square with a Lucide icon and a soft tinted background above every section heading. It is a template artefact. It adds no information, breaks the vertical rhythm, and signals that the author did not know how to differentiate sections any other way.

```html
<!-- slop -->
<section>
  <div class="h-12 w-12 rounded-xl bg-indigo-100 flex items-center justify-center mb-4">
    <svg class="h-6 w-6 text-indigo-600"><!-- lightning bolt --></svg>
  </div>
  <h2 class="text-2xl font-bold">Fast</h2>
  <p class="text-slate-600">Our platform is blazingly fast.</p>
</section>
```

```html
<!-- refined: number + rule as the section marker -->
<section class="border-t border-[oklch(25%_0.02_250)] pt-6">
  <div class="flex items-baseline gap-4">
    <span class="font-mono text-xs text-[oklch(45%_0.02_250)]">01</span>
    <h2 class="font-serif text-3xl text-[oklch(20%_0.02_250)]">Fast, because<br/>nothing reloads.</h2>
  </div>
  <p class="mt-4 max-w-prose text-[oklch(35%_0.02_250)] leading-relaxed">
    Pages stream in partial. The scheduler holds state between navigations.
  </p>
</section>
```

If the design genuinely uses iconography, draw custom marks or use a weight-consistent set, and place them where they carry meaning, not as decoration above every `<h2>`.

---

## 5. Hero metric template

Three stat cards in a row: big number + small label + small gradient accent bar. Used on every AI-generated dashboard and every landing page that wants to look quantitative. The cards are always identical in size and spacing and always communicate the same weight, which means nothing stands out. Real data has outliers; template data does not.

```html
<!-- slop -->
<div class="grid grid-cols-3 gap-6">
  <div class="rounded-xl border p-6">
    <p class="text-sm text-slate-500">Users</p>
    <p class="mt-2 text-3xl font-bold bg-gradient-to-r from-indigo-500 to-purple-500 bg-clip-text text-transparent">12.4K</p>
    <p class="mt-2 text-sm text-emerald-600">↑ 12.3%</p>
  </div>
  <!-- repeated 2x -->
</div>
```

```html
<!-- refined: editorial stat block, weight allocated to the one that matters -->
<dl class="grid grid-cols-12 gap-x-6 gap-y-10 border-t border-b border-[oklch(25%_0.03_30)] py-10">
  <div class="col-span-7">
    <dt class="font-mono text-xs uppercase tracking-[0.2em] text-[oklch(40%_0.05_30)]">Active subscribers</dt>
    <dd class="mt-3 font-serif text-8xl leading-none text-[oklch(20%_0.03_30)] tabular-nums">12,487</dd>
    <dd class="mt-2 text-sm text-[oklch(35%_0.05_30)]">Readers who opened at least one issue this quarter.</dd>
  </div>
  <div class="col-span-3 col-start-9 self-end">
    <dt class="font-mono text-xs uppercase tracking-[0.2em] text-[oklch(40%_0.05_30)]">Churn</dt>
    <dd class="mt-3 font-serif text-2xl text-[oklch(20%_0.03_30)] tabular-nums">0.9%</dd>
  </div>
  <div class="col-span-2 self-end">
    <dt class="font-mono text-xs uppercase tracking-[0.2em] text-[oklch(40%_0.05_30)]">NPS</dt>
    <dd class="mt-3 font-serif text-2xl text-[oklch(20%_0.03_30)] tabular-nums">72</dd>
  </div>
</dl>
```

Weight the headline number. Demote the others. Vary column spans. Never grid-3 three equal stat cards.

---

## 6. Identical card grid

`grid-cols-3 gap-6` of cards containing an icon, a heading, and two lines of text. The visual equivalent of "Lorem ipsum with extra steps." The sameness of the cards communicates nothing — no hierarchy, no narrative, no reason to read any particular card.

```html
<!-- slop -->
<div class="grid grid-cols-3 gap-6">
  <div class="rounded-xl border p-6 shadow-sm">
    <Icon class="h-8 w-8 text-indigo-600 mb-3" />
    <h3 class="font-semibold">Reliable</h3>
    <p class="text-sm text-slate-600">99.99% uptime SLA.</p>
  </div>
  <!-- repeated 5 more times, identical -->
</div>
```

```html
<!-- refined: asymmetric, ranked, one card earns the emphasis -->
<section class="grid grid-cols-12 gap-6">
  <article class="col-span-7 row-span-2 border-r border-[oklch(85%_0.01_80)] pr-6">
    <p class="font-mono text-xs uppercase tracking-widest text-[oklch(50%_0.05_25)]">The principle</p>
    <h3 class="mt-3 font-serif text-4xl text-[oklch(20%_0.02_80)]">Do the smallest thing that could possibly work, then learn.</h3>
    <p class="mt-6 text-[oklch(30%_0.02_80)] leading-relaxed max-w-prose">Long-form explanation here. Not a two-line summary. This is the card that carries the narrative.</p>
  </article>
  <article class="col-span-5">
    <h4 class="font-serif text-xl text-[oklch(20%_0.02_80)]">Reliability</h4>
    <p class="mt-2 text-sm text-[oklch(40%_0.02_80)]">99.99% over 18 months.</p>
  </article>
  <article class="col-span-5">
    <h4 class="font-serif text-xl text-[oklch(20%_0.02_80)]">Support</h4>
    <p class="mt-2 text-sm text-[oklch(40%_0.02_80)]">Response within 12 minutes, measured.</p>
  </article>
</section>
```

If you must grid cards, vary their spans, give one emphasis, and let the others recede. Equal weight is anti-hierarchy.

---

## 7. Gradient text on headlines

`bg-gradient-to-r from-X to-Y bg-clip-text text-transparent` on a headline. It robs contrast, fails AA on the lighter stops, and reads as a decorative substitute for typographic confidence. A well-set headline in a single colour is more striking.

```html
<!-- slop -->
<h1 class="text-6xl font-extrabold bg-gradient-to-r from-fuchsia-500 via-purple-500 to-indigo-500 bg-clip-text text-transparent">
  The future of work
</h1>
```

```html
<!-- refined: single ink colour, italic tension, varied scale inside one line -->
<h1 class="font-serif text-7xl leading-[0.95] text-[oklch(18%_0.02_30)]">
  The future of work,<br/>
  <em class="italic text-[oklch(45%_0.15_25)]">slower</em>.
</h1>
```

Colour on a single word — as a foil — carries more weight than a gradient across the whole line.

---

## 8. Sparklines as decoration

A 40-pixel-wide SVG line that wiggles, placed in a card because "it looks analytical." The line carries no readable data, no axis, no range, no comparison. It is the chart equivalent of lorem ipsum.

```jsx
// slop
<div className="flex items-center justify-between p-4 rounded-xl border">
  <div>
    <p className="text-sm text-slate-500">Revenue</p>
    <p className="text-2xl font-bold">$48,290</p>
  </div>
  <svg className="h-10 w-24 text-emerald-500" viewBox="0 0 100 40">
    <path d="M0,30 L20,20 L40,25 L60,10 L80,15 L100,5" stroke="currentColor" fill="none" strokeWidth="2"/>
  </svg>
</div>
```

```jsx
// refined: either a real chart with axes and comparison, or nothing
<div className="p-6 border-t border-[oklch(85%_0.01_80)]">
  <p className="font-mono text-xs uppercase tracking-[0.2em] text-[oklch(45%_0.02_80)]">Revenue / trailing 12 weeks</p>
  <p className="mt-3 font-serif text-4xl tabular-nums text-[oklch(20%_0.02_80)]">$48,290</p>
  <p className="mt-1 text-sm text-[oklch(40%_0.02_80)]">Median week $3,842. Worst week $1,180 (Feb 14). Best $6,090.</p>
</div>
```

If you cannot label the axes, do not draw the chart. Replace it with a sentence.

---

## 9. Drop-shadow on rounded rectangle

`rounded-xl shadow-lg` with a white fill and slate border. The default Material-lite card. It is not wrong; it is invisible. Nobody will ever say "I remember that site with the rounded cards and the soft shadow."

```html
<!-- slop -->
<div class="bg-white rounded-xl border border-slate-200 shadow-lg p-6">
  <h3 class="font-semibold">Card title</h3>
  <p class="text-sm text-slate-600">Some content.</p>
</div>
```

```html
<!-- refined: commit to a surface treatment with a point of view -->
<!-- option A: brutalist flat -->
<div class="bg-[oklch(97%_0.02_80)] border-4 border-[oklch(18%_0_0)] shadow-[6px_6px_0_oklch(18%_0_0)] p-6">
  <h3 class="font-sans font-black uppercase">Card title</h3>
  <p class="mt-2 text-sm">Some content.</p>
</div>

<!-- option B: editorial rule-only -->
<div class="border-t-2 border-[oklch(20%_0.03_40)] pt-5">
  <h3 class="font-serif text-xl">Card title</h3>
  <p class="mt-2 text-[oklch(35%_0.02_40)]">Some content.</p>
</div>
```

Either commit to a shadow language (hard offset, or no shadow at all) or remove the container.

---

## 10. "Get Started" + right-arrow CTA

Every AI landing page ends with a pill-shaped button reading "Get Started →". It is the single most templated element on the web. The copy says nothing specific to the product, the arrow is a tell, and the pill is a reflex. Replace with a verb that names the actual action.

```html
<!-- slop -->
<button class="bg-indigo-600 text-white px-6 py-3 rounded-full font-semibold inline-flex items-center gap-2">
  Get Started
  <ArrowRightIcon class="h-4 w-4" />
</button>
```

```html
<!-- refined: the button says what happens next -->
<!-- for a newsletter -->
<form class="flex items-end gap-3 border-b border-[oklch(25%_0.03_30)] pb-2">
  <label class="flex-1">
    <span class="block font-mono text-[11px] uppercase tracking-[0.2em] text-[oklch(45%_0.05_30)]">Your email</span>
    <input type="email" class="mt-1 w-full bg-transparent font-serif text-2xl focus:outline-none" placeholder="jules@paris.fr" />
  </label>
  <button class="font-mono text-xs uppercase tracking-[0.2em] text-[oklch(20%_0.03_30)] hover:underline underline-offset-4">
    Send me Issue 04
  </button>
</form>
```

If the button is a pill, it should be a pill because the aesthetic calls for pills (neo-brutalist-playful, soft-pastel). Otherwise match the surrounding geometry.

---

## 11. Monospace everywhere

Setting body copy in a monospace font to signal "developer-focused" or "technical." Monospace is for tabular data, code, and deliberately retro aesthetics (retro-futurist, brutalist-raw). Using it for a paragraph reduces reading speed by ~20% and signals costume, not substance.

```html
<!-- slop -->
<article class="font-mono text-sm text-slate-800 max-w-prose">
  <h2 class="text-2xl font-bold">Our mission</h2>
  <p>We believe developers deserve better tools. Our platform combines...</p>
</article>
```

```html
<!-- refined: monospace earns its place — for a number, a label, or a code sample -->
<article class="max-w-prose">
  <p class="font-mono text-[11px] uppercase tracking-[0.25em] text-[oklch(45%_0.05_250)]">Mission / v4</p>
  <h2 class="mt-3 font-serif text-3xl text-[oklch(20%_0.02_250)]">Tools that respect the afternoon.</h2>
  <p class="mt-4 text-[oklch(30%_0.02_250)] leading-relaxed">We build for the last two hours of the day, when energy is low and the bug is still open.</p>
</article>
```

Use one monospace family for labels, code, and tabular numerals. Never for body prose.

---

## 12. Center-everything layout

Every element centered horizontally, uniform vertical spacing, hero in the middle, three cards in the middle, CTA in the middle. It is the path of least compositional resistance. It cannot express hierarchy because every element gets the same horizontal treatment. Asymmetry is how a page says "read this one first."

```html
<!-- slop -->
<main class="max-w-4xl mx-auto text-center space-y-12 py-20">
  <h1 class="text-5xl font-bold">Title</h1>
  <p class="text-xl text-slate-600 max-w-2xl mx-auto">Subtitle that restates the title.</p>
  <button class="mx-auto block bg-indigo-600 text-white px-6 py-3 rounded-full">Get Started →</button>
</main>
```

```html
<!-- refined: 12-col grid, flush-left headline, deliberate off-balance -->
<main class="grid grid-cols-12 gap-6 px-10 py-20 max-w-[1400px] mx-auto">
  <div class="col-span-8">
    <p class="font-mono text-xs uppercase tracking-[0.25em] text-[oklch(45%_0.05_30)]">Paris / est. 2021</p>
    <h1 class="mt-6 font-serif text-7xl leading-[0.95] text-[oklch(18%_0.02_30)]">
      A quarterly for<br/>
      <em class="italic text-[oklch(45%_0.15_25)]">patient cooks</em>.
    </h1>
    <a href="#subscribe" class="mt-10 inline-block border-b-2 border-[oklch(18%_0.02_30)] pb-1 font-mono text-xs uppercase tracking-[0.25em]">Subscribe / €48 year</a>
  </div>
  <figure class="col-span-3 col-start-10 self-end">
    <img src="/cover.jpg" alt="Issue 04 cover" class="w-full" />
    <figcaption class="mt-2 font-mono text-[11px] text-[oklch(45%_0.05_30)]">Issue 04, photograph by M. Lefèvre.</figcaption>
  </figure>
</main>
```

Pick one axis of asymmetry per layout. Flush-left body, right-aligned metadata. Weighted hero, lighter asides. Grid breaks where emphasis lives.

---

## How to use this gallery

When you catch yourself writing any of these twelve patterns, stop. Open `aesthetic-directions.md`, pick a direction, and let the direction dictate the surface treatment, palette, typography, and composition. The refined column on every entry above is only one possibility — each direction in the catalogue would solve the same need differently. The point is not that glassmorphism or centered layouts are forbidden. The point is that defaulting to them with no commitment underneath is what produces slop.
