Stats as of 2026-11-09 21:18 UTC — last scan: 2026-11-02

389 scan batches run

87,690 of 87,696 available pages scanned (100.0% coverage) 81,644 pages with technology detections (93.1% of scanned) 477 unique technologies identified


Technology Scan by Country

Country URLs Scanned Pages with Detections Available Last Scan
Austria 822 788 822 2026-10-11
Belgium 1,329 1,227 1,329 2026-10-17
Bulgaria 353 302 353 2026-10-11
Canada 4,469 4,264 4,469 2026-10-17
Croatia 257 254 257 2026-10-11
Czechia 866 800 866 2026-10-11
Denmark 1,536 1,507 1,536 2026-10-18
Estonia 401 384 401 2026-10-11
Finland 199 189 199 2026-10-11
France 10,009 9,288 10,009 2026-10-28
Germany 6,599 6,471 6,599 2026-10-24
Greece 1,752 1,640 1,752 2026-10-19
Hungary 392 304 392 2026-10-13
Iceland 145 143 145 2026-10-13
Ireland 536 499 536 2026-10-13
Italy 5,351 4,770 5,351 2026-10-27
Latvia 803 764 803 2026-10-16
Lithuania 122 114 122 2026-10-13
Luxembourg 573 527 573 2026-10-13
Malta 610 592 610 2026-10-17
Netherlands 945 892 945 2026-10-13
Norway 249 242 249 2026-10-13
Poland 14,951 13,805 14,951 2026-11-02
Portugal 3,508 3,182 3,508 2026-10-20
Cyprus 29 29 29 2026-10-13
Romania 807 351 807 2026-10-22
Slovakia 442 416 442 2026-10-16
Slovenia 214 207 214 2026-10-14
Spain 6,091 5,336 6,091 2026-10-29
Sweden 1,702 1,627 1,702 2026-10-20
Switzerland 2,123 2,077 2,123 2026-10-16
United Kingdom 19,511 18,659 19,511 2026-10-31

Hover or focus any non-zero country-table count to preview matching pages. Activate the number to keep the preview open and download a CSV for that country and metric from Download machine-readable technology data (JSON).


Top Technologies

# Technology Pages Categories
1 jQuery 43,762 JavaScript libraries
2 PHP 26,797 Programming languages
3 Apache 21,957 Web servers
4 Font Awesome 19,942 Font scripts
5 Bootstrap 19,857 UI frameworks
6 Google Tag Manager 17,588 Tag managers
7 Google Font API 17,526 Font scripts
8 MySQL 15,582 Databases
9 WordPress 15,470 Blogs, CMS
10 Nginx 13,655 Reverse proxies, Web servers
11 jQuery Migrate 13,567 JavaScript libraries
12 Cloudflare 7,666 CDN
13 Windows Server 7,161 Operating systems
14 IIS 7,048 Web servers
15 jQuery UI 6,464 JavaScript libraries
16 Microsoft ASP.NET 6,202 Web frameworks
17 Drupal 5,584 CMS
18 Yoast SEO 5,164 SEO
19 reCAPTCHA 5,007 Security
20 jsDelivr 4,728 CDN

Top Technology Categories

# Category Pages
1 JavaScript libraries 86,728
2 Web servers 48,351
3 Font scripts 38,741
4 Programming languages 33,595
5 CMS 28,240
6 UI frameworks 26,257
7 Tag managers 17,624
8 CDN 16,849
9 Databases 16,321
10 Blogs 15,622
11 Reverse proxies 14,246
12 Operating systems 11,350
13 Web frameworks 9,445
14 JavaScript frameworks 8,117
15 Miscellaneous 6,063

📥 Machine-readable results: Download machine-readable technology data (JSON)


Overview

The technology scanner fetches each government page and uses wappalyzer-python3 to identify technologies from HTTP response headers and HTML content. Detected technologies (CMS, web server, JavaScript frameworks, analytics, etc.) and their versions are stored in the metadata database and written back into an annotated *_tech.toon TOON file.

Scans run automatically every 6 hours via GitHub Actions so that the full set of URLs across all countries can be covered gradually without overloading government servers.


License and Digital Public Goods status (Top Technologies)

