+ 01 / Intro

Is street parkingreally free?

A self-initiated investigation into 60,000 NYC parking tickets.

Role
Solo · research, design, build
Data
NYC Open Data — Parking Violations Issued
Years
2021 → 2025 (5y, 60k records)
Boroughs — Scale at a glance
BoroughsScale at a glance
Precincts — Drill down
PrecinctsDrill down
Years — The rhythm
YearsThe rhythm
Types — 97 ways to lose
Types97 ways to lose

+ Premise

02

I came back from a trip and foundfour tickets fanned out under my wiper.

I'd been gone two weeks. $405 in parking violations. I sat in the driver's seat and did the math: a covered garage four blocks away was $310 a month.

Wait.

If even I — a careful-ish person who'd lived in NYC for years — had managed to lose $400 to street parking in fourteen days, the city was clearly running a much larger operation than I'd appreciated. So I did the only reasonable thing.

I downloaded every parking violation NYC has issued in the last five years and started counting.
The premise, in one sentence

+ The data

03

Every ticket the city writes.Plate, precinct, time, code, fine.

Five years × millions of records a year. The trick was that you can't just hit one endpoint — NYC organizes parking tickets by fiscal year, not calendar year (Jul → Jun), so each calendar year I cared about lived across two datasets. To get 2021 – 2025 I had to stitch six of them.

The other trick: the issued data only stores a violation code (a number from 1 to 99), not the price. Manhattan below 96th Street has its own higher fine schedule. I cross-referenced a separate dataset — DOF Parking Violation Codes — to hydrate every record with the right amount based on the precinct.

NYC Open Data

6 fiscal-year datasets · Jul → Jun · Issued violations

Stitch + page

Regroup by calendar year · monthly slices · 60k records

Hydrate with DOF code map

Code (1–99) → fine $ · MN-below-96 = higher rate

FIG. 1 — Two stitches: one across fiscal years, one across the fine schedule.

WHAT I ENDED UP WITH

5calendar years (2021 → 2025)
60,000violations sampled, balanced monthly
97distinct violation codes

+ Build

04

Three questions.Four scenes a non-technical friend could play with.

Where does NYC make the most? What are people getting hit for? When does it spike? Each question got its own scene — none of them a dashboard. Dashboards are for analysts; I wanted something that opened on a phone and held attention for two minutes.

VIEW 01 / Boroughs

Pick a borough. Each sphere is its annual fine total.

Three.js renders the four boroughs as physical objects you can size up at a glance. Click a sphere and it collapses into the individual tickets that built it — every dot is a real summons in the data.

In 2024, NYC ticketed Manhattan precincts for roughly 3× what it ticketed Bronx precincts. Population's nearly the same.

Boroughs view — four spheres sized by annual fines

VIEW 02 / Precincts

NYPD precinct boundaries, click to drill in.

Mapbox layer with real precinct geometry. Clicking surfaces a side panel: the precinct's average ticket cost, monthly trend, and a comparison line to its borough mean.

NYPD's 18th Precinct — Midtown North, including Times Square — had the highest average ticket value in the dataset.

Precincts view — Mapbox precinct drilldown

VIEW 03 / Years

Five years, side by side, five different metrics.

Force-layout bubbles for the borough split. Monthly line graph. Stacked bars for share-over-time. The metric switcher cycles total cost, cost-per-plate, ticket count, tickets-per-plate, and cost-per-ticket — same data, five framings.

The post-pandemic recovery in ticketing is visible to the naked eye. 2020 dipped. By 2023 the city was issuing more per month than 2019.

Years view — bubbles + line + stacked bars

VIEW 04 / Types

97 distinct violation codes, grouped by borough.

The treemap groups every code under the borough that wrote it most. Bar chart shows price-vs-frequency. Below, top-10 lists per borough — useful, weirdly, for spotting which code each neighborhood seems to specialize in.

Brooklyn, Queens, and the Bronx are most often ticketed for FIRE HYDRANT. Manhattan's #1 is NO STANDING — DAY/TIME LIMITS. That's a borough personality test.

Types view — treemap + bar + top 10

+ Findings

05

Sample of 60,000 tickets.Real money.

Some of these surprised me. None of them made me park better.

  • Total fines in our 5-year sample$5.97M
  • Avg. fine, Manhattan below 96th$93
  • Avg. fine, everywhere else$67
  • Most common ticket city-wideFire Hydrant
  • Most expensive common ticketNo Standing
  • Boroughs where Fire Hydrant is #13 of 4

Scale this sample to the city's actual issuance volume and you're looking at billions in fines a year. Just from people parking.

+ Reflection

06

I built this in 2021.I rebuilt it in 2026 because I was curious if anything changed.

The first version was a student project. Vue 2 era. Vue CLI, Vuex, jQuery still hanging around. Data was a one-time export I couldn't update.

Five years later I came back, gutted the build (Vite, Pinia, ESM, mobile-first responsive, properly typed stores) and rewrote the data pipeline so it pulls current records from NYC Open Data on demand. Same project, current numbers, runs on a phone. The findings shifted in interesting ways — Manhattan stayed dominant, Fire Hydrant stayed #1 in three boroughs, but the average ticket cost rose. Fine schedules updated in 2023.

So. Is street parking really free?It is not.

And yet I'm still parking on the street. Some answers don't change behavior — they just give you better metaphors.

Built with Vue 3 · Vite · Pinia · Mapbox GL · Three.js · D3.

Data: NYC Open Data — Parking Violations Issued FY2021 → FY2026 · DOF Parking Violation Codes.

GitHub ↗ · The original 2021 version ↗