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
Inter
on literally everything -
Space Grotesk
when feeling fancy -
Geist Sans
/Geist Mono
in the year-of-Vercel -
Instrument Serif
for one italic word in the H1 ("the only ~platform~ you need") -
CameraPlainVariable
served 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-400
overbg-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 - Win
steps - 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/10
on the nav - Tailwind utility soup #
cdn.gpteng.co
in 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.