September 28, 2026
• Project
A pipeline that pulls events from 50+ Seattle venues, ticketing APIs and calendar feeds, merges the duplicates, and serves one digest as a web UI, RSS and iCal feeds, and personalized email. 63 commits from May to September 2026, over 4,700 lines of Python outside the scrapers.
Architecture Scraping layer. Static HTML (BeautifulSoup, 35+ sites), JSON APIs (Ticketmaster, Bandsintown, ESPN, Luma, Eventbrite), JavaScript-heavy sites via Playwright, and iCal feeds. Every scraper returns the same Event model.
Read more →July 8, 2026
• 3 min read
Written up in October 2026. Dates are when I actually built it.
Airline rewards activity isn’t a log, it’s a table that quietly edits itself. Points post late, get adjusted, sometimes vanish. I wanted a ping the moment my own account’s history changed, so I built a watcher: about 900 lines of Python with 60 unit tests. It only ever reads my own account.
Don’t hash the columns, hash the meaning Each activity row gets a SHA-256 over (date, description, amount).
Read more →July 8, 2026
• Project
A headless watcher that monitors a loyalty-program account, detects any change to its activity history (including edits and deletions of old rows), and alerts me on Telegram. It only reads my own account. About 900 lines of Python with 60 unit tests, built in three days.
Architecture fetch, diff, alert, then persist. Each run captures the account’s data, diffs it against stored state, sends one message summarizing changes, and only then saves the new state.
Read more →June 3, 2026
• 2 min read
Written up in October 2026. Dates are when I actually built it.
Reviewing your own code like you’re attacking it is humbling. I did that to my events collector and found a good one.
The bug /admin/send-digest emails every subscriber, and it sat behind HTTP Basic Auth. The check was shaped like this:
1 2 if cfg.basic_auth_user: # verify the Authorization header against configured credentials Read that again. If BASIC_AUTH_USER isn’t set, the whole check is skipped, and the endpoint is open.
Read more →May 17, 2026
• 2 min read
Written up in October 2026. Dates are when I actually built it.
Finding out what’s happening in Seattle means checking about fifty websites. I got tired of that and built a thing to do it for me: Seattle Events Collector. It’s over 4,700 lines of Python before you count the scrapers themselves, and most of the interesting part is figuring out that four websites listing the same show are talking about one show.
Read more →March 22, 2026
• 2 min read
Written up in October 2026. Dates are when I actually built it.
Airline shopping portals love to scream “5X POINTS!!!” at you. Is that a great rate, or just a Tuesday? The portal will never tell you, because it only shows you today. So I built a tracker that remembers. Code’s here.
The data model is the whole project I put everything in Cloudflare D1 (SQLite) and spent most of my time on the schema, because the questions I wanted to answer (“is this an all-time high?
Read more →