MEASURED DEMO · NO EMAIL REQUIRED

A complete website audit, with the evidence

This deliberately noindex guide scored 81/100 overall. Its SEO check still found a search blocker. Explore every finding and compare the corrected source.

81/100

Overall diagnostic · grade B

Read the check, then the score

The guide is constructed for this experiment. It is not a customer website or a live scan of example.org. Fixing its robots meta value changes SEO from 55 to 72; it does not demonstrate a traffic increase.

Read the before-and-after case study →

SEO

55/100 · E

11 findings to review · 41 checks

GEO (AI Answer Engines)

65/100 · D

3 findings to review · 33 checks

Performance

93/100 · A

3 findings to review · 39 checks

Accessibility

100/100 · A+

0 findings to review · 27 checks

Code Quality

98/100 · A+

1 findings to review · 27 checks

UI / UX

96/100 · A+

1 findings to review · 29 checks

Data & Tracking

100/100 · A+

0 findings to review · 13 checks

Security

52/100 · E

6 findings to review · 20 checks

What was measured

Published 2026-10-13. Scoring version 2026-10-06.2. 229 checks emitted for this snapshot. The list includes informational and conditional checks.

Four constructed HTML snapshots scored by the production scoring functions in static mode, with the evaluation clock fixed to October 13, 2026 at 12:00 UTC. The baseline, noindex and unlabelled variants differ only in the stated HTML edits. The script-only variant moves the article into a client script. Page identity, response time (200 ms), compression, robots access and auxiliary context are fixed experiment inputs, not measurements of a live host. No browser, DNS, sitemap or real-user performance tests were run. No customer data or citation measurements are included. example.org is a reserved example domain, not the site tested.

“Observed” below describes evidence found in the supplied snapshot or fixed experiment context. It does not mean we verified the same condition on a deployed host. Performance figures here use fixed inputs; they are not measured Core Web Vitals.

Download the four results (JSON) · Read the before HTML · Read the corrected HTML · Scoring methodology

SEO: 55/100

Scored 55/100 across 37 on-page SEO checks (26 pass, 5 warn, 6 fail) — including keyword distribution, schema completeness, anchor diversity and index-signal consistency.

pass Title length

Title is 46 characters (~373px): "How to audit a public web page | Example guide".

titleLength · observed · weight 2.2

{
  "title": "How to audit a public web page | Example guide",
  "length": 46,
  "pixelWidth": 373
}
pass Title not truncated in SERPs

Estimated SERP width ~373px (Google truncates around 580px).

titlePixels · observed · weight 0.8

warn Keyword near start of title

Primary term "page" appears at position 26 in the title.

titleKeywordFront · heuristic · weight 1.2

pass Brand in title

Title uses a separator, suggesting a brand suffix.

titleBrand · observed · weight 0.5

pass Meta description length

Meta description is 134 characters.

metaDescLength · observed · weight 1.6

{
  "length": 134
}
warn Meta description has a call to action

The description lacks a call to action.

metaDescCta · heuristic · weight 0.6

Demo guidance: Add an action word (e.g. 'Discover…', 'Get…') to improve click-through.

pass Keyword in meta description

Primary term "page" appears in the description.

metaDescKeyword · heuristic · weight 0.6

pass Exactly one H1

One <h1>: "How do you audit a public web page?".

h1Single · observed · weight 2

{
  "h1Count": 1
}
pass Keyword in H1

Primary term "page" is in the H1.

h1Keyword · heuristic · weight 1

pass Logical heading hierarchy

3 headings form a clean outline.

headingOrder · observed · weight 1.2

{
  "headings": 3,
  "h2Count": 2
}
pass Sub-headings structure content

2 <h2> sub-heading(s).

h2Coverage · observed · weight 0.8

pass Keyword targeting (title/H1/intro)

Primary term "page" → title:✓ H1:✓ intro:✓.

keywordTargeting · heuristic · weight 2.2

{
  "topKeywords": [
    {
      "term": "page",
      "count": 5,
      "density": 4.672897196261682
    },
    {
      "term": "check",
      "count": 4,
      "density": 3.7383177570093453
    },
    {
      "term": "audit",
      "count": 3,
      "density": 2.803738317757009
    },
    {
      "term": "html",
      "count": 3,
      "density": 2.803738317757009
    },
    {
      "term": "evidence",
      "count": 3,
      "density": 2.803738317757009
    },
    {
      "term": "labels",
      "count": 3,
      "density": 2.803738317757009
    }
  ]
}
fail Keyword density not stuffed

Top term "page" is 4.7% of 107 content words.

keywordDensity · heuristic · weight 1

Demo guidance: Reduce repetition — over-using the keyword reads as spam to Google.

warn Semantic / topical depth (phrases)

Recurring topical phrases: "form labels".

semanticDepth · observed · weight 1

{
  "phrases": [
    {
      "term": "form labels",
      "count": 2,
      "density": 1.8691588785046727
    }
  ]
}

Demo guidance: Cover the topic with related sub-topics and entities (LSI) so the page demonstrates depth.

fail Content depth

Roughly 170 words of body text.

contentDepth · observed · weight 1.4

{
  "words": 170
}

