Skip to content

Changelog

What’s changed.

One timeline of everything that’s shifted—data releases and site changes together, each tagged by what it touched. Use it to cite “as of” or to track when a number you previously quoted may have moved.

Current data snapshot:

Appendix

Full dataset version history (v1.3.1)

The complete, versioned history of the YIMBY 101 zoning dataset—the numbers behind every map, ranking, and headline—straight from the pipeline’s own changelog (semantic versioning; the footer’s data version links here). The Data entries in the timeline above summarise the reader-facing releases; this is the full technical record of every version, written for a pipeline audience.

Show the full technical changelog

+

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 of which.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_permitted and AND-NOTs it into permits_only_detached, while keeping sepp_lmrh_permitted band-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_permitted share 68.6% → 76.5%. The restriction-union headline is unchanged (every R2 parcel is already low_density, so the union does not move); all other cities unchanged.
  • Known upper bound: sepp_dual_occ_permitted subtracts 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-0534epi-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_code is 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 per POLYGON_NUMBER and 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 carries LGA_NAMES per 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 classified None. Now a third st_intersects test tags a hit Local (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 flipping None → Local (Perth heritage Local ~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, parcels layer; the 16 railway dcdbid exclusions still present). 1,138,092 → 1,140,113 parcels (+2,021, +0.18%). Manifest sha refreshed
  • pushed to the tracked sa-raw R2 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 melbourne outputs (geojson and baked PMTiles) correctly tag Mitchell’s within-SUA parcels lga_code == "24850" at every zoom (2,602 parcels in melbourne-union; 1,775 in one z14 tile; the per-LGA overview feature for 24850 is 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 C4 from sydney_rural_zones in 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 test test_low_density_stronger_with_distance_control (an xfail) now xpasses — restores the v4 low-density × sale-price finding; left as xfail pending 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: keep ZONE_CODE == "PDA" rows, re-add them as residential with storeys = 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 to est_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_GROUP keep-list, which excluded all Special Use Zone schedules. Added a targeted, LGA-scoped carve-in for ZONE_CODE %in% c("SUZ6","SUZ7","SUZ8") & LGA == "MELBOURNE"not a group-wide SUZ add (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 with storeys = NA (unknown height — no melbourne_storey_rules SUZ 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-restricted now includes no-height-data parcels. In, _non_restricted is 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-data layer 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. The test_residential_layers_partition invariant was rewritten for the overlapping (Option B) semantics: union + non-restricted partition every housing parcel; no-height-data ⊆ non-restricted. CSV metrics are unaffected (map-only); PMTiles rebaked. A versioned PMTiles reingest issue will be filed in zoning-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\b filter 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-all 5 km 0.6989 → 0.7009).
  • NSW: dropped 4 anomalous parcels. Ethan identified them by GPKG fid; we drop by the persistent cadid instead (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), Adelaide objectid → dcdbid. fid / objectid renumber 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 since 0.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_frontage verified 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_LAYERS is 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-density complement map layer. The denser-housing-allowed complement of the low-density layer (exact complement over residential land: low-density + non-low-density partition all ex-rural residential). Synthetic flag in literal_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-only now 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-heritage map layer now ships wash-only (no per-parcel detail). added gt-2-storey + non-heritage complement layers (v0.22.0). The per-parcel non-heritage layer 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”). New WASH_ONLY_LAYERS in emits only the dissolved per-SAL non-heritage-wash for it; gt-2-storey keeps 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 current suburbs/ leaderboard. The committed prices/by-{sal,sa2,lga}.csv had drifted against the upstream suburbs/by-*.csv they 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 in prices/ 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 the approvals-by-ring-* artefacts.

[0.22.0] - 2026-06-24

Added

  • Two complement map layers — gt-2-storey (>2-storey) and non-heritage. Map-only (gitignored polygons/*.geojson + their dissolved -wash companions for all 8 cities); no CSV / committed-output change and no R re-run. Both are synthetic flags computed in literal_polygons._prepare_city_parcels from columns already in the parcels gpkgs: gt-2-storey = the literal height-known storeys > 2 footprint (~height_unknown & ~le_2_storey, the canonical gt_2_storey flag — height-unknown parcels stay in no-height-data, not here); non-heritage = ~heritage over residential land (exact point-on-surface complement of the heritage layer). Both exclude_rural=True and both added to WASH_LAYERS. le-2-storey + gt-2-storey + no-height-data now partition ex-rural residential exactly, as do heritage + non-heritagedocs/pipeline/,,, the per-city pages + README, and reframed full_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_sua only for the all-residential (-all) family, and permits-only-detached had no SUA value at all — so an ex-rural full-metro headline had no truthful per-control SUA companion (using the -all SUA cut would mix denominators and break the union ⊇ component superset invariant). Adds five *-ex-rural-all metric 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 carrying cumulative_sua plus matching cumulative_5km/cumulative_20km/full_gccsa ex-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 same restricted & ~rural / ~rural definition as (the new full_gccsa reproduces the published by-ring cumulatives to 0.0000 pp across all 8 cities × 5 controls). The superset invariant union ⊇ {≤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-level rural column, so defaulted all WA parcels to rural=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 into residential_ex_rural and inflated the low-density / union / highly-restricted shares, and shipped empty. Perth now sets rural = (zone_category == "Low-density / rural residential"), netting ~273 km² of rural-residential land out of both sides of every ex-rural metric (mirrors Adelaide’s adelaide_rural_zones model). 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=station query 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 — was share_near_pt=3.94%, share_restricted_in_pt=47.6%, stop_count=9) and its pt-* map layers (rapid-stops, restricted-near-pt, non-restricted-near-pt, buffer) emit empty. The OSM public_transport=station query 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/DZ into one merged Urban renewal / Greenfield group label that had no row in — so the frontend (which now classifies the map from that SSOT,) fell to grey/unknown and needed an interim → mixed-use hack that conflated two zones on different rungs. Split the mapping to the classifier’s own labels: RDZ/DZUrban renewal (mixed-use), UGZGreenfield (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 (the melbourne-zoning layer); 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 via assumptions.greenfield_thresholds) was an unreliable, blended/unsourced per-city value. The whole min_lot config section, the Python + R greenfield_thresholds getters, and the now-orphan are removed.

Changed

  • min-lot-size/by-{sal,sa2,lga}.csv keep 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 exactly city, code, name, parcel_count, mean_lot_area_m2, median_lot_area_m2. The retained lot-size data is unchanged (byte-identical parcel_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_m2 of each city’s restricted-residential parcels (no external benchmark). The output column greenfield_threshold_m2 is renamed median_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_floor in) that downgrades a multi-dwelling typology to prohibited where a parcel’s R-Code ranks below the matched (council, zone) row’s apartment_min_rcode — but only Stirling | RES was floored, so apartments were over-reported on every other Perth council’s low-R-Code “Residential” land. Set apartment_min_rcode = R40 on the six remaining plain-”Residential” (RES) rows of WA.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); no townhouse_min_rcode floor was added (Stirling has none). Bayswater MHDR and Cottesloe 1B (dedicated higher-density residential) are flagged for Ethan — left unfloored. Per-council apartment_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_fallback rows → one of 9 density rungs (low … medium-high, high, centre, mixed-use, non-residential). 150/150 frontend cityZoneList codes 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-dwelling detailed-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 complement permits_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) with current_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 of cityComposition), so the frontend no longer re-aggregates the joint distribution.
  • Documented dwellings/ha density-yield assumption (, ask 1). The frontend’s hardcoded DWELLINGS_PER_HA 50 / 200 / 400 figures now live in with an ASSUMPTION: source + a _relationship_to_capacity_per_ha note explaining why they are intentionally distinct from the calibrated capacity.per_ha kernel (round, conservative headline densities vs the per-storey GMAPS yields). Read via yimby.assumptions.counterfactual_*. The counterfactual swap’s dwelling delta uses townhouse_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, NSW Heritage_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_one now 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. _perth now 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’s typology/ 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. Set apartment_permitted = conditional for SN/HN/N. Adelaide apartment_permitted_pct 56.6% → 74.2%.
  • Moreton Bay GR_U secondary-dwelling contradiction fixed. GR_U (a high-density precinct) has house_permitted = no, yet the row had secondary_dwelling_permitted = yes — but a secondary dwelling presupposes a primary house, so it can’t exist where a house isn’t permitted. Set to no. Brisbane secondary_dwelling_permitted_pct 99.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-parcel heritage flag (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), and total_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’s lockedLandKm2.
  • Reform ratio columns on. upliftPct, upliftVsExistingPct, increasePct (+ _20km) + the existing_dwellings / baseline_dwellings / existing_plus_baseline denominators — 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-zoning map 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 (geopandas to_json → vectorised shapely.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), and street_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, and permits_only_detached defaulted to FALSE for every parcel. Adds planning-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 sets permits_only_detached, permits_only_detached_known and zone_typology (= group, for the rollup). Headline restricted share unchanged — LDRZ is already low_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 survey plan qualifies (in the 400 m station band and fronting ≥ 15.5 m), all LMR2 parcels in that plan are lifted to 3 storeys (grouped by plan, 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_pct up sharply (RZ1 ≈ 80% of resi land) and gt-2-storey for 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 tagged DRAFT … (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_20km siblings (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-all 5 km 0.756→0.722, union-all-parcels 5 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-storey unchanged (HCTZ are mid-rise, already > 2 storeys) — moves heights/by-category and 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-density GR, 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-only zone_typology column now carries the precinct (Logan/Ipswich/Moreton LDR+GR, BCC HDR/LMDR/ CR, Redland LDR1-5), leaving est_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 legacy Qld_Dwelling_Heritage_Data.shp onto 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-ring headline shares (verified byte-identical), and grey matches the grey map layers by construction, so the frontend can draw red|green|grey bars 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, the sal-to-lga correspondence, 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-lga now 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_ring computed parcel areas from geometry.area, but Darwin’s strata placeholders carry a fake ~50 m² circle geometry (real area is in lot_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 real lot_area_m2 by 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_sua filters.
  • Pipeline efficiencies: per-stage wall-clock timing in the combiner, YIMBY_SKIP_SENSITIVITY=1 flag (mirrors YIMBY_SKIP_POLYGONS for iterative regens), and dropped the always-empty no-data-low-density map layer.

0.9.0 - 2026-06-18

Changed

  • Brisbane capacity baseline → Greater Brisbane (5-council LSDM sum),. brisbane capacity_dwellings 119,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 a per_council_lsdm_2021 breakdown. 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 restricted union 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-detached PMTiles 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/_pct rollup columns for all four controls + <city>-no-data-{low-density,heritage, detached-only} PMTiles layers (≤2-storey “no data” is the existing no-height-data layer). Source-absent per control: ≤2-storey = no published height limit (storeys NA); 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 new permits_only_detached_known gpkg 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 Cadastre layer is inner-Darwin only). now combines BOTH NT sources recorded in: the City of Darwin Cadastre (inner Darwin, carries TOWNP_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 synthesise TOWNP_ZONE and derives PAR_AREA_M from AREA_HA. Merged to one uniform schema at the fetch layer, so is unchanged and the combiner’s LGA_2025 sjoin 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

  • restricted is 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 through add_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 new permits_only_detached gpkg 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_ZONES denylist 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_20km columns were never regenerated against them — said Central/Flinders while the approvals rollup still reflected the pre-revert centres. This full regen reconciles the within_20km_cbd SA2 flag with the committed ring origins; Melbourne/Sydney count_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 reportingdiscretionary (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-third finding (~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_dwelling 31.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-restricted so the map stops colouring unknown-height land as confirmed-unrestricted (~131k parcels across the capitals).
  • Sydney SEPP (Housing) 2021 height overridesmax(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=1 reproduces the LEP-only baseline. New deps osmnx/networkx. Capacity framing: of the 126,609, ~87k are R1/R2 parcels whose 9.5 m ceiling is storey-neutral (still 2 storeys after floor((9.5−1)/3.1)); the parcels that actually gain a storey number ~39.6k, and sepp_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-city are metro-bounded (parcels within the city’s CITY_MAX_RING); by-sal/by-sa2/ by-lga cover all cadastre land.

Changed

  • Sydney: admit City of Parramatta Deferred Matter land as Mixed use, unknown height (; +0.49 km²).
  • Adelaide: add FC+UC strata/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_LEP vs Sydney, Campbelltown (NSW) vs Campbelltown, Sutherland Shire vs Sutherland, Canterbury-Bankstown Local Environmental, Bayside (NSW)) were silently dropped, understating Sydney coverage. A shared _canon_lga reconciles both sides: Sydney per-parcel match 63% → 86% (~205k parcels recovered), house share 87% → 94%. A ⚠️ LOW-MATCH stderr warning now guards against future drift.
  • Typology by-ring cap binning (review) — replaced an np.clip that 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 and by-city reflects 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_permitted flag and the rollup gates dual-occ/townhouse on it, matching the apartment + height treatment.
  • Typology WA split R-Codes (audit) — _perth now collapses split codes (R20/40R40) 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 Neighbourhood zone (19,122 parcels / 168 km², Adelaide’s largest unmatched bucket) to SA.tsv⚠️ UNMATCHED-ZONE canary (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 — formerly B8, recoded under the 2022 Employment Zones reform; zero B8 polygons 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 use parcels carrying an R-Code.
  • SA “Historic Area” heritage overlay — the Planning & Design Code area-wide control, routed to the Other Heritage Overlay bucket.
  • 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 versioningVERSION + CHANGELOG +, surfaced in the site footer.

Changed

  • Melbourne: exclude business-only zones C2Z/B3Z/B4Z; gate UGZ greenfield 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_ring 1-indexed; wide-format X.Y files derived from the canonical 8.x long-form by construction.

Citation

How to cite a specific snapshot

Cite the snapshot date alongside the dataset name. Example: Australian Zoning Atlas (snapshot 12 July 2026). Numbers quoted may have shifted in later snapshots.

Timeline

Everything that’s changed

Data releases and site changes in one list, newest first. Each entry is tagged— Data for a pipeline release that moves the numbers, and Feature / Methodology / Fix for changes to the site itself. The latest of each is flagged so you can see what the live data and the live site currently reflect.

  1. Data Latest data Data v1.3.1—a small Sydney height correction. Where two of Sydney’s building-height overlays genuinely overlap—about 1.85 km², mostly amendment layers stacked over a base limit in the inner suburbs and CBD—the height that applies is now read as the more permissive of the two, rather than the stricter. They’re two versions of the same control, not two limits binding at once. Only Sydney’s height-based numbers move, and barely: Greater Sydney’s highly-restricted share rounds from 86.9% to 86.8%, with slightly larger shifts—up to about 0.2 of a point—in the inner rings where these overlays stack. Low-density, heritage, and detached-only controls, and every other city, are unchanged.
  2. Data Data v1.3.0—coverage and classification refinements since the 1.0 release. Perth’s heritage picture is now more complete: the WA Heritage List—individually listed local heritage places, which needn’t fall inside a designated heritage area—had been missed, leaving 5,672 Perth parcels unflagged. Adding it lifts Perth’s heritage share from about 0.9% to 1.7%, and its highly-restricted share by about a fifth of a point. Perth’s parcel base also moved to the current PlanWA property-interest cadastre—about 3% more residential lots over essentially the same land—with every published share shifting less than a third of a point. In Sydney, a scoping correction: the state’s dual-occupancy reform (two dwellings on one lot) applies right across the metro, not only near transit as the data had assumed, so Sydney’s detached-only share—land where only a single detached house is permitted—falls about 4 points within 20km. The headline highly-restricted figure doesn’t move, because that land already counted as low-density. South Australia’s parcel cadastre was also refreshed, with no meaningful effect.
  3. Data Data v1.0.0—the dataset’s first stable release, and a cumulative jump from v0.24.0. The 1.0 marker signals a publicly stable dataset, not a change of method. Folded into it are four residential-land classification fixes, three of which move published numbers. The largest is in Sydney: land zoned “Environmental Living” (the C4 zone—established bushland suburbs that sit inside the metropolitan footprint) had been filtered out as rural large-lot, and is now correctly counted as metropolitan residential. Roughly 172 km² of it—almost all low-density, almost all restricted—enters Greater Sydney’s denominator, lifting its highly-restricted share by about 3 points and its low-density share by nearly 5, while easing its two-storey-cap share (that bushland mostly carries no published height limit, so it enlarges the base without adding to the two-storey count). Brisbane eases about half a point as its Priority Development Areas—state-led urban-renewal precincts, like Bowen Hills and Woolloongabba, that override the base zone to enable substantial housing—are added back. Melbourne is essentially unchanged. On the city maps, residential land with no published height limit now shows as open rather than grey by default: it’s among the least-restricted land, so greying it out overstated restriction—the “no published limit” caveat stays available as a toggle.
  4. Feature Latest site Methodology now has its own menu in the navbar—Overview, Data inputs, Assumptions, Code & mechanics, and the Glossary in one dropdown—so the rebuilt methodology pages are reachable in a single hop. Under the hood, the primary navigation can now be edited in the CMS like the footer links already could.
  5. Methodology The methodology section was rebuilt into a plain-language, four-page family: an Overview, plus dedicated Data inputs (where every number comes from, state by state), Assumptions (every modelling choice with its direction of bias), and a Code & mechanics appendix. Assumptions moved from /about/assumptions to /about/methodology/assumptions (the old link redirects). Every page is now CMS-editable—the prose is managed in the Studio with an in-repo fallback, so the four controls behind the “highly restricted” headline (no more than 2 storeys, detached-only, low-density, heritage) are explained consistently end to end.
  6. Feature Each control’s restriction map now reads as a clean two-colour split. On the 2-storey, low-density, heritage and detached-only maps, the green is now that control’s OWN complement—land where more than two storeys, denser-than-low-density housing, no heritage overlay, or more than a detached house is permitted—so red and green tile the residential land by that single control exactly and match the red/green coverage bar beneath each map. Previously the green showed the narrower “open on every control” land, which left much of the denser-allowed land unpainted (the low-density map in particular drew almost no green). The complements render at full lot level as you zoom in. The footer now shows Data v0.26.0.
  7. Data Data v0.24.0—a cumulative jump from v0.12.0. The biggest shift for readers is scope: the “Significant Urban Area” is now the canonical full-metro extent, so the whole-of-metro figure sitting beneath each city’s 20km headline—and every per-control section (highly-restricted, low-density, heritage, the two-storey cap, detached-only)—now reads a true Significant-Urban-Area cumulative rather than the old ring-sum proxy, giving an honest contrast against the 20km number. Along the way the data corrected several long-standing distortions: Melbourne now clips to the Greater Melbourne boundary and gained housing-typology classification (its detached-only metrics fill in to parity with the other seven capitals), Perth’s rural-residential land is excluded from the metropolitan low-density count, Darwin is treated as having no rapid transit, Brisbane’s three-storey LMR uplift propagates across whole strata schemes, and reform uplift now excludes heritage parcels at exact parcel grain. The detailed-zoning map was rebuilt too—heritage renders as the geometric intersection with the overlay extent rather than whole zone polygons, statewide-source cities clip to their metro boundaries, and new complement map layers (the over-two-storey footprint and a non-heritage wash) shipped live in the tiles. The footer now shows Data v0.24.0.
  8. Fix The homepage scrollytelling now fits every viewport. Before, the sticky visuals—the eight-city bar chart, the city-grid maps with their eight-row ranking strips, and the image cards—overflowed and got clipped on short laptops, cutting off the bottom city rows and the tops of maps. Now every visual scales as a whole to fit both the height and width of the screen, never upscaling beyond its natural size and re-fitting on resize, so charts, maps, legends and ranking lists always land fully on screen. The visuals also sit clear of the site header instead of centring behind it, and their drop-shadow no longer gets sheared off at the edge. Verified across a range of laptop and desktop resolutions for every story step.
  9. Data Data v0.12.0—a Brisbane + Melbourne refinement, cumulative from v0.10.0. Brisbane’s Low–Medium Density Residential lots now lift from two storeys to three where they meet City Plan’s transit condition—within 400m walking distance of a rail or busway station and fronting a road reserve at least 15.5m wide—so the share of Brisbane capped at no more than 2 storeys eases (within 5km, 75.6% → 72.2%). A knock-on: Brisbane is no longer the most transit-restricted capital—unlocking that near-station land drops its transit-proximate restricted share just below Adelaide’s, so Adelaide (≈84%) now leads that ranking and the homepage’s rapid-transit spotlight features it. Melbourne’s Housing Choice and Transport Zone is now split into its HCTZ1 and HCTZ2 height schedules (lot-size and frontage dependent), refining Melbourne’s height and reform-capacity figures—its restriction shares are unchanged. Also folded in: precinct-granular residential typology across all five Greater Brisbane councils, and NSW Accelerated TOD precinct tagging in Sydney. The footer now shows Data v0.12.0.
  10. Data Data v0.10.0—a reconciling release. Council membership is now correct on the city fringe: every suburb’s parent council resolves to a real council page, so suburbs on the outer edge link back to where they actually sit. Seventeen Hobart suburbs—Blackmans Bay, Bonnet Hill and the like—sit in Kingborough, which (along with Derwent Valley and Sorell) is now part of Hobart’s council list rather than an off-map name; their pages previously printed the council as plain text to avoid a dead link, and now link through. Each city page also gains a data-coverage bar beneath its chart-and-map sections—a red/green/grey strip showing how each control divides that city’s residential land: restricted, not restricted, or no published limit (the conservative-floor land we keep in the denominator but never count as restricted). On the homepage, the spotlight maps now carry a compact legend overlay reading the same split. The footer now shows Data v0.10.0.
  11. Data Data v0.9.0—a cumulative jump from v0.3.0. The headline definition of “highly restricted” is now a four-way union: alongside 2-storey caps, low-density-only zoning, and heritage, it counts land that permits only detached dwellings. In practice that fourth control is almost entirely already low-density or two-storey, so the headline shares barely move—it completes the definition rather than changing the number. Darwin now includes the City of Palmerston (a new council page; Darwin’s low-density share rises about 11 points as the cadastre extends beyond the inner city). Brisbane’s reform-capacity baseline is corrected to a Greater Brisbane five-council sum. Maps gained two things: a per-component spotlight for the new detached-only control, and a grey “no data” layer showing where a control simply isn’t recorded for a parcel (Melbourne, for instance, has no detached-only data, so that map reads grey). The footer now shows Data v0.9.0.
  12. Feature Restriction maps now read in full colour. Beneath the red highly-restricted land, every map paints a green “open residential” underlay—so you can see what’s open as well as what’s locked, rather than red floating on a bare basemap. The headline-radius ring around each city is drawn solid (a few captions and the legend had described it as dashed, which no longer matched the map). A grey layer for residential land with no published control data is still to come—it needs a new field from the upstream pipeline before we can draw it honestly.
  13. Data Data v0.3.0—two targeted corrections in Sydney and Melbourne; the other six capitals are unchanged from v0.2.0. The bigger one is Sydney’s CBD core: land in the Metropolitan Centre zone (the SP5 code that replaced the old B8 business zone in the 2022 Employment Zones reform) now counts as residential, lifting the residential share of the innermost ring from 7.8% to 37.7% and adding about 1.3 km² of inner-ring residential land. Sydney’s 5 km restriction shares ease by a point or two as a result (2-storey 46.1% → 44.0%). Melbourne drops seven mistakenly-included parcels, trimming 0.29 km² with no meaningful effect on its headline figures. The footer now reads Data v0.3.0.
  14. Fix Maps caught up with the new tiles. The detailed zoning map now colours actual planning-scheme zone codes—every code in every capital assessed like-for-like and bucketed onto the same restrictiveness ladder (Perth’s R-code ladder now splits properly from R2 through R160; Sydney’s R1–R5, Canberra’s RZ1–RZ5/CZ codes, Adelaide’s P&D Code zones, and Brisbane’s City Plan codes all map per scheme, since the same code can mean different things in different states). A test now guarantees every zone shipped in the tiles has a colour, so future data updates can’t silently grey the map. Council and suburb maps also frame deterministically off their own boundary geometry instead of waiting on tile arrival—no more cropped or mis-zoomed viewports—and suburb maps gained the smooth low-zoom→parcel handoff council maps already had. Verified with rendered screenshots of all eight capitals.
  15. Data Data v0.2.0—a twelve-issue correctness batch from the upstream pipeline, now reflected site-wide. The biggest movement is Melbourne: commercial zones (C2Z/B3Z/B4Z) no longer count as residential, and Urban Growth Zone land only counts where the underlying land use is actually residential—together trimming Melbourne’s residential footprint by about 200 km² and its modelled reform capacity by roughly 13%. Brisbane’s Emerging Community zones are now excluded outside named precincts (−2.3% reform capacity). Perth gains a “Special Control Area” zoning category and admits Special-Use-with-R-Code land; Adelaide’s Historic Area overlays now appear in the heritage breakdown (about a quarter of inner-ring heritage) alongside zone re-buckets and strata-corrected parcels (+21.9 km²); Hobart picks up Particular Purpose Zone residential land; and major stadiums are excluded everywhere. Headline restriction shares barely move—these are classification corrections at the margins, not methodology changes. The footer now shows the dataset version (v0.2.0) with a link to the upstream changelog.
  16. Feature The CMS is live, and the site’s data-independent prose now lives there. Sanity Studio (at /admin, for editors) now manages the About page, the homepage hero, the FAQ, the long-form reform explainers on /reforms, city-page narratives, and the site’s canonical contact address—which /contact and /press now share, so they can’t drift apart. Studio bodies support rich text, tables, and captioned images, rendered in the site’s house style. Pages with data-wired prose (methodology, assumptions, the research deep-dives, the evidence pages) stay in the repository where their numbers are computed. Publishing in Studio triggers a site rebuild, so edits go live in minutes. A side-effect fix: the reform explainers previously rendered their bold markers as literal asterisks—they’re real emphasis now.
  17. Fix Site-wide copy edit. A full editorial pass over every reader-facing page outside the homepage story—methodology, FAQ, reforms, the research deep-dives, comparisons, and the council/suburb/SA2 templates—tightening machine-drafted prose to the site’s house voice. No number, finding, or caveat changed: wording only, with every edit logged before/after in the repo. Along the way we fixed real rendering bugs: doubled page titles on four pages (“…—Australian Zoning Atlas—Australian Zoning Atlas”), stray spaces inside statistics (“α= 0.85”, “12.8 %”) caused by template line breaks, mid-word broken hyphens (“income- driven”), and a handful of sentences that said the opposite of their own charts—“rollback compresses constraints”, a council reform caption describing the removal (rather than the granting) of an 8-storey allowance, and a research heading that placed peak fertility in the inner ring.
  18. Methodology Every restriction-share number on the site now divides by the same denominator. The headline “highly restricted” figure has always excluded rural-residential land (it’s neither buildable-up land nor a fair denominator), but the component shares—2-storey, low-density-only, heritage—were still measured against all residential land. Where a component sat beside the union that contains it, the two were on different bases, which let a component read larger than the union: Hobart (53% rural-residential) showed 2-storey at 99% above a “highly restricted” headline of 98%. Backend now ships every component on the ex-rural basis, and we’ve switched all of them across the site—city pages, rankings, SA2 / council / suburb pages, the choropleth, the compare tool, and the embeds—so “highly restricted ≥ each component” holds everywhere (verified across 12,078 area comparisons). Hobart now reads 2-storey 97.5% under a 97.9% union. We also dropped the rural-residential overlay from the low-density map (it contradicted the now-rural-excluded metric) and corrected the methodology pages, which still described several now-shipped pieces—the reform-uplift matrix, lot-by-lot capacity, the confirmed Melbourne baseline, the SUA scope—as “about to change”.
  19. Feature Reform uplift now reads down to the council. The backend reform-uplift matrix (net additional homes each reform legalises over today’s controls, scored lot-by-lot, whole-metro) landed at LGA grain, so every council page now carries a “How much could this council build under reform?” card, and Comparisons gains a national “Which councils unlock the most?” leaderboard for the Townhouse Code and Mid-rise-everywhere reforms. Per-council figures come straight from the same matrix the headline reform numbers use—no more prorated per-hectare estimate. Melbourne’s zoned-capacity baseline was also restored to its original collation value; its “potential dwellings increase” moves accordingly. We relabelled the “greenfield” lot-size figure throughout as the UDIA average (the median new-estate lot), not a regulatory floor—it’s a benchmark we compare built and regulated lots against, not a minimum below which estates can’t subdivide. The About menu now lists Assumptions and drops Press.
  20. Data Re-ingested the backend, and Darwin’s lot cadastre landed. Built from the NT land-titles cadastre (20,588 residential lots, median ~817 m²), Darwin is now a full parcel city—it runs the per-ring lot metrics, lot-by-lot, frontage and reform-uplift like every other capital (the ~16% dense-strata placeholder lots sit out the geometry-dependent stages but still count for area, count and zoning). Canberra (ACT) is now the only capital without per-distance-ring lot breakdowns. We also surfaced a new lot-size dataset—the actual median existing lot in each city (Melbourne 506 m² up to Darwin 817 m²), distinct from the UDIA greenfield average—on the minimum-lot-size page, the data inventory, and as a “median lot” tile on every suburb and council page.
  21. Data Flagged Darwin’s lot cadastre as in-motion across the About explainer pages. Darwin’s planning data is still zone-level on the live site, so it sits out the per-parcel lot-by-lot, frontage and reform-uplift metrics—aggregate min-lot stats still ship. Upstream, an interim parcel build has landed (backend) and a full-cadastre rebuild is underway that supersedes it; Darwin’s lot-level figures will update on the next data re-ingest. The caveat is sourced once from the city-profile module and surfaces on both the Data and Methodology pages.
  22. Methodology Clarified how unknown building heights are handled. Residential land with no published height limit is kept in the denominator but counted as NOT height-capped (as if it permits more than two storeys), so the 2-storey share and the headline restricted figure are a conservative floor—they under-count restriction wherever height data is sparse (notably WA and the Darwin core), never over-count it. A known-height-only variant that reads higher stays on /data. Spelled out on the methodology glossary.
  23. Feature Added a “two denominators” panel to the zoning-blocks-housing evidence page. Approvals per km² stays the headline; approvals per 1,000 existing dwellings now ship alongside as a co-equal robustness companion (top-vs-bottom-bucket gap -52% vs -26%; pooled Poisson -10.2% vs -4.4% per +10pp low-density). Dividing by existing dwelling stock runs milder because the stock is itself downstream of decades of the same zoning—the divergence is part of the evidence, not a contradiction.
  24. Methodology Standardised the “restricted suburbs approve fewer homes” gap on the conservative figure everywhere—the mean of the five annual bucket drops (~52%)—rather than the pooled five-year-mean method (~66%). The home page previously led with 66% while the evidence page said 52%; both now derive from one source, and the larger pooled figure is shown only as a clearly-labelled alternative.
  25. Data Revived Victorian/NSW/SA sale-price data (Valuer-General overlay) across the suburb + council market data and the price-based findings. Prices appear in the findings and methodology/experimental context only—they remain deliberately off the council, suburb, and SA2 detail pages.
  26. Methodology Low-density narrowed: rural-living zones excluded (YIMBY-101-Data /). NSW RU5 + C4, QLD RR, VIC LDRZ, SA Rural Living / Neighbourhood / Settlement / Shack Settlement, TAS Rural Living, NT RL + RR were previously counted as low-density but cover rural-residential land, not the suburban single-dwelling-only land the metric is meant to capture. Brisbane low-density @ 20km: 68.0% → 48.2% (Δ-19.8pt—QLD RR was a big chunk). Sydney: 70.4% → 66.3% (Δ-4.1pt). Other cities unchanged. Union-restricted unchanged because rural land was also caught by the 2-storey cap.
  27. Data Zoned-capacity outputs landed (backend). Per-ring, per-LGA, and per-SAL dwelling-uplift estimates under 3-storey townhouse and 8-storey mid-rise scenarios, plus an annual-flow translation (~1%/yr central, 0.7%/yr low) sourced from California/Auckland/NYC natural experiments. Calibrated to published state-government baselines for 5 cities; Sydney + Melbourne + Darwin ship uncalibrated. 4–7 storey scenarios deliberately excluded—they fall in the infeasibility gap between walk-up townhouse and lift-served apartment.
  28. Methodology Low-density-only redefined per Ethan’s Appendix 1—per-state zone lists rather than a one-size-fits-all keyword match. Adelaide 5km: 35% → 57%, Hobart 5km: 7% → 14%, Sydney 5km: 24% → 26%. Melbourne and Canberra unchanged. The broader Adelaide definition adds 8 detailed neighbourhood zones; Hobart adds Village + Rural Living + Future Urban; Sydney adds R5 + RU5 + C4.
  29. Methodology PT proximity now leads with share_restricted_in_pt—the fraction of land within 800m of rapid transit that is restricted, rather than the legacy fraction of restricted land that happens to sit near transit. Both numbers stay in the API; the canonical framing is the policy-relevant one (how much amenity-rich land is locked up).
  30. Data Rapid-transit stops switched from OSM all-modes to a GTFS mean-headway filter (buses qualify at ≤15 min mean headway across the weekday 7am-7pm window, with a rail / tram / ferry fallback for cities without a public feed). Hobart drops to zero rapid stops; bus-heavy networks (Canberra, Darwin) shrink as expected.
  31. Data WA pipeline migrated to parcels-area-based (matching every other state). Adelaide CBD landmark corrected; numbers shifted accordingly.
  32. Feature Rebranded to Australian Zoning Atlas; switched typography to Space Grotesk.
  33. Feature Rankings now toggle between 5km / 10km / 20km / 30km radii.
  34. Feature /councils/[code] gained per-LGA ring charts; SAL ↔ LGA cross-linking.
  35. Feature PT proximity map shipped (stops + 800m buffer + restricted-near-PT overlay).
  36. Methodology Heritage metric now sourced directly from upstream heritage-all instead of derived 2.1 × 1.2.
  37. Data ACT + NT per-SAL polygon coverage repaired (Canberra 5 → 106 SALs; Darwin 2 → 62 SALs).
  38. Methodology Maps now show a dashed 20km radius overlay matching the headline scope.