ZH/zhe hang
← Work index

01 ·deployed web app ·2026

EhParkLeh

A Singapore parking finder that answers one question well: where do I park near here, right now, that fits my needs.

Facts

  • 3,566 carparks, live
  • data.gov.sg + live LTA EV charging
  • installable PWA, iOS and Android

Built with

  • React 19
  • TypeScript
  • FastAPI
  • Leaflet
  • PWA
  • Capacitor

EhParkLeh is a live web app that pulls open government data from data.gov.sg and LTA DataMall to give accurate, current information on the carparks near any location. Government data alone was not enough, as some parking spaces are not listed in it, so I also use the Google Places API and OpenStreetMap to find parking that the government data misses.

Contains information from HDB carpark availability (data.gov.sg) and EV charger availability (LTA DataMall), made available under the terms of the Singapore Open Data Licence version 1.0. Map data © OpenStreetMap contributors. Original music.

Inspiration

Every driver in Singapore knows the feeling: paying mall parking rates, and the frustration of finding a spot in the first place. You end up zooming into Google Maps, hunting for a little ‘P’ near your destination and hoping it has space. The data that would help already exists, live lot counts and real rates, just scattered across separate government feeds. So I pulled it into one place, a single glance at a map that links straight to Google Maps for directions.

The one job

Finding parking in Singapore looks like a solved problem, but it is not. The government runs parking.sg, which does a fantastic job as a one-stop solution for paying for parking. It does not, however, help you find a carpark: it has no map and no live availability, so it answers ‘how do I pay’, not ‘where do I go’. That gap is the whole product. EhParkLeh does one thing: finding a carpark, and does it completely.

I followed the SLC framework: Simple, Lovable, Complete, which lets the app solve one problem, and solve it well. It installs as a PWA, works offline against the last results, and wraps to native iOS and Android through Capacitor.

Seven feeds, one clean dataset

Coverage is the hard part, and no single feed has it. The inventory reconciles seven overlapping government and commercial feeds, including:

  • data.gov.sg. Operated by Open Government Products, with HDB as the underlying data owner for its live free-lot counts and carpark information; also includes URA street parking and real LTA carpark rates.
  • LTA DataMall. Live EV charging availability.
  • LTA OneMotoring. Indicative rates for malls and private carparks.
  • Google Places. Carpark locations the government data misses, such as malls and private lots.
  • OpenStreetMap. Extra parking spots, and a cross-check for duplicates.

Car wash bays come from the operators’ own location lists, and address search uses OneMap.

A build step merges the parking feeds onto a geocoded spine, dedupes by spatial proximity and name similarity, and classifies each carpark by type so the filters work. The result is one file, roughly 3,566 carparks, served by a FastAPI backend with a short-lived cache in front of the live availability feed.

What it stands on

React 19 and TypeScript with a Leaflet map on the front, FastAPI on the back, deployed on Vercel and Render.