You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
An interactive map showing where Swiss municipalities host their email — whether with US hyperscalers (Microsoft, Google, AWS) or Swiss providers or other solutions.
5
+
An interactive map showing where Indian municipalities host their email — whether with US hyperscalers (Microsoft 365, Google Workspace, AWS) or India-based solutions (NIC, Indian ISPs, independent hosting).
6
6
7
-
**[View the live map](https://mxmap.ch)**
7
+
**[View the live map](https://mxmap.in)**
8
8
9
-
[](https://mxmap.ch)
9
+
[](https://mxmap.in)
10
+
11
+
> This is an India-specific fork of [davidhuser/mxmap](https://github.com/davidhuser/mxmap), adapted to cover Indian states, union territories, districts, and municipal corporations using the Local Government Directory (LGD).
10
12
11
13
## How it works
12
14
13
15
The data pipeline has two stages:
14
16
15
-
1.**Resolve domains** — Fetches all ~2100 Swiss municipalities from Wikidata and the BFS (Swiss Statistics) API, applies manual overrides, scrapes municipal websites for email addresses, guesses domains from municipality names, and verifies candidates with MX lookups. Scores source agreement to pick the best domain. Outputs `municipality_domains.json`.
17
+
1.**Resolve domains** — Loads Indian municipalities from a curated `indian_municipalities.csv` (sourced from the Local Government Directory) and Wikidata SPARQL, applies manual overrides, scrapes municipal websites for email addresses, guesses `.gov.in` / `.nic.in`domains from municipality names and state abbreviations (ISO 3166-2:IN), and verifies candidates with MX lookups. Scores source agreement to pick the best domain. Outputs `municipality_domains.json`.
16
18
17
-
2.**Classify providers** — For each resolved domain, looks up all MX hosts, pattern-matches them, then runs 10 concurrent probes (SPF, DKIM, DMARC, Autodiscover, CNAME chain, SMTP banner, Tenant, ASN, TXT verification, SPF IP). Aggregates weighted evidence, computes confidence scores (0–100). Outputs `data.json` (full) and `data.min.json` (minified for the frontend).
19
+
2.**Classify providers** — For each resolved domain, looks up all MX hosts, pattern-matches them, then runs 10 concurrent probes (SPF, DKIM, DMARC, Autodiscover, CNAME chain, SMTP banner, Tenant, ASN, TXT verification, SPF IP). Aggregates weighted evidence, computes confidence scores (0–100). Classifies each domain into one of: `microsoft`, `google`, `aws`, `nic`, `indian-isp`, or `independent`. Outputs `data.json` (full) and `data.min.json` (minified for the frontend).
|`us-cloud`| Microsoft 365, Google Workspace, AWS |
55
+
|`india-based`| NIC (National Informatics Centre), Indian ISPs, Independent/self-hosted |
56
+
57
+
## Municipality data
58
+
59
+
Municipalities are loaded from [`indian_municipalities.csv`](indian_municipalities.csv), which covers:
60
+
61
+
-**28 States** and **8 Union Territories**
62
+
-**Districts** across all states
63
+
-**Municipal Corporations (MC)** — major urban local bodies
64
+
65
+
Each entry carries an LGD code (Local Government Directory code), name, state, and entity type. The pipeline uses Indian state abbreviations (ISO 3166-2:IN) — e.g. `mh` for Maharashtra, `dl` for Delhi — to generate plausible `.gov.in` and `.nic.in` domain candidates.
66
+
48
67
## Classification system
49
68
50
-
see[`classifier.py`](src/mail_sovereignty/classifier.py) for the full implementation details, but in summary,
69
+
See[`classifier.py`](src/mail_sovereignty/classifier.py) for the full implementation details, but in summary,
51
70
we use a weighted evidence system where each probe contributes signals of varying strength towards different provider classifications.
52
71
53
-
54
72
## Quick start
55
73
56
74
```bash
@@ -79,31 +97,29 @@ uv run ruff check src tests
79
97
uv run ruff format src tests
80
98
```
81
99
82
-
83
100
## Related work
84
101
102
+
*[mxmap.ch](https://mxmap.ch) — the original Swiss version by David Huser
85
103
*[hpr4379 :: Mapping Municipalities' Digital Dependencies](https://hackerpublicradio.org/eps/hpr4379/index.html)
86
-
* If you know of other similar projects, please open an issue or submit a PR to add them here!
87
104
88
-
## Forks
105
+
## Other country forks
89
106
90
-
* DE
107
+
* CH (original): https://mxmap.ch
108
+
* DE:
91
109
*https://b42labs.github.io/mxmap/
92
110
*https://mx-map.de/
93
-
* NL https://mxmap.nl/
94
-
* NO https://kommune-epost-norge.netlify.app/
95
-
* BE https://mxmap.be/
96
-
* EU https://livenson.github.io/mxmap/
111
+
* NL:https://mxmap.nl/
112
+
* NO:https://kommune-epost-norge.netlify.app/
113
+
* BE:https://mxmap.be/
114
+
* EU:https://livenson.github.io/mxmap/
97
115
* LV: https://securit.lv/mxmap
98
-
*[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))
99
116
* PT: https://mxmap.pt/
100
117
* FR: https://mxmairies.fr/
101
-
* See also the forks of this repository
102
-
118
+
*[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))
103
119
104
120
## Contributing
105
121
106
-
If you spot a misclassification, please open an issue with the BFS number and the correct provider.
122
+
If you spot a misclassification, please open an issue with the LGD code and the correct provider.
107
123
For municipalities where automated detection fails, corrections can be added to [`overrides.json`](overrides.json).
0 commit comments