Update for the week ending on Friday, Aug 7, 2026
mtlynch.io
- Moved the Plausible Analytics snippet to its own partial
- Updated to the latest Plausible Analytics JS snippet
- Fixed a dead link to airgradient
Refactoring English
Book
- Worked on a dedicated section about coming up with titles for blog posts
- Added a complete example of respecting the reader’s bandwidth
- Reordered the chapters in part two to match which chapters readers are reading
Website
- Worked on improving the site’s look
- Restructured the early access page to show less text above the fold
- Made the hamburger menu text a little bigger on mobile and right-aligned the items
- Added a basic site footer
- Got rid of some conflicting color schemes
- Adjusted the navbar so that the “Early Access” call-to-action button is always visible
- Wrote blurbs for some old excerpts that didn’t have blurbs.
Feedback app
- Added a confirmation dialog that confirms replacing a book draft
- Added support for aggregating visit counts across book versions
- Changed analytics from total visits to unique readers
- Added Fly SSH console support to my Docker image
- Fly needs a root entry in
/etc/passwdforflyctl ssh consoleto work
- Fly needs a root entry in
- Added convenience scripts for downloading production data to my local dev environment
Scraper bot attack
- Improved my tool for converting bunny logs to IP blocklists
- Paid for Bunny Shield to do better rate limiting by IP
- Tweaked the descriptive blocklist output to show the number of requests per IP block
- It helps me filter out false positives with only a handful of requests that matched the malicious pattern
Little Moments
Little Moments is an open-source web app I’m working on to replace the current family photo sharing app (TinyBeans) I used (which I strongly dislike).
- Added UI controls for editing captions and support for persist them in the backend
- Added UI controls for deleting media and support for processing the requests in the backend
- Refactored media publishing out of the upload handlers
- Refactored Tinybeans import orchestration out of main.go and into the importer
- Added custom types for image widths so that we validate them earlier
- Switched from
ProcessableVideotype toUploadPath - Implemeted graceful shutdown on SIGINT and SIGTERM
- Refactored TinyBeans import code to import incrementally
Mikeville
- Added admin controls
- Moved the server to Boston
- I realized the original server was in Oregon with a 75ms ping, and the new one has a 5ms ping
- Added cows into the game
- You can ride them or turn them into steaks
- Added background music and sound effects
- Improved river
- Now it looks more waterlike, previously it was just little circles
- Now you can dam it, and it pools and overflows in more realistic ways
- Added speedups to e2e tests
Grosiree
Grosiree is a shared grocery list web app I’m making with my wife to show her how vibecoding works.
- Limit grocery item names to 35 characters
- Backported a bunch of improvements from go-app-starter
- Changed page title on
/to Grocery List - Replaced the mobile hamburger menu with “More” dropdown
- This keeps the main two screens one click away in all views
NixOS Config
- Added litestream backups for Grosiree
Weekly Snippets
- Switched JavaScript tooling to pnpm
Misc
- Did monthly bookkeeping
- Updated my beancount importer to support Chase’s new CSV format
- Talked to new photographer about author photo
- Tried to explain why I want the copyright
- Continued looking for other static hosting providers
- Vercel: Seems like they’ll block scrapers, but it’s a giant complicated machine and I don’t have any reason to believe they’ll be better than Netlify
- Surge: They seem appealing because it’s a flat rate for unlimited traffic and they run their own CDN, but they have a 450 MB limit per site, and my blog is about 800 MB and growing.
- Bunny: Hard to do atomic deploys and partial uploads when only a little of the site changes between builds
- Catchup call with old co-worker