What are tenants actually paying across NSW?
Turns official NSW rental bond lodgements into median weekly rents by dwelling type, postcode and month: signed rents, not asking prices. A tested dbt pipeline on DuckDB feeds a live dashboard.
Live. The dashboard and the pipeline behind it are both published.
Overview
Listing sites show what landlords are asking. NSW Fair Trading records what tenants actually signed, through rental bond lodgements.
RentLens turns those official records into median weekly rents by dwelling type, postcode and month, and flags bad rows such as missing or implausible rents before they reach the numbers.
Architecture
Monthly spreadsheets are downloaded and landed as Parquet, modelled with dbt on DuckDB, and published as a static Chart.js dashboard.
- NSW Fair Trading spreadsheets
- Ingest: download and land as Parquet (safe to re-run)
- dbt staging: type-cast and rename
- dbt intermediate: flag bad rows
- dbt marts: median rents by month and by postcode
- DuckDB
- Static dashboard on GitHub Pages
Live dashboard
Data: NSW Fair Trading rental bond lodgements, © State of New South Wales, licensed under Creative Commons Attribution (CC BY). Median rents are my own aggregation of that data and are not an official NSW Government statistic.
Design decisions
Watermark on arrival time, not lodgement date
An incremental model needs a watermark. Using the event time (lodgement date) would silently drop late-arriving records, so the model keys on when each file arrived. A test checks that late records land; it only proves the incremental case once a second, later batch of files is added, which is still to do.
How it is built and checked
- dbt build (models plus tests) runs in CI on every push and pull request.
- A script checks the numbers published on the dashboard against the pipeline's output.
- An engineering log and an architecture decision record document the work.
- The dashboard's third-party script is pinned with Subresource Integrity.
- Dashboard accessibility, performance and security measurements are recorded with dates and commands in this site's METRICS.md.
Roadmap
- A data.json pipeline: Python queries the dbt marts and the dashboard reads the result dynamically
- dbt column descriptions and dbt docs published to GitHub Pages
- A SQL agent over the DuckDB marts
- Monthly automatic ingest when NSW publishes new data
Known limitations
- Covers new tenancies only: it shows the rent agreed at lease signing, not what existing tenants pay now.
- Bonds can be lodged up to about six weeks after a lease starts, so the latest months fill in late.
Repository activity
- Last push
- 24 Oct 2026
- Licence
- MIT
- Latest CI run
- Passing (opens in a new tab)
Content checked against the project README and repository on 24 Oct 2026. Repository activity is read live from GitHub and refreshed hourly.