Open data
Every layer is downloadable, documented, and reusable. No account, no rate limit, no API key. Each file carries its own provenance inside it, so a download stays attributable after it is detached from this site.
ALPR corridors
The road each plate reader would take to reach the nearest other plate reader, drawn as far as your radius reaches.
982 records · line · ODbL 1.0
Redlining zones (HOLC)
1930s federal mortgage-risk grades that steered lending away from Black and immigrant neighbourhoods.
168 records · polygon · CC BY-NC-SA 4.0
Racial covenants (aggregate)
Deed clauses that barred non-white families from buying or living on a property, counted by block.
2,567 records · polygon · CC0 1.0 Universal
Licensing — read this before redistributing
The code in this project is MIT. Data we compile ourselves — the normalised schema, the geocoding, the cross-layer joins — is CC BY 4.0.
Upstream layers keep their own terms, and we cannot relax them. Repackaging this site's files does not relicense the underlying data:
- ALPR cameras — ODbL 1.0, from OpenStreetMap. Share-alike: derived databases must stay open under the same terms, and attribution to OpenStreetMap contributors is required.
- Redlining — CC BY-NC-SA 4.0, from Mapping Inequality. Non-commercial and share-alike. This one is not CC BY 4.0 and cannot be used commercially.
- Data centres — FracTracker Alliance terms; attribution required, non-commercial.
- 287(g), detention facilities, Census geography — US federal government works, public domain.
In short: the federal layers are free for any use, the camera layer is share-alike, and the redlining and data-centre layers are non-commercial. When combining them, the most restrictive term governs the combination.
Schema
Every layer file is a GeoJSON FeatureCollection with a non-standard
metadata object carrying provenance, and features whose
properties follow one shared shape regardless of layer. Layer-specific fields
live under attributes.
{
"type": "FeatureCollection",
"metadata": {
"layer": "agency_287g",
"featureCount": 10,
"source": "ICE — Participating agencies (287(g))",
"sourceUrl": "https://www.ice.gov/identify-and-arrest/287g",
"license": "Public domain (US federal government work)",
"attribution": "U.S. Immigration and Customs Enforcement",
"sourceDate": "2026-07-20",
"lastUpdated": "2026-07-30T00:00:00.000Z",
"refresh": "periodic",
"knownGaps": ["..."]
},
"features": [{
"type": "Feature",
"geometry": { "type": "Point", "coordinates": [lng, lat] },
// or Polygon / MultiPolygon for zones,
// LineString for camera-to-camera roads
"properties": {
"id": "stable slug, safe to join on",
"layer": "alpr | alpr_corridor | agency_287g | detention_facility |
data_center | redlining | racial_covenant",
"name": "institution, facility, or zone — never a person",
"county": "county name, or null",
"countyFips": "Census GEOID — join key across layers",
"state": "USPS code",
"confidence": "confirmed | reported | probabilistic",
"sourceDate": "ISO date the record is effective, or null",
"attributes": { "layer-specific fields" }
}
}]
}
countyFips is the join key. It is a Census GEOID present on every record we
could place, which is what makes it possible to ask a question across layers — for example,
which counties have both a 287(g) agreement and an ICE-contracted jail.
confidence is not decoration. probabilistic on the camera layer
means a record may be stale or wrong; treat it accordingly in any analysis.
Rebuild it yourself
Every dataset here is produced by a script that reads only public sources and requires no API key or credential. Clone the repository and run:
npm install
npm run data # rebuild every layer from upstream
npm run data:287g # or just one
Set SCOPE=national on the 287(g), detention, or data-centre scripts to ingest the
whole country rather than Minnesota. You will need a national county reference first — see
methodology.