Every time I asked Claude Code to "build me a landing page," I got the same page back.
Centered hero. Inter font for everything. Maybe Space Grotesk if it felt artsy. A purple-to-blue gradient on the H1. A small pill badge floating above the headline ("New," "Beta," "Now with AI"). Three identical feature cards underneath, each with a Lucide icon on top, usually zap, shield-check, sparkles. A numbered 1-2-3 steps row. Glassmorphism on the nav. shadcn/ui everywhere. Dark mode with grey-on-darker-grey body text that fails contrast checks but "looks clean."
After about the twentieth one I started seeing it in my sleep. So I stopped complaining and built a tool.
uislop: a Go CLI that scores how AI-generated a page looks
It takes a URL, fetches the HTML and linked JS, runs a pile of regexes against it, and prints a single number between 0 and 100.
$ uislop https://some-ai-startup.ai
font:Inter hits=12 weight=2 add=24
color:purple hits=8 weight=3 add=24
color:gradient hits=14 weight=2 add=28
css:shadcn hits=4 weight=4 add=16
icon:svg_lucide hits=11 weight=2 add=22
layout:centered hits=7 weight=2 add=14
layout:allCaps hits=9 weight=1 add=9
----
87
0 means "looks human-built or pre-2022." 100 means "this was vibe-coded last Tuesday."
Why Go? Same reason I defaulted my new projects to Go. One binary, runs anywhere, no virtualenv, no dependency drift. I can scp it to anything and grep the entire web.
The signals I crystallized
After eyeballing a few hundred AI startup landing pages, the patterns are weirdly consistent.
Fonts
-
Interon literally everything -
Space Groteskwhen feeling fancy -
Geist Sans/Geist Monoin the year-of-Vercel -
Instrument Seriffor one italic word in the H1 ("the only ~platform~ you need") -
CameraPlainVariableserved fromcdn.gpteng.co, basically a Lovable fingerprint
Colors
- VibeCode purple (#8b5cf6, #7c3aed)
- Gradients on the H1, the CTA, the icon backgrounds, the nav border, everywhere
- Dark mode with
bg-zinc-950 - Body text at
text-zinc-400overbg-zinc-900, 3.8:1 contrast, fails WCAG, "looks clean" - Soft colored glows behind every primary button
Layout
- Centered hero with
max-w-3xl text-center - Tiny pill badge above the H1 (
rounded-full bg-primary/10) - Three feature cards,
grid-cols-3 gap-8, each with an icon on top - Numbered
01 - Sign up / 02 - Get started / 03 - Winsteps - All-caps section labels with
tracking-wider - Stat banner row ("10k+ users," "99.9% uptime," "$0 cost")
The icons
Always Lucide. Always the same five: zap, shield-check, bot, sparkles, rocket. If a page has all five visible above the fold, it is a tell.
The CSS giveaways
- shadcn primitives in the bundle
-
backdrop-blur-md bg-white/10on the nav - Tailwind utility soup
-
cdn.gpteng.coin the asset URLs
What I learned shipping it
A few things surprised me.
- The signal is loud. I expected to need ML. Regex on the HTML and one pass of linked JS gets you to 90%+ accuracy on the obvious cases.
- Geist Sans skews the score harder than I thought. Half the false positives are real human-built sites that just happen to use Vercel's font.
- The pattern travels. Once you have the score, you start seeing it everywhere. Half the recent YC batch lands in the 80s.
- The cure for being part of the problem is to look at your own page. Mine scored 72. I shipped the tool anyway.
What this is and is not
It is not a tool to shame anyone. Shipping anything is hard. If shadcn + Lucide + purple gradient is what gets you to revenue, ship it.
It is a forcing function. When the default output of every model converges on the same aesthetic, "looks like everyone else" becomes the new "looks unstyled." The score is just a mirror.
One weird trick to drop your score: swap Inter for a real typeface, pick a color that is not on the violet wheel, and delete one feature card. Three minutes, ten points off.
Top comments (0)