January 2026: Month in Review
January was busy. I shipped things, broke things, fixed some of them, and spent more time than I'd like to admit fighting a CDN that refuses to give me fresh HTML. Here's the rundown.
HydrantMap went live
I wrote a whole post about this, but the short version: local fire department asked for help finding buried hydrants after the snowstorm, I built a map, and within 24 hours over half the hydrants in two municipalities were checked. No login, no friction, just tap and report.
The part I didn't expect was how much I'd think about the threat model. I almost shared it on X, but then I imagined some bored troll marking buried hydrants as clear for laughs. Fire crew shows up to a snowbank instead of water. Not great. So I kept distribution tight—local Facebook groups, Nextdoor, places where your name is attached to your actions. Social accountability matters more than reach when you're crowdsourcing public safety data without verification.

Building out my "personal AI nervous system"
I've been calling it that in my head even though it sounds ridiculous. The idea: use n8n as an orchestration layer with Slack as my command center. Information should find me. I shouldn't have to go looking for it.
Gmail evening digest. Every night, Claude reads my unread messages and posts a summary to Slack. Urgent, action needed, FYI, ignorable. The categorization isn't perfect, but it's good enough that I stopped feeling that low-grade anxiety of an unchecked inbox.
SMS grocery list. Text items to a Twilio number throughout the week. Monday morning, Claude compiles everything, groups by store section, predicts what I'm probably making, and sends it via MMS with a cat chef illustration. Because automation should have personality.
Frontier model alerts. Monitors X for announcements from Anthropic, OpenAI, xAI about new model releases. I got tired of finding out about things three days late from a random newsletter.
Changedetection.io → n8n webhook. This one watches my local borough website for new meeting agendas and minutes. When a new PDF appears, it triggers a workflow. In theory. More on that in a second.
Pi-hole on a Raspberry Pi
Sunday project. Raspberry Pi, Pi-hole, Tailscale for remote access. About 150k blocked domains out of the box.
The setup was straightforward. What got interesting was thinking about what to do next. I started designing an n8n workflow that would pull allowed queries from Pi-hole's API, batch them, and have Claude analyze for potential trackers that slip past standard blocklists. Every household has different apps and different tolerance for broken functionality—generic lists only get you so far.
Haven't shipped it yet. Still architecture diagrams. But the shape feels right.

Development environment archaeology
Midway through the month I realized something embarrassing: none of my dev environment was documented. I work across multiple machines with different usernames, different paths, tools installed at different times by past versions of me who didn't leave notes.
So I built a project context system for my dotfiles repo. A CLAUDE.md file, individual project docs in docs/projects/, conventions in conventions.md. The idea is any Claude instance can immediately understand what I'm working on, where it lives, and how to help.
This is the boring infrastructure work that makes everything else easier. Not automation, just knowledge that survives across sessions.
The changedetection.io problem (solved!)
Here's the bug I was fighting: my local borough website sits behind a CDN that serves cached responses to bot-like requests. My monitoring instance kept seeing stale HTML from December even though the live site had new February PDFs.
I tried switching fetch methods, cache-busting query parameters, custom headers. Nothing worked. The CDN looks at the request, decides it's a bot, and hands back cached garbage.
The fix was WebDriver mode—render the page in an actual browser instead of making simple HTTP requests. Edge caches behave differently when they see real JavaScript execution. Added a browser container to my docker-compose setup, set an XPath filter to grab just the PDF links, and now it works. New meeting minutes trigger the workflow like they should.
Other stuff
QuoteMow PRD. I wrote a full product requirements document for a B2B SaaS idea—lawn size estimation from satellite imagery for lawn care companies. $19/month plus $0.50 per quote. The PRD exists. The product does not. We'll see if I actually build it.
What's next
February is probably shipping the Pi-hole analytics workflow, maybe actually starting on QuoteMow, and whatever else breaks in interesting ways.
If you made it this far, thanks for reading. This was mostly for me to have a record of what I actually did versus what I think I did.
