Last updated 13 October 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 lookups | Sends your point to a server |
|---|---|---|---|---|---|
| The front door/ | None. | https://districtry.goatcounter.com/count |
districtry-play-appsession districtry-themeread only |
Photon / Komoot (address search) | 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-app-launchsession districtry-play-appsession districtry-share-insession districtry-boundary-streetskept districtry-install-invitekept districtry-last-appkept districtry-themekept |
Photon / Komoot (address search), Nominatim / OpenStreetMap (office pins) | 5 layers |
| New York/ny/ | Google Analytics G-YPJ570LWJBlive host only (districtry.com), never in an embed |
https://districtry.goatcounter.com/count |
districtry-app-launchsession districtry-play-appsession districtry-share-insession nyc-school-type-filtersession districtry-boundary-streetskept districtry-install-invitekept districtry-last-appkept districtry-themekept |
Photon / Komoot (address search), GeoSearch / NYC Planning (address search, office pins) | None. |
| San Francisco/ca/ | None. | https://districtry.goatcounter.com/count |
districtry-app-launchsession districtry-play-appsession districtry-share-insession sf-school-type-filtersession districtry-boundary-streetskept districtry-install-invitekept districtry-last-appkept districtry-themekept |
Photon / Komoot (address search), Nominatim / OpenStreetMap (office pins) | None. |
| Wisconsin/wi/ | None. | https://districtry.goatcounter.com/count |
districtry-app-launchsession districtry-play-appsession districtry-share-insession districtry-boundary-streetskept districtry-install-invitekept districtry-last-appkept districtry-themekept |
Photon / Komoot (address search), Nominatim / OpenStreetMap (office pins) | 1 layer |
| Iowa/ia/ | None. | https://districtry.goatcounter.com/count |
districtry-app-launchsession districtry-play-appsession districtry-share-insession districtry-boundary-streetskept districtry-install-invitekept districtry-last-appkept districtry-themekept |
Photon / Komoot (address search), Nominatim / OpenStreetMap (office pins) | None. |
| Michigan/mi/ | None. | https://districtry.goatcounter.com/count |
districtry-app-launchsession districtry-play-appsession districtry-share-insession districtry-boundary-streetskept districtry-install-invitekept districtry-last-appkept districtry-themekept |
Photon / Komoot (address search), Nominatim / OpenStreetMap (office pins) | None. |
| Minnesota/mn/ | None. | https://districtry.goatcounter.com/count |
districtry-app-launchsession districtry-play-appsession districtry-share-insession districtry-boundary-streetskept districtry-install-invitekept districtry-last-appkept districtry-themekept |
Photon / Komoot (address search), Nominatim / OpenStreetMap (office pins) | None. |
| Kentucky/ky/ | None. | https://districtry.goatcounter.com/count |
districtry-app-launchsession districtry-play-appsession districtry-share-insession districtry-boundary-streetskept districtry-install-invitekept districtry-last-appkept districtry-themekept |
Photon / Komoot (address search), Nominatim / OpenStreetMap (office pins) | None. |
| Indiana/in/ | None. | https://districtry.goatcounter.com/count |
districtry-app-launchsession districtry-play-appsession districtry-share-insession districtry-boundary-streetskept districtry-install-invitekept districtry-last-appkept districtry-themekept |
Photon / Komoot (address search), Nominatim / OpenStreetMap (office pins) | None. |
| North Carolina/nc/ | None. | https://districtry.goatcounter.com/count |
districtry-app-launchsession districtry-play-appsession districtry-share-insession districtry-boundary-streetskept districtry-install-invitekept districtry-last-appkept districtry-themekept |
Photon / Komoot (address search), Nominatim / OpenStreetMap (office pins) | None. |
| Oklahoma/ok/ | None. | https://districtry.goatcounter.com/count |
districtry-app-launchsession districtry-play-appsession districtry-share-insession districtry-boundary-streetskept districtry-install-invitekept districtry-last-appkept districtry-themekept |
Photon / Komoot (address search), Nominatim / OpenStreetMap (office pins) | None. |
| South Carolina/sc/ | None. | https://districtry.goatcounter.com/count |
districtry-app-launchsession districtry-play-appsession districtry-share-insession districtry-boundary-streetskept districtry-install-invitekept districtry-last-appkept districtry-themekept |
Photon / Komoot (address search), Nominatim / OpenStreetMap (office pins) | None. |
| Tennessee/tn/ | None. | https://districtry.goatcounter.com/count |
districtry-app-launchsession districtry-play-appsession districtry-share-insession districtry-boundary-streetskept districtry-install-invitekept districtry-last-appkept districtry-themekept |
Photon / Komoot (address search), Nominatim / OpenStreetMap (office pins) | None. |
| Arkansas/ar/ | None. | https://districtry.goatcounter.com/count |
districtry-app-launchsession districtry-play-appsession districtry-share-insession districtry-boundary-streetskept districtry-install-invitekept districtry-last-appkept districtry-themekept |
Photon / Komoot (address search), Nominatim / OpenStreetMap (office pins) | None. |
| Mississippi/ms/ | None. | https://districtry.goatcounter.com/count |
districtry-app-launchsession districtry-play-appsession districtry-share-insession districtry-boundary-streetskept districtry-install-invitekept districtry-last-appkept districtry-themekept |
Photon / Komoot (address search), Nominatim / OpenStreetMap (office pins) | None. |
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, Oklahoma, South Carolina, Tennessee, Arkansas and Mississippi. It is one word, and it never leaves your browser.
The install invitation. On a phone, the map offers once to add districtry to your home screen. It records that it has asked in localStorage under districtry-install-invite, so it does not ask again. This is on Illinois, New York, San Francisco, Wisconsin, Iowa, Michigan, Minnesota, Kentucky, Indiana, North Carolina, Oklahoma, South Carolina, Tennessee, Arkansas and Mississippi. It is one word, and it never leaves your browser.
Which state you used last. Each app keeps its own two-letter tag (il, ny and so on) in localStorage under districtry-last-app on Illinois, New York, San Francisco, Wisconsin, Iowa, Michigan, Minnesota, Kentucky, Indiana, North Carolina, Oklahoma, South Carolina, Tennessee, Arkansas and Mississippi. The installed app's launcher at /app/ reads it to open that state's map. It is two letters, the next state you open replaces it, 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, Oklahoma, South Carolina, Tennessee, Arkansas and Mississippi, 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.
A launch already counted. When you open the installed app, the launch is counted once. A mark in sessionStorage under districtry-app-launch records that, so moving between states in the same window does not count it again. This is on Illinois, New York, San Francisco, Wisconsin, Iowa, Michigan, Minnesota, Kentucky, Indiana, North Carolina, Oklahoma, South Carolina, Tennessee, Arkansas and Mississippi. It is erased when you close the app, and it never leaves your browser.
Opened in the Google Play app. If you open districtry from its Android app on Google Play, a mark in sessionStorage under districtry-play-app records that, so the pages in that window leave out the links asking for sponsorship: Google Play does not allow an app from its store to send readers to an outside payment page. The website keeps those links. This is on the front door, Illinois, New York, San Francisco, Wisconsin, Iowa, Michigan, Minnesota, Kentucky, Indiana, North Carolina, Oklahoma, South Carolina, Tennessee, Arkansas and Mississippi, and on the installed app's launcher at /app/. It is erased when you close the app, and it never leaves your browser.
A place shared into the app. When you share a place into the installed app, its launcher at /app/ leaves a mark in sessionStorage under districtry-share-in, so the map it opens can count that a share arrived. The map removes the mark as soon as it has counted it. This is on Illinois, New York, San Francisco, Wisconsin, Iowa, Michigan, Minnesota, Kentucky, Indiana, North Carolina, Oklahoma, South Carolina, Tennessee, Arkansas and Mississippi. It says nothing about the place, 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.
If you install districtry, its launcher at /app/ keeps one more
cache, holding only the launcher page itself, so the installed app opens with no
connection.
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 every app, 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, South Carolina, Tennessee, Arkansas, Mississippi. |
| 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, South Carolina, Tennessee, Arkansas, Mississippi. |
| 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, South Carolina, Tennessee, Arkansas, Mississippi. |
| Deno Deployshort map-link lookup | Only when you paste a short Google Maps or Apple Maps link (maps.app.goo.gl, maps.apple) into a search box, or share one into the installed app: that link, sent to districtry's own lookup, which runs on Deno's servers, follows it to the full link and sends that back. Deno receives your IP address and the short link. The lookup's own code stores neither; Deno, not this project, keeps whatever request logs its platform keeps. A map link or a coordinate pair that carries its position is read in your browser and goes nowhere; a map link that names a place without one is searched like typed text, by the address search below. In every app, when the map's own search can't find the house at an address you search for, or at one a map link names, the lookup also receives that address and asks the U.S. Census Bureau where the number falls (the next row). | Only when you paste or share a short map link, or, in every app, when the map's search can't find the house at an address you search for. | The front door, Illinois, New York, San Francisco, Wisconsin, Iowa, Michigan, Minnesota, Kentucky, Indiana, North Carolina, Oklahoma, South Carolina, Tennessee, Arkansas, Mississippi. |
| U.S. Census Bureauhouse-number lookup | Only when the map's own address search can't find the house at an address you search for, because it knows the street but not the house number on it, or doesn't know the street in that town at all, and you typed the address and sent the search (with Search or Enter, or by picking its street from the list) or a map link you paste or share carries it: the address, with its state and its street's ZIP code filled in when you left them out, sent through districtry's lookup on Deno Deploy, which asks the Census Bureau's geocoder where that number falls on the street and sends its estimate back. The Census Bureau receives the address and the lookup's IP address, not yours. Nothing is sent this way while you are still typing. | Only when the map's search can't find the house at an address you search for. | Illinois, New York, San Francisco, Wisconsin, Iowa, Michigan, Minnesota, Kentucky, Indiana, North Carolina, Oklahoma, South Carolina, Tennessee, Arkansas, Mississippi. |
| GeoSearch / NYC Planningaddress search, office pins | The text you type into the search box, or the place's name and address from a map link you paste or share, sent as you type so suggestions can appear. It also receives public office addresses from the datasets to place their map pins. | Only while you are searching for an address, or when a card places an office pin. | New York. |
| Nominatim / OpenStreetMapoffice pins | 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. Nothing you type into the search box is sent here. | Only when a card places an office pin. | Illinois, San Francisco, Wisconsin, Iowa, Michigan, Minnesota, Kentucky, Indiana, North Carolina, Oklahoma, South Carolina, Tennessee, Arkansas, Mississippi. |
| Photon / Komootaddress search | The text you type into the search box, or the place's name and address from a map link you paste or share — 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. 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, South Carolina, Tennessee, Arkansas, Mississippi. |
| 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, and one from the front page’s address box. | Every page on this site — the apps, the front door, and every page they link. Three carry none: 404.html (served for a URL that does not exist), app/index.html (the installed app’s launcher, which hands straight on to the state you used last, where the visit is counted) 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, app-install/, app-launch/, 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, install-invite/, layer/, locate-fail/, map-link-read/, map-link/, metro-portal-go/, more-item/, more-open, osm-note, select, share-in/, share-native, share-open, share-permalink, share-qr. Exactly two of those — geolocate-success and select — carry coordinates, rounded to 2 decimal places. When the search box reads a Google Maps or Apple Maps link, map-link-read/ says which app it was in, which of the two the link came from, whether it was a short link, whether it was pasted or arrived in the page’s address (as a place shared into the installed app does), and what the search showed; it never carries the link, the place or its position. The front page sends that one event, as map-link-read/front/, when its address box reads such a link. Any other 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, Oklahoma, South Carolina, Tennessee, Arkansas and Mississippi. 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.
Places you share into the app. Once districtry is installed on an
Android phone it is in the Share menu, so a place open in Google Maps can be shared
straight to it. What you share arrives in the address of a request for the installed
app's launcher at /app/, and the launcher's own copy on your phone answers that
request. The launcher hands it to the map after the #, and the map
reads it as it would a link pasted into its search box: a link that carries its position
is read on your phone, a short link goes to the short-link lookup in the table above, and
a place name or an address goes to the address search. When that search can't find the
house at the address, the address also goes through the lookup to the Census Bureau,
which the table above names too. The launcher keeps that copy from
the first time the installed app opens, or from the moment you install districtry from a
state's map. A share sent before then reaches this site's host, GitHub Pages, in the
address of that request.
What there isn't
- No accounts, logins, or passwords.
- No database operated by this project, and nowhere for us to keep anything. The one service it runs, the map-link lookup in the table above, answers each request and keeps no record of it.
- 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.