How We Built the House Price Dashboard
When we set out to visualise every residential property transaction in England and Wales, we knew we'd need a stack that could handle serious data volume without serious infrastructure costs. Here's how we did it.
The data
The UK Land Registry publishes a complete record of every property transaction since 1995 — around 30 million rows. The dataset includes the price paid, the date, postcode, property type, and whether it was a new build or existing property. It's published as a single CSV file that weighs in at several gigabytes.
Why DuckDB?
We needed something that could aggregate millions of rows quickly, run on a single server with no external database infrastructure, and ideally fit in a single file we could deploy alongside the application. DuckDB was the obvious choice. It handles analytical queries over our full dataset in milliseconds, and the entire database file is small enough to store in S3 and pull down on deploy.
The API layer
FastAPI serves both the data endpoints and the static frontend. When you load the map, it fetches pre-aggregated price statistics by postcode district and year. The aggregation happens at database build time, so API responses are fast and cacheable.
The frontend
The map itself is built with Leaflet, rendering GeoJSON boundaries for each postcode district. We colour each district on a gradient based on average price, with the scale adjusting dynamically as you change the year or property type filter. The whole thing is vanilla JavaScript — no frameworks, no build step.
What's next
We're working on inflation-adjusted comparisons, more granular postcode sector data, and an AI chat feature that lets you query the data in natural language. Stay tuned.