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

  1. The URL is normalised, and refused if it resolves to a private or reserved address.
  2. 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.
  3. 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.
  4. Rules and structural checks run against that description, producing evidence rows.
  5. 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.

Active rule set

78 enabled rules
RuleBuilderFamilySignal typePatternWeight
Lorem ipsum placeholder copy-contenttextlorem ipsum|dolor sit amet|consectetur adipiscing40
Placeholder brand name-contenttextyour (company|brand|business) name|company name here|your (company|brand) here|\[your (company|brand)\]|\[company name\]|acme (inc|corp|co)\b30
Untouched default hero copy-contenttextwelcome 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 here30
Placeholder contact details-contenttextexample@example\.com|your@email\.com|123-456-7890|555-555-5555|123 main st20
Placeholder legal or footer text-contenttextall rights reserved\.? (your|company name)|\[company\]|\{\{\s*\w+\s*\}\}15
Lovable / GPT Engineer script hostLovablefingerprintscript_host(^|\.)gpteng\.co$100
Lovable hosting domainLovablefingerprinthost(^|\.)lovable(project)?\.app$100
Lovable generator meta tagLovablefingerprintmeta_generatorlovable100
v0 generator meta tagv0 by Vercelfingerprintmeta_generatorv0(\.dev| by vercel)100
Durable generator meta tagDurablefingerprintmeta_generatordurable100
v0 generator meta tag (v0.app)v0 by Vercelfingerprintmeta_generatorv0\.app100
v0 hosting domainv0 by Vercelfingerprinthost(^|\.)v0\.(build|dev)$95
Bolt generator meta tagBolt.newfingerprintmeta_generatorbolt\.new|stackblitz95
Bolt hosting domainBolt.newfingerprinthost(^|\.)bolt\.host$95
Framer generator meta tagFramerfingerprintmeta_generatorframer95
Wix generator meta tagWixfingerprintmeta_generatorwix\.com|wix website builder95
Wix response headerWixfingerprintheader^x-wix-[a-z-]*:95
Webflow generator meta tagWebflowfingerprintmeta_generatorwebflow95
Base44 page-view loggerBase44fingerprinthtml/api/app-logs/[0-9a-f]{24}/log-user-in-app92
Lovable project badge or backlinkLovablefingerprinthtmllovable-badge|lovable\.dev/projects|lovable\.app/projects|data-lovable90
v0 script hostv0 by Vercelfingerprintscript_host(^|\.)v0\.dev$90
Replit hosting domainReplitfingerprinthost(^|\.)replit\.(app|dev)$|(^|\.)repl\.co$90
Durable asset hostDurablefingerprintscript_host(^|\.)durable\.co$|(^|\.)durablesites\.com$90
Base44 hosting domainBase44fingerprinthost(^|\.)base44\.app$90
Hostinger AI / Zyro generator meta tagHostinger AI Builderfingerprintmeta_generatorhostinger|zyro90
Framer hosting domainFramerfingerprinthost(^|\.)framer\.(website|app|ai)$90
Wix static asset hostWixfingerprintscript_host(^|\.)parastorage\.com$|(^|\.)wixstatic\.com$90
Wix hosting domainWixfingerprinthost(^|\.)wixsite\.com$|(^|\.)editorx\.io$90
Webflow data attributesWebflowfingerprinthtmldata-wf-page|data-wf-site|data-wf-domain90
Webflow hosting domainWebflowfingerprinthost(^|\.)webflow\.io$90
Squarespace generator meta tagSquarespacefingerprintmeta_generatorsquarespace90
Replit default meta descriptionReplitfingerprintmeta_anybuilt on replit\. update this description90
Base44 auth storage key in the JS bundleBase44fingerprintbundlebase44_access_token|base44SharedInstances90
v0 default project domainv0 by Vercelfingerprinthost^v0-[a-z0-9-]+\.vercel\.app$88
Base44 media CDNBase44fingerprinthtmlmedia\.base44\.com/88
Lovable default OpenGraph imageLovablefingerprintmeta_anylovable\.dev/opengraph|gpteng\.co/[^"\s]*og85
v0 source markerv0 by Vercelfingerprinthtmlv0\.dev/chat|data-v0-t=|built with v085
Bolt source markerBolt.newfingerprinthtmlbolt\.new/~|built with bolt|__bolt85
Replit badge or runtime markerReplitfingerprinthtmlreplit-badge|__replco|replit\.com/@85
Base44 script hostBase44fingerprintscript_host(^|\.)base44\.(app|com)$85
10Web AI generator meta tag10Web AIfingerprintmeta_generator10web85
Mixo generator meta tagMixofingerprintmeta_generatormixo85
Framer asset hostFramerfingerprintscript_host(^|\.)framerusercontent\.com$|(^|\.)framer\.com$85
Webflow asset hostWebflowfingerprintscript_host(^|\.)website-files\.com$|(^|\.)webflow\.com$85
Shopify response headerShopifyfingerprintheader^x-shopify-stage:|^x-shopid:85
AI generation comment left in source-fingerprinthtml<!--\s*(generated|created) (by|with) (chatgpt|claude|gpt|copilot|cursor|lovable|bolt|v0)85
Lovable runtime package in the JS bundleLovablefingerprintbundle@lovable\.dev/|gptengineer|gpt-eng\.com|lovable-tagger85
Base44 SDK in the JS bundleBase44fingerprintbundle@base44/sdk|base44\.app/api85
Replit script hostReplitfingerprintscript_host(^|\.)replit\.com$80
Dora AI source markerDora AIfingerprinthtmldora\.run|__dora_80
Softr generator meta tagSoftrfingerprintmeta_generatorsoftr80
Squarespace asset hostSquarespacefingerprintscript_host(^|\.)squarespace\.com$|(^|\.)sqspcdn\.com$80
Durable badge or backlinkDurablefingerprinthtmldurable\.co/\?|made with durable75
Shopify CDN hostShopifyfingerprintscript_host(^|\.)shopifycdn\.com$|(^|\.)shopify\.com$75
WordPress generator meta tagWordPressfingerprintmeta_generatorwordpress70
Elementor generator meta tagElementorfingerprintmeta_generatorelementor70
Bubble generator meta tagBubblefingerprintmeta_generatorbubble70
Carrd generator meta tagCarrdfingerprintmeta_generatorcarrd70
Cursor / Copilot scaffold marker-fingerprinthtmldata-cursor-generated|__CURSOR_|generated-by-copilot70
Bolt / StackBlitz reference in the JS bundleBolt.newfingerprintbundlebolt\.new|webcontainer-api70
Relume component libraryRelumefingerprintscript_host(^|\.)relume\.io$65
Ghost generator meta tagGhostfingerprintmeta_generatorghost60
Link to lovable.dev inside the JS bundleLovablefingerprintbundlehttps?://lovable\.dev60
Vercel preview domainVercelfingerprinthost(^|\.)vercel\.app$50
Netlify preview domainNetlifyfingerprinthost(^|\.)netlify\.(app|com)$50
Vercel deployment headerVercelfingerprintheader^x-vercel-id:|^server: vercel45
Netlify deployment headerNetlifyfingerprintheader^x-nf-request-id:|^server: netlify45
Cloudflare Pages domainCloudflare Pagesfingerprinthost(^|\.)pages\.dev$45
Render deployment domainRenderfingerprinthost(^|\.)onrender\.com$40
Fly.io deployment domainFly.iofingerprinthost(^|\.)fly\.dev$40
data-testid attributes shipped to production-hygienehtmldata-testid\s*=18
Untouched shadcn/ui class vocabulary-hygieneclass_namebg-background|text-foreground|text-muted-foreground|bg-card|border-border|ring-offset-background16
Default template layout classes left unrenamed-hygieneclass_namemin-h-screen|container mx-auto|hero-section|feature-card|cta-section|section-wrapper12
Vite / CRA single-root client-render shell-hygienehtml<div id="root">\s*</div>|<div id="app">\s*</div>10
Default lucide icon classes-hygieneclass_namelucide lucide-|lucide-icon8
TODO / FIXME comment left in shipped markup-hygienehtml<!--[^>]*(TODO|FIXME|XXX)8
Source map reference in the JS bundle-hygienebundlesourceMappingURL=[^\s]+\.map6
Source maps referenced in production output-hygienehtmlsourceMappingURL6

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".