Web Experiences

SaskTaxSales

A live map of every Saskatchewan property a municipality has advertised for sale, assembled every morning from five hundred public sources that never publish the same way twice. Brand, product, pipeline and business, built and operated solo.

SaskTaxSales project image
Project
SaskTaxSales, self-initiated
Sector
Land, public records and local government
Services
Identity, product, build, data, growth
Live at
sasktaxsales.ca

The information was already public. It was just published one town at a time, in five hundred places, and never in the same shape twice.

Deliverables
  • Brand identity and design system
  • Product design and front end
  • Backend, database and daily data pipeline
  • 1,456 server-rendered pages
  • Membership, checkout and billing
  • Hosting, monitoring and daily operation
Overview

A Saskatchewan municipality that is owed back taxes can eventually take title to the property and sell it. When it does, it has to advertise: in the Provincial Gazette, in a small-town weekly, on its own website, in a council agenda PDF. That is the whole system. It works, and it is completely public, and it is unusable, because no two of the seven hundred and eighty-six municipalities publish the same way and none of them publish anywhere a buyer is already looking.

SaskTaxSales reads all of it every morning and puts it on one map. Fifteen hundred listings across a hundred and sixty-three municipalities, each one drawn to its real registered parcel boundary and linked back to the notice it came from.

It was designed, built, branded and launched alone over one summer, using Claude for the parser work and the research, which is the only reason a project with this much surface area was possible without a team.

The mark is a section corner

Saskatchewan is surveyed on the Dominion Land Survey: the whole province is cut into one mile sections, each section into four quarters, and every legal description on the site is a coordinate in that grid. The mark is that grid seen from the ground. Four green quarters recede toward a horizon, split by the road allowance that runs between them, with a blue survey star where the four corners meet.

It is drawn in perspective rather than plan, which is the decision the whole identity rests on. A plan view would have been a map, and there are enough maps in this category. The perspective makes it land.

The wordmark splits the same way the product does. Sask in green is the place; TaxSales in blue is the mechanism. Two colours, one lockup, and the mark works at sixteen pixels in a browser tab because the four quarters and the star hold their shape all the way down.

The road allowance draws itself first, then the quarters fall in behind it
The full lockup
The mark alone
#609348
#5C7C99
#1D6B4A
#EFB425
#F6F5F0
#1F2A30

Warm paper, not a dashboard

Everything about this subject invites a dark interface with red urgency chips, and it is the wrong instinct. These are people’s houses, lost for unpaid taxes, and the buyer is usually a retired couple in a small town rather than an investor with a spreadsheet. The interface is set on warm off-white paper, with a serif for anything a person reads as a fact and a grotesk for everything they operate.

Three typefaces, each with a job that never overlaps. Newsreader carries civic addresses, prices and dates, because a serif reads as a record. Hanken Grotesk takes the interface. Roboto Mono takes legal land descriptions and parcel numbers, which have to be transcribed exactly and are never read as prose.

Colour is functional throughout. Green is open, gold is closing soon, grey is closed, blue is a tax-title listing. Nothing on the site is coloured to be decorative, so a colour anywhere is always information.

There are two greens on purpose and they are never reconciled. The logomark green sits at 3.64 to 1 on white, which is right for a mark and would fail accessibility as text on a filled button, so the interface green is a darker one at 6.45 to 1. Repainting the mark to match would have been tidier and would have split everything already published into a before and an after.

The founding member badge, and the argument above in one object: the disc is the darker interface green, the mark is reversed out of it, and the survey star is the gold that means closing soon

One map, fifteen hundred parcels

Every listing is plotted against the province’s public cadastral service, so the shape on screen is the registered parcel and not a pin dropped on a street. Fourteen hundred and forty-three of fifteen hundred and thirty-one are located that way, twelve hundred and forty-five of them as an exact single-parcel match. The rest stay honestly unplaced rather than being approximated onto a town centre.

