From fa3c32d057296ac43f71886ef0b8cf883a108c9f Mon Sep 17 00:00:00 2001 From: David Huser <4357648+davidhuser@users.noreply.github.com> Date: Wed, 25 Mar 2026 12:42:37 +0100 Subject: [PATCH 1/7] ui fixes --- css/map.css | 8 ++++---- index.html | 21 ++++++++------------- js/map-shared.js | 2 +- tenant.html | 12 +++++++----- 4 files changed, 20 insertions(+), 23 deletions(-) diff --git a/css/map.css b/css/map.css index 2acb41e9..58d88b76 100644 --- a/css/map.css +++ b/css/map.css @@ -24,7 +24,7 @@ body { display: flex; flex-direction: column; height: 100dvh; overflow: hidden; .info-card p { font-size: 13px; color: #444; line-height: 1.5; margin: 0; } .info-card a { color: #2563eb; text-decoration: none; } .info-card a:hover { text-decoration: underline; } -#generated { font-size: 11px; color: #999; margin-top: 4px; } +#generated { font-size: 12px; color: #999; margin-top: 4px; } .info-title { display: none; font-size: 16px; font-weight: 600; color: #1a1a2e; margin-bottom: 12px; } .legend-toggle { @@ -42,8 +42,8 @@ body { display: flex; flex-direction: column; height: 100dvh; overflow: hidden; .legend-group { margin-top: 8px; } .legend-group:first-child { margin-top: 4px; } .legend-group-label { - font-size: 11px; color: #999; text-transform: uppercase; - letter-spacing: 0.3px; font-weight: 600; display: block; margin-bottom: 2px; + font-size: 13px; color: #333; + letter-spacing: 0.3px; font-weight: 600; display: block; margin-bottom: 4px; } #map { flex: 1; position: relative; width: 100%; will-change: transform; } @@ -108,7 +108,7 @@ body { display: flex; flex-direction: column; height: 100dvh; overflow: hidden; .cat-badge.unknown { background: #f3f4f6; color: #6b7280; } .color-toggle { - display: block; margin-top: 8px; padding: 3px 8px; border-radius: 3px; + display: block; margin: 8px auto 0; padding: 3px 8px; border-radius: 3px; font-size: 11px; font-weight: 500; cursor: pointer; background: #f3f4f6; border: 1px solid #d1d5db; color: #374151; } diff --git a/index.html b/index.html index 11404f77..05e33801 100644 --- a/index.html +++ b/index.html @@ -61,17 +61,19 @@
Digital sovereignty: US-based providers are subject to the US CLOUD Act, which allows US authorities to request stored data, regardless of where it is physically hosted. This map makes the current provider landscape visible.
+US-based providers are subject to the US CLOUD Act, allowing US authorities to request stored data regardless of where it is hosted. This map makes the current provider landscape visible.
Each municipality's official domain is checked via 11 signals from DNS records, SMTP banners, ASN lookups, and a public Microsoft API endpoint, then classified by provider type with confidence scoring.
-Disclaimer: DNS records indicate mail routing and authorized senders, not necessarily where data is stored.
+Each municipality's email domain is checked against multiple public DNS and network signals, then classified by provider type.
+Classifications may contain errors. DNS records indicate mail routing, not necessarily where data is stored.
If you notice an error, please submit an issue.
The code and data are on GitHub.
- If you have noticed an error, please submit an issue.
The code and data are on GitHub.
A registered M365 tenant means the municipality's domain is in Microsoft Entra ID, implying (but not confirming) the use of M365 services such as Teams, SharePoint, or OneDrive — but not necessarily email. See the Email Map for email hosting.
+A registered M365 tenant means the municipality's domain is in Microsoft Entra ID, implying (but not confirming) the use of some M365 services.
Each domain is queried against Microsoft's public getuserrealm.srf endpoint (unauthenticated). It returns: Managed (fully cloud-managed identity), Federated (hybrid, on-premises AD synced to cloud), or no result.
Caveat: Tenant presence confirms domain registration, not specific service usage. Some tenants could be inactive.
+Each domain is queried against Microsoft's public getuserrealm.srf endpoint, which returns Managed, Federated, or no result.
Tenant presence confirms domain registration, not specific service usage. Tenants could be inactive. If you notice an error, please submit an issue.
The code and data are on GitHub.
- If you have noticed an error, please submit an issue.
The code and data are on GitHub.
A map of all ~2,100 Swiss municipalities colored red if any email-related DNS record references a US hyperscaler — Microsoft, Google, or AWS. Even a single include: in SPF is enough to trigger exposure.
The Email Map picks one winning provider per municipality. This map casts a wider net: a municipality whose email is hosted by a Swiss provider but whose SPF record still delegates to spf.protection.outlook.com shows green on the Email Map, but red here.
MX, SPF, DKIM, autodiscover, DMARC, CNAME chain, TXT verification, and ASN of MX/SPF IPs. The M365 tenant check (getuserrealm.srf) is not counted here because it's not a DNS record — see the Tenant Map for that signal.
The code and data are on GitHub.
+ If you have noticed an error, please submit an issue.
A map of all ~2,100 Swiss municipalities colored red if any email-related DNS record references a US hyperscaler — Microsoft, Google, or AWS. Even a single include: in SPF is enough to trigger exposure.
A map of all ~2,100 Swiss municipalities shaded by how deeply their email DNS touches a US hyperscaler — Microsoft, Google, or AWS. Orange means the MX record itself points to a hyperscaler (email lives there). Pale amber means the MX is elsewhere but SPF, DKIM, autodiscover, or another record still delegates to one. Green means no hyperscaler trace at all.
The Email Map picks one winning provider per municipality. This map casts a wider net: a municipality whose email is hosted by a Swiss provider but whose SPF record still delegates to spf.protection.outlook.com shows green on the Email Map, but red here.
The Email Map picks one winning provider per municipality. This map casts a wider net and grades exposure: a municipality whose email is hosted by a Swiss provider but whose SPF record still delegates to spf.protection.outlook.com shows as Swiss on the Email Map, but pale amber here.
A map of all ~2,100 Swiss municipalities shaded by how deeply their email DNS touches a US hyperscaler — Microsoft, Google, or AWS. Orange means the MX record itself points to a hyperscaler (email lives there). Pale amber means the MX is elsewhere but SPF, DKIM, autodiscover, or another record still delegates to one. Green means no hyperscaler trace at all.
+All ~2,100 Swiss municipalities, shaded by how much their email DNS touches a US hyperscaler (Microsoft, Google, AWS). See the legend for what each color means.
The Email Map picks one winning provider per municipality. This map casts a wider net and grades exposure: a municipality whose email is hosted by a Swiss provider but whose SPF record still delegates to spf.protection.outlook.com shows as Swiss on the Email Map, but pale amber here.
The Providers map names one email provider per municipality. This one is broader, it also catches Swiss-hosted municipalities that still touch Microsoft, Google, or AWS somewhere in their email setup.
MX, SPF, DKIM, autodiscover, DMARC, CNAME chain, TXT verification, and ASN of MX/SPF IPs. The M365 tenant check (getuserrealm.srf) is not counted here because it's not a DNS record — see the Tenant Map for that signal.
DNS records: MX, SPF, DKIM, autodiscover, DMARC, CNAME chain, TXT verification, and ASN of MX/SPF IPs.
+Classifications may contain errors. DNS records indicate mail routing, not necessarily where data is stored.
If you notice an error, please submit an issue.
The code and data are on GitHub.
- If you have noticed an error, please submit an issue.
The code and data are on GitHub.
A map of all ~2,100 Swiss municipalities showing whether their official domain is registered as a Microsoft 365 tenant — detected via a public Microsoft endpoint.
-A registered M365 tenant means the municipality's domain is in Microsoft Entra ID, implying (but not confirming) the use of some M365 services.
-Each domain is queried against Microsoft's public getuserrealm.srf endpoint, which returns Managed, Federated, or no result.
Tenant presence confirms domain registration, not specific service usage. Tenants could be inactive. If you notice an error, please submit an issue.
-The code and data are on GitHub.
- -Zur Darstellung der Karte werden externe Ressourcen von Drittanbietern geladen. Dabei wird Ihre IP-Adresse an die jeweiligen Server übermittelt:
unpkg.com — Leaflet-Kartenbibliothek und Schweizer Gemeindegrenzen (TopoJSON)basemaps.cartocdn.com — Kartenkacheln (CARTO)unpkg.com: Leaflet-Kartenbibliothek und Schweizer Gemeindegrenzen (TopoJSON)basemaps.cartocdn.com: Kartenkacheln (CARTO)All ~2,100 Swiss municipalities, shaded by how much their email DNS touches a US hyperscaler (Microsoft, Google, AWS). See the legend for what each color means.
-The Providers map names one email provider per municipality. This one is broader, it also catches Swiss-hosted municipalities that still touch Microsoft, Google, or AWS somewhere in their email setup.
-DNS records: MX, SPF, DKIM, autodiscover, DMARC, CNAME chain, TXT verification, and ASN of MX/SPF IPs.
-Classifications may contain errors. DNS records indicate mail routing, not necessarily where data is stored.
If you notice an error, please submit an issue.
The code and data are on GitHub.
- -A map of all ~2,100 Swiss municipalities showing which provider handles their official email — grouped by jurisdiction — based on public DNS records and other public network signals.
+A map of all ~2,100 Swiss municipalities, grouped by jurisdiction. Each is colored by the provider handling its official email, based on public DNS records and other public network signals.