Evaluates the semantic integrity and navigability of the page's HTML. A well-structured page gives both users and crawlers a clear, predictable hierarchy.
Heading structure — max 40 pts
Single H1 tag
The page must have exactly one <h1>. One H1 = 15 pts. More than one = 5 pts (penalised for ambiguity). None = 0 pts.
one title: +15 pts1+ titles: +5 ptsno title
1 found15 pts
Sufficient heading count
At least 3 total headings (H1–H6) signals that content is broken into scannable sections. Rewarded with 5 pts.
found: +5 ptsnot found
7 total5 pts
Heading hierarchy score
Checks that headings nest correctly (no H3 before an H2, etc.). The raw hierarchy score (0–100) contributes up to 20 pts via the formula: score × 0.20.
correct: up to +20 ptsnot correct
100 / 10020 pts
Semantic tags — max 20 pts (5 pts each)
Landmark tags
Presence of <header>, <main>, <article>, and <footer> is checked individually. Each present tag adds 5 pts, for a possible 20 pts total. These tags give screen readers and search engines structural anchors.
main ✓ footer ✓10 pts
Images & links — max 35 pts
Alt text coverage
For every image on the page, alt text is checked. The ratio of covered images drives up to 20 pts: (images − missing_alt) / images × 20. Full coverage earns the maximum.
up to 20 pts
67 / 6720 pts
Internal links
Links pointing to pages within the same domain. 5+ internal links = 10 pts. At least 1 = 5 pts. None = 0 pts. Internal links aid crawlability and user navigation.
up to 10 pts
7 links10 pts
External links
At least one link to an external domain earns 5 pts. External links signal that the page connects to the wider web, a positive trust signal.
5 pts
2 links5 pts
Page size — max 5 pts
HTML size under 500 KB
The raw HTML document (excluding assets) should remain under 500 KB. Leaner HTML parses faster. Passing this threshold earns 5 pts.
5 pts
211 KB5 pts
Measures how much complexity the page introduces at load time — number of requests, scripts, stylesheets, third-party dependencies, and total page weight. Starts at 100 and deducts for excess.
Penalty-based scoring. Load Complexity starts at 100. Each threshold violation deducts points. A page with no excess earns the full 100, as seen in this example.
Request count penalties
Total HTTP requests
Counts every resource the browser fetches: HTML, images, scripts, fonts, etc. Over 30 = −5 pts. Over 60 = −15 pts. Over 100 = −25 pts.
1–30: no penalty30–60: −5 pts60–100: −15 pts>100: −25 pts
5 requestsno penalty
Script & stylesheet penalties
JavaScript files
Each JS file adds parse and execution cost. Over 4 files = −5 pts. Over 8 = −10 pts. Over 15 = −20 pts.
0–3: no penalty4–8: −5 pts8–15: −10 pts>15: −20 pts
0 filesno penalty
CSS files
Stylesheets block rendering until downloaded and parsed. Over 4 = −5 pts. Over 8 = −10 pts.
0–3: no penalty4–8: −5 pts>8: −10 pts
0 filesno penalty
Render-blocking scripts
Scripts in the <head> without async or defer block the browser from rendering anything. 1–2 = −3 pts. 3–5 = −8 pts. Over 5 = −15 pts.
0: no penalty1–2: −3 pts3–5: −8 pts>5: −15 pts
0no penalty
External dependency penalties
Third-party domains
Each unique external domain (CDNs, analytics, fonts, embeds) requires a separate DNS lookup and connection. Over 2 = −5 pts. Over 5 = −10 pts. Over 10 = −20 pts.
0–1: no penalty2–5: −5 pts5–10: −10 pts>10: −20 pts
1 domainno penalty
Total page weight
Sum of all transferred bytes (HTML + assets). Over 2 MB = −5 pts. Over 5 MB = −10 pts. Heavy pages hurt users on slow connections and mobile data.
<2 MB: no penalty2–5 MB: −5 pts>5 MB: −10 pts
0.14 MBno penalty
Checks the presence of HTTP security headers that protect visitors from common web attacks. Each header is a binary check — present or absent.
Binary checks only. Each of the five security signals is either present (✓) or absent (✗). The score is derived entirely from the server response headers — no page content is analysed.
HTTP response headers checked
HTTPS
The page is served over an encrypted TLS connection. This is the baseline requirement for all other security headers to be meaningful.
✓ Present
Strict-Transport-Security (HSTS)
Instructs browsers to only connect via HTTPS for a defined period, even if the user types http://. Prevents protocol downgrade attacks.
✓ Present
Content-Security-Policy (CSP)
Defines which sources of scripts, styles, and media the browser is allowed to load. Mitigates cross-site scripting (XSS) attacks by blocking unauthorised content.
✓ Present
X-Frame-Options
Prevents the page from being embedded in an <iframe> on another site. Protects against clickjacking attacks where a malicious overlay tricks users into unintended clicks.
✓ Present
X-Content-Type-Options
Set to nosniff, this stops browsers from guessing the MIME type of a response, preventing them from treating a script file as HTML or vice versa.
✓ Present
Referrer-Policy
Controls how much referrer information is included when the user navigates away. Limits leakage of internal URLs and user paths to third-party sites.
✓ Present
Evaluates how well the page communicates its meaning to automated systems — search engines, AI crawlers, and social media scrapers. Covers structured data, metadata quality, content clarity, and discoverability signals.
Semantic richness — up to 20 pts (weight: 20%)
Semantic richness score
Computed from the presence of <main> and <footer> tags (base 80%), plus a bonus of up to 25 pts for the count of <nav>, <aside>, and <section> elements (capped at 1× multiplier).
Formula: (semantic_flags / 2) × 80 + min((nav+aside+section) / 2, 1) × 25.
92.5 / 100× 0.20 → 18.5 pts
Heading & alt clarity — up to 30 pts
Heading clarity score
Directly inherits the heading hierarchy score from the Structure dimension. A correct heading order = 100. Contributes up to 15 pts via weight 0.15.
100 / 100× 0.15 → 15 pts
Image alt coverage ratio
The fraction of images that have alt text: (images − missing_alt) / images. Multiplied by 100 and weighted at 0.15, it contributes up to 15 pts. Full coverage = full points.
1.0 (100%)× 0.15 → 15 pts
Structured data & social tags — up to 35 pts
Schema.org / JSON-LD
Points for each JSON-LD block (json_ld_count × 10) plus each unique schema type detected (schema_type_count × 20), capped at 30 pts. Weighted at 0.20, contributes up to 6 pts.
8 schema types found
30 pts (capped)× 0.20 → 6 pts
Open Graph tags
Presence of any og: meta tags earns 15 pts. These power link previews on social platforms and inform AI summarisers about the page's intent. Weighted at 0.05.
7 og: tags× 0.05 → 0.75 pts
Twitter Cards
Presence of any twitter: meta tags earns 5 pts. Controls the appearance of links when shared on X/Twitter. Weighted at 0.05.
4 twitter: tags× 0.05 → 0.25 pts
New signals group — up to 15 pts
Meta description quality
Length thresholds: missing = 0 pts, too short (<50 chars) = 4 pts, too long (>160 chars) = 6 pts, optimal (50–160 chars) = 10 pts. This page's description is 202 chars, so rated "too_long".
too_long → 6 pts
202 chars6 / 10
Title tag quality
Same thresholds: missing = 0, too short (<10 chars) = 4, too long (>60 chars) = 6, optimal = 10 pts. This page's title is 102 chars, rated "too_long".
too_long → 6 pts
102 chars6 / 10
Canonical tag
A <link rel="canonical"> tag tells crawlers the authoritative URL for the page, preventing duplicate content issues. Present = 2 pts.
+2 pts
✓ Present2 / 2
Contact information
Detected by regex scanning visible text for email addresses or phone numbers. Contact presence earns 1 pt — it signals legitimacy and business intent to AI systems.
+1 pt
Email found1 / 1
Content-to-noise ratio
Ratio of visible text characters to total HTML bytes. If ≥ 5% of the HTML is readable text, the page is considered content-rich and earns 1 pt. Low ratios suggest tag-heavy template pages with little actual content.
0.006 < 0.05 threshold
0.0060 / 1
A heuristic assessment of homepage visual quality based purely on HTML and inline CSS — no screenshots or rendering. Checks for key UX components and visual discipline. * Note: currently informational only, not included in the total score calculation.
UX component checks — up to 60 pts
Hero section
Detected via class names containing "hero", "banner", "jumbotron", "cover", or "splash", or via a background-image style on a top-level section. Also credited if the first image appears within the first 40 HTML tags. Earns 10 pts.
found: +10 ptsnot found
not found0 / 10
Logo
Searched for within the <header> first — an image with "logo" in the alt text, or an SVG element. Falls back to any <img> with "logo" in alt or src. Earns 15 pts.
found: +15 ptsnot found
not found0 / 15
CTA button
Scans all <a> and <button> elements for action verbs: book, contact, hire, inquire, get in touch, start, schedule, reserve. First match earns 10 pts.
found: +10 ptsnot found
not found0 / 10
Navigation quality
Counts links within the <nav> element: 0 = missing (0 pts), 1–2 = sparse (5 pts), 3–8 = ok (15 pts), 9+ = cluttered (5 pts). Optimal navigation is neither bare nor overwhelming.
0 links: 0 pts1-2 links: 5 pts3-8 links: 15 pts9+ links: 5 pts
5 links15 / 15
Footer completeness
The <footer> is checked for a copyright symbol (©) or the word "copyright" in its text. Presence earns 10 pts — a complete footer signals a professional, trustworthy page.
found: +10 ptsnot found
✓ Found10 / 10
Visual discipline — up to 40 pts (score × 0.40)
Font discipline
Extracts all font-family declarations from inline styles, normalises and de-duplicates them. Penalty: (font_count − 3) × 8 for 4+ fonts. If no fonts are detected at all, no penalty is applied (can't assess discipline).
0-3: no penalty4-11 fonts 12+ fonts
0 detected
Color discipline
Counts unique hex and RGB values in inline CSS. Penalty: (color_count − 10) × 2 for 11+ colors.
Visual discipline score = 100 − font_penalty − color_penalty, then multiplied by 0.40 for up to 40 pts.
< 10 colors17-34 colors 35+ colors
visual_discipline = 100 - 0 - 14 = 86 × 0.40 = 34.4
17 colors× 0.40 → 34.4 pts
Google Lighthouse is run headlessly against the live page. Four categories are measured. The audit uses the Performance score directly as the Lighthouse Score for weighting purposes.
Lighthouse categories (all 0–100)
Performance
Google's weighted composite of Core Web Vitals and load timing metrics. This is the value used as the lighthouse_score in all further calculations.
97
Accessibility
Audits contrast ratios, ARIA labels, keyboard navigability, and semantic HTML usage. Reported as a standalone signal.
100
Best Practices
Checks for HTTPS, modern image formats, no browser errors, secure third-party libraries, and correct use of APIs.
100
SEO
Lighthouse's own SEO checks: robots.txt, mobile viewport, crawlability, and meta tag completeness.
100
Core Web Vitals reported
LCP — Largest Contentful Paint
Time until the largest visible element (image or text block) has fully loaded. Under 2.5 s is "Good". This page: 2,524 ms — borderline.
2,524 ms
CLS — Cumulative Layout Shift
Measures unexpected visual movement as the page loads. Under 0.1 is "Good". This page has virtually no layout shift.
0.001
TBT — Total Blocking Time
Total time the main thread was blocked long enough to prevent input response. Under 200 ms is "Good". Zero indicates no long tasks.
0 ms
Speed Index
How quickly content is visually populated during load, measured in milliseconds. Lower is better.
1,380 ms
The total score is a weighted average of five core dimensions. Appearance is excluded at this stage. A separate Efficiency Score is also computed as a performance-focused composite.
(90 × 0.20) + (100 × 0.20) + (100 × 0.20) + (81 × 0.20) + (97 × 0.20)
= 18 + 20 + 20 + 16.2 + 19.4
= 93.6
Efficiency Score — a separate composite
The Efficiency Score is a focused view on technical delivery quality. It weights the three dimensions most directly tied to page speed and code health.
Load Complexity
100
× 35%
Score summary — all dimensions
Efficiency Score (structure + load + lighthouse)
96 / 100
Appearance (informational only)
59 / 100