
A multi-scale map that scores how livable Bengaluru actually is. Built using Cursor and Antigravity as a working demo on Vibe-coding.
Role
Product, data, and full-stack engineering
Timeline
2 months (ongoing)
Outcome
Built a working prototype using live data on Cursor and Antigravity
Team
Solo Project
Overview
Most livability rankings flatten a city into one number. Bengaluru does not work that way: a ward next to a tech park, a lake, and a metro station is a different place from the ward two kilometres away.
Bengaluru Livability Tracker is an interactive map that scores areas across twelve public-data indices - healthcare, education, daily needs, transit, employment, green cover, parks and lakes, recreation, water infrastructure, road quality, weather comfort, and air quality. Zoom changes the geography: about 34 neighborhoods, 243 BBMP wards, a ~500 m H3 grid, then an on-demand 500 m score wherever you click. A list view ranks the same scores; a detail panel shows the radar chart and the counts and distances behind each index.
Built as a personal project: product definition, data pipeline, API, and map UI. Here I have tried to use as many open source data and features as possible.
Problem
City “best places to live” lists are usually static, city-wide, and opaque. They rarely show where amenities sit, how far they are, or what happens when you drop from a locality name to a ward or a street.
Bengaluru makes that gap worse. Livability here is a mix of jobs, BMTC and metro access, lakes and parks, piped water coverage, and air - none of which align to a single polygon or area. I wanted a tool that treats scale as part of the question: neighborhood for orientation, ward for civic geography, H3 grids and point for “what is it like here.”
Approach
Three decisions shaped the product:
Zoom is the geography. Neighborhoods at city scale, BBMP wards at mid-zoom, H3 hexes at street-block scale, and a 500 m radius score at building scale. The layer chip in the header always names the current unit. (Individual streets and apartments to be covered in a subsequent iteration)
Public data, scored offline, served as GeoJSON. A Python bootstrap pulls OSM POIs, transit, BWSSB / OpenCity water layers, Sentinel-2 NDVI, and climate, then writes scored polygons. FastAPI serves those layers and computes point scores on demand.
Weights and limits are visible. Overall score is a weighted sum of twelve indices. Amenity scores mix how many places are nearby with how close the nearest one is. The UI lists what the data is not: road tags are not BBMP condition surveys; AQI is a model, not a CPCB station; water is infrastructure presence, not tanker days. (Looking to build these dynamic information into future iterations)
Product features
Map view - Choropleth (colour-coded maps) of overall score on a light base map. Hover for the name and score; click to open the panel.
Zoom-driven layers - Neighborhoods (zoom 10–12), BBMP wards (13–14), H3 grid (15–16), point scoring (17+). (Point scoring to be implemented in future iterations)
Search - Find an area and fly the map to it.
Score panel - Overall score and rank, radar across indices, accordion breakdown with the actual counts, distances, NDVI, park/lake hectares, AQI, and similar metrics.
List view - Ranked neighborhoods, sortable columns, expand a row to its child wards, jump back to the map.

List View
Shows the list of neighbourhoods and the constitutent wards in the breakdown. Also shows the overall scores
The 12 indices
Index | Description |
|---|---|
Healthcare (9%) | Hospitals, doctors, and pharmacies within ~2 km |
Education (9%) | Schools, colleges, and universities within ~2 km |
Daily needs (8%) | Groceries, convenience stores, bakeries, and markets in or next to the area (~0.4 km) |
Transit (11%) | Bus and metro stop density and nearest-stop distance |
Employment (9%) | Proximity to IT parks and office clusters (~5 km) |
Green cover (7%) | Mean Sentinel-2 NDVI inside the area |
Parks & lakes (10%) | Park and lake polygon area overlapping the neighborhood, ward, or hex |
Recreation (10%) | Malls, cinemas, theatres, sports, restaurants, and cafes within ~2 km |
Water availability (7%) | BWSSB service coverage, public borewells, and nearby supply lines |
Road quality (6%) | OpenStretMaps highway class / paved-surface proxy (not BBMP condition) [to figure out how to add actual road conditions on this] |
Weather comfort (7%) | Climate comfort at the area centroid (Open-Meteo weather APIs) |
Air quality (7%) | US AQI / PM2.5 at the centroid (Open-Meteo) |

The indices polygon
Each neighbourhood, ward and polygon is scored on these 12 indices and their weights
Technical Specs
Data Pipeline (run once, offline): download BBMP wards → generate neighborhoods → seed IT parks → fetch OpenStreetMaps POIs → transit (Open BMTC + BMRCL GTFS) → environment (Open-Meteo) → water infrastructure (OpenCity / BWSSB GIS) → Sentinel-2 NDVI → score neighborhoods, wards, and H3 cells to GeoJSON.
Frontend: React 18, TypeScript, Vite, MapLibre GL, Tailwind, Radix UI, Recharts. MapLibre fill colors follow the overall score; zoom selects which GeoJSON layer to load.
Outcome - What I learned
The useful result is not a single “best neighborhood.” It is being able to move from a city overview to a ward to a 500 m circle and still see the same twelve questions, with the numbers that produced the color.
Building it made the data quality problem concrete. OpenStreetMaps is dense for shops and sparse for some offices. Road “quality” is a tag proxy. Air quality is a ~5 km model, not a street. Water coverage is pipes and borewells, not summer supply. Putting those limits in the product is part of the design.
Zoom-as-scale is the UX lesson: one map, four geographies, no extra mode switcher. The cost is teaching people that the score should change as the unit changes.
What next?
Currently working on a mobile view for the map/list view. There are some bugs that needs to be fixed though.Add
Adding a "house rent" category based on listings from public websites and locality
Plans to include actual road conditions on the map (either by crowdsourcing or any other means)
Real time BWSSB and BMTC data.
Traffic data.
Visual design update (logo, branding, type etc)
Publish it and make it available for public audiences.



