// project · parking-nl

Parking NL

The real price of parking for your stay, everywhere in the Netherlands. Every public parking area, priced for your arrival time and duration, cheapest first — with free spots, live garage spaces and zones coloured by price.

NetherlandsOpen dataMCP + APILive · beta

The story and the accuracy check: read the write-up →

Note: this page is an AI-generated summary of the project. The product, the code, and the data behind it are real — the prose isn't hand-written.

// why

Signs and maps give a rate per hour. Drivers want to know what 3 hours from 14:00 will cost, and where it's cheapest — which depends on pay hours, day caps, progressive tariffs, day cards and holidays. The national register has all of that as open data; Parking NL turns it into one sorted list and a map.

// look

Scheveningen: the price in this area first, then cheaper alternatives
Price here first, then a cheaper alternative only if it's worth the walk.
Ziggo Dome garage detail with the walking route on the map
Ziggo Dome: tariff detail and the walking route to the venue.
My-location mode in Scheveningen on a phone
My location: what it costs where you stand.
Ziggo Dome with 5/10/15-minute walking rings
Walking rings from the map menu.
Installed app in Utrecht with a cheaper alternative
Installable app, works offline.
Rotterdam garages with capacity and live free spaces
Garages with capacity and live free spaces.
Rotterdam destination mode on a phone
Destination mode, with a saving one card down.
In-car layout at 1180×660 for a Tesla screen
In-car layout (Tesla, 1180×660).
Search overlay with landmarks
Search with landmarks.
  • Redesign around information hierarchy: the price here first, then a meaningfully cheaper alternative.
  • My-location vs destination modes; the walking route on the map; optional walking rings.
  • In-car layout (Tesla 1180×660); installable PWA with offline.
  • Accessibility: axe serious/critical issues 71 → 0 (WCAG 2.2 AA). Lighthouse mobile performance 85–90 in the latest runs.
  • Deploy gate: 7 production checks (incl. map-control spacing); any failure rolls back automatically.
  • MCP/API: price basis, tariff freshness, occupancy status, filters.
  • Garages from the national open feeds, including every Q-Park garage: location and capacity yes; prices and live counts need operator access (Q-Park and APCOA web data is personal-use only).
  • Data refreshes nightly at 05:30 with safety checks; public /coverage page.

Most of this came out of four rounds of synthetic UX testing →

// the data bit

4,833 public parking areas in 301 of 342 municipalities; 3,956 with a computable tariff (3,589 on the map); 429 live garages; 17,394 free spots; 3,423 real zone polygons plus 910 approximate. 1,813 priced areas carry tariffs last changed before 2024 and are flagged in the app.

  • RDW Open Data Parkeren (CC-0) — areas, tariffs, polygons
  • NPR open parking data — 429 live garages
  • OpenStreetMap (ODbL) — free spots, outlines
  • Gemeente Amsterdam — parking bays
  • PDOK — address and place search

// stack

how it's built
  • TanStack StartReact 19 on Cloudflare Workers
  • MapLibre GL + ProtomapsNL basemap as PMTiles in R2 — no paid map tiles
  • PMTiles zone polygonsBuilt with tippecanoe, coloured by the price for your stay
  • Tariff calculatorOne pure function for app, API and MCP; 15 tests on real city rules
  • MCP + RESTStreamable HTTP MCP at /mcp, OpenAPI 3.1 REST API
  • Python + DuckDB + ShapelyRDW → R2 refresh in about 30 seconds

// status

  • Live in beta at parking.davidbroza.dev — free for drivers, no account, no ads.
  • Prices are indicative: only as fresh as what operators register. Accuracy check against 2026 regulations: 7 of 10 exact; the misses were stale registrations.
  • Developers: anonymous MCP/API access, keys and plans on the pricing page.