
The Map I Never Meant to Build
Sixty thousand views, three neighborhoods asking to borrow it, and a little map that got a bit better every spring until it turned into something anyone can run.
Here is a number I did not expect: 60,653.
That is how many times people opened a map of my neighborhood last spring. Not a map of the parks, or of where the good coffee is. A map of other people's garages.
So here is the question I keep turning over. How does a neighborhood yard sale pull the kind of traffic a small business would pay real money for? And how did the little map behind it end up with three other neighborhoods emailing to ask if they could run their own?
To get there, I have to tell two stories at the same time. One is about a block coming alive. The other is about a piece of software I never meant to make.
The Block
Spring 2025. My wife and I organized North Tabor's first-ever neighborhood-wide yard sale. She heads communications for the association and I serve as co-chair, so this was the kind of thing we handle on a weeknight and then keep talking about at dinner.
We scheduled it exactly one week before the neighborhood cleanup, which turned out to be the smartest part: sell what you can on Saturday, and haul the rest to the dumpsters the following week. Thirty-eight households signed up. People wandered from sale to sale with coffee in hand, and the Rainbow Garden plant sale sold out before noon.
That was the whole point, not the map. The map only mattered because thirty-eight sales scattered across a neighborhood are impossible to find without one.
The Map That Broke Itself
So, the map. The first version was already better than it had any right to be. It was a live Leaflet map that read straight from the Google Form's spreadsheet and redrew itself every time a neighbor signed up. There was no dragging pins around by hand, and I was proud of it.
It had one flaw, and it was fatal. To turn a street address into a dot on the map, it called the Google geocoding API in the browser, every time the page loaded, for every single pin.
You can probably see where this goes. A map that re-checks every address every time someone opens it will chew through a free API quota fast, and the more popular the map gets, the faster it dies. The thing worked so well that its own traffic strangled it. The night before the sale, with people about to go hunting for couches at 9 a.m., the map went dark.
So I did the unglamorous thing: I dumped every pin into a Google MyMaps by hand and left both of them running. That began as an emergency patch, but it stuck around for a better reason. A MyMaps map syncs straight into the Google Maps app people already have on their phones, so a neighbor can pull up the sales and get directions from the app they use for everything else. We still rebuild it by hand the night before every sale, since MyMaps offers no public API to automate against. The live web map on the site is the one I maintain, and the MyMaps is the copy that rides along in everyone's pocket.
The Fix
When it came time to run the sale again, I did not rewrite the whole thing. I fixed the one part that hurt.
Instead of geocoding addresses in the browser on every load, I moved that work into the spreadsheet itself. A small script now runs once, the moment a neighbor submits the form: it looks up their coordinates and writes them into the sheet next to their address. The map simply reads the numbers that are already sitting there. Each address is looked up once and kept, instead of being recomputed thousands of times a day.
That was the entire second version: one boring, load-bearing fix. It is also the reason the 2026 map pulled 39,456 views without a single panicked, night-before scramble, while the original 2025 map kept right on going, its own view count now past sixty thousand. By then the sale had a new name, Tabor Neighbors, because it had spilled past North Tabor into the neighborhoods around us. Fifty-six households signed up that year.
The Emails
Here is the part I did not plan for.
The first email arrived after our very first sale, back in 2025. Someone from the Reed Neighborhood Association had found our map, popped the hood, and written to say that it looked like "Leaflet but fed by your spreadsheet data," and that they just needed a way to get their own sign-up sheet into the same format. They had already reverse-engineered the whole approach. They just wanted the bridge.
The other two came a year later, after our second sale, and close together. Sunnyside, starting from scratch: "Apps you use, fees that you charge, whatever you have would be helpful." And Paul, organizing the Mt. Tabor sale, who wanted the harder stuff: a two-day weekend version, and a way for neighbors to log back in and edit their own listing, because the previous year people had sent him changes right up until the morning of the sale.
Three neighborhoods. And there is an old rule in software for exactly this moment: you do not build the reusable version of a thing until you have watched the same need turn up three separate times. Once is a fluke. Twice is a coincidence. The third time is the work telling you what it wants to be.
Reed was the one who saw it first. Mt. Tabor was the one whose ask I actually built. And somewhere in there, the goal changed. It was no longer "make next year's North Tabor sale a little smoother." It was "make this something a stranger could run without me in the room."
The Thing It Became
So the third time I opened this code, I did not just patch it. I pulled it out of North Tabor's website entirely and rebuilt it as its own small open-source project: a set of web components, released under the GPLv3.
This was the pass where it grew the parts other neighborhoods needed. A search box that filters the map and the list at the same time. Day checkboxes, so that Mt. Tabor's Saturday-only and Sunday-only sellers each show up on the right day. The features that turn "my neighborhood's map" into "a map."
Here is how you run it now: drop a few tags on a page, point it at a Google Form's responses, and you get the map, a searchable list of who is selling what, and the search box tying them together. Setup takes about twenty minutes and is mostly clicking around in Google, with one short snippet to paste at the end. If you would rather not touch that part, it is a block you can hand to whoever manages your site.
The whole thing sits on a spreadsheet you own, a form you own, and your own website. No per-sale fee. No accounts. Nothing in the middle to lock you in or to turn your neighbors' addresses into somebody's dataset. It is GPL, so it stays that way.
The walkthrough and the code are here: github.com/sparkstonepdx/yardsale-map.
I keep coming back to that plant sale selling out before noon. The map was never the interesting part. The interesting part was a couple hundred people leaving their houses on the same Saturday to go meet each other over folding tables. The software just had to get out of the way and let that happen.
If your neighborhood wants to run one, grab it, and reach out if you get stuck. I will help you get it standing. And if you do use it, let me know. I like watching the small things I build show up doing real work out in the world.