Cursor, v0, Lovable and Bolt all collapsed onto the same CSS tells. Paste any URL and get a deterministic 0–100 slop score: a weighted fingerprint based on Adrian Krebs's April 2026 study plus Meng To's gradient-avatar tell.
Generated pages converge: the same fonts, the same gradient hero text, the same glassmorphism, the same eyebrow pill and big-number stat banner. None of these is wrong on its own. Linear and Stripe use Inter too, which is why they score Mild. Slop is the density of converged tells, scored deterministically so two runs of the same page always agree.
Geist / Inter defaults, crushed display tracking, wide body tracking, flat size hierarchy.
Gradient hero text, gradient-heavy backgrounds, aurora blobs, colored glows, vibe-purple.
Centered hero, eyebrow pill, glassmorphism, bento grids, nested cards, icon-card rows.
An optional second axis scores the words: the hedge-y, em-dash-heavy register LLMs default to.
Cloudflare Browser Rendering loads it exactly as a browser would: JS, fonts, computed styles and all.
Every pattern detector is a pure function that runs against the live computed styles in a single pass.
Each triggered pattern adds its weight. Same page in, same score out. No model, no randomness.
Clean 0–9Mild 10–27Heavy 28+
Prefer the terminal? Browse every rule, or run it locally:
npx slop-detect <url> · gate CI with --fail-on heavy.