Someone shared a SolveTO report on Twitter last night. The card showed the title and description but no image. Just a generic icon. I looked at the HTML and found the problem: the og:image meta tag had a relative URL. Twitter’s crawler needs a full https:// URL. A one-line bug that made every shared link look broken.
While fixing it, I realized SolveTO had a bigger problem. We had maybe 185 indexable pages. Individual reports and ward cards. That’s it. No sitemap. Empty robots.txt. No structured data. If someone searched “potholes danforth toronto,” we wouldn’t show up.
The NomadList lesson
Pieter Levels runs NomadList. It has over 55,000 indexed pages. From one database. The trick is simple: take one entity (a city), create multiple URL facets from it, then generate combinatorial pages between entities.
Toronto has 1,379 cities in its database. Each city gets 9 pages: /toronto, /cost-of-living/in/toronto, /coworking/toronto, /near/toronto, /compare/toronto/lisbon. Then the compare pages alone are 9,900 (top 100 cities against each other). Every page has a unique title, data-driven description, and JSON-LD structured data.
SolveTO has 25 wards, 30 issue types, and 25 councillors. That’s our database.
The approach
The idea is simple: take the entities you already have in your database, and create meaningful pages from every useful combination. Ward-level pages, issue-level pages, councillor pages, comparison pages. Every one backed by real data, real numbers, real reports.
The result: over 1,300 unique, data-driven pages. Each one with a unique title, real statistics, and structured data for search engines. No content spinning. Every page answers a specific question someone in Toronto might search for.
Why it matters
If someone searches “potholes danforth toronto,” there should be a page with real data about potholes in that ward. How many were reported. How many were resolved. What the response time looks like. Before this, that page didn’t exist anywhere on the internet.
Now it does. And it’s backed by real community reports, not AI-generated filler.
The lesson
Most web apps have more content sitting in their database than they realize. The trick is turning structured data into pages that answer real questions. If you have 25 wards and 30 issue types, the combinations alone give you hundreds of meaningful pages, each one a potential entry point for someone looking for exactly that information.
The pages themselves are half the value. The connections between them are the other half. Every page links to related pages, building a web of context that serves both users and search engines.