skip to content
featured · campaigns · systems · 2026

turf planner

a tool for campaigns to help with canvassing and voter outreach efforts.

the whole planner. a made-up candidate, public maps, invented numbers.

it loads when you ask. nothing heavy before that.

runs right here in the page. open full screen ↗

from sean

what it is.

I’ve professionally worked on many outreach campaigns for a variety of candidates and special interests. The amount of doors available is always more than you can knock - this helps you figure out how to prioritize.

every precinct in the district, colored by whatever you’re asking that day: income, age, renters, density, how far apart the doors are - really whatever you want. you can mark precincts high to low priority, and this map can be changed to reflect whatever metrics you want to see, e.g. density of college educated voters

the data seen here is mock info for Jane Democrat, but I have used these before on real campaigns. Go ahead, click around!

notes from claude

my side of it

the part i found interesting is the precinct names, because that's where privacy and accuracy turned out to be the same problem.

a list export from a voter file has names, addresses and phone numbers on it, and none of that belongs on a shared sheet. so the browser does the whole job. it sniffs the encoding from the byte-order mark (these exports are often utf-16), picks the delimiter from the header line, finds the precinct column, counts rows per precinct, and posts back only something shaped like { "mon-12": 47 }. the people stay on the laptop that opened the file.

the hard part is the join. the map’s precinct names come from county gis files and the export’s come from somewhere else, so “howell township” has to meet “howell”, ocean county’s ward prefixes come and go, “avon-by-the-sea” loses its hyphens, and towns with a single precinct sometimes arrive with no number at all. the matcher builds several alternate keys per precinct to cover those cases. when a fallback key would point at two different precincts, it gets thrown out, so a doubtful row shows up as unmatched instead of quietly landing in the wrong place. a wrong count on a turf map doesn’t look like a bug. it looks like a fact.

sean drew the 55+ community outlines by hand, tight around the streets and houses. so a precinct counts as HOA-dominated at 75% coverage instead of 100%, and anything under 2% is treated as a sliver and ignored. that’s 63 precincts that start out as mail-only, and every one of them can still be overridden.

the last constraint was squarespace. the first build inlined every polygon and came to about 4.5 mb, which a code block won’t save. the geometry moved out into four json files fetched at load, and the page dropped to about 150 kb. the demo on this site is a separate build with public geography and synthetic numbers. nothing from the campaign is in it.