All notable changes to the YIMBY 101 zoning dataset are documented here.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning. Versions tag the data (the contents of), not the code:
- MAJOR — a breaking change to the output schema, ring indexing, or denominator conventions.
- MINOR — methodology or coverage changes that move published numbers.
- PATCH — corrections that don’t materially move the headline metrics.
The current published version is in VERSION and is emitted to
(via the combiner) for the site to display.
Per-version metric tables. Each release’s per-city impact — total ex-rural residential land + the five restriction-control shares + the Δ vs the prior version and why — is tabulated in [] (full backfill to v0.2.0; regenerate with). New releases also embed their table inline below.
Unreleased
[1.3.1] - 2026-07-12
NSW Height-of-Building (HOB) overlap-precedence fix, on a fully regenerated Sydney baseline (Sydney adapter rerun + full). PATCH — a correctness fix confined to the ~1.85 km² of NSW where LEP HOB polygons genuinely overlap; the city-wide headline is unchanged (all moves sub-0.01 pp aggregate), with local shifts up to ~0.2 pp in the inner/CBD rings where HOB precinct stacking occurs. No other city moves.
Fixed
- Overlapping LEP Height-of-Building polygons were resolved most-restrictive
(lowest height wins), over-restricting the NSW parcels under genuinely
overlapping HOB polygons. Overlapping HOB polygons are
amendment/precinct stacking of the same control (e.g. a CBD precinct height
map layered over the base LEP height), not two simultaneously-binding controls,
so the applicable limit for a parcel is the most permissive of the
overlapping polygons. ‘s per-parcel HOB lookup now takes
which.max(max_height_m)instead ofwhich.min. Statewide the HOB layer has 3.18 km² of self-overlap, 1.85 km² of it across polygons with differing heights — the only parcels this can move. - This is deliberately not Adelaide’s PDCode convention. Adelaide’s
min-wins resolves a genuine Levels-vs-Metres dual control where both limits bind simultaneously — verified against the raw PDCode data as the only overlap present (each of the Levels and Metres surfaces is internally non-overlapping; their intersection is 385 km²) — so it correctly stays min-wins. The other six adapters were swept and carry no equivalent min-wins height-overlap logic. Audited under. - Greater Sydney ≤2-storey (ex-rural) 76.94% → 76.93%, highly-restricted (GCCSA, ex-rural) 86.85% → 86.84% (rounds 86.9% → 86.8% at the boundary), SUA highly-restricted 85.248% → 85.241% — all sub-0.01 pp city-wide. Inner rings move more: gt-2-storey +0.21 pp at 18 km; the Parramatta LGA (CBD HOB stacking) ≤2-storey −0.15 pp. Height-independent controls (low-density, heritage, detached-only) and every other city are unchanged.
Per-city metric movement (vs 1.3.0)
Full history in [].
| City | Resid km² | Highly restr. | HR (SUA) | ≤2-storey | Low-dens | Herit | Detached | Δ HR (pp) | What happened |
|---|---|---|---|---|---|---|---|---|---|
| Sydney | 1,006 | 86.8% | 85.2% | 76.9% | 77.2% | 5.8% | 4.5% | -0.01 | HOB overlap precedence fix — overlapping HOB polygons are same-control precinct stacking, most-permissive wins; GCCSA HR ticks 86.9% → 86.8% on the rounding boundary, all moves sub-0.01 pp city-wide — methodology |
| Melbourne | 1,500 | 49.8% | 49.5% | 47.8% | 31.4% | 4.1% | 10.8% | — | — |
| Brisbane | 788 | 84.5% | 84.3% | 82.4% | 56.4% | 1.0% | 34.8% | — | — |
| Perth | 653 | 88.9% | 88.8% | 88.5% | 50.3% | 1.7% | 0.0% | — | — |
| Adelaide | 372 | 88.2% | 88.1% | 87.1% | 27.6% | 7.7% | 0.0% | — | — |
| Hobart | 96 | 97.4% | 97.2% | 96.9% | 21.3% | 3.2% | 0.0% | — | — |
| Canberra | 111 | 75.1% | 76.0% | 75.0% | 75.0% | 2.0% | 0.0% | — | — |
| Darwin | 27 | 88.4% | 88.4% | 88.4% | 73.3% | 0.0% | 73.3% | — | — |
[1.3.0] - 2026-07-09
Sydney SEPP (Housing) Chapter 6 dual-occupancy scoping fix, on a fully regenerated Sydney baseline (Sydney adapter rerun + full). MINOR — Sydney’s published detached-only share moves materially; the restriction-union headline is unchanged, and no other city moves.
Fixed
- Dual-occupancy SEPP liberalisation was gated on the 400 m/800 m walking
catchment for all of Chapter 6, over-restricting Sydney’s detached-only metric. SEPP Housing 2021 Ch 6 Part 2 (dual occupancy / semi-detached, s.166)
is permitted with consent on “land to which this chapter applies” (s.164 —
statewide minus bushfire/coastal/heritage/exclusion-map and the 4 excluded LGAs),
with no walking-catchment requirement; only Parts 3/4 (multi-dwelling /
terrace / residential flat building, ss.170/174) bake the “low and mid rise
housing area” band into their permission grants. now computes
a chapter-wide, R2-only
sepp_dual_occ_permittedand AND-NOTs it intopermits_only_detached, while keepingsepp_lmrh_permittedband-gated for Parts 3/4. folds the same flag into the typology breakdown so both published outputs agree. Reading independently verified against the NSW Planning Portal and the SEPP’s two-stage commencement (dual-occ went statewide at Stage 1, 1 Jul 2024; mid-rise typologies catchment-gated at Stage 2, 28 Feb 2025). - Greater Sydney detached-only (permits-only-detached, ex-rural) moves −4.17 pp
at 20 km / −2.70 pp full GCCSA / −3.13 pp SUA; typology
dual_occ_permittedshare 68.6% → 76.5%. The restriction-union headline is unchanged (every R2 parcel is alreadylow_density, so the union does not move); all other cities unchanged. - Known upper bound:
sepp_dual_occ_permittedsubtracts only the bushfire/coastal/heritage/exclusion-map cuts of s.164, not the flood (Georges River / Hawkesbury-Nepean PMF), ANEF, pipeline, Schedule-12, or ATOD carve-outs — so detached-only is a slight lower bound (correct direction, sub-1 pp). Tracked in.
Added
- R2 dual-occupancy pre-Feb-2025 ban audit for the 8 banning councils, verified against point-in-time (31 Jan 2025) LEP text, with the SEPP-upzoning quantification and a note that 2 of the 8 (Hawkesbury, Wollondilly) are Ch 6-excluded LGAs and so were never upzoned by the SEPP. Adds a pre-upzoning (LEP-only) headline snapshot for Sydney.
- Corrected ‘s Hornsby instrument ID (
epi-2013-0534→epi-2013-0569; the old ID resolved to a Ballina amendment). Affects only future point-in-time LEP re-fetches.
Per-city metric movement (vs 1.2.0)
Full history in [].
| City | Resid km² | Highly restr. | HR (SUA) | ≤2-storey | Low-dens | Herit | Detached | Δ HR (pp) | What happened |
|---|---|---|---|---|---|---|---|---|---|
| Sydney | 1,006 | 86.9% | 85.2% | 76.9% | 77.2% | 5.8% | 4.5% | 0.00 | SEPP dual-occ scoping fix — s.166 dual-occ is chapter-wide, not walking-catchment-gated; detached-only 7.2% → 4.5%, union unchanged — methodology |
| Melbourne | 1,500 | 49.8% | 49.5% | 47.8% | 31.4% | 4.1% | 10.8% | — | — |
| Brisbane | 788 | 84.5% | 84.3% | 82.4% | 56.4% | 1.0% | 34.8% | — | — |
| Perth | 653 | 88.9% | 88.8% | 88.5% | 50.3% | 1.7% | 0.0% | — | — |
| Adelaide | 372 | 88.2% | 88.1% | 87.1% | 27.6% | 7.7% | 0.0% | — | — |
| Hobart | 96 | 97.4% | 97.2% | 96.9% | 21.3% | 3.2% | 0.0% | — | — |
| Canberra | 111 | 75.1% | 76.0% | 75.0% | 75.0% | 2.0% | 0.0% | — | — |
| Darwin | 27 | 88.4% | 88.4% | 88.4% | 73.3% | 0.0% | 73.3% | — | — |
[1.2.0] - 2026-07-07
Perth parcel-base source switch, on a fully regenerated baseline (full
- PMTiles rebake). MINOR — Perth’s published numbers move slightly.
Changed
- Switched the Perth cadastre from the Landgate Historical Cadastre (LGATE-489) to
the PlanWA property-interest cadastre. now reads
(replacing). Three
adapter changes for the new source: (1) UPPERCASE column names (
USAGE_CODE,POLYGON_NUMBER); (2)usage_codeis now a compound text field (e.g."1; 19"= Transfer-of-Land-Act + Building-Strata) — residential tenure is matched by splitting on;and intersecting with{1, 2, 16}, not a bare%in%(a naïve match would silently drop 153,628 parcels carrying a secondary code); (3) the source is already one clean row perPOLYGON_NUMBERand plain-linear geometry, so the dedup + curve conversion become no-ops. Verified: the split-and-intersect filter yields 1,323,980 statewide residential parcels, matching the source’s own count exactly. Greater Perth: 789,053 residential lots (+3.0% vs the Landgate base) over essentially the same land (ex-rural residential 657.4 → 653.4 km², −0.6%). Published Perth ex-rural shares move <0.3 pp: low-density +0.29 pp, ≤2-storey −0.06, heritage +0.04, highly-restricted −0.02. All other cities unchanged. Raw file swapped on R2 + in the manifest; the old Landgate extract is retained on R2 for rollback. (Not yet adopted: the new file also carriesLGA_NAMESper parcel, a candidate to replace the separate LGA_2025 spatial join — deferred pending a spot-check.)
Per-city metric movement (vs 1.1.0)
Full history in [].
| City | Resid km² | Highly restr. | HR (SUA) | ≤2-storey | Low-dens | Herit | Detached | Δ HR (pp) | What happened |
|---|---|---|---|---|---|---|---|---|---|
| Sydney | 1,006 | 86.9% | 85.2% | 76.9% | 77.2% | 5.8% | 7.2% | — | — |
| Melbourne | 1,500 | 49.8% | 49.5% | 47.8% | 31.4% | 4.1% | 10.8% | — | — |
| Brisbane | 788 | 84.5% | 84.3% | 82.4% | 56.4% | 1.0% | 34.8% | — | — |
| Perth | 653 | 88.9% | 88.8% | 88.5% | 50.3% | 1.7% | 0.0% | -0.02 | Cadastre source switched Landgate Historical → PlanWA property-interest — methodology |
| Adelaide | 372 | 88.2% | 88.1% | 87.1% | 27.6% | 7.7% | 0.0% | — | — |
| Hobart | 96 | 97.4% | 97.2% | 96.9% | 21.3% | 3.2% | 0.0% | — | — |
| Canberra | 111 | 75.1% | 76.0% | 75.0% | 75.0% | 2.0% | 0.0% | — | — |
| Darwin | 27 | 88.4% | 88.4% | 88.4% | 73.3% | 0.0% | 73.3% | — | — |
[1.1.0] - 2026-07-07
Two coverage/data refreshes (Perth heritage, SA cadastre), plus a diagnosis-only issue. MINOR — Perth’s published heritage numbers move; on a fully regenerated baseline (full + PMTiles rebake).
Added
- WA Heritage List (DPLH-090) added to Perth’s heritage classification.
Perth previously tested parcels against only the State Register (DPLH-006 →
State) and Heritage Areas precincts (DPLH-089 →Local), missing the Heritage List — individual places listed on an LGA’s local planning scheme. A listed place needn’t sit inside a Heritage Area, so List-only places were classifiedNone. Now a thirdst_intersectstest tags a hitLocal(State still wins). Fetched to via the new reproducible (wired into; manifest + R2 tracked). 8,588 places statewide; 10,811 Perth parcels hit the List, 5,672 of them flippingNone → Local(Perth heritageLocal~7,015 → 12,687). Greater Perth ex-rural shares: heritage 0.9 → 1.7% (+0.81 pp), highly-restricted 88.8 → 89.0% (+0.21 pp); ≤2-storey / low-density unaffected.
Changed
- Refreshed the SA DCDB parcel cadastre from a staged extract. Replaced
with a fresher DCDB export (schema-identical:
same 19 columns, EPSG:4326,
parcelslayer; the 16 railwaydcdbidexclusions still present). 1,138,092 → 1,140,113 parcels (+2,021, +0.18%). Manifest sha refreshed
- pushed to the tracked
sa-rawR2 key. Adelaide moves are negligible (every ex-rural share <0.05 pp; ex-rural residential land 371.7 → 372.1 km²) — a routine refresh.
Investigated (no change)
- **Mitchell LGA blank council map ** — diagnosed as not a backend bug. The
melbourneoutputs (geojson and baked PMTiles) correctly tag Mitchell’s within-SUA parcelslga_code == "24850"at every zoom (2,602 parcels inmelbourne-union; 1,775 in one z14 tile; the per-LGA overview feature for24850is present at z7–9). Redirected to frontend with a fit-bounds lead (the overview feature is GCCSA-scoped 507 km² with data in a small SW sliver). No data change.
Per-city metric movement (vs 1.0.0)
Full history in [].
| City | Resid km² | Highly restr. | HR (SUA) | ≤2-storey | Low-dens | Herit | Detached | Δ HR (pp) | What happened |
|---|---|---|---|---|---|---|---|---|---|
| Sydney | 1,006 | 86.9% | 85.2% | 76.9% | 77.2% | 5.8% | 7.2% | — | — |
| Melbourne | 1,500 | 49.8% | 49.5% | 47.8% | 31.4% | 4.1% | 10.8% | — | — |
| Brisbane | 788 | 84.5% | 84.3% | 82.4% | 56.4% | 1.0% | 34.8% | — | — |
| Perth | 657 | 89.0% | 88.8% | 88.6% | 50.0% | 1.7% | 0.0% | +0.21 | WA Heritage List (DPLH-090) added — 5,672 None→Local — coverage |
| Adelaide | 372 | 88.2% | 88.1% | 87.1% | 27.6% | 7.7% | 0.0% | -0.02 | SA DCDB cadastre refreshed, +2,021 parcels — methodology (refresh) |
| Hobart | 96 | 97.4% | 97.2% | 96.9% | 21.3% | 3.2% | 0.0% | — | — |
| Canberra | 111 | 75.1% | 76.0% | 75.0% | 75.0% | 2.0% | 0.0% | — | — |
| Darwin | 27 | 88.4% | 88.4% | 88.4% | 73.3% | 0.0% | 73.3% | — | — |
[1.0.0] - 2026-07-05
First stable release. Promotes 1.0.0-rc.3 to the dated 1.0.0 after the
validation freeze — the data is byte-for-byte identical to 1.0.0-rc.3; only
VERSION, this heading, and the emitted change (no combine, no
map re-bake). The live R2 PMTiles bundle already carries the rc.3 data.
Under this project’s SemVer policy 1.0.0 is a confidence / maturity milestone,
not a breaking change — the policy is unchanged (a real MAJOR bump still means a
breaking change to the output schema, ring indexing, or denominator conventions),
so the next genuine break is still 2.0.0. The 1.0.0 line’s methodology and
coverage are the union of everything through rc.3 (see the rc.1–rc.3 notes below):
the four coverage/correctness fixes of rc.3 (Sydney C4, Brisbane PDA, Melbourne SUZ, no-height-data map default) on a fully regenerated baseline.
[1.0.0-rc.3] - 2026-06-27
Third release candidate for the 1.0.0 line — four coverage / correctness fixes
to residential-land classification, on a fully regenerated baseline (full
clean combine + polygon rebake). Three move published city numbers (Sydney,
Brisbane, Melbourne); one is a map-layer default change.
Changed
- NSW C4 (Environmental Living) reclassified as non-rural residential.
Dropped
C4fromsydney_rural_zonesin so Environmental Living parcels count toward the ex-rural (metro) denominator the restriction shares run on, instead of being filtered out as rural-residential large-lot. C4 is a genuine NSW Standard-Instrument residential living zone (permits dwelling houses across established bushland suburbs inside the metro footprint), not a large-lot category like RU5 (Village) / R5 (Large Lot Residential). C4 stays on the residential allow-list and stays low-density — it just stops being treated as rural. Verified: 99.7% of C4 area (339 of 340 km²) falls inside the Greater Sydney GCCSA, confirming it is metro land, not the Blue Mountains fringe. Moves Sydney’s ex-rural-denominator restriction shares (~172 km² net of C4 parcels — all low-density, all restricted, mostly unknown-height — enters the denominator; the C4 zone spans ~340 km² but lots exclude roads/reserves). Greater Sydney ex-rural cumulative shares: low-density 72.5 → 77.2 (+4.7 pp), restricted 84.1 → 86.9 (+2.7 pp), ≤2-storey 82.0 → 76.9 (−5.1 pp) (C4 bushland parcels largely lack a height cap, so they enlarge the denominator while adding little to the ≤2-storey numerator), heritage 6.5 → 5.8 (−0.7 pp). Sydney’s zoning-by-category breakdown is unchanged (C4 was already “Low density residential” — only its rural flag moved). Side effect: the borderline price testtest_low_density_stronger_with_distance_control(anxfail) now xpasses — restores the v4 low-density × sale-price finding; left asxfailpending a maintainer call on converting it to a hard assert. - Brisbane Priority Development Areas (PDA) added back to the zoning layer. previously dropped the entire
LVL1_ZONE == "Planning scheme"overlay (PDA + South Bank/SBCA). PDAs are state-declared urban-renewal areas (Bowen Hills, Northshore Hamilton, Woolloongabba, Carseldine, Fitzgibbon …) that supersede the City Plan base zone and enable substantial — usually high-density — housing, so dropping them undercounted housing-capable land. Now: keepZONE_CODE == "PDA"rows, re-add them as residential withstoreys = NA(unknown height — PDAs run their own development schemes with no single City Plan cap; this also guarantees PDA land never falls into the ≤2-storey restricted bucket), and let PDA win precedence over the underlying base zone. South Bank (SBCA) stays dropped (parks-heavy).est_zone "PDA"maps to the existing Centres / Priority Development Area category. Verified: 12 PDA polygons, 9.36 km², ~0% self-overlap (the self-overlap that motivated the original blanket drop was SBCA-driven), ~4.4k lot parcels under PDA of which 80% sit on a residential base (parks/reserves are already removed by the parcel tenure filter), so no extra clip is needed. The build re-classifies 4,406 parcels toest_zone = "PDA": 4,151 are not- restricted (→ no-height-data → non-restricted under) and 255 are heritage- restricted (a heritage building inside a PDA is genuinely heritage-restricted). Greater Brisbane ex-rural cumulative shares: restricted 85.1 → 84.5 (−0.6 pp), low-density 56.9 → 56.4 (−0.4 pp), ≤2-storey 83.1 → 82.4 (−0.6 pp), heritage 0.97 → 1.04 (+0.07 pp — PDAs like Bowen Hills carry more heritage overlay than the metro average). The “Centres / Priority Development Area” zoning category gains content (mean ring share 9.7% → 10.2%). - Melbourne City-of-Melbourne SUZ6/SUZ7/SUZ8 added back as Mixed use.
keeps zones via a
ZONE_CODE_GROUPkeep-list, which excluded all Special Use Zone schedules. Added a targeted, LGA-scoped carve-in forZONE_CODE %in% c("SUZ6","SUZ7","SUZ8") & LGA == "MELBOURNE"— not a group-wideSUZadd (that would sweep in airports/universities/hospitals/ racecourses statewide, and the schedule numbers are LGA-specific). These permit residential/mixed-use development; classified Mixed use withstoreys = NA(unknown height — nomelbourne_storey_rulesSUZ entry). Verified: 7 polygons, 0.70 km², all inside the Greater Melbourne GCCSA, 0% overlap with already-kept residential zones (genuinely additive). The build adds 799 parcels (511 SUZ6 + 288 SUZ7; no SUZ8 falls in the City of Melbourne LGA). Ex-rural share movements are negligible (<0.02 pp on every metric — 799 of ~2.0 M parcels); the “Mixed use” zoning category grows marginally (mean ring share 8.95% → 9.02%). - Map default:
<city>-non-restrictednow includes no-height-data parcels. In,_non_restrictedis now all not-restricted residential land (height known or unknown), reversing’s default carve-out. A parcel with no recorded height cap is, if anything, among the least restricted residential land, so greying it out as “unknown” read as more restricted than reality and shrank the/cities/[slug]hero map’s contrast layer. The<city>-no-height-datalayer is kept as a non-exclusive sub-overlay (no-height-data ⊆ non-restricted) so the “we don’t know the cap here” caveat is still surfacable, it is just no longer the default colour. Complements: the new PDA / SUZ unknown-height parcels now read as unrestricted on the map. Thetest_residential_layers_partitioninvariant was rewritten for the overlapping (Option B) semantics:union+non-restrictedpartition every housing parcel;no-height-data ⊆ non-restricted. CSV metrics are unaffected (map-only); PMTiles rebaked. A versioned PMTiles reingest issue will be filed inzoning-australia.
Per-city metric movement (vs rc.2)
Total ex-rural residential land (GCCSA) + restriction-control shares; full history in [].
| City | Resid land km² | Highly restricted | HR (SUA) | ≤2-storey | Low-density | Heritage | Detached-only | Δ HR (pp) | What happened |
|---|---|---|---|---|---|---|---|---|---|
| Sydney | 1,006 | 86.9% | 85.2% | 76.9% | 77.2% | 5.8% | 7.2% | +2.71 | C4 (Environmental Living) reclassified non-rural → enters the ex-rural denominator — methodology |
| Melbourne | 1,500 | 49.8% | 49.5% | 47.8% | 31.4% | 4.1% | 10.8% | -0.01 | City-of-Melbourne SUZ6/7/8 added as Mixed use — coverage |
| Brisbane | 788 | 84.5% | 84.3% | 82.4% | 56.4% | 1.0% | 34.8% | -0.59 | Priority Development Areas (PDA) re-included — coverage |
| Perth | 657 | 88.8% | 88.6% | 88.6% | 50.0% | 0.9% | 0.0% | — | — |
| Adelaide | 372 | 88.2% | 88.1% | 87.1% | 27.7% | 7.7% | 0.0% | — | — |
| Hobart | 96 | 97.4% | 97.2% | 96.9% | 21.3% | 3.2% | 0.0% | — | — |
| Canberra | 111 | 75.1% | 76.0% | 75.0% | 75.0% | 2.0% | 0.0% | — | — |
| Darwin | 27 | 88.4% | 88.4% | 88.4% | 73.3% | 0.0% | 73.3% | — | — |
[1.0.0-rc.2] - 2026-06-26
Second release candidate for the 1.0.0 line — rc.1 (byte-identical to 0.26.0)
plus the correctness fixes below, on a fully regenerated baseline.
Changed
- Excluded anomalous parcels flagged by Ethan (NSW, QLD).
- QLD: dropped 7 named survey plans + all
feat_name == "Main Line"rail-corridor parcels (the existing\bRailway\bfilter doesn’t catch “Main Line”). 266 parcels dropped in Greater Brisbane (18 plan + 248 Main Line). Brisbane restriction shares move ~0.2 pp (e.g.le-2-storey-all5 km 0.6989 → 0.7009). - NSW: dropped 4 anomalous parcels. Ethan identified them by GPKG
fid; we drop by the persistentcadidinstead (see below). Sydney moves are negligible (6th decimal — 4 parcels of 1.6 M). - Hardened all manual parcel-exclusion lists to persistent cadastral keys
(VIC, SA). Re-keyed the existing exclusion lists off rebuild-fragile
row-ids onto stable identifiers — byte-identical outputs (same parcels
dropped; verified Melbourne/Adelaide unchanged): Melbourne
fid → parcel_pfi(VicMap Persistent Feature Identifier), Adelaideobjectid → dcdbid.fid/objectidrenumber on re-fetch and would silently target the wrong parcels. New convention doc: [].
Fixed
- Regenerated stale
capacity/lot-by-lot-eligibility*+scenarios/lot-by-lot*. These had not been refreshed since0.20.0(2026-06-23) — the v0.21–v0.26 releases were disjoint-output branch merges that didn’t re-run the full combine, so these stages were frozen while their inputs (parcels, typology gates, amalgamation shares) moved underneath them. The stage is deterministic (two clean runs are byte-identical;compute_frontageverified reproducible) — the earlier “nondeterminism” read was stale-vs-current, not run-to-run. This rc is cut from a full clean combine, so these are now in sync with their inputs.
[1.0.0-rc.1] - 2026-06-25
First release candidate for the 1.0.0 line. This is a confidence /
maturity milestone, not a methodology change: the data is byte-for-byte
identical to 0.26.0 — only VERSION, this changelog, and the emitted
move. The RC is held in a validation freeze (full test suite +
frontend reingest check) before being promoted to a dated ## [1.0.0].
Note on the version number
Under this project’s SemVer policy a MAJOR bump means a breaking change to the
output schema, ring indexing, or denominator conventions — and no such break
is shipped here. 1.0.0 is a deliberate round-number / “we are confident this
dataset is publicly stable” marker. The policy is unchanged: the next breaking
schema or denominator change is still what bumps to 2.0.0; non-breaking
methodology/coverage changes bump the MINOR (1.1.0, …).
[0.26.0] - 2026-06-25
Fixed
- Reverted the wash-only map slim — it reintroduced a rendering bug. While
optimising the pmtiles size (v0.22.0 non-heritage → v0.24.0 → v0.25.0 Tier-1
wash-only, 724→580 MB), we made several layers ship only their dissolved
per-SAL “wash” companion, dropping the per-parcel z13–14 geometry. That broke
close-zoom rendering: the dissolved/joined polygons do NOT render at z>14 —
they overzoom into algorithmic blobs / drop out — which is the exact bug
per-parcel emission was added to fix. The frontend zooms the city
spotlight + suburb/council maps to lot level (~z15), so any wash-only layer
wired onto them would have blanked out. All layers are restored to per-parcel
(
WASH_ONLY_LAYERSis now empty). The slim never reached the live site (the slimmed layers weren’t frontend-bound yet), so this is a clean revert. The pmtiles returns to full per-parcel fidelity (~1 GB) — “large files over no rendering”. The safe ways to shrink it WITHOUT breaking close-zoom (lower--maximum-zoom, heavier simplification, or compositing the pure complements) are tracked in.
[0.25.0] - 2026-06-25
Added
non-low-densitycomplement map layer. The denser-housing-allowed complement of thelow-densitylayer (exact complement over residential land:low-density+non-low-densitypartition all ex-rural residential). Synthetic flag inliteral_polygons, ships wash-only (it’s the denser-allowed majority of residential, so per-parcel detail would bloat the bundle).
Changed
- Map-volume slim — restriction/coverage complement layers ship wash-only (Tier 1).
Per the 2026-06-25 map-volume audit: the per-parcel (z13–14, lot-level) layers
were ~80% of the 724 MB pmtiles, but the frontend only binds lot-level on a few
maps. Tier 1 = the layers the frontend does not bind yet (shipped ahead of
pending render issues):
permits-multi-dwelling,gt-2-storey,permits-only-detached,non-heritage,non-low-density,no-height-data,no-data-heritage,no-data-detached-onlynow ship wash-only (per-parcel z13–14 dropped). GeoJSON source 7.96 → 5.72 GB; pmtiles ~724 → ~500 MB, no live change. KEEP full lot-level:zoning(detailed map),union,non-restricted. Tier 2 (le-2-storey/low-density/rural— bound per-parcel today) held for a paired frontend rebind. Ships via the re-baked on R2.
[0.24.0] - 2026-06-24
Changed
non-heritagemap layer now ships wash-only (no per-parcel detail). addedgt-2-storey+non-heritagecomplement layers (v0.22.0). The per-parcelnon-heritagelayer is the heritage complement —all residential land — and ballooned the pmtiles to 848 MB (+213 MB) for negligible value over the dissolved choropleth wash (the per-parcel “non-heritage” view is just “every lot except the heritage ones”). NewWASH_ONLY_LAYERSin emits only the dissolved per-SALnon-heritage-washfor it;gt-2-storeykeeps its full per-parcel layer. pmtiles back to ~660 MB. NOTE: v0.22.0’s 848 MB tiles never went live (the R2 upload failed); this is the first live ship of’s layers. Map-only; ships via the re-baked on R2.
Changed
- Regenerated
prices/to re-align with the currentsuburbs/leaderboard. The committedprices/by-{sal,sa2,lga}.csvhad drifted against the upstreamsuburbs/by-*.csvthey join onto: they were last generated before the ex-rural-denominator standardisation and the permits-only-detached / no-data reworks landed in the suburb rollup. The refresh re-runs (which faithfully passes the up-to-date suburb columns through) so the shared restriction columns —*_ex_rural_*,rural_*,permits_only_detached_*,*_no_data_*— now match the suburbs leaderboard exactly (previously off by up to ~80pp / full 0↔100 swings on some boundaries). Three columns carried from the suburb rollup are now present inprices/too:composite_rank,qualifies_for_ranking,total_ex_rural_m2. The v5 time-series growth columns (price_cagr_pct/price_growth_period/price_growth_source) were already in the committed outputs and are unchanged. Price / income / rent / sale-price / CAGR values are stable. Also regenerated the dependent,, and theapprovals-by-ring-*artefacts.
[0.22.0] - 2026-06-24
Added
- Two complement map layers —
gt-2-storey(>2-storey) andnon-heritage. Map-only (gitignoredpolygons/*.geojson+ their dissolved-washcompanions for all 8 cities); no CSV / committed-output change and no R re-run. Both are synthetic flags computed inliteral_polygons._prepare_city_parcelsfrom columns already in the parcels gpkgs:gt-2-storey= the literal height-knownstoreys > 2footprint (~height_unknown & ~le_2_storey, the canonicalgt_2_storeyflag — height-unknown parcels stay inno-height-data, not here);non-heritage=~heritageover residential land (exact point-on-surface complement of theheritagelayer). Bothexclude_rural=Trueand both added toWASH_LAYERS.le-2-storey+gt-2-storey+no-height-datanow partition ex-rural residential exactly, as doheritage+non-heritagedocs/pipeline/,,, the per-city pages + README, and reframedfull_gccsa-as-headline language in / comments. GCCSA is everywhere reframed as the secondary companion (never removed). Capacity is the explicit exception (GCCSA-bound, self-consistent, no SUA baseline — labelled as such).
Added
- SUA-clipped ex-rural cumulative shares for all five restriction controls
(union/highly-restricted, ≤2-storey, low-density, heritage, and
permits-only-detached), enabling the frontend’s “full metro” headline +
components to sit on the Significant Urban Area consistently with the
ex-rural denominator (closes). Previously carried
cumulative_suaonly for the all-residential (-all) family, andpermits-only-detachedhad no SUA value at all — so an ex-rural full-metro headline had no truthful per-control SUA companion (using the-allSUA cut would mix denominators and break theunion ⊇ componentsuperset invariant). Adds five*-ex-rural-allmetric rows (union-ex-rural-all,le-2-storey-ex-rural-all,low-density-ex-rural-all,heritage-ex-rural-all,permits-only-detached-ex-rural-all) to, each carryingcumulative_suaplus matchingcumulative_5km/cumulative_20km/full_gccsaex-rural cuts. The chosen emit slots straight into the existing ingest (no per-ring-file schema change). Numerator = parcels (repr-point in SUA_2021) AND control mask AND not rural; denominator = the ex-rural residential land clipped to SUA — the samerestricted & ~rural/~ruraldefinition as (the newfull_gccsareproduces the published by-ring cumulatives to 0.0000 pp across all 8 cities × 5 controls). The superset invariantunion ⊇ {≤2-storey, low-density, heritage, detached}rural, excluding it from the ex-rural denominator and the restriction metrics — consistent with the other 7 capitals.** The Perth/WA adapter never set a parcel-levelruralcolumn, so defaulted all WA parcels torural=FALSE. The 18,119 parcels in the"Low-density / rural residential"LPS category (zones: Rural residential, Special rural, Special residential, Residential bushland) were therefore counted as ordinary restricted low-density residential: they leaked intoresidential_ex_ruraland inflated the low-density / union / highly-restricted shares, and shipped empty. Perth now setsrural = (zone_category == "Low-density / rural residential"), netting ~273 km² of rural-residential land out of both sides of every ex-rural metric (mirrors Adelaide’sadelaide_rural_zonesmodel). Perth-only. Perth full-metro (GCCSA) cumulative shares move down: highly-restricted (union) 92.7 → 88.8%, ≤2-storey 92.5 → 88.6%, low-density 67.5 → 50.0%, union-ex-heritage 92.1 → 87.9%; within-20km: union 87.6 → 86.9%, low-density 56.1 → 53.5%.
Changed
- Darwin ring origin repointed to the Darwin GPO; Darwin public-transport proximity now ships N/A (no urban rapid transit).
- : Darwin’s per-ring origin was an ad-hoc road intersection
(Garramilla Bnd & Cavenagh St). Repointed it to the Darwin GPO
(48 Cavenagh St,
lon=130.8419655, lat=-12.4610446), matching Hobart’s GPO convention, across every ruler (,, cities CBD,). The GPO is ~170 m from the old origin, so every Darwin per-ring share shifts only marginally; the ring annuli still partition the metro total cleanly. - : Darwin has no urban rapid transit and no GTFS feed, so the old
OSM rail/tram/ferry fallback returned 9 phantom “stops” (the Ghan
long-distance terminal, harbour/island ferries, plus bus interchanges via
a
public_transport=stationquery bug). Darwin is now an explicit no-urban-rapid-transit city (NO_RAPID_TRANSIT): its qualifying rapid-stop set is empty, so ships its row honestly as N/A (empty/NaN proximity shares,stop_count=0— wasshare_near_pt=3.94%,share_restricted_in_pt=47.6%,stop_count=9) and itspt-*map layers (rapid-stops, restricted-near-pt, non-restricted-near-pt, buffer) emit empty. The OSMpublic_transport=stationquery line (which leaked bus interchanges) was dropped, with a defensive bus-mode post-filter retained, so the rail/tram/ferry fallback stays clean for any future no-GTFS city.
[0.19.0] - 2026-06-23
Fixed
- Melbourne detailed-zoning dissolve labels now match the
zone-classification SSOT. The Melbourne polygon dissolve
collapsed
RDZ/UGZ/DZinto one mergedUrban renewal / Greenfieldgroup label that had no row in — so the frontend (which now classifies the map from that SSOT,) fell to grey/unknownand needed an interim→ mixed-usehack that conflated two zones on different rungs. Split the mapping to the classifier’s own labels:RDZ/DZ→ Urban renewal (mixed-use),UGZ→ Greenfield (non-residential). All 6 Melbourne dissolve labels now resolve against the classifier; the Greenfield urban-growth fringe correctly renders non-residential rather than mixed-use. Melbourne-only, map-only (themelbourne-zoninglayer); ships via the re-baked on R2. No CSV / headline-number change.
[0.18.0] - 2026-06-23
Bundles two independent data-correctness changes cut off v0.17.0 — the Perth R-Code apartment-floor completion and the UDIA-benchmark removal — into one release (disjoint outputs: typology/ vs min-lot-size/ + amalgamation/). CSV-only; no map / R2 change.
Removed
- UDIA greenfield benchmark dropped from the pipeline (, Ethan).
The per-city UDIA 2026 State of the Land median greenfield lot size
(+
min_lot.greenfield_source, exposed viaassumptions.greenfield_thresholds) was an unreliable, blended/unsourced per-city value. The wholemin_lotconfig section, the Python + Rgreenfield_thresholdsgetters, and the now-orphan are removed.
Changed
min-lot-size/by-{sal,sa2,lga}.csvkeep only the cadastre lot-size stats. The three greenfield-share columns (actual_share_above,regulated_share_above,greenfield_threshold_m2) are dropped; the leaderboard now ships exactlycity, code, name, parcel_count, mean_lot_area_m2, median_lot_area_m2. The retained lot-size data is unchanged (byte-identicalparcel_count/ mean / median vs the prior release across all three grains) — “the minimum lot size data” Ethan asked to keep.- Amalgamation small-lot cutoff repointed to each city’s own median
residential lot size. no longer
reads the UDIA threshold; it computes the cutoff self-consistently as the
median
area_m2of each city’s restricted-residential parcels (no external benchmark). The output columngreenfield_threshold_m2is renamedmedian_lot_size_m2. Hobart + Darwin — previously skipped for lacking a UDIA threshold — are now included. - Perth R-Code apartment floor extended to 6 plain-Residential councils
(completes). v0.17.0 added the WA-only R-Code floor
(
_apply_wa_rcode_floorin) that downgrades a multi-dwelling typology to prohibited where a parcel’s R-Code ranks below the matched (council, zone) row’sapartment_min_rcode— but only Stirling | RES was floored, so apartments were over-reported on every other Perth council’s low-R-Code “Residential” land. Setapartment_min_rcode = R40on the six remaining plain-”Residential” (RES) rows ofWA.tsv— Bassendean, Bayswater, Claremont, Melville, Nedlands, Victoria Park — the direct analogs of Stirling’s Ethan-confirmed case. Centre / Mixed Use / District-Local-Neighbourhood Centre / Highway / Private-Community-Purposes zones are correctly left unfloored (apartments there are permitted by the zone type, not R-Code-gated); notownhouse_min_rcodefloor was added (Stirling has none). Bayswater MHDR and Cottesloe 1B (dedicated higher-density residential) are flagged for Ethan — left unfloored. Per-councilapartment_permitted_pct: Bassendean 99.4→25.2, Bayswater 99.4→95.9, Claremont 95.3→5.8, Melville 100→15.5, Nedlands 99.8→38.6, Victoria Park 100→40.7. Perth overall 18.21→13.18 (Stirling unchanged 32.31). WA/Perth-only — every non-Perth typology row byte-identical to the prior release.
[0.17.0] - 2026-06-23
Bundles six parallel work-streams cut off v0.16.0 (, heritage+GCCSA-clip,) into one release — one changelog entry, one R2 pmtiles upload, one frontend reingest.
Added
- ** — per-state zone-code → density-level SSOT.**
The classification that colours the detailed-zoning map lived only in the
frontend, forking provenance from the backend. Migrated the
whole table here: 156 per-(city,
zone_code) rows + 53
group_fallbackrows → one of 9 density rungs (low … medium-high, high, centre, mixed-use, non-residential). 150/150 frontendcityZoneListcodes resolve. Ethan’s corrections applied: Melbourne Urban-renewal→mixed-use, HCTZ→medium-high, RGZ→medium-high (=HCTZ); Canberra RZ5→high, CZ2/CZ5→mixed-use; Darwin Service/Tourist-Commercial→mixed-use; Brisbane LMDR↦LMR merge; Adelaide township zones (N/T/TN/TAC/TMS) excluded from “Zoning groups”. Map-colouring SSOT; no number change. permits-multi-dwellingdetailed-map layer — the “missing-middle allowed” land. The detached control partitions residential land into three buckets but only two shipped as polygons (permits-only-detached+no-data-detached-only); the positive bucket — land that permits MORE than a detached house — had no shape. Added it (+-wash, all 8 cities) as the complementpermits_only_detached_known & ~permits_only_detached. Per-city: Melbourne 1.9 M (LDRZ stays detached-only), Sydney 981 k, Perth 619 k, Adelaide 580 k, Brisbane 488 k, Canberra 128 k, Hobart 101 k, Darwin 8.5 k. Existing layers + suburb CSVs byte-identical; map-only, ships via the re-baked on R2.- City-swap counterfactual is now backend SSOT. The
/cities“what if city A had city B’s zoning?” model was modelled entirely in the frontend. The pipeline now ships — one row per ordered (source, target) pair of the 8 capitals (8×7 = 56) withcurrent_restricted_km2,swapped_restricted_km2,delta_km2,delta_dwellings,current_share_pct,swapped_share_pct,total_res_km2. The swap cross-applies each target’s per-ring restricted-ex-rural share onto each source’s residential km² (single-sourced from, clipped to the 20 km headline disc) — reproducing the frontend formula exactly. The frontend reads + renders only. - City-composition rollup (, ask 3).
counterfactuals/city-composition.{csv,json}— the area-weighted pooled inner-20 km 8-cell (≤2 × LD × heritage) cross-tab per city (the backend mirror ofcityComposition), so the frontend no longer re-aggregates the joint distribution. - Documented dwellings/ha density-yield assumption (, ask 1). The
frontend’s hardcoded
DWELLINGS_PER_HA50 / 200 / 400 figures now live in with anASSUMPTION:source + a_relationship_to_capacity_per_hanote explaining why they are intentionally distinct from the calibratedcapacity.per_hakernel (round, conservative headline densities vs the per-storey GMAPS yields). Read viayimby.assumptions.counterfactual_*. The counterfactual swap’s dwelling delta usestownhouse_3_storey(50 dw/ha) × 100 ha/km².
Fixed
- Detailed-zoning map heritage was applied to whole zone polygons, not the
Heritage Overlay extent — Melbourne, Sydney, Canberra. The map flagged an
ENTIRE (multi-suburb) zone polygon as heritage if it touched an HO anywhere,
so on the three cities whose zoning source is zone-level (not parcel-level)
large blocks rendered hatched. Melbourne was worst —
intersects(ho_union)in marked ~62% of the metro as heritage. Now heritage is the geometric intersection of the zones with the raw heritage layer (VIC, NSWHeritage_Filtered.shp, ACT), split from the remainder: Melbourne 62% → 3.8%; Sydney whole-zone → fine-grained pieces (median 578 m², 228 km² matching the raw extent); Canberra → the genuine intersection. The parcel-level cities (Brisbane/Adelaide/Perth/Hobart/Darwin) keep their already-correct per-parcel heritage. Map-only; no CSV / number change. Ships via the re-baked on R2. - Detailed-zoning map now clips to the GCCSA for Sydney, Adelaide, Hobart,
Darwin (the fix, extended). Their zoning sources are statewide, so the
map carried all-state zones — Sydney had 75% of its zoning area outside
Greater Sydney, Adelaide 61%, Hobart/Darwin nearly all.
_build_onenow clips each statewide source to its GCCSA polygon (with a per-geometry make_valid → buffer(0) → polygonal-only repair for the invalid / mixed-dimension SA/TAS source geometry). Now 0% outside the GCCSA. Melbourne/Brisbane/Perth were already metro-only (Brisbane/Perth byte-identical). Map-only; same re-baked pmtiles. - Perth typology now resolves on (council × zone × R-Code), not just
(council × zone). WA permissibility is two-layer (LPS zoning table ×
R-Codes density floor), but the rollup dropped the R-Code — collapsing e.g.
Residential (R20)and(R40)to one verdict — biasing Perth’s shares upward._perthnow parses the R-Code (82.9% coverage) and a WA-only ordered-scale floor downgrades a multi-dwelling typology to prohibited where the parcel’s R-Code is below the council’s*_min_rcode(new WA.tsv threshold columns). Stirling apartment share 97.2% → 32.3%. The remaining ~29 metro councils’ R-Code floors are a follow-up audit (Ethan). WA-only — every other state’stypology/output is byte-identical. - SA low-density zones now permit low-rise apartments. The SA typology
audit was built from a secondary Guide PDF, reading Suburban Neighbourhood /
Hills Neighbourhood / Neighbourhood (SN/HN/N) as
apartment = no. The operative Planning & Design Code classifies residential flat buildings as Deemed-to-Satisfy in those zones, restricting only those of 3+ levels — so low-rise apartments are permitted. Setapartment_permitted = conditionalfor SN/HN/N. Adelaideapartment_permitted_pct56.6% → 74.2%. - Moreton Bay GR_U secondary-dwelling contradiction fixed. GR_U (a
high-density precinct) has
house_permitted = no, yet the row hadsecondary_dwelling_permitted = yes— but a secondary dwelling presupposes a primary house, so it can’t exist where a house isn’t permitted. Set tono. Brisbanesecondary_dwelling_permitted_pct99.3% → 98.6%.
[0.16.0] - 2026-06-23
Changed
- Reform uplift now excludes heritage parcels at parcel grain. The
reform-uplift matrix (
reforms/*.csv) was heritage-BLIND — it granted uplift to heritage-overlay parcels that can’t actually redevelop. now reads the per-parcelheritageflag (already in every parcels gpkg) and zeroes those parcels’ uplift. This is the exact geometric heritage exclusion, replacing the frontend’s lossy ring-average×(1−heritagePct)multiplier (the frontend can drop it). Moves the published reform numbers down by each city’s heritage share: Adelaide −7.8%, Sydney −6.1%, Melbourne −3.3%, Canberra −2.6%, Hobart −1.7%, Brisbane −0.7%, Perth −0.4%, Darwin −0.1% (midrise_everywhere).
Added
- Ranking SSOT columns on
suburbs/by-{sal,sa2,lga}.csv. Three facts the frontend used to compute itself, now published from the pipeline:qualifies_for_ranking(per-level ranking floor — SAL ≥500 parcels OR ≥0.5 km²; SA2 ≥500 parcels (cadastre) / ≥1.5 km² (zone-polygon cities); LGA ≥1.5 km²),composite_rank(the per-city CBD-composite score: distance 60% / restricted% 25% / log-area 15%, per-city min-max over qualifying rows), andtotal_ex_rural_m2(persisted; = max(0, total_m2 − rural_m2)). - . Native absolute “locked
land” area per city × radius {5,10,20,30 km} = Σ per-ring restricted km²
(
le-2-storey-all), the precise form of the frontend’slockedLandKm2. - Reform ratio columns on.
upliftPct,upliftVsExistingPct,increasePct(+_20km) + theexisting_dwellings/baseline_dwellings/existing_plus_baselinedenominators — the ratios the reforms page (incl. the “+174%” figure) used to derive in the browser, now SSOT so every surface reads identical numbers.
[0.15.0] - 2026-06-23
Fixed
- Melbourne detailed-zoning map export now clips to the Greater Melbourne
GCCSA, not a stale ~49 km disc (closes). The v0.13.0 GCCSA fix reached
the parcel/data rollups but NOT the map-polygon export — that’s a separate
artifact (→), last regenerated under the disc clip
and never refreshed. The raw VicMap zones cover all of Victoria (~9° wide); the
generator now clips them to the same Greater Melbourne GCCSA polygon
uses for parcels. The
melbourne-zoningmap layer goes from a 1.14° circle to the 1.34° metro extent — recovering the Mornington Peninsula (south −38.29 → −38.48) and the eastern suburbs (east 145.55 → 145.74). Map-only: no CSV / headline-number change. Ships via the re-baked on R2 (the GeoJSON + gpkg are gitignored).
Changed
- Combine bake-speedup — ~24% faster (65.4 → 50.0 min), byte-identical
output. Six stages re-implemented as pure speedups, each verified
byte-for-byte identical to v0.14.0:
polygons(geopandasto_json→ vectorisedshapely.to_geojson),per-lga-ring(sjoin fast-path + residual overlay, 375 → 42 s),reform-uplift(vectorised the per-parcel iterrows scatters, 302 → 148 s),polygon-zoning(parallelised the 8 cities, 209 → 73 s),sensitivity-suite(slim non-geometry frames + precomputed LGA groups, 269 → 210 s), andstreet_frontage(bulk STRtree query). No data change.
[0.14.0] - 2026-06-22
Added
- Melbourne housing-typology classification,. Melbourne was the only
capital with no typology data — the per-zone permission metrics
(
apartment_permitted_pct,townhouse_permitted_pct,*_with_consent_pct, …) were empty, andpermits_only_detacheddefaulted toFALSEfor every parcel. Addsplanning-schemes-package/output/spatial_join/VIC.tsv(keyed on the schedule-stripped VicMap zone group — NRZ1/NRZ2 → NRZ) classifying the 17 housing-permitting zone groups: LDRZ (Low Density Residential) is the only detached-only group (large-lot single dwelling), and every other residential / growth / mixed-use zone (NRZ, GRZ, RGZ, R1Z, HCTZ, UGZ, MUZ, ACZ, CCZ, CDZ, PDZ, DZ, C1Z, B1/2/5Z) permits missing-middle (dual-occ / townhouse / apartment). now setspermits_only_detached,permits_only_detached_knownandzone_typology(= group, for the rollup). Headlinerestrictedshare unchanged — LDRZ is alreadylow_density, so flagging it detached-only is redundant for the union. This populates the Melbourne typology-permission metrics (parity with the other 7 cities) and the detached-only component / map layer (previously empty for Melbourne).
[0.13.0] - 2026-06-22
Changed
- Brisbane LMR2 3-storey uplift now propagates across strata schemes,.
The LMR2 2→3-storey upgrade was decided per cadastral parcel, so in a
strata / community-title scheme (BUP/GTP/SP
plan) only the unit(s) physically fronting a ≥ 15.5 m road reserve passed the test — the interior units of the same development wrongly stayed at 2. Now, if any LMR2 parcel in a surveyplanqualifies (in the 400 m station band and fronting ≥ 15.5 m), all LMR2 parcels in that plan are lifted to 3 storeys (grouped byplan, which is globally unique statewide; a single-parcel freehold plan is a no-op). The upgrade rises from 7,461 → 17,129 of 71,599 LMR lots. Brisbane-only; pulls inner-ring restriction down further than v0.12.0. Follow-up to. - Melbourne now clips to the Greater Melbourne GCCSA, not a 60 km disc. clipped parcels/zones to a circular 60 km buffer around the CBD — Melbourne was the only city not clipping to its GCCSA polygon. That rendered the detailed-zoning map as a circle and, more importantly, dropped real Greater-Melbourne parcels beyond 60 km (Mornington Peninsula, outer growth corridors) while sweeping in non-GCCSA rural land within 60 km. Now clips to the Greater Melbourne GCCSA like every other city; parcels reach the GCCSA edge (~75 km) instead of a 49 km circle. The 20 km headline is unaffected; full-metro / SUA-scoped Melbourne figures + the zoning map change.
- ACT Missing Middle reforms applied to the Canberra mapping,. RZ1 gains
apartments (2-storey walk-up / manor form; height unchanged at 2); RZ2–RZ5 take
their multi-unit heights (RZ2 3, RZ3 4, RZ4 6, RZ5 7 storeys) and are renamed
(Suburban Density / Residential Transition / Urban Residential / Urban Density
Zone). Moves Canberra
apartment_permitted_pctup sharply (RZ1 ≈ 80% of resi land) andgt-2-storeyfor RZ2–RZ5. Highly-restricted (ex-rural) falls 91.4 → 75.1% (−16.3 pp) — RZ2–RZ5 move out of the ≤2-storey bucket as they take their multi-unit heights (RZ1’s own 2-storey cap is unchanged, but it is not the whole story; an earlier draft of this note’s “headline barely moves” was wrong). This is the only real-world policy change in the dataset’s history so far. ⚠️ At v0.13.0 these were the proposed Missing Middle reforms (a draft Major Plan Amendment out for consultation, not yet gazetted), applied per maintainer direction — every changed row is taggedDRAFT … (pre-gazettal), sourced to the draft MPA, traceable and revertible. (The reforms have since been gazetted / are now in effect, so this models current ACT zoning.)
Added
- 20 km-scoped coverage columns on,. Six
*_within_20kmsiblings (red/green/grey areas + shares) so the frontend’s coverage bar can match the 20 km-scoped section it sits under instead of citing the full-metro figure. Additive — existing columns unchanged.
0.12.0 - 2026-06-20
Changed
- Brisbane LMR2 conditional 3-storey uplift,. Greater Brisbane
Low–Medium Density Residential (LMR) lots previously capped at 2 storeys are
lifted to 3 storeys where they meet City Plan 2014’s LMR 2-storey/3-storey
condition 2: within 400 m walking distance of a rail or busway station
and fronting a road reserve ≥ 15.5 m wide. Walking distance is a true
OSM pedestrian-network isochrone from rail (GTFS
route_type==2) + curated busway stations (, committed); road-reserve width is the median inward-normal chord across a lot’s shared frontage with adjacent Road Type Parcels. 7,461 of 71,599 LMR lots qualify and move 2→3 storeys. Brisbane-only; pulls inner-ring restriction down (le-2-storey-all5 km 0.756→0.722,union-all-parcels5 km 0.795→0.762). The LMR2 change touches QLD only (all other states byte-identical w.r.t. this change). - Melbourne HCTZ1/HCTZ2 schedule-dependent storeys,. Housing Choice
and Transport Zone parcels now take schedule-dependent heights: HCTZ1
defaults to 4 storeys (6 where the lot is ≥ 1000 m² and street
frontage is ≥ 20 m — the GMAPS Melbourne yield cut), HCTZ2 defaults to 3
(4 under the same size/frontage condition). Frontage is computed in-adapter
(mirrors
street_frontage.compute_frontage) on the ~3,772 ≥1000 m² candidates. Melbourne-only; restriction-union /le-2-storeyunchanged (HCTZ are mid-rise, already > 2 storeys) — movesheights/by-categoryand the reform-uplift estimates only.
0.11.0 - 2026-06-19
Changed
- Precinct-granular QLD typology for all 5 Greater Brisbane councils,.
QLD residential land was largely unmatched in the typology join: the adapters
emit base zone codes (
LDR, legacy-densityGR,HDR,LMR,CR) while the audit (QLD.tsv) keys on precinct-suffixed codes (LDR_A,GR_S,HDR_15,LMDR_3a,CR_C,LDR1…). A typology-onlyzone_typologycolumn now carries the precinct (Logan/Ipswich/MoretonLDR+GR, BCCHDR/LMDR/CR, RedlandLDR1-5), leavingest_zone— and therefore all restriction / heights / lot-size / low-density / zone-category / min-lot numbers — byte-identical. Also completes the long-pending migration of the QLD typology / min-lot / zoning-map readers off the stale legacyQld_Dwelling_Heritage_Data.shponto the from-raw. Typology coverage rises: Logan 53.5→81.0, Moreton Bay 62.3→98.3, Ipswich 7.9→82.8, Brisbane 57.5→84.4, Redland 93.8→97.6 (%). Only QLD moves; all non-QLD cities byte-identical. The detached-only component becomes precinct-aware (flows into suburbs/prices/share, QLD-only); Redland townhouse 93.3→68.6 corrects a legacy over-count (the LDR1/2/4 precincts prohibit townhouses the base “LDR (other)” row permitted).
0.10.0 - 2026-06-18
Added
- Per-control coverage stat for the spotlight bars,. New
— one row per (city, control) for control ∈
{le-2-storey, low-density, detached-only, heritage} with red (restricted by
that control), green (assessed, not restricted) and grey (no published data)
as both km² and shares of the ex-rural residential denominator. Computed on
the exact same denominator + numerators as the
*-ex-rural-by-ringheadline shares (verified byte-identical), and grey matches the grey map layers by construction, so the frontend can drawred|green|greybars consistent with the spotlight maps + component %s. Lets wire the last review item.
Changed
- Council / suburb membership → Significant Urban Area (SUA),. The
suburb (
by-sal), SA2 (by-sa2) and council (by-lga) rollups, thesal-to-lgacorrespondence, the per-LGA-per-ring file, the council overview map and the SA2 demographics now define “belongs to a capital” by the ABS SUA (contiguous urban footprint) rather than the broader GCCSA. A suburb is kept iff its representative point is in the city’s SUA; a council is kept iff it is home to ≥1 such suburb (suburb-derived — robust to land-sliver LGAs and tiny-but-dense councils alike). Effects: - Fixes the broken council links:
sal-to-lganow references only in-SUA councils, so every suburb’s council link resolves (0 broken, 0 orphans). Fringe councils that hold real metro suburbs but are <50% inside the SUA — Kingborough (Kingston), Derwent Valley, Light, Adelaide Plains, Mitchell, Unincorporated NT (Charles Darwin/East Arm) — are now included (they were wrongly dropped by the old ≥50%-of-LGA-area filter). - Drops extra-SUA satellites that GCCSA swept in — Sydney loses Central Coast, Melbourne loses Macedon Ranges (each its own ABS SUA). Councils ~133 → 137; suburbs ~2,556 → ~2,383.
- The headline restricted-by-ring metric is unchanged (still GCCSA-scoped); this release re-scopes the council/suburb navigation, not the headline.
Fixed
- per-lga-per-ring Darwin area (surfaced by).
per_lga_ringcomputed parcel areas fromgeometry.area, but Darwin’s strata placeholders carry a fake ~50 m² circle geometry (real area is inlot_area_m2/PAR_AREA). added the all-strata fringe councils Litchfield + Unincorporated NT, which exposed it (per-ring area ~800 m² vs the real ~90,800). Now apportions the reallot_area_m2by each parcel’s geometry fraction — a no-op for the real-geometry polygon cities (SA/ACT/TAS/QLD/WA), and now consistent with by-lga for Darwin.
Internal
- New — single source of truth for SUA membership
(
in_sua_mask,sua_council_codes,sua_polygon), replacing the duplicated_lgas_in_gccsa/_lgas_in_sua/_filter_lgas_to_suafilters. - Pipeline efficiencies: per-stage wall-clock timing in the combiner,
YIMBY_SKIP_SENSITIVITY=1flag (mirrorsYIMBY_SKIP_POLYGONSfor iterative regens), and dropped the always-emptyno-data-low-densitymap layer.
0.9.0 - 2026-06-18
Changed
- Brisbane capacity baseline → Greater Brisbane (5-council LSDM sum),.
brisbane
capacity_dwellings119,300 → 397,400 — now the sum of all five Greater-Brisbane GCCSA councils’ SEQ LSDM 2021 additional-dwelling capacity from a single source (Brisbane 119,300 + Ipswich 112,400 + Logan 59,900 + Redland 35,500 + Moreton Bay 70,300), with aper_council_lsdm_2021breakdown. This is a consistent net-additional construct (comparable to the other capitals’ baselines) and supersedes both the prior BCC-only 119,300 and the proposed BCC-SGS-197k × land-ratio extrapolation (~833,000, which mixed constructs and over-extrapolated the greenfield outer councils). Shifts Brisbane’s calibrated capacity floor + uplift (the baseline is added as the lower anchor); capacity README worked example updated to match.
0.8.0 - 2026-06-18
Added
- Detached-only is now a standalone reported component. v0.6.0 added
permits-only-detached as a 4th component of the
restrictedunion but never emitted it on its own, so the frontend’s per-component 2×2 grid + detached spotlight had nothing to read. It now ships everywhere the other three components do:permits_only_detached_m2/_pct(+_ex_rural) on the by-lga/sa2/sal rollups, a, and a<city>-permits-only-detachedPMTiles layer. No number changes — purely surfacing the existing flag. - Per-control “no data” coverage. For each control, residential land
that is not-otherwise-restricted but whose source input is absent is now
surfaced (distinct from “present and permissive”), so the frontend can paint
grey + render red│green│grey coverage bars. New
<control>_no_data_m2/_pctrollup columns for all four controls +<city>-no-data-{low-density,heritage, detached-only}PMTiles layers (≤2-storey “no data” is the existingno-height-datalayer). Source-absent per control: ≤2-storey = no published height limit (storeysNA); low-density = always zone-determined (grey = 0); heritage = no register ingested (Darwin only — synthesised from the HT zone); detached-only =(lga,zone)not in the audit, incl. all of Melbourne (a newpermits_only_detached_knowngpkg column threads the audit match-gate out of). Absence stays treated as not-restricted (the conservative floor is unchanged); empty grey buckets are expected and fine.
0.7.0 - 2026-06-17
Added
- Darwin: City of Palmerston coverage — Darwin now includes the City of
Palmerston council, which the cadastre-only rebuild silently dropped (the
City of Darwin
Cadastrelayer is inner-Darwin only). now combines BOTH NT sources recorded in: the City of Darwin Cadastre (inner Darwin, carriesTOWNP_ZONE) and the NT Parcels layer clipped to the City of Palmerston LGA — the latter carries geometry only, so it’s spatial-joined to the NT Town Planning Zone polygons to synthesiseTOWNP_ZONEand derivesPAR_AREA_MfromAREA_HA. Merged to one uniform schema at the fetch layer, so is unchanged and the combiner’sLGA_2025sjoin labels the new parcels City of Palmerston automatically. Darwin: ~20.6k → 32,381 residential lots (+~11.8k, almost all Low Density Residential), gaining a second council. Darwin’s low-density-ex-rural share rises ~11 pp (Palmerston is overwhelmingly LR); ≤2-storey +0.5 pp; heritage unchanged. Per-LGA, by-ring, suburb, lot-size and capacity outputs all gain the Palmerston rows.
0.6.0 - 2026-06-17
Changed
restrictedis now a 4-way union — added permits-only-detached (a zone permits a detached house but no multi-dwelling form: dual-occ / townhouse / apartment) as the 4th restriction component alongside ≤2-storey, low-density, and heritage. Derived natively in R (ports the permission audit → 3-tier binarisation → house-but-no-multi, with each adapter’s zone reconciliation: NSW/QLD/WA per-(lga,zone) incl. the WA two-layer + the NSW SEPP exclusion; SA/TAS/NT/ACT state-wide). Baked throughadd_restriction_flags, so the gpkg, the 8.x by-ring CSVs,share/, capacity, and pt all pick it up consistently. The component is also a newpermits_only_detachedgpkg column. Melbourne stays 3-way (no typology prescriptions).- Dense-zone guardrail on permits-only-detached. The audit encodes
“not specified” as
n/s, which the typology convention treats as prohibited. That is correct for a genuine low-density zone, but inverts the flag for a zone that is multi-dwelling by definition whose multi-dwelling permissions the audit simply didn’t record — so a.TYP_DENSE_ZONESdenylist prevents NSW R3/R4 (Medium/High Density Residential), MU1 (Mixed Use) and E1/E2/B1–B8 (commercial/mixed centres) from ever being flagged detached-only. Genuine low-density cases are kept (NSW R2 Low Density, R5 Large Lot, RU5 Village; every NT/QLD/SA/WA/ACT detached-only zone is already rural/low-density). Net effect: ~0 pp in every city — detached-only land is almost entirely already captured by low-density/≤2-storey, so the union adds definitional completeness + long-term robustness without moving the headline numbers, computed at source in R rather than bolted on downstream.
Fixed
- Stale within-20km approval counts for Melbourne & Sydney. v0.5.0 moved the
ring origins to the central stations (Flinders St / Central) but the
*_within_20kmcolumns were never regenerated against them — said Central/Flinders while the approvals rollup still reflected the pre-revert centres. This full regen reconciles thewithin_20km_cbdSA2 flag with the committed ring origins; Melbourne/Sydneycount_within_20km(and the_per_1000_*ratios derived from it) shift by ~1–6% per FY. Deterministic distance-from-CBD flag, so the new values are the correct ones; no other city is affected.
0.5.0 - 2026-06-17
Typology methodology overhaul (Ethan-directed) + ring-origin correction. Full regen of + PMTiles.
Added
- Three-tier typology reporting —
discretionary(a DA / merit assessment is required and may be refused) is now its own reported tier instead of conflated with prohibited, which had systematically understated WA (and a little NT/SA/TAS). Additive + backward-compatible: each typology keeps<t>_permitted_pct(yes+conditional) and gains<t>_with_consent_pct(discretionary); permissible = the sum, prohibited (no/n-s) = the remainder. - Detached-house-only metric in the
house-everywhere-apartment-on-a-thirdfinding (~1,042 km² across the 7 capitals).
Changed
- WA two-layer typology join — Perth now joins on
(council, LPS underlying zone)(the council Zoning-Table Multiple-Dwelling call, Layer 2) instead of the state R-Code site-area table (Layer 1), which had overstated apartments to 90%. Perth apartment = 22.2% by-right + 42.6% with-consent = 64.8% permissible (most WA councils permit apartments via a discretionary DA). - NSW secondary-dwelling SEPP override — the Housing SEPP permits a secondary
dwelling (granny flat) with consent statewide wherever a house is permitted,
overriding the LEP land-use table. Sydney
secondary_dwelling31.6% → 93.0%. - Sydney + Melbourne ring origins → central stations (revert) — Sydney to Central Station (was Martin Place), Melbourne re-aligned to its adapter’s Flinders St ruler (was the CBD grid centre). Every capital’s ring origin is now its central station/hub. Shifts all Sydney ring + cumulative (5/20 km) metrics.
0.4.0 - 2026-06-16
Data-correctness + coverage batch:– (per-city admissions), (Sydney SEPP height uplift), (typology surfaced across all land), plus a two-round adversarial output-validity review + a full pipeline audit that hardened the typology joins and the release guardrails. Full regen of all families + PMTiles from the SEPP-applied per-state outputs.
Added
- Polygon map layer “residential, no height-limit data” — height-unknown
residential parcels split out of
non-restrictedso the map stops colouring unknown-height land as confirmed-unrestricted (~131k parcels across the capitals). - Sydney SEPP (Housing) 2021 height overrides —
max(LEP, SEPP)per parcel: Ch 5 TOD (22 m inside the TOD Sites Map) + Ch 6 LMRH (true street-network 400 m/800 m walking bands around 116 Town Centres + 59 Schedule 11 stations, R1–R4, minus bushfire/coastal/heritage; R3/R4 22/17.5 m, R1/R2 9.5 m). 126,609 parcels height-uplifted in metres; provenance (in_tod/lmrh_tier/sepp_height_m/height_source/sepp_apartment_permitted) on;YIMBY_SYDNEY_LEP_ONLY=1reproduces the LEP-only baseline. New depsosmnx/networkx. Capacity framing: of the 126,609, ~87k are R1/R2 parcels whose 9.5 m ceiling is storey-neutral (still 2 storeys afterfloor((9.5−1)/3.1)); the parcels that actually gain a storey number ~39.6k, andsepp_apartment_permitted(43,704) is the cleanest liberalisation measure — don’t read “126,609” as 126k parcels getting meaningfully taller. - Typology surfaced across all land — the permitted-typology rollup
gains + grains and all 8 typologies (added
boarding_house/retirement/aged_care); NSW unions the SEPP uplift. 7 of 8
capitals (Melbourne excluded — no VIC audit in).
by-ring/by-cityare metro-bounded (parcels within the city’sCITY_MAX_RING);by-sal/by-sa2/by-lgacover all cadastre land.
Changed
- Sydney: admit City of Parramatta
Deferred Matterland as Mixed use, unknown height (; +0.49 km²). - Adelaide: add
FC+UCstrata/community-title subtypes to the DCDB filter (; +7.16 km²). - Perth: admit Commercial-family parcels carrying an R-Code as residential (; +629 parcels, +0.93 km²).
Fixed
- Typology NSW LGA-name join (review) — 5 Sydney LGAs whose audit
data existed but whose names had drifted (
City_of_Sydney_LEPvsSydney,Campbelltown (NSW)vsCampbelltown,Sutherland ShirevsSutherland,Canterbury-Bankstown Local Environmental,Bayside (NSW)) were silently dropped, understating Sydney coverage. A shared_canon_lgareconciles both sides: Sydney per-parcel match 63% → 86% (~205k parcels recovered), house share 87% → 94%. A⚠️ LOW-MATCHstderr warning now guards against future drift. - Typology
by-ringcap binning (review) — replaced annp.clipthat piled every beyond-cap parcel into one cap-ring row (Adelaide ring-70 was 50% of city area) with a.between(1, cap)filter, so each ring is a true 1 km annulus andby-cityreflects the metro rather than the whole state. - Typology Brisbane coverage docs — corrected the README’s false claim that unmatched land is non-residential; Brisbane’s 47% reflects Logan/Moreton Bay/ Ipswich residential land keyed by precinct-suffixed audit rows the base-code cadastre can’t join (tracked for a follow-up; no fabricated precinct assignment).
- Typology LMRH dual-occ/townhouse s.164 exclusions (audit) — the Sydney
SEPP union granted dual-occ + townhouse to ~53k heritage/bushfire/coastal/
exclusion-map parcels the LMRH liberalisation excludes (apartment was already
gated). The adapter now exports an exclusion-aware
sepp_lmrh_permittedflag and the rollup gates dual-occ/townhouse on it, matching the apartment + height treatment. - Typology WA split R-Codes (audit) —
_perthnow collapses split codes (R20/40→R40) to highest density before the join, mirroring; ~81k previously-dropped split-coded parcels now join, lifting Perth coverage. - Typology SA Neighbourhood zone (audit) — added the bare
Neighbourhoodzone (19,122 parcels / 168 km², Adelaide’s largest unmatched bucket) toSA.tsv⚠️ UNMATCHED-ZONEcanary (the per-LGA warning skipped SA/TAS/WA/ACT/NT, hiding the SA + WA drops above), a per-city coverage-floor test, an all-cities-present test, a per-city ring-cap test, and a version-cut test that fails on an undated CHANGELOG.
0.3.0 - 2026-06-13
Two per-city coverage/correction fixes on top of 0.2.0, with a full regen of the gpkg-derived sub-stages + polygon PMTiles.
Changed
- Sydney: count the Metropolitan Centre zone (
SP5— formerlyB8, recoded under the 2022 Employment Zones reform; zeroB8polygons remain) as residential, bucketed Mixed use. +1.28 km² inner-ring residential land — ring-1 (CBD core) residential share 7.8% → 37.7%, ring-2 44.9% → 51.5%; Mixed-use share +12.2 pp (ring 1) / +6.6 pp (ring 2).
Fixed
- Melbourne: exclude 7 manually-flagged erroneous / non-residential VicMap
parcels by GeoPackage
fid(, Ethan). −0.29 km² residential land, concentrated in rings 5/7/9/14 (the flagged lots are large).
0.2.0 - 2026-06-13
Data-correctness batch — 12 of the 13– issues. (Brisbane capacity — BCC Sustainable Growth Strategy 197k extrapolated to the SUA — is held back pending Ethan’s methodology validation, so the Brisbane capacity baseline stays at 119,300 SEQ LSDM in this release.)
Added
- Perth Special Control Area — admit hand-curated residential
Development-zone polygons (storeys unknown) +Special useparcels carrying an R-Code. - SA “Historic Area” heritage overlay — the Planning & Design Code area-wide
control, routed to the
Other Heritage Overlaybucket. - Hobart Particular Purpose Zone residential land via a manual overlay (Mixed Use, unknown height; +1,097 parcels).
- Major-stadium exclusion — drop CBD stadiums (OSM
leisure=stadium) from residential land across all capitals (; Melbourne’s Marvel is the only real removal — most majors sit on recreation zones). - Dataset semantic versioning —
VERSION+CHANGELOG+, surfaced in the site footer.
Changed
- Melbourne: exclude business-only zones
C2Z/B3Z/B4Z; gateUGZgreenfield against the FUS land-use layer (10% coverage, −183.9 km²); drop the Docklands-bay + Flinders-St non-residential overlay. - SA: zone-category buckets (Golf Course Estate, Home Industry, Strategic
Innovation, Urban Neighbourhood) + Urban Corridor storeys; Strategic Innovation
flipped to residential. Widen the DCDB parcel filter to FL/UN/TA with a
strata footprint dedup (+21.9 km²). Golf Course Estate + Home Industry
also flagged
low_density(Ethan,). - Brisbane: exclude Emerging Community by default, re-include only the Neighbourhood-Plan precincts.
Fixed
- (none — this batch is methodology/coverage corrections.)
0.1.0 - 2026-06-12
Baseline release — the dataset as published for the federal-launch site. First version under semantic versioning; every subsequent data change is tracked against this point.
- Per-km-ring restricted / height-capped / heritage shares for all eight capital cities, built from raw cadastre via the adapters into the combiner.
- Published capacity baselines, headline stats (5 km / 20 km cumulative averages), suburb / SA2 / LGA rollups, and the polygon PMTiles family.
- Parcels-area denominators throughout;
km_ring1-indexed; wide-format X.Y files derived from the canonical 8.x long-form by construction.