Social Media Scanning
Social media tier distribution
Stats as of 2026-04-09 02:54 UTC — last scan: 2026-04-09
185 scan batches run
82,714 of 82,714 available pages scanned (100.0% coverage) 77,380 of 82,714 scanned pages were reachable (93.6%)
Legacy social media (older, centralised platforms):
| Platform | Pages with link | % of scanned | % of reachable |
|---|---|---|---|
| 14,596 | 17.6% | 18.9% | |
| ✖ X | 3,309 | 4.0% | 4.3% |
| 28,211 | 34.1% | 36.5% | |
| 9,574 | 11.6% | 12.4% |
Modern / open social media (decentralised or open platforms):
| Platform | Pages with link | % of scanned | % of reachable |
|---|---|---|---|
| 🦋 Bluesky | 627 | 0.8% | 0.8% |
| 🐘 Mastodon / Fediverse | 4,286 | 5.2% | 5.5% |
📥 Machine-readable results are available as the social-media-data.json artifact in the latest Generate Scan Progress Report workflow run.
Digital Sovereignty Rankings
Countries ranked by Digital Sovereignty Score — the percentage of reachable pages using no social media or modern open platforms only (Mastodon / Bluesky). A higher score means fewer links to US corporate social-media platforms (Twitter / X, Facebook, LinkedIn). Pages with no social-media links at all score highest; pages linking only to Mastodon or Bluesky also rank well. Legacy Exposure shows the percentage of reachable pages that still link to Twitter/X, Facebook, or LinkedIn.
| Rank | Country | Sovereignty Score | No Social | Modern Only | Legacy Exposure | Tier |
|---|---|---|---|---|---|---|
| 1 | LITHUANIA | 95.4% | 99 | 4 | 30.6% | 🥉 Growing |
| 2 | SLOVAKIA | 94.7% | 382 | 9 | 35.8% | 🥉 Growing |
| 3 | AUSTRIA | 93.4% | 710 | 25 | 45.4% | 🥉 Growing |
| 4 | SWEDEN | 92.5% | 1,362 | 14 | 34.4% | 🥉 Growing |
| 5 | HUNGARY | 92.1% | 317 | 20 | 40.2% | 🥉 Growing |
| 6 | ICELAND | 91.9% | 116 | 8 | 44.4% | 🥉 Growing |
| 7 | NORWAY | 91.4% | 211 | 2 | 23.6% | 🥉 Growing |
| 8 | BULGARIA | 91.4% | 235 | 11 | 37.9% | 🥉 Growing |
| 9 | MALTA | 87.6% | 501 | 20 | 27.1% | 🥉 Growing |
| 10 | DENMARK | 87.6% | 1,307 | 10 | 38.8% | 🥉 Growing |
| 11 | SLOVENIA | 85.8% | 156 | 7 | 32.1% | 🥉 Growing |
| 12 | CROATIA | 85.3% | 187 | 11 | 36.2% | 🥉 Growing |
| 13 | GREECE | 83.9% | 1,325 | 41 | 33.6% | 🥉 Growing |
| 14 | CZECHIA | 82.9% | 643 | 23 | 34.4% | 🥉 Growing |
| 15 | BELGIUM | 82.8% | 960 | 59 | 40.5% | 🥉 Growing |
| 16 | ESTONIA | 82.3% | 298 | 22 | 52.7% | 🥉 Growing |
| 17 | LUXEMBOURG | 81.6% | 183 | 21 | 40.0% | 🥉 Growing |
| 18 | GERMANY | 80.3% | 4,903 | 301 | 32.1% | 🥉 Growing |
| 19 | ROMANIA | 79.5% | 273 | 6 | 38.5% | 🥉 Growing |
| 20 | REPUBLIC_OF_CYPRUS | 79.2% | 19 | 0 | 45.8% | 🥉 Growing |
| 21 | SWITZERLAND | 77.9% | 1,565 | 56 | 32.9% | 🥉 Growing |
| 22 | FINLAND | 77.9% | 132 | 2 | 39.5% | 🥉 Growing |
| 23 | NETHERLANDS | 76.8% | 644 | 54 | 38.6% | 🥉 Growing |
| 24 | FRANCE | 75.9% | 6,968 | 213 | 35.8% | 🥉 Growing |
| 25 | PORTUGAL | 71.5% | 2,039 | 57 | 40.6% | 🥉 Growing |
| 26 | IRELAND | 63.9% | 293 | 25 | 50.4% | 🥉 Growing |
| 27 | POLAND | 63.9% | 8,601 | 301 | 51.0% | 🥉 Growing |
| 28 | UNITED_KINGDOM_UK | 61.4% | 11,462 | 37 | 39.1% | 🥉 Growing |
| 29 | SPAIN | 58.8% | 3,193 | 29 | 43.5% | 🥉 Growing |
| 30 | LATVIA | 58.8% | 430 | 23 | 60.2% | 🥉 Growing |
| 31 | ITALY | 55.5% | 2,647 | 85 | 51.6% | 🥉 Growing |
Social Media Scan by Country
Available: all government pages tracked in our domain list. Reachable: of those scanned, pages that returned a valid HTTP response (not an error or timeout). Sov. Score: Digital Sovereignty Score — % of reachable pages with no social media or modern-only social presence. Tier columns classify each page by its overall social media presence; platform columns count pages with at least one link to that platform — a page may appear in more than one platform column.
| Country | Scanned | Available | Reachable | Sov. Score | No Social | Legacy-only | X | Modern | Mixed | Bluesky | Mastodon | Scan Period | |||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| AUSTRIA | 821 | 821 | 787 | 93.4% | 710 | 312 | 35 | 18 | 351 | 184 | 25 | 45 | 16 | 42 | Mar 2026 – Apr 2026 |
| BELGIUM | 1,309 | 1,309 | 1,230 | 82.8% | 960 | 404 | 183 | 74 | 455 | 319 | 59 | 97 | 28 | 90 | Mar 2026 – Apr 2026 |
| BULGARIA | 291 | 291 | 269 | 91.4% | 235 | 90 | 18 | 5 | 100 | 4 | 11 | 12 | 0 | 13 | Mar 2026 – Apr 2026 |
| CROATIA | 233 | 233 | 232 | 85.3% | 187 | 70 | 34 | 0 | 77 | 20 | 11 | 14 | 0 | 14 | Mar 2026 – Apr 2026 |
| CZECHIA | 843 | 843 | 803 | 82.9% | 643 | 243 | 131 | 10 | 269 | 28 | 23 | 33 | 0 | 38 | Mar 2026 – Apr 2026 |
| DENMARK | 1,521 | 1,521 | 1,503 | 87.6% | 1,307 | 557 | 176 | 21 | 483 | 339 | 10 | 27 | 17 | 13 | Mar 2026 – Apr 2026 |
| ESTONIA | 396 | 396 | 389 | 82.3% | 298 | 180 | 67 | 2 | 204 | 65 | 22 | 25 | 0 | 27 | Mar 2026 – Apr 2026 |
| FINLAND | 180 | 180 | 172 | 77.9% | 132 | 64 | 28 | 13 | 51 | 57 | 2 | 4 | 2 | 2 | Mar 2026 – Apr 2026 |
| FRANCE | 10,007 | 10,007 | 9,460 | 75.9% | 6,968 | 2,837 | 1,821 | 636 | 2,738 | 1,691 | 213 | 547 | 126 | 505 | Mar 2026 – Apr 2026 |
| GERMANY | 6,555 | 6,555 | 6,484 | 80.3% | 4,903 | 1,652 | 1,177 | 175 | 1,661 | 585 | 301 | 430 | 124 | 451 | Mar 2026 – Apr 2026 |
| GREECE | 1,748 | 1,748 | 1,628 | 83.9% | 1,325 | 447 | 236 | 60 | 497 | 116 | 41 | 100 | 0 | 103 | Mar 2026 – Apr 2026 |
| HUNGARY | 390 | 390 | 366 | 92.1% | 317 | 124 | 29 | 0 | 143 | 12 | 20 | 23 | 0 | 25 | Mar 2026 – Apr 2026 |
| ICELAND | 139 | 139 | 135 | 91.9% | 116 | 48 | 8 | 5 | 60 | 6 | 8 | 12 | 0 | 14 | Mar 2026 – Apr 2026 |
| IRELAND | 522 | 522 | 498 | 63.9% | 293 | 197 | 165 | 31 | 215 | 98 | 25 | 54 | 18 | 42 | Mar 2026 – Apr 2026 |
| ITALY | 5,338 | 5,338 | 4,919 | 55.5% | 2,647 | 2,278 | 2,044 | 94 | 2,374 | 538 | 85 | 260 | 0 | 290 | Mar 2026 – Apr 2026 |
| LATVIA | 802 | 802 | 771 | 58.8% | 430 | 382 | 284 | 47 | 447 | 165 | 23 | 82 | 0 | 83 | Mar 2026 – Apr 2026 |
| LITHUANIA | 120 | 120 | 108 | 95.4% | 99 | 29 | 5 | 0 | 33 | 15 | 4 | 4 | 0 | 4 | Mar 2026 – Apr 2026 |
| LUXEMBOURG | 571 | 571 | 250 | 81.6% | 183 | 64 | 43 | 3 | 89 | 65 | 21 | 36 | 11 | 33 | Mar 2026 – Apr 2026 |
| MALTA | 608 | 608 | 595 | 87.6% | 501 | 129 | 57 | 17 | 152 | 69 | 20 | 32 | 0 | 34 | Mar 2026 – Apr 2026 |
| NETHERLANDS | 937 | 937 | 909 | 76.8% | 644 | 257 | 148 | 74 | 305 | 218 | 54 | 95 | 45 | 77 | Mar 2026 – Apr 2026 |
| NORWAY | 239 | 239 | 233 | 91.4% | 211 | 55 | 10 | 13 | 40 | 42 | 2 | 0 | 0 | 2 | Mar 2026 – Apr 2026 |
| POLAND | 14,938 | 14,938 | 13,941 | 63.9% | 8,601 | 6,150 | 1,092 | 325 | 6,990 | 762 | 301 | 957 | 1 | 1,047 | Mar 2026 – Apr 2026 |
| PORTUGAL | 3,503 | 3,503 | 2,933 | 71.5% | 2,039 | 1,015 | 430 | 70 | 1,116 | 271 | 57 | 175 | 2 | 183 | Mar 2026 – Apr 2026 |
| REPUBLIC_OF_CYPRUS | 24 | 24 | 24 | 79.2% | 19 | 11 | 5 | 0 | 11 | 3 | 0 | 0 | 0 | 0 | Mar 2026 – Apr 2026 |
| ROMANIA | 799 | 799 | 351 | 79.5% | 273 | 124 | 42 | 1 | 135 | 13 | 6 | 11 | 0 | 14 | Mar 2026 – Apr 2026 |
| SLOVAKIA | 434 | 434 | 413 | 94.7% | 382 | 135 | 17 | 9 | 143 | 50 | 9 | 13 | 0 | 13 | Mar 2026 – Apr 2026 |
| SLOVENIA | 200 | 200 | 190 | 85.8% | 156 | 52 | 21 | 6 | 57 | 5 | 7 | 9 | 1 | 9 | Mar 2026 – Apr 2026 |
| SPAIN | 6,069 | 6,069 | 5,475 | 58.8% | 3,193 | 2,056 | 1,807 | 371 | 1,796 | 488 | 29 | 324 | 51 | 311 | Mar 2026 – Apr 2026 |
| SWEDEN | 1,558 | 1,558 | 1,487 | 92.5% | 1,362 | 477 | 92 | 24 | 443 | 337 | 14 | 35 | 11 | 25 | Mar 2026 – Apr 2026 |
| SWITZERLAND | 2,117 | 2,117 | 2,082 | 77.9% | 1,565 | 557 | 239 | 215 | 256 | 525 | 56 | 128 | 56 | 114 | Mar 2026 – Apr 2026 |
| UNITED_KINGDOM_UK | 19,502 | 19,502 | 18,743 | 61.4% | 11,462 | 6,627 | 4,152 | 990 | 6,520 | 2,484 | 37 | 701 | 118 | 668 | Mar 2026 – Apr 2026 |
| Total | 82,714 | 82,714 | 77,380 | 69.3% | 52,161 | 27,623 | 14,596 | 3,309 | 28,211 | 9,574 | 1,496 | 4,285 | 627 | 4,286 | — |
Hover or focus any non-zero country-table count to preview matching pages. Activate the number to keep the preview open. Full machine-readable data is available as the
social-media-data.jsonartifact in the latest workflow run.
Overview
The social media scanner fetches each government page and inspects the HTML for links to known social platforms. Results are stored in the metadata database and published to this site via the Scan Progress Report.
Scans run automatically every 3 hours via GitHub Actions so that the full set of ~80,000 URLs across 31 countries can be covered gradually without overloading government servers.
Platforms Tracked
Legacy Social Media (older, centralised platforms)
| Platform | Domains detected |
|---|---|
twitter.com |
|
| X | x.com |
facebook.com, fb.com |
|
linkedin.com |
Modern / Open Social Media (decentralised or open platforms)
| Platform | Domains detected |
|---|---|
| Bluesky | bsky.app, bsky.social |
| Mastodon / Fediverse | 40+ known instances + /@username pattern detection |
Tier Classification
Each scanned page is assigned one of five tiers:
| Tier | Meaning |
|---|---|
unreachable |
Page could not be fetched (network error, timeout, 4xx/5xx) |
no_social |
Page is reachable but contains no recognised social media links |
twitter_only |
Page links only to legacy platforms (Twitter, X, Facebook, or LinkedIn) |
modern_only |
Page links only to Bluesky or Mastodon (modern / open platforms) |
mixed |
Page links to at least one legacy platform and at least one modern platform |
Viewing Results
Scan Progress Report
The Scan Progress Report is regenerated after every scan and shows per-country breakdowns including:
- Total URLs scanned and reachable count
- Tier distribution (twitter-only / modern / mixed / no-social / unreachable)
- Per-platform link counts (Twitter, X, Bluesky, Mastodon)
- Date range showing when each country was last scanned
GitHub Actions Artifacts
Each workflow run also uploads a scan artifact containing:
data/metadata.db— the full SQLite results databasesocial-scan-output.txt— the raw scan logdata/toon-seeds/countries/**_social.toon— annotated TOON files
To download artifacts:
- Go to GitHub Actions → Scan Social Media Links
- Click on the relevant workflow run
- Scroll to the Artifacts section at the bottom of the run summary page
- Download
social-scan-<run_number>to inspect the database or TOON files
Running a Scan Manually
Via GitHub Actions (recommended)
- Go to Actions → Scan Social Media Links
- Click Run workflow
- Optionally enter a country code (e.g.
ICELAND) or leave blank to scan all - Optionally adjust the rate limit (default: 1.0 req/sec)
Via the command line
# Scan a single country
python3 -m src.cli.scan_social_media --country ICELAND --rate-limit 1.0
# Scan all countries (with a 110-minute runtime cap)
python3 -m src.cli.scan_social_media --all --max-runtime 110 --rate-limit 1.0
Output Format
Annotated TOON file (*_social.toon)
Each page entry gains a social_media field:
{
"url": "https://example.gov/",
"is_root_page": true,
"social_media": {
"is_reachable": true,
"social_tier": "mixed",
"twitter_links": ["https://twitter.com/example_gov"],
"x_links": [],
"facebook_links": [],
"linkedin_links": [],
"bluesky_links": ["https://bsky.app/profile/example.bsky.social"],
"mastodon_links": []
}
}
Database table (url_social_media_results)
| Column | Type | Description |
|---|---|---|
url |
TEXT | Page URL |
country_code |
TEXT | Country identifier (e.g. ICELAND) |
scan_id |
TEXT | Unique scan run identifier |
is_reachable |
INTEGER | 1 = reachable, 0 = not reachable |
twitter_links |
TEXT | JSON list of twitter.com hrefs found |
x_links |
TEXT | JSON list of x.com hrefs found |
facebook_links |
TEXT | JSON list of facebook.com / fb.com hrefs found |
linkedin_links |
TEXT | JSON list of linkedin.com hrefs found |
bluesky_links |
TEXT | JSON list of Bluesky hrefs found |
mastodon_links |
TEXT | JSON list of Mastodon hrefs found |
social_tier |
TEXT | Tier classification (see above) |
scanned_at |
TEXT | ISO-8601 timestamp of scan |
Countries Covered
Scans cover all 27 EU member states plus 4 allied nations:
| Region | Countries |
|---|---|
| EU member states | Austria, Belgium, Bulgaria, Croatia, Czechia, Denmark, Estonia, Finland, France, Germany, Greece, Hungary, Ireland, Italy, Latvia, Lithuania, Luxembourg, Malta, Netherlands, Poland, Portugal, Republic of Cyprus, Romania, Slovakia, Slovenia, Spain, Sweden |
| Allied nations | Iceland, Norway, Switzerland, United Kingdom |
See also the Government Domains page for a full listing of all domains tracked per country.
Architecture
scan-social-media.yml (GitHub Actions — every 3 hours)
↓
scan_social_media.py (CLI)
↓
SocialMediaScannerJob.scan_country()
↓
SocialMediaScanner.scan_urls_batch()
↓
For each URL:
httpx.get() → HTML content
BeautifulSoup → extract <a href="..."> links
Match against platform patterns
↓
Classify into social_tier
↓
Save to url_social_media_results table
↓
Write *_social.toon output file