Small Fixes, in the Order I Found Them
2026-08-23
# Small Fixes, in the Order I Found Them I spent most of this weekend somewhere I didn't expect to end up, which was inside my own website's plumbing instead of at a table with dice on it. No con, no session report, just a laptop, a half-finished Monster, and a running list of things about the site that had been quietly bothering me for weeks. It started Friday night with the unglamorous stuff. I gave the site actual app icons and a manifest file, the kind of thing that lets someone add it to their home screen and have it open like a real app instead of just another browser tab buried under six others. I wrote a service worker, set proper cache headers so the icons and the meeple SVG can sit there forever unbothered while the manifest and service worker itself always get rechecked, and built social preview images for the landing page, the photography section, and the Game Shelf, so a link dropped into a text message actually shows something worth clicking instead of a blank gray box. None of it is visible in the way a new feature is visible. It's the kind of work that only shows up as an absence of small annoyances, which I've come to think is most of what good craft actually is. Saturday I wrote up the rate limiting plan for four public endpoints, the concierge, the geocoder, the nearby-stores lookup, the BGG import, capping each one per visitor so nothing gets hammered by accident or on purpose. I left it failing open on purpose, meaning if I never run the one-time setup command, nothing breaks, it just stays unprotected. I liked writing that note to myself. There's something honest about building a safety net and then writing down, plainly, what it doesn't catch. Comments and reactions still write straight to the database with no net under them at all, and I said so, rather than pretending the job was more finished than it was. Somewhere in that same stretch I also built the golden hour widget for the booking calendar on the photography side, which ended up being one of my favorite pieces of the whole weekend. A client picks a date off the calendar, and the site works out, right there, no API key and no network call, the morning and evening golden hour windows, sunrise, sunset, and both blue hours for that day, using nothing but the sun's actual position in the sky. It defaults to Memphis since that's where the shoots happen, but there's a quiet "use my location instead" link under it that asks for geolocation and, if it's denied or the browser balks, just falls back to Memphis without a word of complaint. I keep thinking about how much of photography is really just scheduling around light you don't control, and here's a little tool that does the math on that light before anyone's even shown up with a camera. It felt like the kind of thing worth building even if only three people ever click it. Then today, Sunday, I finally sat down with the Game Shelf itself and went hunting for bugs I'd been telling myself I'd get to eventually. The one that had actually been nagging at me was a game mismatch in my own collection. I'd search for Go! Go! Go Kart and somehow get an Arkham Horror promo card instead, and I'd shrugged it off as bad data more than once. Turns out it wasn't the data at all. It was timing. Typing quickly fired off a new search on every keystroke, and if a slower response for an earlier, shorter guess like "Go K" happened to land after the correct one for "Go Kart," it would silently overwrite the dropdown with noise right as I went to click. The fix was to give every request a sequence number and only ever trust the most recent one. It's a small thing, a few lines, but I keep turning it over. How much of what we mistake for wrongness in a system, or in a person, is actually just an earlier answer arriving late and getting mistaken for the current one. After that I moved the monthly play log up to sit right under the heatmap where it belongs instead of stranded at the bottom of the page, gave it a heading it never had, and fixed an edit button that would quietly do nothing if you opened a game from anywhere other than the Collection tab. Three commits, all logged properly for the first time, since I'd been running this site off a live "baseline" for longer than I want to admit. None of this is the kind of weekend I usually write about here. There's no table, no dice, no one across from me. But I noticed the same thing I notice after a good long game, that satisfaction of a system finally doing what it was always supposed to do, quietly, without anyone having to think about it again. I closed the laptop with the cursor still blinking in an empty terminal, four fixes deeper into a site nobody's grading me on, and it felt exactly as good as it should. Now to play a game.... By Norman, BigGame, BGG Tabletop. Photography. Philosophy. The spaces where they all live.