Method
How the verdict is computed
No language model is involved in the verdict. A scan fetches the page once, server-side, and runs a fixed rule set against it. The same input always produces the same output, and every point is attributable to a named rule.
Pipeline
- The URL is normalised, and refused if it resolves to a private or reserved address.
- The page is fetched with a desktop browser User-Agent, following up to 5 redirects, with a hard 10 second budget. Nothing on the target is executed.
- The HTML is tokenised into a flat description: tags with attributes and nesting depth, visible text, comments, inline scripts. robots.txt and sitemap.xml are fetched separately, and up to 10 subresources are size-probed with HEAD requests.
- Rules and structural checks run against that description, producing evidence rows.
- Evidence is scored by family, weighted, and turned into a verdict.
Scoring
The fingerprint family takes the strongest single match plus 5 points per corroborating match (capped at 100), because one conclusive fingerprint should not be diluted by the absence of others. The other three families are additive: many small smells add up. Families are then weighted 50 / 25 / 15 / 10.
- AI-built requires a direct AI-builder fingerprint scoring 80 or more. Confidence is floored at 85.
- Likely AI-assisted means either a weaker AI-builder fingerprint, or no fingerprint but a weighted total of 55 or more.
- A classic visual builder such as Wix, Webflow or Framer never produces "AI-built" on its own. Those platforms ship AI features, so they count toward "AI-assisted" only.
- Deployment platforms (Vercel, Netlify, Cloudflare Pages) are weak evidence by design. They corroborate; they do not convict.
Active rule set
78 enabled rules| Rule | Builder | Family | Signal type | Pattern | Weight |
|---|---|---|---|---|---|
| Lorem ipsum placeholder copy | - | content | text | lorem ipsum|dolor sit amet|consectetur adipiscing | 40 |
| Placeholder brand name | - | content | text | your (company|brand|business) name|company name here|your (company|brand) here|\[your (company|brand)\]|\[company name\]|acme (inc|corp|co)\b | 30 |
| Untouched default hero copy | - | content | text | welcome to your new (website|site|app)|build something amazing|start building your|your journey starts here|edit this text|click to edit|this is a paragraph|add your text here | 30 |
| Placeholder contact details | - | content | text | example@example\.com|your@email\.com|123-456-7890|555-555-5555|123 main st | 20 |
| Placeholder legal or footer text | - | content | text | all rights reserved\.? (your|company name)|\[company\]|\{\{\s*\w+\s*\}\} | 15 |
| Lovable / GPT Engineer script host | Lovable | fingerprint | script_host | (^|\.)gpteng\.co$ | 100 |
| Lovable hosting domain | Lovable | fingerprint | host | (^|\.)lovable(project)?\.app$ | 100 |
| Lovable generator meta tag | Lovable | fingerprint | meta_generator | lovable | 100 |
| v0 generator meta tag | v0 by Vercel | fingerprint | meta_generator | v0(\.dev| by vercel) | 100 |
| Durable generator meta tag | Durable | fingerprint | meta_generator | durable | 100 |
| v0 generator meta tag (v0.app) | v0 by Vercel | fingerprint | meta_generator | v0\.app | 100 |
| v0 hosting domain | v0 by Vercel | fingerprint | host | (^|\.)v0\.(build|dev)$ | 95 |
| Bolt generator meta tag | Bolt.new | fingerprint | meta_generator | bolt\.new|stackblitz | 95 |
| Bolt hosting domain | Bolt.new | fingerprint | host | (^|\.)bolt\.host$ | 95 |
| Framer generator meta tag | Framer | fingerprint | meta_generator | framer | 95 |
| Wix generator meta tag | Wix | fingerprint | meta_generator | wix\.com|wix website builder | 95 |
| Wix response header | Wix | fingerprint | header | ^x-wix-[a-z-]*: | 95 |
| Webflow generator meta tag | Webflow | fingerprint | meta_generator | webflow | 95 |
| Base44 page-view logger | Base44 | fingerprint | html | /api/app-logs/[0-9a-f]{24}/log-user-in-app | 92 |
| Lovable project badge or backlink | Lovable | fingerprint | html | lovable-badge|lovable\.dev/projects|lovable\.app/projects|data-lovable | 90 |
| v0 script host | v0 by Vercel | fingerprint | script_host | (^|\.)v0\.dev$ | 90 |
| Replit hosting domain | Replit | fingerprint | host | (^|\.)replit\.(app|dev)$|(^|\.)repl\.co$ | 90 |
| Durable asset host | Durable | fingerprint | script_host | (^|\.)durable\.co$|(^|\.)durablesites\.com$ | 90 |
| Base44 hosting domain | Base44 | fingerprint | host | (^|\.)base44\.app$ | 90 |
| Hostinger AI / Zyro generator meta tag | Hostinger AI Builder | fingerprint | meta_generator | hostinger|zyro | 90 |
| Framer hosting domain | Framer | fingerprint | host | (^|\.)framer\.(website|app|ai)$ | 90 |
| Wix static asset host | Wix | fingerprint | script_host | (^|\.)parastorage\.com$|(^|\.)wixstatic\.com$ | 90 |
| Wix hosting domain | Wix | fingerprint | host | (^|\.)wixsite\.com$|(^|\.)editorx\.io$ | 90 |
| Webflow data attributes | Webflow | fingerprint | html | data-wf-page|data-wf-site|data-wf-domain | 90 |
| Webflow hosting domain | Webflow | fingerprint | host | (^|\.)webflow\.io$ | 90 |
| Squarespace generator meta tag | Squarespace | fingerprint | meta_generator | squarespace | 90 |
| Replit default meta description | Replit | fingerprint | meta_any | built on replit\. update this description | 90 |
| Base44 auth storage key in the JS bundle | Base44 | fingerprint | bundle | base44_access_token|base44SharedInstances | 90 |
| v0 default project domain | v0 by Vercel | fingerprint | host | ^v0-[a-z0-9-]+\.vercel\.app$ | 88 |
| Base44 media CDN | Base44 | fingerprint | html | media\.base44\.com/ | 88 |
| Lovable default OpenGraph image | Lovable | fingerprint | meta_any | lovable\.dev/opengraph|gpteng\.co/[^"\s]*og | 85 |
| v0 source marker | v0 by Vercel | fingerprint | html | v0\.dev/chat|data-v0-t=|built with v0 | 85 |
| Bolt source marker | Bolt.new | fingerprint | html | bolt\.new/~|built with bolt|__bolt | 85 |
| Replit badge or runtime marker | Replit | fingerprint | html | replit-badge|__replco|replit\.com/@ | 85 |
| Base44 script host | Base44 | fingerprint | script_host | (^|\.)base44\.(app|com)$ | 85 |
| 10Web AI generator meta tag | 10Web AI | fingerprint | meta_generator | 10web | 85 |
| Mixo generator meta tag | Mixo | fingerprint | meta_generator | mixo | 85 |
| Framer asset host | Framer | fingerprint | script_host | (^|\.)framerusercontent\.com$|(^|\.)framer\.com$ | 85 |
| Webflow asset host | Webflow | fingerprint | script_host | (^|\.)website-files\.com$|(^|\.)webflow\.com$ | 85 |
| Shopify response header | Shopify | fingerprint | header | ^x-shopify-stage:|^x-shopid: | 85 |
| AI generation comment left in source | - | fingerprint | html | <!--\s*(generated|created) (by|with) (chatgpt|claude|gpt|copilot|cursor|lovable|bolt|v0) | 85 |
| Lovable runtime package in the JS bundle | Lovable | fingerprint | bundle | @lovable\.dev/|gptengineer|gpt-eng\.com|lovable-tagger | 85 |
| Base44 SDK in the JS bundle | Base44 | fingerprint | bundle | @base44/sdk|base44\.app/api | 85 |
| Replit script host | Replit | fingerprint | script_host | (^|\.)replit\.com$ | 80 |
| Dora AI source marker | Dora AI | fingerprint | html | dora\.run|__dora_ | 80 |
| Softr generator meta tag | Softr | fingerprint | meta_generator | softr | 80 |
| Squarespace asset host | Squarespace | fingerprint | script_host | (^|\.)squarespace\.com$|(^|\.)sqspcdn\.com$ | 80 |
| Durable badge or backlink | Durable | fingerprint | html | durable\.co/\?|made with durable | 75 |
| Shopify CDN host | Shopify | fingerprint | script_host | (^|\.)shopifycdn\.com$|(^|\.)shopify\.com$ | 75 |
| WordPress generator meta tag | WordPress | fingerprint | meta_generator | wordpress | 70 |
| Elementor generator meta tag | Elementor | fingerprint | meta_generator | elementor | 70 |
| Bubble generator meta tag | Bubble | fingerprint | meta_generator | bubble | 70 |
| Carrd generator meta tag | Carrd | fingerprint | meta_generator | carrd | 70 |
| Cursor / Copilot scaffold marker | - | fingerprint | html | data-cursor-generated|__CURSOR_|generated-by-copilot | 70 |
| Bolt / StackBlitz reference in the JS bundle | Bolt.new | fingerprint | bundle | bolt\.new|webcontainer-api | 70 |
| Relume component library | Relume | fingerprint | script_host | (^|\.)relume\.io$ | 65 |
| Ghost generator meta tag | Ghost | fingerprint | meta_generator | ghost | 60 |
| Link to lovable.dev inside the JS bundle | Lovable | fingerprint | bundle | https?://lovable\.dev | 60 |
| Vercel preview domain | Vercel | fingerprint | host | (^|\.)vercel\.app$ | 50 |
| Netlify preview domain | Netlify | fingerprint | host | (^|\.)netlify\.(app|com)$ | 50 |
| Vercel deployment header | Vercel | fingerprint | header | ^x-vercel-id:|^server: vercel | 45 |
| Netlify deployment header | Netlify | fingerprint | header | ^x-nf-request-id:|^server: netlify | 45 |
| Cloudflare Pages domain | Cloudflare Pages | fingerprint | host | (^|\.)pages\.dev$ | 45 |
| Render deployment domain | Render | fingerprint | host | (^|\.)onrender\.com$ | 40 |
| Fly.io deployment domain | Fly.io | fingerprint | host | (^|\.)fly\.dev$ | 40 |
| data-testid attributes shipped to production | - | hygiene | html | data-testid\s*= | 18 |
| Untouched shadcn/ui class vocabulary | - | hygiene | class_name | bg-background|text-foreground|text-muted-foreground|bg-card|border-border|ring-offset-background | 16 |
| Default template layout classes left unrenamed | - | hygiene | class_name | min-h-screen|container mx-auto|hero-section|feature-card|cta-section|section-wrapper | 12 |
| Vite / CRA single-root client-render shell | - | hygiene | html | <div id="root">\s*</div>|<div id="app">\s*</div> | 10 |
| Default lucide icon classes | - | hygiene | class_name | lucide lucide-|lucide-icon | 8 |
| TODO / FIXME comment left in shipped markup | - | hygiene | html | <!--[^>]*(TODO|FIXME|XXX) | 8 |
| Source map reference in the JS bundle | - | hygiene | bundle | sourceMappingURL=[^\s]+\.map | 6 |
| Source maps referenced in production output | - | hygiene | html | sourceMappingURL | 6 |
Structural checks (nesting depth, utility-class bloat, missing canonical, absent JSON-LD and similar absence tests) cannot be expressed as patterns and live in code. They appear in the evidence table with the signal type "structural check".