What's in, what's out, and why.
This dashboard is built on the Toronto Police Service Community Safety Indicators series, with Statistics Canada population denominators. Below is the methodology it stands on. Read it before comparing anything on this site.
Sources.
All incident data is sourced from the Toronto Police Service Community Safety Indicators. The dashboard reads pre-aggregated JSON produced by the build pipeline, which is why cross-filter UI stays fast even on mobile. Data covers reports through 2026-03-31, imported 2026-07-09.
- Incidents
- Toronto Police Service · Community Safety Indicators
- Population (city)
- Statistics Canada · City of Toronto CSD estimates by year (table 17-10-0155-01)
- Population (nbhd)
- Toronto Neighbourhood Profiles · 2021 Census, 25% sample data
- National context
- StatCan table 35-10-0026-01 · Crime Severity Index
- Boundaries
- City of Toronto · 158 official neighbourhoods · 2021 boundary set
The default unit is incidents per 10,000 residents.
Counts visually penalize high-population neighbourhoods: a denser neighbourhood with the same per-capita rate as a quieter one looks more dangerous on the page, even though it isn't. So every chart on this site defaults to rate per 10,000 residents, with raw counts available via the sticky toggle in the header. Toggling units changes the meaning of every number on screen at once.
Why a choropleth, not a dot/cluster map.
The source publishes approximate lat/lng per incident and explicitly forbids exact-address presentation. A dot map would imply a precision the data does not have, and risks tying records to specific buildings, blocks, or people. We instead aggregate to neighbourhood level: 158 cells, each shaded by the active category's rate per 10K residents.
Scope and exclusions.
This dashboard is intentionally narrow. Knowing what it doesn't cover is part of reading it correctly.
This is a trend dashboard, not a live ticker.
The TPS source refreshes quarterly. There is no "Recent incidents" widget, no relative date strings ("3 days ago"), and no live feed. The chronological feed uses absolute dates only. The site itself is updated periodically, with no fixed schedule. Every freshness number on the page (topbar pill, this card, the footer) reflects the data itself: the latest report date the imported data covers, and when it was imported, not when the site was last rebuilt.
What this dashboard doesn't do.
- No language calling a neighbourhood "safe" or "dangerous." Show the data, don't label the place.
- Counts are never the default visualisation. That would visually penalise high-population neighbourhoods.
- No addresses, no point-resolution maps, no per-incident identifiable detail.
- No relative-date framing ("yesterday"). This is a trend tool, not a crime ticker.
- Colour is never the only cue. Every category has a distinct glyph and a label.
- WCAG AA contrast minimum, including chart strokes and choropleth fills.
Colophon.
Type: IBM Plex Sans & IBM Plex Mono. Charts hand-rolled in SVG against an oklch palette. Map: Leaflet with CartoDB Dark Matter tiles, 2021 Census neighbourhood polygons. Built with Astro; reads pre-aggregated JSON.
Toronto Crime Pulse · v1.0.0-rc · No tracking. No cookies. No ads. No paywall. Open methodology.