Demo guidance: Thin content struggles to rank — expand to comprehensively cover the topic (600+ words for key pages).

pass Text-to-HTML ratio

Visible text is ~35.5% of the HTML payload.

textRatio · observed · weight 0.7

pass Clean, readable URL

Clean URL path: "/audit-guide".

urlStructure · observed · weight 1

fail Page is indexable

The page is set to noindex and will be excluded from search.

indexable · observed · weight 2.4

{
  "robotsMeta": "noindex,follow",
  "xRobots": ""
}

Demo guidance: Remove the noindex directive if you want this page to rank.

pass Links are followable

No page-level nofollow.

followable · observed · weight 0.6

pass Googlebot access to this URL

No matching robots restriction for Googlebot on this URL.

robotsTxt · observed · weight 1.2

{
  "agent": "Googlebot",
  "allowed": true,
  "path": "/audit-guide"
}
pass XML sitemap available

Sitemap reachable at undefined.

sitemap · observed · weight 1

pass Canonical URL

Canonical → https://example.org/audit-guide (self-referencing).

canonical · observed · weight 1.2

info hreflang for internationalization

No hreflang tags (only needed for multi-language sites).

hreflang · not-applicable · weight 0.4

Demo guidance: If you serve multiple languages/regions, add hreflang alternates.

fail Open Graph tags

0/5 core Open Graph tags present.

openGraph · observed · weight 0.9

{
  "present": []
}

Demo guidance: Add og:title, og:description, og:image, og:url and og:type for rich social/chat previews.

info Twitter/X card tags

0/3 Twitter card tags present.

twitterCard · not-applicable · weight 0.5

Demo guidance: Add twitter:card, twitter:title and twitter:image for better X/Twitter previews.

warn Structured data (Schema.org)

No JSON-LD structured data found.

structuredData · observed · weight 1.3

{
  "blocks": 0,
  "valid": 0,
  "types": []
}

Demo guidance: Add valid JSON-LD (Organization, BreadcrumbList, Article/Product as relevant) to qualify for rich results.

info Breadcrumb structured data

No breadcrumb structured data.

breadcrumbs · not-applicable · weight 0.4

Demo guidance: Add BreadcrumbList schema so search shows breadcrumb trails in results.

pass Descriptive image alt text

1/1 images have alt text.

imageAlt · observed · weight 0.9

pass Internal linking

6 internal and 1 external links (0 nofollow).

internalLinks · observed · weight 1

{
  "internal": 6,
  "external": 1,
  "nofollow": 0
}
pass Descriptive anchor text

0 generic anchor(s) like "click here" out of 8 links.

anchorQuality · observed · weight 0.6

pass Mobile-friendly viewport

viewport: "width=device-width, initial-scale=1".

mobileViewport · observed · weight 1.2

pass Language declared

lang="en".

htmlLang · observed · weight 0.6

warn Keyword across title/H1/intro/URL/alt

Primary term "page" appears in 3/5 key locations (title/H1/intro/URL/alt).

keywordDistribution · heuristic · weight 1.4

Demo guidance: Distribute your primary keyword across the title, H1, opening text, URL slug and an image alt for unambiguous topical relevance.

pass Sub-headings cover the topic

1/2 sub-headings include a top topical term.

h2KeywordCoverage · heuristic · weight 0.8

fail Social image is share-ready

No og:image.

ogImageQuality · observed · weight 0.6

Demo guidance: Use an absolute og:image URL (1200×630) and declare og:image:width/height for reliable rich previews.

pass URL free of tracking params

No tracking/session parameters in the canonical URL.

cleanUrlParams · observed · weight 0.5

pass Diverse internal anchor text

8 unique anchors out of 8 links (100% diverse).

anchorDiversity · observed · weight 0.5

fail No conflicting index signals

Page is noindex yet appears in the sitemap — conflicting signals.

indexSitemapConsistency · heuristic · weight 0.7

Demo guidance: Remove noindex pages from the sitemap (or make them indexable) to avoid sending crawlers mixed signals.

pass Title optimised for click-through

Title uses numbers/power words that lift CTR.

titleCtr · observed · weight 0.5

pass Meta description is purpose-written

Meta description is distinct from body copy.

descUnique · observed · weight 0.4

info Feed advertised (RSS/Atom)

No RSS/Atom/JSON feed announced in <head> (only relevant if the site publishes a feed).

feedDiscovery · not-applicable · weight 0.3

Demo guidance: If you publish a feed, announce it with <link rel="alternate" type="application/rss+xml"> so readers and agents can find it.

GEO (AI Answer Engines): 65/100

Scored 65/100 across 13 applicable access and content checks. Optional editorial observations are listed separately; this score does not measure AI citations.

fail Machine-extractable structured data

No JSON-LD — AI engines must guess the page's facts and entities.

structuredAnswers · observed · weight 2.4

Demo guidance: Add Article and Organization/Person JSON-LD (plus HowTo where relevant) so engines can lift facts verbatim and attribute you.

pass Question-based headings

3 heading(s) phrased as questions.

questionHeadings · observed · weight 1.4

{
  "examples": [
    "How do you audit a public web page?",
    "What should you check first?",
    "How do you confirm an improvement?"
  ]
}
pass Concise, liftable answers

