Real Estate ·
Port Moody Property Graph
The Problem
Port Moody’s parcel, property, building permit, and zoning data all live in separate open-data sources with no shared identifiers. Answering a simple real-estate question — what’s this parcel zoned for, has it pulled permits recently, what does it look like next to comparable properties — meant manually cross-referencing three or four different datasets by hand every time.
Constraints
- Source datasets update on their own schedules and occasionally fail mid-fetch
- No official cross-reference between parcel IDs, property IDs, and permit records — matching has to be inferred
- Needed to run unattended on modest hardware, not a full data-warehouse budget
What I Did
Built an ingestion pipeline running on a small AWS Lightsail instance:
- Daily per-dataset ingest jobs — separate scheduled jobs pull parcels, building permits, and zoning districts from Port Moody’s open data, each upserting by source ID so re-runs are safe
- Postgres/PostGIS as the property graph — parcels, properties, permits, and zoning districts are modeled as linked records so a single query can answer “what’s around this property”
- Backups and raw-data retention — every raw source pull is archived to S3 alongside encrypted nightly Postgres backups, so a bad ingest run can always be replayed from the original data
Results
- Currently tracking 14,938 parcels, 14,644 properties, 3,353 building permits, and 958 zoning districts, refreshed daily
- Ingestion jobs run unattended and have been reliable enough that failures are the exception, not the norm
- The dataset is now the foundation for the real estate investment and renovation analysis I’m building on top of it
What I’d Do Differently
The property-matching step (linking parcels to properties to permits) started as a quick heuristic and stayed that way longer than it should have — worth formalizing once the downstream analysis work solidifies what “matched” actually needs to mean.