The card is the whole argument for the product in one component: satellite imagery with the parcel outlined in gold, the municipality, the civic address in a serif, the legal description in mono, the size in acres, and the closing date. A buyer can rule a listing in or out from the card, which is what makes a list of fifteen hundred usable at all.

Opening a listing gives the deposit, the parcel size, the bidding method, the administrator’s name and phone number, and a link that opens the municipality’s own notice. The site never becomes the source. It is the index.

The board: list and map
A listing open, parcel pinned
Satellite base layer

Most of this traffic is standing in a field

Mobile is a separate design rather than a narrowed one. The board splits into two tabs, listings and map, because a split view at three hundred and ninety pixels gives you neither. Opening a listing raises a sheet over the map, stopped partway so the parcel stays visible above it, and the sheet drags up to full height from there.

The mono legal description is the reason for one of the more unglamorous decisions in the build: its font is loaded with font-display: optional rather than swap, because a late swap reflows every card on the page and pushes the footer down. On a slow rural connection that is the single largest layout shift the site can produce.

Where the site is actually read: one hand, a listing open over the map, somewhere with a slow connection
The sheet stops partway, so the parcel stays visible
Listings tab
Sheet at full height

Five hundred and fourteen ways to publish the same notice

Behind the map is a pipeline that watches 514 public endpoints in 22 different shapes, from structured feeds a machine can read to ordinary municipal web pages watched for change. Every one of them is free and open to anybody, and every one of them is read on terms the publisher set.

Most of what comes back is a PDF of a newspaper page. Some of those pages are scans with no text at all, so they are read with local OCR. Some set two different municipalities’ notices side by side in columns, which a plain text extraction reads straight across and silently merges into one, publishing a parcel under the wrong town’s name. That single failure mode took a column-aware re-read, an arithmetic check that counts how many notices a page declares against how many were parsed, and a rule that every notice states how many parcels it holds and must produce all of them or none.

Sixty-three thousand lines of Python, no third-party dependencies, seventy-six test files. It runs on one small server every morning and finishes in about an hour.

What the product refuses to say

A tax enforcement list is not a for-sale list. A property on it can still be paid off by its owner and most are. Publishing both on the same map, in the same colour, would produce a site that looks twice as useful and gets people to phone municipalities about houses that were never for sale. They are kept strictly apart, and only the second list is public.

The same rule runs all the way down. A row whose OCR is garbled is dropped, not guessed. A parcel with no mapped road says "verify access" and never "landlocked", because a road allowance can grant legal access with no road on it. A listing that disappears from the board says when it went, never that it sold. A garbled closing date is suppressed only when a clean parsed date survives to replace it, because with nothing else there a flag beats a deletion.

None of this is visible on the site, which is the point. It is why the numbers on it can be trusted, and it is a large fraction of the work.

Fourteen hundred and fifty-six front doors

Nobody searches for a brand they have not heard of. They search for a town.

Every listing is a server-rendered page with its own address, its own parcel map and its own structured data. Every municipality gets a hub. Twenty-one guides answer the questions people actually type, from what a tax title is to whether a tax sale clears a mortgage to whether somebody in Alberta is allowed to buy Saskatchewan farmland. Fourteen hundred and fifty-six pages in the sitemap, all of them free, all of them citing the municipal notice they came from.

The public record is free and always will be: municipality, method, closing date, deposit, legal description, civic address, parcel size, the price and the source notice. The paid layer is the analysis on top of it, which is a different thing to sell and the only version of this that is defensible.

A municipality hub
A collection page

Where it is now

Live since June 2026, updated every morning, free to use with no account. Fifteen hundred and thirty-one listings across a hundred and sixty-three municipalities as of September 2026, with a paid membership for the deal layer on top of the free public record.

It is the first place in Saskatchewan where this record exists in one piece, and it stays that way by being rebuilt every morning rather than by being finished once.