100% of paragraphs are answer-sized; 1 list(s), 0 table(s).

liftableContent · heuristic · weight 1.4

info Structured data tables

No data tables.

dataTables · not-applicable · weight 0.5

Demo guidance: Where you compare options or list specs, use <table> — engines extract tabular facts cleanly.

pass Author & attribution (E-E-A-T)

Authorship/attribution signals present.

authority · observed · weight 1.2

pass Discoverable About/Org page

An About/Team/Company link is present.

aboutPage · observed · weight 0.5

pass Machine-readable dates

Published/modified dates are exposed.

freshness · observed · weight 0.9

warn Outbound citations

1 outbound citation(s) to other domains.

citations · observed · weight 0.9

Demo guidance: Cite primary sources — well-sourced pages are more likely to be trusted and cited.

pass AI search crawler access to this URL

No matching robots restriction for OpenAI Search, Perplexity or Claude Search. This is access eligibility, not proof of indexing or citations.

aiCrawlerAccess · observed · weight 1.6

{
  "blockedSearch": [],
  "decisions": []
}
info Google Search AI eligibility

Public markup cannot confirm indexing, snippet eligibility or the owner's Search Console AI inclusion setting. Google-Extended controls Gemini training and grounding; it does not control Google Search inclusion.

googleAiEligibility · not-tested · weight 0

info Training and user-triggered access policy

Policy restrictions: none detected. Training, Gemini grounding and user-triggered agents have separate purposes. ChatGPT-User does not determine ChatGPT Search inclusion.

aiPolicyChoices · observed · weight 0

info llms.txt published

No /llms.txt found (optional — Google ignores it, but some AI agents read it).

llmsTxt · not-applicable · weight 0.4

Demo guidance: Consider publishing /llms.txt — a curated markdown map of your key content some AI agents read. Note it has no effect on Google Search or AI Overviews.

info Link header advertises resources

No discovery hints in the HTTP Link header (optional: lets agents find sitemap/llms.txt without parsing HTML).

linkHeaderDiscovery · not-applicable · weight 0.3

Demo guidance: Consider advertising sitemap/llms.txt/feeds via the HTTP Link header for agents that never read your HTML.

info AI usage declared (Content-Signal)

No Content-Signal directives in robots.txt (emerging, optional standard for declaring AI search/train permissions).

contentSignal · not-applicable · weight 0.2

Demo guidance: Optionally add Content-Signal directives to robots.txt to state explicitly whether AI may search, ingest or train on your content.

pass Semantic HTML landmarks

Uses 6 semantic landmark(s): main, article, section, nav, header, footer.

semanticStructure · observed · weight 1

info Direct answer up top

Opens with a definitional, quotable statement.

directAnswer · heuristic · weight 0

pass Text present in the initial HTML

170 words in the initial HTML. Short pages can be complete; text length does not establish content quality or citations.

serverRendered · observed · weight 1

info Quotable statistics

0 statistic-like figures (0.0 per 500 words).

statDensity · heuristic · weight 0

Demo guidance: Use relevant, verifiable figures when they help readers. Statistics density is not a measured citation signal.

info Comparison-style content

No comparison or tabular content detected.

comparisonContent · not-applicable · weight 0.6

Demo guidance: Where relevant, add comparison tables or 'X vs Y' sections — engines surface these for decision queries.

info Self-contained opening

Opening is a self-contained, quotable definition.

selfContained · heuristic · weight 0

info Content split into extractable chunks

~57 words per section across 2 sub-headings.

chunking · heuristic · weight 0

info In-page anchor navigation

No table-of-contents anchors.

tableOfContents · not-applicable · weight 0.4

Demo guidance: For long content, add a table of contents with in-page anchors — it maps your sections for AI navigation.

info Schema entity matches page

No named entities in schema.

entityConsistency · not-applicable · weight 0.5

warn FAQ-style coverage

2 question headings.

faqRichness · observed · weight 0.5

Demo guidance: Add a visible FAQ section answering 3+ real user questions — Q&A content is a top source of AI-answer citations. (FAQPage markup is optional; Google dropped FAQ rich results in May 2026.)

pass Content is recent

Content dated ~0 month(s) ago.

absoluteRecency · observed · weight 0.6

info Named-entity richness

19 distinct proper-noun phrases (entities engines can link).

entityRichness · not-applicable · weight 0.4

pass Key content not hidden behind UI

Content isn't buried in tabs/accordions.

answerNotHidden · observed · weight 0.4

info A2A agent card published

No A2A agent card (emerging spec; only relevant if the site exposes services for AI agents to call).

agentCard · not-applicable · weight 0.3

Demo guidance: If you offer agent-callable services, consider publishing an A2A agent card at /.well-known/agent-card.json.

info Traffic advice for prefetch proxies

