Last updated 24 August 2026 · Applies to districtry.com and every app under it.
The short version. There is no account to make, no server of ours to store anything in, and nothing here is sold or used for advertising.
- Every app here is a static website — a set of files your browser downloads and then runs on its own. We operate no database and no back end.
- The point you pick is not saved anywhere by us. It lives in your browser and in the address bar, so a refresh or a shared link can restore it.
- Where a counter runs, the only location it ever receives is rounded to about a kilometre — deliberately too coarse to identify an address.
- Looking things up means asking other people's servers — map tiles, address search, and the government GIS services each layer reads. Those servers see your IP address, as they would for any website.
Which app you are on
districtry is one project serving several apps from one address, and they do not all behave identically — Illinois and New York run Google Analytics; every one of them carries the same counter. Rather than flatten that into a vague sentence, here is each app's own row. Every cell is read out of the page that app actually serves, by the script that builds this one.
| App | Google Analytics | GoatCounter | Stored in your browser | Address search | Sends your point to a server |
|---|---|---|---|---|---|
| The front door/ | None. | https://districtry.goatcounter.com/count |
districtry-themeread only |
Photon / Komoot | None. |
| Illinois/il/ | Google Analytics G-YPJ570LWJBlive host only (districtry.com), never in an embed |
https://districtry.goatcounter.com/count |
chi-school-type-filtersession districtry-boundary-streetskept districtry-themekept |
Photon / Komoot, Nominatim / OpenStreetMap | 5 layers |
| New York/ny/ | Google Analytics G-YPJ570LWJBlive host only (districtry.com), never in an embed |
https://districtry.goatcounter.com/count |
nyc-school-type-filtersession districtry-boundary-streetskept districtry-themekept |
Photon / Komoot, GeoSearch / NYC Planning | None. |
| San Francisco/ca/ | None. | https://districtry.goatcounter.com/count |
sf-school-type-filtersession districtry-boundary-streetskept districtry-themekept |
Photon / Komoot, Nominatim / OpenStreetMap | None. |
| Wisconsin/wi/ | None. | https://districtry.goatcounter.com/count |
districtry-boundary-streetskept districtry-themekept |
Photon / Komoot, Nominatim / OpenStreetMap | 1 layer |
| Iowa/ia/ | None. | https://districtry.goatcounter.com/count |
districtry-boundary-streetskept districtry-themekept |
Photon / Komoot, Nominatim / OpenStreetMap | None. |
| Michigan/mi/ | None. | https://districtry.goatcounter.com/count |
districtry-boundary-streetskept districtry-themekept |
Photon / Komoot, Nominatim / OpenStreetMap | None. |
| Minnesota/mn/ | None. | https://districtry.goatcounter.com/count |
districtry-boundary-streetskept districtry-themekept |
Photon / Komoot, Nominatim / OpenStreetMap | 6 layers |
| Kentucky/ky/ | None. | https://districtry.goatcounter.com/count |
districtry-boundary-streetskept districtry-themekept |
Photon / Komoot, Nominatim / OpenStreetMap | 4 layers |
| Indiana/in/ | None. | https://districtry.goatcounter.com/count |
districtry-boundary-streetskept districtry-themekept |
Photon / Komoot, Nominatim / OpenStreetMap | 4 layers |
| North Carolina/nc/ | None. | https://districtry.goatcounter.com/count |
districtry-boundary-streetskept districtry-themekept |
Photon / Komoot, Nominatim / OpenStreetMap | 4 layers |
| Oklahoma/ok/ | None. | https://districtry.goatcounter.com/count |
districtry-boundary-streetskept districtry-themekept |
Photon / Komoot, Nominatim / OpenStreetMap | 4 layers |
What stays on your device
All of it is yours to clear at any time through your browser's "clear site data".
Boundary street names. If you switch the map's “Boundary streets” button off or back on, the choice is kept in localStorage under districtry-boundary-streets on Illinois, New York, San Francisco, Wisconsin, Iowa, Michigan, Minnesota, Kentucky, Indiana, North Carolina and Oklahoma. It is one word, and it never leaves your browser.
Light or dark. If you use the theme toggle, the choice is kept in localStorage under districtry-theme on Illinois, New York, San Francisco, Wisconsin, Iowa, Michigan, Minnesota, Kentucky, Indiana, North Carolina and Oklahoma, so the site does not flash white on your next visit. It is one word, and it never leaves your browser. The front door reads it and never writes it, which is how the choice follows you off the map.
One display preference, per app. The school layer's type filter is remembered in sessionStorage under chi-school-type-filter on Illinois. It is a handful of true/false switches, it is erased when you close the tab, and it never leaves your browser.
One display preference, per app. The school layer's type filter is remembered in sessionStorage under nyc-school-type-filter on New York. It is a handful of true/false switches, it is erased when you close the tab, and it never leaves your browser.
One display preference, per app. The school layer's type filter is remembered in sessionStorage under sf-school-type-filter on San Francisco. It is a handful of true/false switches, it is erased when you close the tab, and it never leaves your browser.
A cache of each app's own files. A service worker stores the app shell when you first visit, and each layer's boundary file and officeholder roster the first time you switch that layer on (for a layer drawn from vector tiles, the pieces of its map you have looked at), so the map loads fast and those layers work offline. It holds published public data — district shapes and rosters — not anything about you.
No app here sets a cookie of its own. Google Analytics, where it runs, sets its own.
What leaves your browser, and who receives it
Every row here is something your browser requests directly. Each of those servers necessarily sees your IP address and the request itself; none of them receives a name, an email, or an account, because these apps have none to give.
| Who | What they receive | When | Which apps |
|---|---|---|---|
| GitHub Pageshosting | The ordinary web-server request for each file — your IP address, browser, and the page you asked for. GitHub, not this project, keeps those logs. In Illinois, New York, San Francisco, Wisconsin, Iowa and Michigan, a layer drawn from vector tiles requests its map a piece at a time, so those requests also describe the area you are looking at and, to answer its card, the square of about 7 km around the point you select. | Every visit. | The front door, Illinois, New York, San Francisco, Wisconsin, Iowa, Michigan, Minnesota, Kentucky, Indiana, North Carolina, Oklahoma. |
| CARTObasemap tiles | The map tiles you request — which, taken together, describe the area you are looking at and how far you zoomed in. | Whenever the map draws or moves. | The front door, Illinois, New York, San Francisco, Wisconsin, Iowa, Michigan, Minnesota, Kentucky, Indiana, North Carolina, Oklahoma. |
| Cloudflare (cdnjs)mapping library | A request for one JavaScript file, Leaflet 1.9.4, pinned by hash. | Every visit to a map. | The front door, Illinois, New York, San Francisco, Wisconsin, Iowa, Michigan, Minnesota, Kentucky, Indiana, North Carolina, Oklahoma. |
| GeoSearch / NYC Planningaddress search | The text you type into the search box, sent as you type so suggestions can appear. | Only while you are searching for an address, or when a card places an office pin. | New York. |
| Nominatim / OpenStreetMapaddress search, office pins | The address you searched, when the bounded fallback runs. It also receives public office addresses from the datasets — a clerk's office, a school — to place their map pins; that is data about buildings, not about you. | Only while you are searching for an address, or when a card places an office pin. | Illinois, San Francisco, Wisconsin, Iowa, Michigan, Minnesota, Kentucky, Indiana, North Carolina, Oklahoma. |
| Photon / Komootaddress search | The text you type into the search box — sent as you type on the apps' type-ahead boxes, and only when you press the button on the front door. Illinois also offers a batch check for people working from a list — a petition sheet, a canvass list. That sends every address in the list you paste, one lookup a second until it is done. Those are usually other people's addresses rather than your own, and the list itself is never uploaded anywhere: it stays in your browser, and only the address text goes to this geocoder. | Only while you are searching for an address, or when a card places an office pin. A batch check sends its whole list, one address a second. | The front door, Illinois, New York, San Francisco, Wisconsin, Iowa, Michigan, Minnesota, Kentucky, Indiana, North Carolina, Oklahoma. |
| Public GIS servicesthe district data itself | Requests for boundary and roster data from government servers — the U.S. Census TIGERweb, ArcGIS services run by cities, counties and states, municipal open-data portals, and the USGS. Mostly these download a whole layer and the "which district contains this point" test then runs inside your browser. Where an app is marked in the table above as sending a point, that layer instead asks the server about your exact selected point so one district can answer immediately while the full layer downloads. Opening a row on the comparison stats screen runs that same lookup for a point inside the district the row names, which is a point you did not click, and printing that screen opens every row. Layers whose data ships with the app contact nobody at all. | When you turn a layer on and select a point, or open or print comparison stats. | Every app with a map. |
| GoatCounteranalytics | A page count and a few named events. See Analytics, precisely. | Every visit to any page. The named events come from an app’s map only. | Every page on this site — the apps, the front door, and every page they link. Two carry none: 404.html (served for a URL that does not exist) and coverage-map.html (the front door’s iframe body, counted by the page that embeds it). |
| Google Analyticsanalytics | A standard GA4 page view, including the page URL. Loaded only on the live site and never inside an embed. | Every visit to the live site. | Illinois, New York. |
Each linked policy is that company's own; this page cannot speak for them. The full, machine-checked list of every dataset an app reads is on that app's sources page.
Your location
No app here asks for your location on its own. It is offered once, behind the "Use my current location" button, and your browser asks your permission before anything happens. Declining costs you nothing else on the page.
If you allow it, the coordinates your browser reports are used in the page to drop a point and answer the layer cards. The one thing that goes anywhere is a rounded pair sent to that app's GoatCounter — 2 decimal places, roughly a kilometre — which is coarse enough that it cannot pin an address and fine enough to show which part of a region the feature gets used from.
Clicking the map is the same story with no permission needed: the point is yours, and only the rounded version is counted.
Analytics, precisely
Counters run for one reason: to know whether anyone is using this and which parts.
GoatCounter
GoatCounter is cookieless and does not build a profile across sites. Every page on this site reports to a single GoatCounter site (districtry) — the apps, the front door, and the text pages that answer one question or list one county’s board; the page path is what distinguishes them. Besides the page view, each app sends named events for: address-search, boundary-streets/, compare-stats-link/, compare-stats-print/, compare-stats-reopen/, compare-stats-row/, compare-stats/, compare-stop, compare/, copy-coordinates, district-search/ (only Illinois, the app that searches districts by name), embed-iframe, feedback-link, feedback-open/button, feedback-open/link, feedback-send/email, feedback-send/github, gaps-open, gaps-suggest/, gaps-why/, geolocate, geolocate-success, layer/, locate-fail/, metro-portal-go/, more-item/, more-open, select, share-native, share-open, share-permalink, share-qr. Exactly two of those — geolocate-success and select — carry coordinates, rounded to 2 decimal places. A page that is not an app — a county list, a question page, this one — sends the page view and nothing else. Nothing you type is ever sent to it.
Google Analytics
GA4 (G-YPJ570LWJB) runs on Illinois and New York — and only there: never on a local copy, never inside an iframe embed, and not at all on The front door, San Francisco, Wisconsin, Iowa, Michigan, Minnesota, Kentucky, Indiana, North Carolina and Oklahoma. It sets its own cookies and records the standard GA4 page view, which includes the page URL — so if you arrived on a shared permalink, the point encoded in that link is part of what Google sees. Google's handling is governed by its own privacy policy.
Blocking either one is fine. The analytics calls are written so that a blocked or failed counter is a no-op — nothing about the map changes.
Links you share, and reports you send
Permalinks carry your point. Selecting a place writes it into the
address bar as #p=41.8825,-87.6285, at full precision, along with the layers you have on. That
is what makes a link shareable — and it means anyone you send the link to, and anything
that logs it, gets that location. Delete the part of the URL after # to share the
map without it.
Bug reports are yours to send. "Report a bug or leave a comment" prepares a draft containing what you wrote, the current page URL — which may include your point — and your browser's user-agent string. It is only ever a draft: nothing is transmitted until you submit the GitHub issue or send the email yourself, and you can edit it first. The same form sits at /feedback.html for every page that is not a map, and it fills in the address of the page you came from.
A link can open the form. A link ending in #feedback opens it, and #feedback= followed by text fills that text in, so someone can send you a form that already says what to check. That text, and a copied link to the form with what you typed, travel after the # in the address, which your browser never sends to a server or to analytics.
What there isn't
- No accounts, logins, or passwords.
- No database or back end operated by this project — there is nowhere for us to keep anything.
- No advertising, ad networks, retargeting pixels, or social trackers.
- No sale or sharing of data. There is no data of yours to sell.
- No cross-site tracking or profile built by this project.
- No collection of names, email addresses, or payment details — no app here has a field that asks for one.
- No unrounded location in any analytics event this project sends.
Every app here is a single open-source page. If a claim on this page and the code ever disagree, the code is the truth and this page is the bug: read it, or file the discrepancy.
How AI coding agents are used in building districtry, and where AI is never used, is on its own page: How districtry uses AI.
Children
districtry is a general-audience civic reference. It has no sign-up, collects no personal details from anyone, and is not directed at children.
Changes, and how to ask
This page is versioned with the apps it describes, and it is generated from them — the build reads each app's own shipped page for the facts in the tables above, and refuses to publish a claim that has stopped being true. When the data flows change, this page changes in the same commit: the file's history is the changelog.
Questions, corrections, or a request about your data: adam@overberg.co. Because the project stores nothing about you, there is generally nothing to look up, correct, or delete on our side — but if you think that is wrong in your case, say so and it will be checked properly rather than waved away.
Not legal advice, and not a contract. This page describes how the software behaves, verified against the source. It is a plain-language description, not a warranty, and it does not change the disclaimers on the maps themselves.