Skip to content

Blog

Updates from the Canadian Political Data team — launches, technical deep-dives, and notes on what we shipped and why.

This week I shipped paid politician monitoring. You can pick a politician, pick a set of platforms (Twitter, Bluesky, Instagram, Mastodon), pick a cadence (weekly, monthly, quarterly), and the service will scrape their public posts on that schedule, debit credits from your balance per refresh, and show you the result in your dashboard.

The Hansard speech alerts that have been around since user accounts launched are still free and still work. Social monitoring is the second axis on the same Monitor button — same row in our database, same dashboard, different pricing.

Seven ways to analyze: turning one paid surface into a substrate

The first paid AI thing on Canadian Political Data was the Full Report. You'd land on a politician's page, type a topic, click Generate, watch a hold drop on your credit balance, and fifteen minutes later get back a multi-section essay with sourced citations to every quote the model used. It worked. People used it. But it answered exactly one question — what has this person said about this topic, end to end? — and that left a lot of other shapes of question on the floor.

This week I shipped six more.

From 3.4 million vectors to a topic map: how the Semantic Explorer got built

Two weeks ago I wrote about rebuilding the embedding pipeline — trading BGE-M3 for Qwen3-Embedding-0.6B, swapping a hand-rolled FastAPI wrapper for Hugging Face's TEI, and going from 4.7 chunks per second to 50. That post ended with the historical backfill in flight. This post is what happened next.

The backfill finished. 3.4 million speech chunks, every one of them with a 1024-number "fingerprint of meaning" sitting in a Postgres column. Search worked beautifully — type a query, get back semantically similar chunks in milliseconds. But there was a question I kept getting that search couldn't answer: what is even in this dataset? You can't search for what you don't know to look for.

The Semantic Explorer is the answer to that question. It's now live at /explore, and there's a new technical explainer at docs.canadianpoliticaldata.org/explore/how-it-works that walks through every choice in detail. This post is the story of how it got built — what I tried, what I changed my mind about, and what shipped.

A week of coverage, commerce, and one big licence change

Eight days, thirty-eight commits. The kind of week that warrants stepping back from "what did we ship today" to "what shape is the project in now." Three big threads ran in parallel — provincial coverage, monetization, and one quiet-but-load-bearing governance decision.

Accounts, alerts, corrections — CPD is now two-way

Canadian Political Data has been a read-only site since launch. You could browse, search, and click around, but the site had no idea who you were and couldn't do anything for you. That changes today.

Four new user-facing features shipped this week. Plus Quebec Hansard came online, which brings us to three provincial Hansards live. Here's the short tour.

From months to hours: rebuilding the embedding pipeline

Canadian Political Data's search layer runs on vector embeddings — every speech chunk in the corpus is transformed into a 1,024-number fingerprint that lives in a mathematical space where similar meanings cluster together. Ask "housing affordability" and you get back chunks that never use the phrase but argue about gatekeepers, missing middles, and supply-side vs demand-side — because the model understands what the words mean, not just what they are.

Getting there wasn't free. This post is about what it cost, what I found along the way, and what it unlocks.

Towards the definitive source of Canadian political data

When we started SovereignWatch last year, the question was narrow: where is Canadian political data actually stored? We built a scanner, mapped ridings to server pins, and coloured the country by sovereignty tier. The headline — that referendum campaigns for both "leave" and "stay" overwhelmingly host in the United States — did what it was meant to do.

The project is now outgrowing that question. The infrastructure we built to track hosting is, it turns out, most of the infrastructure you need to track political speech itself. This post is about what comes next.