Stats as of 2026-07-23 05:24 UTC โ€” last scan: 2026-07-23

23 scan batches run

3,746 of 87,696 available pages audited (4.3% coverage) 3,494 successful audits (93.3% of audited)

Overall average Lighthouse scores (0โ€“100 scale):

Performance Accessibility Best Practices SEO
89 85 89 87

Lighthouse Scores by Country

Country Audited Available Perf A11y Best Practices SEO Last Scan
Austria 77 822 89 89 91 85 2026-07-20
Belgium 76 1,329 84 92 92 91 2026-07-20
Bulgaria 352 353 87 81 88 87 2026-07-22
Croatia 257 257 92 72 92 89 2026-07-22
Czechia 167 866 90 87 92 87 2026-07-21
Denmark 159 1,536 86 93 96 91 2026-07-21
Estonia 401 401 91 87 86 89 2026-07-23
Finland 199 199 86 94 96 87 2026-07-20
Hungary 325 392 89 76 81 86 2026-07-21
Iceland 145 145 93 92 91 91 2026-07-21
Ireland 76 536 91 91 91 88 2026-07-21
Latvia 199 803 88 85 90 83 2026-07-21
Lithuania 122 122 86 81 87 85 2026-07-21
Luxembourg 77 573 89 95 96 95 2026-07-22
Malta 282 610 90 85 79 83 2026-07-22
Netherlands 30 945 84 94 95 84 2026-07-23
Norway 249 249 90 93 92 89 2026-07-21
Cyprus 29 29 81 86 84 86 2026-07-21
Slovakia 312 442 91 87 91 88 2026-07-22
Slovenia 214 214 86 80 89 85 2026-07-22

Scores are averages across all successfully audited URLs, displayed as 0โ€“100 (Lighthouse stores scores as 0.0โ€“1.0 internally).


๐Ÿ“ฅ Machine-readable results: Download machine-readable Lighthouse data (JSON) ยท Download per-URL Lighthouse data (CSV)


Overview

The Lighthouse scanner runs the Google Lighthouse CLI against each government page URL and extracts four headline category scores:

Category What it measures
Performance Page speed and Core Web Vitals (LCP, FID, CLS, etc.)
Accessibility WCAG-aligned accessibility checks (colour contrast, ARIA labels, keyboard navigation, โ€ฆ)
Best Practices Security headers, HTTPS, modern web APIs, console errors
SEO Search-engine crawlability, meta tags, structured data

All scores are on a 0โ€“100 scale (stored internally as 0.0โ€“1.0).

Note: PWA (Progressive Web App) audits are skipped for government sites because they are not relevant to the EU Web Accessibility Directive requirements and omitting them reduces per-URL scan time.


How to Interpret the Scores

Lighthouse scores are based on a single page load at the time of the audit. Scores can vary between runs due to network conditions and server load, so the values shown here are averages across all successfully audited URLs for each country.

  • 90โ€“100: Good
  • 50โ€“89: Needs improvement
  • 0โ€“49: Poor

For a detailed breakdown of individual audit failures, download the machine-readable Lighthouse data (JSON) or the per-URL Lighthouse data (CSV).


Running a Scan

  1. Go to Actions โ†’ Scan Lighthouse
  2. Click Run workflow
  3. Optionally enter a country code (e.g. ICELAND) or leave blank to scan all
  4. Optionally adjust the rate limit, concurrency, and skip-recently-scanned-days parameters

The scan runs automatically every day at 03:00 UTC. With --concurrency 3 and skipping URLs audited within the last 30 days, each daily run covers roughly 750โ€“1,000 URLs while ensuring every URL is refreshed at least monthly.

Via the command line

# Scan a single country
python3 -m src.cli.scan_lighthouse --country ICELAND

# Scan all countries (with a 110-minute runtime cap and 3 concurrent processes)
python3 -m src.cli.scan_lighthouse \
  --all \
  --max-runtime 110 \
  --concurrency 3 \
  --skip-recently-scanned-days 30 \
  --only-categories performance,accessibility,best-practices,seo \
  --throttling-method provided

Architecture

flowchart TD
    A["scan-lighthouse.yml\n(GitHub Actions โ€” daily at 03:00 UTC)"]
    A --> B["scan_lighthouse.py (CLI)"]
    B --> C["LighthouseScannerJob.scan_country()"]
    C --> D["Filter out recently-scanned URLs\n(_get_recently_scanned_urls)"]
    D --> E["LighthouseScanner.scan_urls_batch()\n(asyncio.Semaphore โ€” up to 3 concurrent)"]
    E --> F["For each URL (parallel)"]
    F --> G["subprocess: lighthouse URL --output=json\n--only-categories=performance,accessibility,\nbest-practices,seo --throttling-method=provided"]
    G --> H["_parse_lighthouse_output() โ†’ 4 category scores"]
    H --> I["Save to url_lighthouse_results table\n(incremental, per URL)"]
    I --> J["Write *_lighthouse.toon output file"]