No /.well-known/traffic-advice (optional: declares how prefetch proxies like Chrome's private prefetch may load your pages).

trafficAdvice · not-applicable · weight 0.2

Demo guidance: Optionally publish /.well-known/traffic-advice to control how prefetch proxies pre-load your pages.

info MCP server discoverable

No MCP server found (agents probe https://mcp.<your-domain>/ and /.well-known/mcp).

mcpServer · not-applicable · weight 0.4

{
  "location": null
}

Demo guidance: If you offer tools or services AI agents could call, serve an MCP endpoint (Streamable HTTP) at mcp.<your-domain> or /.well-known/mcp — the two locations agents probe for it.

info OpenAPI spec / API catalog published

No /openapi.json or /.well-known/api-catalog found (only relevant if you expose an API).

openApiSpec · not-applicable · weight 0.3

{
  "source": null
}

Demo guidance: If you expose an API, publish its OpenAPI spec at /openapi.json (or an RFC 9727 catalog at /.well-known/api-catalog) so agents can discover and call it unaided.

info agents.md published

No /agents.md found (emerging convention: a markdown briefing for AI agents at the site root).

agentsMd · not-applicable · weight 0.3

Demo guidance: Consider publishing /agents.md — a short markdown briefing (what the site does, key URLs, machine-readable surfaces) that agents can read in one fetch.

info NLWeb surfaces (schemamap + /ask)

No NLWeb surfaces (optional: schemamap in robots.txt plus an /ask endpoint let agents query your site in natural language).

nlweb · not-applicable · weight 0.3

{
  "schemamap": false,
  "askEndpoint": null
}

Demo guidance: Optionally adopt NLWeb: point agents at your structured data with schemamap: lines in robots.txt and answer natural-language questions at /ask.

Performance: 93/100

Scored 93/100 across 26 performance signals (0 failing) — including LCP-image handling, CSS @import chains, revalidators, BFCache eligibility, preconnect coverage and embed facades.

pass Server response time

Document response observed in 200 ms from this server; not real-user field data.

responseTime · observed · weight 2

{
  "ttfb": 200,
  "loadMs": 200
}
pass Minimal redirects

No redirect on the entry URL.

redirects · observed · weight 0.6

pass HTML document size

HTML is 3 KB uncompressed (0 KB on the wire).

htmlSize · observed · weight 1

{
  "htmlKb": 3,
  "transferKb": 0
}
pass Text compression

Response compressed (br).

compression · observed · weight 1.2

pass Brotli compression

Using Brotli (best ratio).

brotli · observed · weight 0.4

pass Render-blocking resources

0 render-blocking script(s) and 0 stylesheet(s) in <head>.

renderBlocking · observed · weight 1.6

{
  "blockingScripts": 0,
  "headStyles": 0
}
info Scripts load async/deferred

No external scripts.

scriptLoading · not-applicable · weight 1

Demo guidance: Add async or defer to non-critical scripts so they don't block parsing.

pass Resource request count

~1 referenced resources (0 scripts, 0 styles, 1 images, 0 iframes).

requestCount · heuristic · weight 1

{
  "totalScripts": 0,
  "styles": 0,
  "imgs": 1,
  "iframes": 0
}
pass Third-party request domains

0 distinct third-party domain(s) referenced.

thirdParty · observed · weight 1

{
  "domains": []
}
info Resource hints (preconnect/preload)

0 preconnect, 0 dns-prefetch, 0 preload hint(s).

resourceHints · not-applicable · weight 0.8

Demo guidance: Add <link rel=preconnect> for critical third-party origins and preload key fonts/hero assets.

info Image optimization

No raster images to optimise (vectors are resolution-independent).

imageOptim · not-applicable · weight 1.4

{
  "rasterImgs": 0,
  "lazy": 0,
  "rasterDimensioned": 0,
  "modern": 0,
  "responsive": 0
}
pass Layout-shift prevention

1/1 images declare width & height.

cls · observed · weight 1

info Web-font loading strategy

No external web fonts detected.

fontDisplay · not-applicable · weight 0.6

pass Inline CSS/JS weight

0 KB inline CSS, 0 KB inline JS.

inlineWeight · observed · weight 0.7

pass HTML minification

HTML appears minified.

minification · observed · weight 0.5

warn Caching headers

No effective Cache-Control on the document.

caching · observed · weight 0.8

Demo guidance: Set Cache-Control on static assets (long max-age + immutable) and a sensible value on HTML.

warn Conditional requests (ETag/Last-Modified)

No ETag or Last-Modified on the document — every revisit re-downloads the full body.

validators · observed · weight 0.5

Demo guidance: Send an ETag or Last-Modified header so browsers can revalidate with If-None-Match and get a cheap 304.

pass CDN / edge delivery

Modern HTTP advertised.

cdn · observed · weight 0.6

Demo guidance: Serve assets from a CDN to cut latency for distant users.

pass Modern HTTP (h2/h3)

Server advertises HTTP/2 or HTTP/3 (alt-svc).

http2 · observed · weight 0.5

pass DOM size

43 DOM nodes.

domSize · observed · weight 0.8

pass No CSS @import chains

No @import in inline CSS.

cssImport · observed · weight 0.6

pass No heavy inline data-URIs

0 base64 data-URI(s), ~0 KB inlined into the HTML.

dataUriBloat · observed · weight 0.7

pass No duplicate scripts

No duplicate script URLs.

duplicateScripts · observed · weight 0.5

pass Hero image not lazy-loaded

The first image loads eagerly.

lcpImage · observed · weight 0.8

warn LCP fetchpriority hint

No fetchpriority hint for the LCP image.

fetchPriority · observed · weight 0.4

Demo guidance: Add fetchpriority="high" to your hero/LCP image so the browser fetches it first.

info Critical origins preconnected

0/0 third-party origins are preconnected.

preconnectCoverage · not-applicable · weight 0.6

pass No heavy un-faceted embeds

No heavy third-party embeds.

embedFacade · observed · weight 0.5

pass No oversized inline scripts

Largest inline <script> is 0.0 KB.

inlineScript · observed · weight 0.5

pass Non-critical CSS deferred/scoped

0 stylesheet(s) load render-blocking (no media scope / print).

mediaScopedCss · observed · weight 0.5

pass No legacy libs blocking <head>

No legacy libraries blocking in <head>.

legacyHeadLibs · observed · weight 0.4

pass Back/forward cache not blocked

No BFCache blockers detected — back/forward navigations can restore instantly from memory.

bfcache · observed · weight 0.5

info Speculation Rules (prefetch/prerender)

No Speculation Rules (optional: makes next-page navigations feel instant).

speculationRules · not-applicable · weight 0.3

Demo guidance: Consider a <script type="speculationrules"> block to prerender likely next pages on hover.

info CSS containment

CSS containment not assessed — stylesheets are external and deep render is off.

cssContainment · not-applicable · weight 0.2

Demo guidance: Consider contain: content (or layout/paint) on self-contained widgets to limit style/layout recalculation scope.

info scrollbar-gutter reserved

scrollbar-gutter not assessed — stylesheets are external and deep render is off.

scrollbarGutter · not-applicable · weight 0.2

Demo guidance: Set scrollbar-gutter: stable on the root/scroll containers so the scrollbar appearing doesn't shift content sideways.

info View Transitions API

No View Transitions usage detected (optional: native cross-fade/morph between pages and states).

viewTransitions · not-applicable · weight 0.3

Demo guidance: Consider the View Transitions API (@view-transition / startViewTransition) for smooth page and state transitions without JS animation libraries.

info Scroll-driven animations (CSS)

No scroll-driven animation usage detected (optional: animation-timeline: scroll()/view()).

scrollDrivenAnimations · not-applicable · weight 0.2

Demo guidance: Consider CSS scroll-driven animations (animation-timeline) for scroll effects — they run off the main thread with zero JS.

info Server-Timing header

No Server-Timing header on the document.

serverTiming · not-applicable · weight 0.2

Demo guidance: Emit a Server-Timing header (e.g. db;dur=42, cache;desc=hit) to surface backend timings in DevTools and RUM analytics.

info Compression Dictionary Transport

No compression-dictionary headers (cutting-edge: Use-As-Dictionary lets returning visitors download only the diff of updated assets).

compressionDictionary · not-applicable · weight 0.2

Demo guidance: Consider Compression Dictionary Transport (Use-As-Dictionary on key assets) so returning visitors fetch deltas instead of full files.

info Early Hints (103) readiness

No Link response header with preload/preconnect on the document.

earlyHintsReady · not-applicable · weight 0.3

Demo guidance: Send 103 Early Hints with Link headers (rel=preload/preconnect) on the main document so browsers start fetching critical assets before the HTML is ready.

Accessibility: 100/100

Scored 100/100 against 22 WCAG checks (0 failing, 0 risky) — including computed colour-contrast, accessible-name coverage, semantic interactivity and ARIA-reference integrity.

pass Document language declared

lang="en".

lang · observed · weight 1.4

pass Images have alt attributes

0/1 images missing an alt attribute.

imgAlt · observed · weight 1.8

{
  "total": 1,
  "missingAlt": 0
}
pass Alt text is meaningful

No generic alt text detected.

altQuality · observed · weight 0.6

pass Form inputs are labelled

0/1 fields have no associated label.

formLabels · observed · weight 1.8

{
  "total": 1,
  "unlabeled": 0
}
pass Descriptive link text

0 vague and 0 empty link(s) of 8.

linkText · observed · weight 0.9

pass Buttons have accessible names

0 button(s) without an accessible name.

buttonNames · observed · weight 0.9

pass Pinch-zoom not disabled

Users can zoom.

zoom · observed · weight 1

pass Landmark regions

Landmarks present: main:true nav:true header:true footer:true.

landmarks · observed · weight 1

pass Skip-to-content link

A skip link is present.

skipLink · observed · weight 0.5

pass Headings form an outline

3 headings in order.

headingStructure · observed · weight 0.8

pass No focusable content in aria-hidden

No focusable elements hidden from assistive tech.

ariaHidden · observed · weight 0.6

pass No positive tabindex

Natural focus order preserved.

tabindex · observed · weight 0.5

pass No autoplaying media

No autoplaying audio/video.

autoplay · observed · weight 0.4

info Text colour contrast (WCAG AA)

No colour pairs to evaluate (colours likely set via external CSS — enable deep render to assess).

contrast · not-tested · weight 1.4

{
  "checked": 0,
  "failures": 0,
  "worst": null
}
pass Interactive elements are named

10/10 interactive elements expose an accessible name.

accessibleNames · observed · weight 1.3

{
  "total": 10,
  "named": 10
}
pass Interactive elements are semantic

All interactive elements use <a>/<button>.

semanticInteractive · observed · weight 1

pass No invalid interactive nesting

No invalid nesting detected.

validNesting · observed · weight 0.7

info Respects prefers-reduced-motion

No inline animations detected.

reducedMotion · not-applicable · weight 0.6

pass Unique top-level landmarks

Exactly one main landmark.

landmarkUniqueness · observed · weight 0.6

pass ARIA references resolve

All aria-labelledby/describedby/controls point to existing IDs.

ariaRefs · observed · weight 0.6

pass No empty headings

No empty headings.

emptyHeadings · observed · weight 0.5

info Adequate touch-target size

No inline-sized interactive elements to assess.

touchTargets · not-applicable · weight 0.5

pass Valid lang value

lang="en" is well-formed.

langFormat · observed · weight 0.4

pass No accessibility overlay widget

No accessibility overlay detected.

a11yOverlay · observed · weight 0.8

pass Keyboard focus ring preserved

No focus-outline removal detected.

focusRing · observed · weight 0.7

info Language of parts (lang on foreign content)

No inline lang attributes found — untagged foreign-language passages can't be detected statically.

inlineLang · not-applicable · weight 0.3

Demo guidance: If the page quotes or embeds text in another language, wrap it with lang="xx" (WCAG 3.1.2) so screen readers pronounce it correctly.

info Machine-translation hints (translate=no)

No translate="no"/notranslate markers found.

translateAttr · not-applicable · weight 0.2

Demo guidance: Mark brand names, code snippets and proper nouns with translate="no" so browser auto-translation doesn't mangle them.

Code Quality: 98/100

Scored 98/100 on 25 front-end hygiene checks (24 clean) — including outdated-library detection, document validity, broken anchors, exposed secrets and !important abuse.

pass HTML5 doctype

Standards-mode <!doctype html>.

doctype · observed · weight 1

pass Character encoding declared early

Charset declared within the first 1KB.

charset · observed · weight 1

pass Language attribute

html lang set.

lang · observed · weight 0.6

pass No deprecated tags

No deprecated HTML tags.

deprecatedTags · observed · weight 1

pass No presentational attributes

No deprecated presentational attributes.

deprecatedAttrs · observed · weight 0.6

pass Limited inline styles

0 elements (0.0%) use inline style attributes.

inlineStyles · observed · weight 0.9

pass No inline event handlers

No inline on* event handlers.

inlineHandlers · observed · weight 0.7

pass Unique element IDs

All element IDs are unique.

dupeIds · observed · weight 0.9

pass No empty interactive elements

No empty links.

emptyElements · observed · weight 0.5

pass Semantic elements over div soup

0 <div>s vs 7 semantic element(s) (0% divs).

semanticRatio · observed · weight 0.8

pass No mixed content

No insecure http resources on an https page.

mixedContent · observed · weight 1.1

{
  "mixed": 0
}
pass No debug leftovers

No TODO/console leftovers in output.

leftovers · observed · weight 0.5

pass Few HTML comments in production

0 HTML comment(s) in the output.

comments · observed · weight 0.3

warn Favicon declared

No favicon declared.

favicon · observed · weight 0.4

Demo guidance: Add a favicon and apple-touch-icon.

pass Reasonable DOM size

43 DOM elements.

domSize · observed · weight 0.8

pass DOM not too deeply nested

Maximum nesting depth ~7.

domDepth · observed · weight 0.5

info No outdated/known-risk libraries

No fingerprinted libraries.

outdatedLibs · not-applicable · weight 1

{
  "libs": []
}
pass No javascript: URLs

No javascript: URLs.

jsUrls · observed · weight 0.6

pass No meta-refresh redirects

No meta refresh.

metaRefresh · observed · weight 0.5

pass Valid document structure

Exactly one html/head/body/title.

singletons · observed · weight 0.7

pass In-page anchors resolve

All in-page anchor links resolve.

brokenAnchors · observed · weight 0.5

pass Forms are well-formed

0/1 form(s) missing a submit target or have unnamed fields.

formValidity · observed · weight 0.6

pass No secrets/internal data exposed

No obvious secrets or internal data in the markup.

noSecrets · observed · weight 0.7

pass No !important abuse

0 !important declaration(s).

importantAbuse · observed · weight 0.5

pass Interactive elements are real controls

Interactivity uses <a>/<button>.

semanticInteractive · observed · weight 0.6

pass No duplicate meta tags

No duplicate description/viewport tags.

dupMeta · observed · weight 0.4

info Modern-CSS adoption

Modern-CSS adoption not assessed (external stylesheets not fetched) — container queries, anchor positioning and text-wrap balance can't be detected from the served HTML alone.

modernCssAdoption · not-applicable · weight 0

UI / UX: 96/100

Scored 96/100 across 17 UI/UX & conversion checks — including click-depth to contact, design-token consistency, above-the-fold pitch and trust signals that most graders ignore.

pass Mobile-responsive viewport

Responsive viewport configured.

responsive · observed · weight 1.8

info Responsive CSS present

No inline media queries (may be in external CSS).

mediaQueries · not-tested · weight 0.6

pass Clear call-to-action

3 action-oriented control(s) detected using the page language. Prominence is not assessed from HTML.

cta · heuristic · weight 1.5

{
  "ctas": 3,
  "purpose": "article",
  "pageLang": "en"
}
pass Discoverable navigation

3 navigation link(s) inside <nav>.

navigation · heuristic · weight 1.2

info Site search

No site search detected.

search · not-applicable · weight 0.4

Demo guidance: For content-heavy sites, add search to help users find things fast.

info Breadcrumbs / wayfinding

No breadcrumbs detected.

breadcrumbs · not-applicable · weight 0.3

pass Contact information

Contact details/links present.

contact · heuristic · weight 0.8

info Social proof / links

No social links detected.

social · not-applicable · weight 0.4

pass Footer present

Footer region present.

footer · observed · weight 0.4

pass Readable prose (Flesch)

Flesch Reading Ease 54.4 — fairly difficult (10th–12th grade); avg 9 words/sentence.

readability · heuristic · weight 1

{
  "flesch": 54.4,
  "grade": 7.9
}
pass Scannable content blocks

0/4 paragraphs are very long (120+ words).

scannability · heuristic · weight 0.7

info Legible base font size

Font size was not measured; computed styles and external CSS are not evaluated in this check.

legibility · not-tested · weight 0.7

pass Form input ergonomics

1 field(s): 1 with a specific type (email/tel/url/number/…), 1 autocomplete, 0 placeholder.

formUx · observed · weight 0.9

pass Clear headline / value prop

H1: "How do you audit a public web page?".

valueProp · heuristic · weight 0.9

pass Visual hierarchy

3 section heading(s) and 1 image(s) establish rhythm.

hierarchy · heuristic · weight 0.8

warn Tab/brand polish

Favicon + descriptive title give a polished browser-tab presence.

polish · heuristic · weight 0.3

Demo guidance: Add a favicon for a polished, trustworthy tab presence.

pass Contact reachable in ≤1 click

Estimated 0 click(s) to contact — contact form on this page.

clicksToContact · heuristic · weight 1.6

{
  "clicks": 0
}
pass Disciplined colour palette

3 distinct colours used in inline/embedded styles.

colorConsistency · heuristic · weight 1.1

{
  "colors": 3
}
info Consistent type scale

No inline font sizes to assess.

typeScale · not-applicable · weight 1

{
  "fontSizes": 0,
  "fontFamilies": 0
}
info Limited font families

0 distinct font families.

fontDiscipline · not-applicable · weight 0.7

info Consistent button styling

1 visually-distinct button/CTA styles detected.

buttonConsistency · not-applicable · weight 1

pass Consistent spacing scale

1 distinct margin/padding/gap values.

spacingScale · heuristic · weight 0.7

pass No !important abuse

0 !important declaration(s).

importantAbuse · observed · weight 0.5

pass Opening content signals (HTML estimate)

Hero has headline:✓ supporting text:✓ CTA:✓.

aboveFold · heuristic · weight 1.2

info Conversion trust signals

No testimonials, logos, ratings or guarantees detected. This conversion check is not required for the inferred page purpose.

trustSignals · not-applicable · weight 0.9

info Maintainable class system

0 distinct class names across 43 elements (ratio 0.00).

classSprawl · not-applicable · weight 0.6

info Browser chrome themed (theme-color/color-scheme)

theme-color ✗, color-scheme ✗.

themeColor · not-applicable · weight 0.3

Demo guidance: Add <meta name="theme-color"> to tint browser chrome to your brand, and <meta name="color-scheme"> so dark-mode users don't get a white flash before CSS loads.

info Web app manifest

No web app manifest (optional: controls name/icon/colours when users install or pin the site).

manifest · not-applicable · weight 0.3

Demo guidance: Add a manifest.json with name, icons and theme colours, linked via <link rel="manifest">.

info Service worker (offline/cache layer)

No service worker detected (optional: only worth adding for app-like sites that benefit from offline/installable behaviour).

serviceWorker · not-applicable · weight 0.4

Data & Tracking: 100/100

Scored 100/100. Detected 0 tool(s) across 6 checks — including consent ordering, PII leakage, fingerprinting and duplicate-property detection.

info Web analytics installed

No recognized client-side analytics detected. The page may intentionally omit analytics or measure activity server-side; no score penalty.

hasAnalytics · not-tested · weight 2.4

{
  "analytics": [],
  "tagManager": false
}

Demo guidance: If measurement is needed, verify your server-side or client-side setup against your goals; analytics is optional for this score.

info Conversion / marketing tracking

No advertising/marketing pixels — fine for a privacy-first site (only needed if you run paid acquisition).

conversionTracking · not-applicable · weight 1.2

Demo guidance: If you run paid acquisition, add the relevant pixels (Meta, Google Ads, LinkedIn) to measure ROI.

info Tag governance

Few tags; a manager is optional at this scale.

tagManager · not-applicable · weight 0.8

info Tracking and consent markup

No recognized profiling trackers; consent requirements were not assessed.

consent · not-tested · weight 2

{
  "consent": []
}
pass Privacy policy link

A privacy/cookie policy link is present.

privacyPolicy · observed · weight 0.8

pass Reasonable tracker count

0 distinct tracking tool(s) detected.

trackerCount · observed · weight 0.9

{
  "vendors": []
}
pass No duplicate analytics

0 GA4 property.

duplicateAnalytics · observed · weight 0.6

pass No PII in tracking/URLs

No obvious PII in tracking calls or URLs.

piiLeak · observed · weight 1

info Honours GPC / Do-Not-Track

No consent-requiring tracking to gate — GPC/DNT not applicable.

gpcDnt · not-applicable · weight 0.4

info First-party / server-side tagging

Tagging appears fully client-side/third-party.

firstPartyTagging · not-applicable · weight 0.4

pass No covert fingerprinting

No device-fingerprinting libraries detected.

fingerprinting · observed · weight 0.6

info Cookie policy / settings link

No dedicated cookie policy/settings link.

cookiePolicy · not-applicable · weight 0.4

pass Trackers load non-blocking

Tracking tags load async/deferred.

trackerPlacement · observed · weight 0.4

Security: 52/100

Scored 52/100 across 13 security checks (0 failing) — including CSP hardening, HSTS, security.txt, cookie prefixes, CORS, violation reporting and known-vulnerable-library detection.

pass Served over HTTPS

The final URL is served over HTTPS.

https · observed · weight 3

warn HSTS header

No HSTS header.

hsts · observed · weight 1.4

Demo guidance: Set Strict-Transport-Security: max-age=31536000; includeSubDomains; preload.

warn Content Security Policy

No Content-Security-Policy.

csp · observed · weight 1.5

Demo guidance: Add a Content-Security-Policy (start in report-only mode) to mitigate XSS.

warn X-Content-Type-Options: nosniff

Missing X-Content-Type-Options: nosniff.

xcto · observed · weight 0.8

Demo guidance: Add X-Content-Type-Options: nosniff to stop MIME sniffing.

warn Clickjacking protection

No clickjacking protection.

clickjacking · observed · weight 1

Demo guidance: Set X-Frame-Options: SAMEORIGIN or a CSP frame-ancestors directive.

warn Referrer-Policy

No Referrer-Policy.

referrerPolicy · observed · weight 0.6

Demo guidance: Set Referrer-Policy: strict-origin-when-cross-origin to avoid leaking URLs.

info Permissions-Policy

No Permissions-Policy (recommended).

permissionsPolicy · not-applicable · weight 0.5

Demo guidance: Add a Permissions-Policy to disable unused features (camera, geolocation…).

info Cross-origin policies (COOP/CORP)

COOP: —, CORP: —.

crossOrigin · not-applicable · weight 0.5

Demo guidance: Consider Cross-Origin-Opener-Policy and Cross-Origin-Resource-Policy to harden isolation.

pass No stack/version disclosure

No obvious version disclosure.

disclosure · observed · weight 0.6

pass No mixed content

No insecure http resources on an https page.

mixedContent · observed · weight 1

pass Forms submit over HTTPS

No forms post to an insecure http endpoint.

formAction · observed · weight 0.6

pass No obvious dangerous JS sinks

No eval/document.write in the served HTML.

dangerousJs · observed · weight 0.4

warn security.txt published

No security.txt found.

securityTxt · observed · weight 0.4

Demo guidance: Publish /.well-known/security.txt with a disclosure contact so researchers can report issues responsibly.

pass No reflexive/wildcard CORS

No permissive CORS header on the document.

corsWildcard · observed · weight 0.5

pass No known-vulnerable libraries

No outdated/known-risk client libraries detected.

vulnerableDeps · observed · weight 0.8

info Cross-origin isolation headers

No Cross-Origin-Embedder-Policy (needed for full isolation / SharedArrayBuffer).

crossOriginIsolation · not-applicable · weight 0.3

Demo guidance: If you need cross-origin isolation, pair COOP with Cross-Origin-Embedder-Policy.

info Violation reporting configured

No Reporting-Endpoints header or CSP report-to — policy violations in the field go unseen.

reportingEndpoints · not-applicable · weight 0.3

Demo guidance: Add a Reporting-Endpoints header (plus report-to in your CSP) so real-world policy breakage reaches you.

info Trusted Types (DOM-XSS defence)

No require-trusted-types-for CSP directive (optional hardening against DOM-based XSS).

trustedTypes · not-applicable · weight 0.3

Demo guidance: Consider CSP `require-trusted-types-for 'script'` to neutralise DOM-based XSS at innerHTML-style sinks.

info CAA records restrict cert issuance

DNS lookup unavailable — couldn't verify CAA records.

caaRecords · not-tested · weight 0.5

info Digest Fields (RFC 9530)

No Repr-Digest/Content-Digest header (RFC 9530 Digest Fields let clients verify response integrity — cutting-edge, mostly for APIs).

digestFields · not-applicable · weight 0.2

Try your own public page

Your score appears without signup. Email unlocks your detailed report. Three successful analyses per network are free each UTC day.

3 free successful analyses per network per UTC day. Score without signup; email unlocks the full report.

Website grader · AI readiness checker · GEO checker · The four-audit study