Update for the week ending on Friday, Apr 17, 2026
Refactoring English
- Published new chapter, “Meet the Reader Where They Are”
- Held a live session, “Using AI to Improve Writing”
- Biggest turnout so far, with 16 attendees
- Published version 0.9.0 draft of the book
- Updated the website to reflect the overhauled table of contents
- Added logic to strip cross links from the HTML version of chapter excerpts
- They didn’t work because the excerpts are standalone chapters separate from the rest of the chapters
- The PDFs excerpts still have broken links because a better fix is too complicated
- Re-did my publish draft script
- It uploaded to my CDN by default, which is the opposite behavior of my publish excerpt script
- I deliberately chose that at the time as it’s more common for me to create a local copy of an excerpt before uploading, but the inconsistency was too confusing.
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 support for uploading imported media to S3-compatible bucket
- Refactored code in preparation of s3 support
- Added an –s3 option to dev-scripts/serve
- Added a feature to prefetch images before the user scrolls to them
- Added a shared
pageDatathat’s included in template data for all pages- For now it’s just CSP nonce, but after I implement auth, it will contain auth state
- So I can test in either local media file mode or upload-to-s3 mode
- Ensure we always create parent directories for SQLite database files
- Updated the /about page to show git revision and build time
- Tip I got from Michael Stapelberg’s latest post
- Grouped route middleware with subrouters
- Refactored SQLite methods to accept proper
littlemomentsstructs instead of a long list of args that matched the structs- Refactored InsertComment to accept littlemoments.Comment
- Refactored InsertReaction to accept littlemoments.Reaction
- Refactored InsertUser to accept littlemoments.User
- Collapsed IsOwner to IsAdmin
- They originally referred to two different things, but I think it’s simpler to start with one and add the other if there’s an actual need
- Added a
gofmtrule to AGENTS.md
PicoShare
PicoShare is a minimalist web-based file sharing tool I’m working on. I’m often frustrated that I can’t just send someone a link directly to a file because every file-sharing service tries to re-encode images/video or wrap their own viewer around other files, so I’m making a simple self-hostable tool that lets you upload files and share them with other people.
- Moved forward a little bit on the switch from mattn/sqlite to ncruces/sqlite
- It’s a big change that I’ve been touching off and on for about two years now
- Renamed
clientRequiresJsontoclientAcceptsJson
Bug bounties
- Sent a vendor a bug bounty report
- Heard back from another vendor
that my report was a dupe
- I suspect that they’re either lying or sitting on bugs for too long, so I’m not planning to report the rest of my findings to them
Misc
- Did monthly bookkeeping
- Created an iPhone Backup to HTML converter for SMS
- This is basically a vibe-coded reimplementation of an app I built 15 years ago, except scoped to my narrow use case
- I used to run AllYourTexts whenever I wanted to refer to something from an old iPhone text message backup, but it was Windows-only, and it was easier for me to just port the code to Go and convert to HTML.