Paste any website URL and get a brutally honest 0–100 forensic score of how cookie-cutter and AI-generated it looks. We fingerprint the default agent house style — the builder watermarks, the stock copy, the obligatory purple gradient — and hand you an explainable verdict with the receipts.
A heuristic toy, not a tribunal. The score reflects visual & structural sameness, not quality. Plenty of great sites are AI-built; plenty of slop is handmade.
The engine fetches a page server-side (no JS rendering) and runs ~20 detectors across six weighted categories. Each category is capped so no single dimension runs away with the score.
| Category | Max | What it sniffs |
|---|---|---|
| 🏷️ Builder watermarks | 35 | v0, Lovable, Bolt, Framer, Webflow, Wix fingerprints; meta generator; leftover "Made with…" badges; Next.js only when shipped with stock defaults |
| 🧱 Default stack | 22 | shadcn/ui used verbatim, Lucide icons, Geist/Inter fonts; Tailwind only when run with the stock theme |
| ✍️ AI copywriting tells | 24 | LLM buzzwords ("seamlessly", "supercharge", "elevate"…), "it's not just X, it's Y", em-dash density, boilerplate CTAs, tricolon taglines |
| 📐 Structural clichés | 16 | The hero→features→testimonials→pricing→CTA skeleton, emoji headings, repeated rounded/shadow card grids |
| 🎨 Visual defaults | 16 | The purple/indigo→blue gradient, gradient clip-text headlines, glassmorphism + heavy rounding |
| 🚧 Placeholder residue | 12 | Lorem ipsum, example.com, John Doe, Unsplash stock heroes, untouched "Create Next App" titles |
A note on stack choice. Using Next.js, Tailwind or Vercel is not a tell — they run countless hand-crafted sites, so penalising them just punishes popularity. The tell is using them with the defaults left untouched. So the framework signals only score when the site also ships stock markers (the shadcn theme, Geist/Inter, the default gradient); a modern stack paired with real design effort scores nothing. Hosting platform is ignored entirely.
Verdict bands: Suspiciously Human (0–18) · Mostly Handcrafted (19–38) · AI-Assisted (39–58) · Heavily AI-Generated (59–78) · Textbook AI Slop (79–100).
Detector logic lives in src/lib/analyzer.ts — pure,
side-effect-free, and easy to extend. Add a new Detector to the relevant
registry and it's automatically included.
- Next.js 16 (App Router) + TypeScript
- Tailwind v4 with a custom editorial/forensic theme (warm bone paper, ink, a single vermillion accent — deliberately built to score low on its own detector)
- Framer Motion for the hero reveal, score count-up, and staggered evidence log
- Fonts: Instrument Serif (display), Hanken Grotesk (body), Space Mono (data)
- Zero external APIs — the analyzer runs in a Node API route, so it's free to host
git clone https://github.com/davidcjw/is-this-ai-slop.git
cd is-this-ai-slop
npm install
npm run dev # http://localhost:3000npm run build # production build
npm run lint # eslintTwo ways in, same payload:
# Public, CDN-cacheable GET — easy to share
curl "https://is-this-ai-slop.davidcjw.com/api/analyze?url=stripe.com"
# POST (used by the app)
curl -X POST https://is-this-ai-slop.davidcjw.com/api/analyze \
-H "Content-Type: application/json" -d '{"url":"stripe.com"}'Returns the full AnalysisResult (score, verdict, per-category breakdown, top
signals). Results are cached per URL for 1h (Next.js Data Cache) and served with
Cache-Control: public, s-maxage=3600, stale-while-revalidate=86400, so repeat
lookups are near-instant. Private/localhost ranges are blocked to prevent SSRF.
- Auto-generated OG / Twitter card (
opengraph-image),robots.txt, andsitemap.xml;WebApplicationJSON-LD + canonical URL and theme-color. - Security headers (HSTS,
nosniff,X-Frame-Options: DENY, Referrer-Policy, Permissions-Policy) set innext.config.ts;X-Powered-Bydisabled.
Optimised for Vercel. Push to GitHub and import the repo —
every push to main auto-deploys.
- Public API caching (Data Cache + CDN
s-maxage) + shareable OG card - Per-URL OG images (live score baked into the social card)
- "Why this score?" deep-link to each triggered detector
- Optional JS-rendered fetch for SPA-heavy sites
- Public API rate limiting (edge/Upstash)
Contributions are welcome! Please open an issue first to discuss what you'd like to change.
- Fork the repo
- Create a feature branch (
git checkout -b feature/your-feature) - Commit your changes (
git commit -m 'feat: describe change') - Push and open a pull request
New detectors are easy: add a Detector to the relevant registry in
src/lib/analyzer.ts and it's picked up automatically.
Please make sure npm run build and npm run lint pass before submitting a PR.
This project follows the Contributor Covenant v2.1. By participating you agree to uphold a welcoming, harassment-free environment.
Distributed under the MIT License. See LICENSE for details.
Built, ironically, by an AI.
