Update for the week ending on Friday, May 1, 2026
mtlynch.io
- Started working on blog post about a college that sent me spam
Refactoring English
- Published “Improving Your Writing with AI” chapter
- Tried to fix paying customers whose email addresses Buttondown labeled as “undeliverable”
- About half got fixed and half just have email addresses that don’t receive email
- Worked on “Minimize Cognitive Load” chapter
- Started working on design doc for feedback app for the HTML version of the book
- Modified asciidoc to render the HTML version with separate files for each chapter
- Improved formatting for blockquotes in HTML output
- Normalized image sizes in HTML/epub output
ScreenJournal
ScreenJournal is basically Goodreads, but for TV and movies. Or letterboxd, but focused on small communities.
- Continued tweaking the migration to the new simpleauth
- It’s still pretty complicated, but it’s simpler than what was there before
- Make handlers depend on
sqlite.Storedirectly- I always like keeping cross-package dependencies scoped to interfaces, but I got feedback from an LLM that in this case, it was pointless because the interface perfectly mirrored the implementation and wasn’t buying me anything.
- Break the handlers dependency on raw DB pointer
- There’s awkward wiring to make it possible for parallel e2e tests to use the same app but multiple databases, so the tests don’t taint each other.
- Renamed SQLite store
ctxfield todb- I don’t know how I started doing this, but it never made sense to me and is extra confusing because
ctxis usually the name forContext
- I don’t know how I started doing this, but it never made sense to me and is extra confusing because
- Converted
handlers.Newto use a params struct- The params list grew too long, and it was too confusing what field was what at the callsite.
- Switched to memdb for ephemeral SQLite test databases
- I was using a shared cache before, but apparently it’s bad
Grosiree
Grosiree is a shared grocery list web app I’m making with my wife to show her how vibecoding works.
- Added a warning if the user tries to add an item with no section.
- Make the auto-complete also populate the item’s section field
- Fixed autocomplete in grocery item edit forms
MeshCore
- My unit tests from six months ago finally got merged.
- Started working on new unit tests for malformed advert packets
Timelinize
Timelinize is a neat project I discovered by Matt Holt (creator of Caddy) that creates a web UI for data you export from services like Google, Twitter, and Facebook.
- Fixed a CI misconfiguration
- Added unit tests for googlevoice importer
NixOS config
- Started experimenting with OpenCode
- For some reason, it just dies silently in my podman container
- It works in my VM sandbox, but that’s slightly more of a pain to use.
- Experimented with VibeVoice (speech to text with speaker identification)
- It’s interesting, but it seems to require a lot of tuning to not exhaust GPU memory and die mid-job.
rss-archiver
rss-archiver is a tool I built for saving podcast feeds locally.
- Added support for downloading feed and episode images
- Stripped parentheses from output filenames
- Treat apostrophe characters as separators in episode names
- So
Conan O'Brienturns intoConan-O-Brienwhereas it was previouslyConan-OBrien
- So
Misc
- Fixed
GOROOTin the nix flake of my go app starter - Experimented with Microsoft VibeVoice
- Pretty good results so far just on my home GPU.