Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# MXmap — municipal email infrastructure maps

> [!IMPORTANT]
> **MXmap has a successor.** This project grew into a team research effort covering all municipalities in Germany, Austria and Switzerland: **[secassure2026.mxmap-project.org](https://secassure2026.mxmap-project.org/)** ([source](https://github.com/mxmap/secassure2026)). The Swiss map at [mxmap.ch](https://mxmap.ch) stays online, but its data is frozen as of April 2026 and will not be updated.

[![CI](https://github.com/davidhuser/mxmap/actions/workflows/ci.yml/badge.svg)](https://github.com/davidhuser/mxmap/actions/workflows/ci.yml)

Interactive maps showing where Swiss municipalities host their email and how deeply their DNS is tied to US hyperscalers (Microsoft, Google, AWS) versus Swiss providers and self-hosted solutions.
Expand Down Expand Up @@ -82,6 +85,7 @@ uv run ruff format src tests

## Related work

* [SecAssure2026](https://secassure2026.mxmap-project.org/) — the successor to this project: email provider and email security maps for ~15,300 municipalities across Germany, Austria and Switzerland ([source](https://github.com/mxmap/secassure2026))
* [hpr4379 :: Mapping Municipalities' Digital Dependencies](https://hackerpublicradio.org/eps/hpr4379/index.html)
* If you know of other similar projects, please open an issue or submit a PR to add them here!

Expand All @@ -93,13 +97,16 @@ Country-specific forks, alphabetical by country code:
* **DE** — https://b42labs.github.io/mxmap/ · https://mx-map.de/
* **EU** — https://livenson.github.io/mxmap/
* **FR** — https://mxmairies.fr/
* **IT** — https://mxmap.it/
* **LV** — https://securit.lv/mxmap
* **NL** — https://mxmap.nl/
* **NO** — https://kommune-epost-norge.netlify.app/
* **PT** — https://mxmap.pt/
* **SE** — https://swedish-mail-dependency.netlify.app/
* **UK** — https://mxmap.uk/

New country forks are welcome — consider starting from the [successor's pipeline](https://github.com/mxmap/secassure2026), which adds a DANE/DNSSEC/SPF/DMARC scanning stage.

Related projects:

* [CAmap Nordic & Baltic](https://koldex.github.io/ca-sovereignty-map/) — TLS CA sovereignty for Nordic and Baltic municipalities ([source](https://github.com/koldex/ca-sovereignty-map))
Expand Down
6 changes: 5 additions & 1 deletion css/shared.css
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
padding: 0 12px;
}
.header-disclaimer a { color: inherit; text-decoration: underline; text-underline-offset: 2px; }
.disclaimer-short { display: none; }

#nav { display: flex; align-items: center; gap: 8px; position: relative; margin-left: 6px; }

Expand All @@ -46,5 +48,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-
.nav-menu .header-link:last-child { border-bottom: none; }

@media (max-width: 600px) {
.header-disclaimer { display: none; }
.header-disclaimer { font-size: 11px; padding: 0 6px; }
.disclaimer-long { display: none; }
.disclaimer-short { display: inline; }
}
6 changes: 5 additions & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
<h1 class="brand">MXmap<span class="brand-tag">municipal email infrastructure</span></h1>
<nav id="nav"></nav>
</div>
<span class="header-disclaimer">&#9888; <strong>Beta:</strong> data may be out of date or incorrect. A research project is ongoing to further develop these maps.</span>
<span class="header-disclaimer"><a href="https://secassure2026.mxmap-project.org/" target="_blank" rel="noopener">&#9888; <span class="disclaimer-long"><strong>Data frozen (April&nbsp;2026)</strong> &mdash; successor with live maps for Germany, Austria &amp; Switzerland</span><span class="disclaimer-short"><strong>Frozen</strong> &mdash; new DACH maps</span> &rarr;</a></span>
<div class="header-right">
<button class="toggle-info" id="toggle-info" aria-expanded="true" aria-controls="info-bar">About &#9652;</button>
</div>
Expand Down Expand Up @@ -76,6 +76,10 @@ <h3>Open source &amp; open data</h3>
<p>The code and data are on <a href="https://github.com/davidhuser/mxmap" target="_blank">GitHub</a>.</p>
<p id="generated"></p>
</div>
<div class="info-card">
<h3>Successor project</h3>
<p>MXmap grew into a team research effort, currently in peer review, mapping email providers and email security for ~15,300 municipalities across Germany, Austria and Switzerland. The Swiss data here is frozen as of April 2026. <a href="https://secassure2026.mxmap-project.org/" target="_blank">Visit the new maps</a>.</p>
</div>
</div>
</section>
<main id="map" role="application" aria-label="Interactive map of Swiss municipality email providers">
Expand Down
5 changes: 5 additions & 0 deletions js/nav.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
(function () {
var path = window.location.pathname;
var links = [
{ href: 'https://secassure2026.mxmap-project.org/', label: 'DACH maps ↗' },
{ href: '/impressum.html', label: 'Impressum' },
{ href: '/datenschutz.html', label: 'Datenschutz' },
];
Expand All @@ -14,6 +15,10 @@
a.href = link.href;
a.className = 'header-link';
a.textContent = link.label;
if (link.href.indexOf('http') === 0) {
a.target = '_blank';
a.rel = 'noopener';
}
if (path === link.href) a.classList.add('active');
return a;
}
Expand Down
Loading