SG Block Index

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

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.

ComponentFull creditZero
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.

ComponentWhat is measuredFull = 100ZeroWeight
MRT / LRTWalk minutes to the nearest rail exit (OSRM foot route)≤ 4 min≥ 20 min55%
Bus stopWalk minutes to the nearest bus stop≤ 2 min≥ 10 min35%
Planned railStraight-line metres to the nearest MP2025 planned station≤ 400 m≥ 1,600 m10%

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.

ComponentWhat is measuredFull = 100ZeroWeight
Nearest hawkerWalk minutes to the nearest hawker centre≤ 5 min≥ 25 min30%
Hawker choiceCount of hawker centres within a 15-min walk≥ 3 centres0 centres15%
Nearest eateryWalk minutes to the nearest licensed eatery≤ 3 min≥ 15 min20%
Eatery choiceCount of licensed eateries within a 10-min walk≥ 12 eateries0 eateries25%
Eatery hygieneShare of nearby eateries graded A or B by SFA100% A/B0% A/B10%

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.

ComponentWhat is measuredFull = 100ZeroWeight
Primary schoolStraight-line metres to the nearest primary school≤ 1,000 m≥ 4,000 m50%
Secondary schoolStraight-line metres to the nearest secondary school≤ 1,000 m≥ 5,000 m20%
ChildcareWalk minutes to the nearest childcare / infant-care centre≤ 5 min≥ 20 min30%

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.

ComponentWhat is measuredFull = 100ZeroWeight
CHAS clinicWalk minutes to the nearest CHAS GP clinic≤ 5 min≥ 20 min35%
PolyclinicWalk minutes to the nearest polyclinic≤ 10 min≥ 30 min30%
HospitalDrive minutes to the nearest hospital (OSRM car route)≤ 10 min≥ 30 min20%
EldercareWalk minutes to the nearest eldercare centre≤ 8 min≥ 25 min15%

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.

ComponentWhat is measuredFull = 100ZeroWeight
SupermarketWalk minutes to the nearest supermarket≤ 5 min≥ 20 min70%
Wet marketWalk minutes to the nearest wet market≤ 8 min≥ 25 min30%

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.

ComponentWhat is measuredFull = 100ZeroWeight
ParkWalk minutes to the nearest park≤ 8 min≥ 25 min50%
Park connectorWalk minutes to the nearest park connector≤ 5 min≥ 15 min30%
Cycling pathStraight-line metres to the nearest cycling path≤ 300 m≥ 1,500 m20%

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.

ComponentWhat is measuredFull = 100ZeroWeight
Raffles Place (CBD)Public-transport minutes to the anchor≤ 20 min≥ 75 min25%
one-north (tech / biomed)Public-transport minutes to the anchor≤ 20 min≥ 75 min25%
Jurong East (2nd CBD)Public-transport minutes to the anchor≤ 20 min≥ 75 min25%
Changi Airport (east employment)Public-transport minutes to the anchor≤ 20 min≥ 75 min25%

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.

ComponentWhat is measuredFull = 100ZeroWeight
Remaining leaseYears of lease left (99 − years since lease commenced)≥ 90 years≤ 40 years100%

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.

ComponentWhat is measuredFull = 100ZeroWeight
LibraryWalk minutes to the nearest public library≤ 10 min≥ 30 min30%
Community clubWalk minutes to the nearest community club≤ 8 min≥ 25 min30%
Sports facilityWalk minutes to the nearest sports facility≤ 10 min≥ 30 min25%
GymWalk minutes to the nearest gym≤ 8 min≥ 25 min15%

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.

ComponentWhat is measuredFull = 100ZeroWeight
Nearest chargerWalk minutes to the nearest EV charger≤ 3 min≥ 15 min70%
Charger choiceCount of distinct chargers within a 10-min walk≥ 3 chargers0 chargers30%

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:

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).

PersonaTransportFoodSchoolsHealthcareDaily needsGreenConnectivityValueLeisureEV
Overall17%13%12%12%12%8%12%6%4%4%
Young family14%9%25%9%11%11%9%5%4%3%
Seniorsschools excluded13%16%0%27%16%9%7%4%6%2%
Renterschools & lease excluded27%14%0%5%14%8%24%0%6%2%
EV owner12%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.

PersonaIndicatorNeutral±3 at
Young familyResidents under 1513%±8 pp
SeniorsResidents 65+16%±8 pp
RenterCommute by public transport60%±15 pp
EV ownerCommute by private vehicle30%±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:

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.