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:

  1. 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
  2. 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”
  3. 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.