How every block is scored
Every residential HDB block in Singapore is scored 0–100 across ten pillars, then combined into six persona composites. All inputs are official open data; nothing is hand-tuned per block. Current snapshot: 2026-11, generated 2026-07-16, covering 10,690 blocks.
The two scoring functions
Almost every number on the site comes from one of two functions. Both take a measured value (a walk time, a distance, or a number of years) and return a 0–100 sub-score. The pillar scores are then just weighted averages of these sub-scores, and the persona scores are weighted averages of the pillars. There is no hidden model and no per-block tuning.
1. Distance decay — decay(t, full, zero)
Used for “closer is better” values (walk times, drive times, distances). You get full credit at or below the full threshold, nothing at or beyond the zerothreshold, and a straight line in between:
score = 100 if t ≤ full score = 0 if t ≥ zero score = 100 × (zero − t) / (zero − full) otherwise
Worked example — nearest MRT is a 9-minute walk (full = 4, zero = 20): 100 × (20 − 9) ÷ (20 − 4) = 100 × 11 ÷ 16 = 68.8.
2. Growth — growth(v, full, zero)
The mirror image, used for the one “more is better” value — remaining lease. Full credit at or above full, nothing at or below zero:
score = 100 if v ≥ full score = 0 if v ≤ zero score = 100 × (v − zero) / (full − zero) otherwise
Worked example — 65 years of lease left (full = 90, zero = 40): 100 × (65 − 40) ÷ (90 − 40) = 100 × 25 ÷ 50 = 50.0.
A component with no amenity in range (no MRT, no hawker, missing lease data) returns 0 — never an error and never a fabricated value. The page then says plainly that nothing of that type is nearby.
Data sources
- HDB Property Information, resale transactions — data.gov.sg (HDB)
- MRT exits, bus stops — data.gov.sg (LTA)
- Hawker centres — data.gov.sg (NEA); CHAS clinics, polyclinics — (MOH)
- Schools — data.gov.sg (MOE); childcare — (ECDA); supermarkets — (SFA)
- Parks, park connectors — data.gov.sg (NParks / URA)
- NEA-licensed eateries with SFA hygiene grades — data.gov.sg (NEA / SFA)
- Eldercare services, Silver Zones — data.gov.sg (MOH / LTA)
- Libraries, community clubs, sports facilities, gyms — data.gov.sg (NLB / PA / SportSG)
- Master Plan 2025 rail layers, cycling path network — data.gov.sg (URA / LTA)
- EV charging points — LTA DataMall (public + HDB carparks)
- Eatery star ratings — Google Places, fetched at request time (never frozen into the snapshot)
- Geocoding and basemap — OneMap, Singapore Land Authority
- Walking and driving times — OSRM routing over OpenStreetMap
Distance decay thresholds
Every amenity component plugs into decay() with its own pair of thresholds. Walking and driving times are door-to-door OSRM routes over OpenStreetMap, not straight lines — except school distances, which are straight-line to mirror MOE's P1 registration rule, and cycling-path / planned-rail distances, which are straight-line because they measure geometry rather than a walkable destination. Remaining lease inverts the scale via growth(): more years, more credit.
| Component | Full credit | Zero |
|---|---|---|
| MRT exit | ≤ 4 min walk = 100 | ≥ 20 min = 0 |
| Bus stop | ≤ 2 min walk = 100 | ≥ 10 min = 0 |
| Hawker centre | ≤ 5 min walk = 100 | ≥ 25 min = 0 |
| CHAS clinic | ≤ 5 min walk = 100 | ≥ 20 min = 0 |
| Polyclinic | ≤ 10 min walk = 100 | ≥ 30 min = 0 |
| Hospital | ≤ 10 min drive = 100 | ≥ 30 min = 0 |
| Supermarket | ≤ 5 min walk = 100 | ≥ 20 min = 0 |
| Wet market | ≤ 8 min walk = 100 | ≥ 25 min = 0 |
| Park | ≤ 8 min walk = 100 | ≥ 25 min = 0 |
| Park connector | ≤ 5 min walk = 100 | ≥ 15 min = 0 |
| Childcare | ≤ 5 min walk = 100 | ≥ 20 min = 0 |
| Primary school | ≤ 1,000 m straight-line = 100 | ≥ 4,000 m = 0 |
| Secondary school | ≤ 1,000 m straight-line = 100 | ≥ 5,000 m = 0 |
| Commute anchor | ≤ 20 min PT = 100 | ≥ 75 min = 0 |
| Eatery (NEA-licensed) | ≤ 3 min walk = 100 | ≥ 15 min = 0 |
| Eldercare centre | ≤ 8 min walk = 100 | ≥ 25 min = 0 |
| Library | ≤ 10 min walk = 100 | ≥ 30 min = 0 |
| Community club | ≤ 8 min walk = 100 | ≥ 25 min = 0 |
| Sports facility | ≤ 10 min walk = 100 | ≥ 30 min = 0 |
| Gym | ≤ 8 min walk = 100 | ≥ 25 min = 0 |
| Cycling path | ≤ 300 m straight-line = 100 | ≥ 1,500 m = 0 |
| Planned rail (MP2025) | ≤ 400 m straight-line = 100 | ≥ 1,600 m = 0 |
| EV charger | ≤ 3 min walk = 100 | ≥ 15 min = 0 |
| Remaining lease | ≥ 90 years = 100 | ≤ 40 years = 0 |
The pillars in detail
Each pillar is a weighted average of its component sub-scores. The weights below are fixed across all ~12,800 blocks — the only thing that varies block to block is the measured distances that feed decay(). Weights within a pillar sum to 100%.
Transport
0.55 × MRT + 0.35 × bus + 0.10 × planned rail
Everyday mobility. The nearest MRT/LRT exit dominates because it sets your reach across the island; the nearest bus stop covers the last-mile and off-rail trips; a small slice rewards being inside the footprint of a station that is planned but not yet open.
| Component | What is measured | Full = 100 | Zero | Weight |
|---|---|---|---|---|
| MRT / LRT | Walk minutes to the nearest rail exit (OSRM foot route) | ≤ 4 min | ≥ 20 min | 55% |
| Bus stop | Walk minutes to the nearest bus stop | ≤ 2 min | ≥ 10 min | 35% |
| Planned rail | Straight-line metres to the nearest MP2025 planned station | ≤ 400 m | ≥ 1,600 m | 10% |
The planned-rail component is always labelled “planned” and never merged with existing stations; the source layer carries no line names, so none are shown. Straight-line distance is used here because a not-yet-built station has no walkable route.
Food
0.30 × nearest hawker + 0.15 × hawker choice + 0.20 × nearest eatery + 0.25 × eatery choice + 0.10 × eatery hygiene
Access to cooked food, blending hawker centres (cheap, cultural, sparse) with the far denser layer of NEA-licensed eateries (coffee shops, food courts, restaurants). “Nearest” components reward proximity; “choice” components reward density; hygiene rewards quality.
| Component | What is measured | Full = 100 | Zero | Weight |
|---|---|---|---|---|
| Nearest hawker | Walk minutes to the nearest hawker centre | ≤ 5 min | ≥ 25 min | 30% |
| Hawker choice | Count of hawker centres within a 15-min walk | ≥ 3 centres | 0 centres | 15% |
| Nearest eatery | Walk minutes to the nearest licensed eatery | ≤ 3 min | ≥ 15 min | 20% |
| Eatery choice | Count of licensed eateries within a 10-min walk | ≥ 12 eateries | 0 eateries | 25% |
| Eatery hygiene | Share of nearby eateries graded A or B by SFA | 100% A/B | 0% A/B | 10% |
The two “choice” components are linear counts, not decay curves: hawker choice = min(100, 100 × count ÷ 3) and eatery choice = min(100, 100 × count ÷ 12). A block beside three hawker centres, or twelve eateries, maxes the component; more than that adds nothing.
Hygiene is the percentage of nearby eateries carrying an A or B SFA grade, computed only over eateries that actually have a grade. If none of the nearby eateries are graded, the component scores 0 rather than guessing. Nearby eateries also carry a Google star rating and review count where matched, fetched at request time and shown with a “reviews on Google” link — grades come from SFA/NEA, ratings from Google, and neither the rating nor the grade is ever fabricated.
Schools
0.50 × primary + 0.20 × secondary + 0.30 × childcare
Proximity to education, weighted toward primary schools because the MOE Primary 1 registration framework grants distance-based priority (within 1 km, then 1–2 km). Primary and secondary distances are straight-line to mirror that rule exactly; childcare is a walk time.
| Component | What is measured | Full = 100 | Zero | Weight |
|---|---|---|---|---|
| Primary school | Straight-line metres to the nearest primary school | ≤ 1,000 m | ≥ 4,000 m | 50% |
| Secondary school | Straight-line metres to the nearest secondary school | ≤ 1,000 m | ≥ 5,000 m | 20% |
| Childcare | Walk minutes to the nearest childcare / infant-care centre | ≤ 5 min | ≥ 20 min | 30% |
Straight-line (“as the crow flies”) distance is deliberate for schools: it is the exact measure MOE uses for P1 home-school distance priority, so the score reflects real registration advantage rather than a walking route.
Healthcare
0.35 × CHAS clinic + 0.30 × polyclinic + 0.20 × hospital + 0.15 × eldercare
Layered medical access: everyday GP care (CHAS clinics) first, subsidised primary care (polyclinics) next, emergency/acute care (hospitals) measured by drive time because you would not walk there, and eldercare day services rounding it out.
| Component | What is measured | Full = 100 | Zero | Weight |
|---|---|---|---|---|
| CHAS clinic | Walk minutes to the nearest CHAS GP clinic | ≤ 5 min | ≥ 20 min | 35% |
| Polyclinic | Walk minutes to the nearest polyclinic | ≤ 10 min | ≥ 30 min | 30% |
| Hospital | Drive minutes to the nearest hospital (OSRM car route) | ≤ 10 min | ≥ 30 min | 20% |
| Eldercare | Walk minutes to the nearest eldercare centre | ≤ 8 min | ≥ 25 min | 15% |
Daily needs
0.70 × supermarket + 0.30 × wet market
Routine grocery runs. Supermarkets carry most of the weight as the default weekly shop; wet markets add fresh produce and are valued but not universal.
| Component | What is measured | Full = 100 | Zero | Weight |
|---|---|---|---|---|
| Supermarket | Walk minutes to the nearest supermarket | ≤ 5 min | ≥ 20 min | 70% |
| Wet market | Walk minutes to the nearest wet market | ≤ 8 min | ≥ 25 min | 30% |
Green
0.50 × park + 0.30 × park connector + 0.20 × cycling path
Access to green and active-mobility space: a park to spend time in, a park connector for walking/jogging routes, and the cycling-path network for car-free travel.
| Component | What is measured | Full = 100 | Zero | Weight |
|---|---|---|---|---|
| Park | Walk minutes to the nearest park | ≤ 8 min | ≥ 25 min | 50% |
| Park connector | Walk minutes to the nearest park connector | ≤ 5 min | ≥ 15 min | 30% |
| Cycling path | Straight-line metres to the nearest cycling path | ≤ 300 m | ≥ 1,500 m | 20% |
Cycling-path distance is straight-line because it measures how close the network passes, a geometric fact, rather than a walk to a single destination.
Connectivity
mean of four commute-anchor times
How reachable the major employment hubs are by public transport. Each anchor is scored on the same decay curve (20 min = 100, 75 min = 0) and the four are averaged equally.
| Component | What is measured | Full = 100 | Zero | Weight |
|---|---|---|---|---|
| Raffles Place (CBD) | Public-transport minutes to the anchor | ≤ 20 min | ≥ 75 min | 25% |
| one-north (tech / biomed) | Public-transport minutes to the anchor | ≤ 20 min | ≥ 75 min | 25% |
| Jurong East (2nd CBD) | Public-transport minutes to the anchor | ≤ 20 min | ≥ 75 min | 25% |
| Changi Airport (east employment) | Public-transport minutes to the anchor | ≤ 20 min | ≥ 75 min | 25% |
Value
remaining-lease growth score (tenure-aware)
A proxy for how much lease you are buying. For a 99-year HDB flat this is 99 minus the years since the lease commenced — HDB's official lease-commencement date (taken from resale records where available), which can start years after the block was physically built. It uses the inverse of the decay curve — more years, more credit — full at 90+ years and zero at 40.
| Component | What is measured | Full = 100 | Zero | Weight |
|---|---|---|---|---|
| Remaining lease | Years of lease left (99 − years since lease commenced) | ≥ 90 years | ≤ 40 years | 100% |
This is the one pillar that uses the growth curve rather than distance decay. For private condos the model is tenure-aware: freehold and 999-year tenures have no meaningful lease decay over a buyer's horizon, so they receive full credit (100) and no remaining-lease figure is invented; only genuine 99-year leaseholds are scored on the decay ramp.
Leisure
0.30 × library + 0.30 × community club + 0.25 × sports facility + 0.15 × gym
Community and recreation amenities that shape day-to-day life beyond the essentials: libraries and community clubs (each weighted equally as social anchors), sports facilities, and gyms.
| Component | What is measured | Full = 100 | Zero | Weight |
|---|---|---|---|---|
| Library | Walk minutes to the nearest public library | ≤ 10 min | ≥ 30 min | 30% |
| Community club | Walk minutes to the nearest community club | ≤ 8 min | ≥ 25 min | 30% |
| Sports facility | Walk minutes to the nearest sports facility | ≤ 10 min | ≥ 30 min | 25% |
| Gym | Walk minutes to the nearest gym | ≤ 8 min | ≥ 25 min | 15% |
EV charging
0.70 × nearest charger + 0.30 × charger choice
How practical it is to own an electric vehicle. Proximity matters sharply because you charge where you park; a secondary component rewards having several chargers nearby, since a lone charger may be occupied.
| Component | What is measured | Full = 100 | Zero | Weight |
|---|---|---|---|---|
| Nearest charger | Walk minutes to the nearest EV charger | ≤ 3 min | ≥ 15 min | 70% |
| Charger choice | Count of distinct chargers within a 10-min walk | ≥ 3 chargers | 0 chargers | 30% |
Choice is a linear count: min(100, 100 × count ÷ 3). Chargers come from LTA DataMall (public and HDB-carpark points), refreshed monthly. Live availability is not shown — check SP Mobility or PlugShare for real-time status.
Worked example: a full Transport score
Suppose a block's nearest MRT exit is a 9-minute walk, its nearest bus stop is a 3-minute walk, and the nearest planned MP2025 station is 900 m away in a straight line. The three sub-scores are:
- MRT:
decay(9, 4, 20) = 100 × (20 − 9) ÷ (20 − 4) = 68.8 - Bus:
decay(3, 2, 10) = 100 × (10 − 3) ÷ (10 − 2) = 87.5 - Planned rail:
decay(900, 400, 1600) = 100 × (1600 − 900) ÷ (1600 − 400) = 58.3
Transport = 0.55 × 68.8 + 0.35 × 87.5 + 0.10 × 58.3 = 37.8 + 30.6 + 5.8 = 74.3. Every pillar on the site is built exactly this way.
A note on estimated Connectivity
In the current snapshot the four anchor times are estimates: walk time to the nearest MRT, plus rail at an effective 35 km/h over the straight-line distance to the anchor, plus a 10-minute overhead for waiting, transfers and egress. These values are marked with a * and are being replaced block by block with real OneMap public-transport routing.
Persona composites
A block's pillar scores are combined into composites tuned to different households. Each composite is a weighted average of the ten pillars; the weights in each row below sum to 100%. A weight of 0% means the pillar is deliberately ignored for that persona — schools for seniors and renters, and lease/value for renters (irrelevant to tenants).
| Persona | Transport | Food | Schools | Healthcare | Daily needs | Green | Connectivity | Value | Leisure | EV |
|---|---|---|---|---|---|---|---|---|---|---|
| Overall | 17% | 13% | 12% | 12% | 12% | 8% | 12% | 6% | 4% | 4% |
| Young family | 14% | 9% | 25% | 9% | 11% | 11% | 9% | 5% | 4% | 3% |
| Seniorsschools excluded | 13% | 16% | 0% | 27% | 16% | 9% | 7% | 4% | 6% | 2% |
| Renterschools & lease excluded | 27% | 14% | 0% | 5% | 14% | 8% | 24% | 0% | 6% | 2% |
| EV owner | 12% | 8% | 5% | 6% | 10% | 4% | 10% | 12% | 3% | 30% |
Investor
The investor composite is not a simple pillar average. It blends overall liveability with two money signals:
investor = 0.55 × overall
+ 0.25 × resale-PSF momentum percentile
+ 0.20 × value (remaining-lease score)Momentum is the subzone's resale price-per-square-foot trend over three years, expressed as a 0–100 percentile against all other subzones. Lease decay is priced in directly through the value term. For a private condo with fewer than five recorded transactions the momentum signal is considered unreliable: rather than impute a neutral 50, the momentum term is dropped and the remaining weights (overall + value) are re-normalised, and the page shows a sparse-data note.
Demographic fit
After the base composite is computed, four personas receive a small, bounded nudge based on the planning area's census demographics (2020) — a block in an area whose resident mix matches the persona gets a slight lift, and vice versa. The adjustment is a linear ramp centred on the national mean, clamped to ±3 points, and applied after weighting so demographics never leak into the block-level pillar claims. Missing demographics mean exactly 0 — never a penalty.
| Persona | Indicator | Neutral | ±3 at |
|---|---|---|---|
| Young family | Residents under 15 | 13% | ±8 pp |
| Seniors | Residents 65+ | 16% | ±8 pp |
| Renter | Commute by public transport | 60% | ±15 pp |
| EV owner | Commute by private vehicle | 30% | ±15 pp |
Overall and Investor have no demographic rule and are never adjusted. Demographics are a planning-area signal only; they inform the persona fit, not any pillar score.
From blocks to estates
Estate, town and street pages roll up their blocks with a unit-weighted average: each block's score is weighted by its number of dwelling units, so a 200-unit block counts for more than a 40-unit one. Alongside the mean, the rollup keeps the minimum, maximum and median of every pillar and composite, so a page can show both the typical block and the spread.
Planned infrastructure and badges
Planned MRT/LRT stations come from URA Master Plan 2025 rail layers and are always labelled “planned” — never mixed with existing stations. The source layer carries no line names, so none are shown. A block within 400 m of an LTA Silver Zone shows an informational badge; it never affects any score. Likewise, blocks near upcoming development sites (URA Government Land Sales, within 1 km) show a neutral “upcoming development” note — a mix of near-term construction and future amenities — which is context only and never scored.
Honest gaps
If a block has no amenity of a given type within range, that component scores zero and the page says so — we never fabricate a nearby amenity. Estimated values are marked *. Planned infrastructure is labelled and never scored as if it exists today. Estate scores are unit-weighted averages of block scores, so large blocks count for more.
What we deliberately don’t score
Some things that affect liveability are left out on purpose, because scoring them honestly at the level of a single block isn’t possible with open data:
- Air quality, population density, and cleanliness are only published at regional or planning-area resolution — every block in a region would share one value — so folding them into a block score would imply a precision the data doesn’t have.
- Sheltered/covered walkways have no maintained, complete open dataset; scoring the partial data available would wrongly penalise genuinely-sheltered blocks it simply doesn’t cover.
- Parks, recreation, food variety, and cycling access are already part of the scoring — under the green, leisure, and food pillars — so they aren’t separate add-ons.
Licensing
Contains information from data.gov.sg made available under the Singapore Open Data Licence, and from OneMap, Singapore Land Authority. Routing © OpenStreetMap contributors. Scores are computed estimates for research — not financial or professional advice.