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-06-30, imported 2026-07-27.
- 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 raw incident counts.
Every chart on this site defaults to raw incident counts — the unfiltered record of what was reported — with rate per 10,000 residents one toggle away. 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 in the active unit — raw counts by default, rate per 10K residents one toggle away (ADR-009).
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 the default (ADR-009), but rates per 10K stay one toggle away everywhere — switch to rates when comparing neighbourhoods of different sizes, because raw counts visually penalise high-population areas.
- 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: Space Grotesk & JetBrains Mono. Charts hand-rolled in SVG against an oklch palette. Map: Leaflet with CARTO tiles, 2021 Census neighbourhood polygons. Built with Astro; reads pre-aggregated JSON.
Toronto Crime Pulse · v1.0.0-rc · No cookies. No ads. No paywall. Open methodology.