To support policy tracking of open source and free software use, this page now includes a machine-readable license registry for the current Top Technologies list:

Current summary from technology-license-data.json:

  • DPGA Registry listed: Drupal
  • OSI-approved license (yes): jQuery, PHP, Apache, Bootstrap, MySQL, WordPress, Nginx, jQuery Migrate, jQuery UI, Drupal, Yoast SEO
  • Partial/mixed: Font Awesome, Microsoft ASP.NET, jsDelivr
  • Not OSI-approved (no): Google Font API, Windows Server, IIS, Google Tag Manager, Cloudflare, reCAPTCHA

Notes:

  • This is a best-effort mapping of detected technology names to primary upstream licenses.
  • Some detections are products/services (not single software packages), so their licensing model can be mixed or proprietary.
  • DPGA status is based on a checked snapshot at generation time and may change.

Usage

Scan a single country

python3 -m src.cli.scan_technology --country ICELAND --rate-limit 2

Scan all countries

python3 -m src.cli.scan_technology --all --rate-limit 2
python3 -m src.cli.scan_technology --all --max-runtime 110 --rate-limit 2.0

Command-line options

Option Default Description
--country CODE — Country code to scan (e.g. FRANCE, ICELAND)
--all — Scan all countries in the TOON directory
--toon-dir PATH data/toon-seeds/countries Directory with .toon seed files
--rate-limit N 2.0 Maximum HTTP requests per second
--max-runtime N 0 (no limit) Maximum runtime in minutes. The scanner stops gracefully before this limit so that partial results can be saved. Set to ~10 minutes less than the GitHub Actions timeout-minutes value.

GitHub Actions

The Scan Technology Stack workflow (.github/workflows/scan-technology.yml) runs automatically every 6 hours and can also be triggered manually from the Actions tab:

  1. Go to Actions → Scan Technology Stack → Run workflow
  2. Optionally enter a country code (leave blank to scan all countries)
  3. Optionally adjust the rate limit

Artifacts uploaded after each run:

Artifact Contents
tech-scan-<run_number> data/metadata.db, scan output log, annotated *_tech.toon files
validation-metadata data/metadata.db (shared with URL validation and social media scans)

Output

Annotated TOON file

Each page entry in the output *_tech.toon file gains a technologies field:

{
  "url": "https://example.gov/",
  "is_root_page": true,
  "technologies": {
    "Nginx": { "versions": ["1.24"], "categories": ["Web servers"] },
    "WordPress": { "versions": ["6.2"], "categories": ["CMS", "Blogs"] }
  }
}

If detection failed for a URL, a tech_error field is added instead:

{
  "url": "https://unreachable.gov/",
  "tech_error": "Connection error: ..."
}

Database table

Results are stored in the url_tech_results table:

Column Type Description
url TEXT Page URL
country_code TEXT Country identifier
scan_id TEXT Unique scan run ID
technologies TEXT JSON object of detected technologies
error_message TEXT Error message (if detection failed)
scanned_at TEXT ISO-8601 timestamp

Query example:

SELECT url, technologies
FROM url_tech_results
WHERE country_code = 'ICELAND'
ORDER BY scanned_at DESC;

Architecture

flowchart TD
    A["scan-technology.yml\n(GitHub Actions — every 6 hours)"]
    A --> B["scan_technology.py (CLI)"]
    B --> C["TechScanner.scan_country()"]
    C --> D["TechDetector.detect_urls_batch()"]
    D --> E["For each URL"]
    E --> F["httpx.get() → HTML + headers"]
    F --> G["Wappalyzer.analyze_with_versions_and_categories()"]
    G --> H["Save to url_tech_results table\n(incremental, per URL)"]
    H --> I["Write *_tech.toon output file"]

Notes

  • Rate limiting is applied between requests to avoid overloading government servers. The default is 2 requests per second.
  • Technology fingerprinting is best-effort; some sites may return no detections if they use custom or obfuscated stacks.
  • Unlike the URL validator, failed tech scans do not mark a URL for removal — errors are recorded but the URL is kept in future scan cycles.
  • Results are persisted incrementally (one URL at a time) so that partial results are preserved even if the GitHub Actions job times out.
  • The *_tech.toon output files are excluded from version control (see .gitignore).