Update for the week ending on Friday, Mar 27, 2026
Refactoring English
- Published “Which Design Doc Did a Human Write?”
- Added a new section to design docs chapter called “What belongs in a design doc?”
- Continued working on “Help the Reader Achieve their Goal” chapter
- Continued working on “Meet the Reader Where They Are” chapter
- Made minor revisions to “Make your writing sound natural” chapter
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).
- Got done with most of milestone 1
- SQLite implementation is not complete yet
- Cloud storage is not implemented yet
- Importing from TinyBeans all works
- Imported emoji reactions from TinyBeans
- Switched to generating new UUIDs for files instead of reusing Tinybeans UUIDs
- I suspected that we were getting unintended side effects from reusing the TinyBeans UUIDs, and I was right, as too much was implicit.
- This also made me realize we don’t want URL paths to use UUIDs, as they’re too long and ugly.
- As a side effect, I shortened to 4-digit friendly IDs for URLs.
- Use lowercase for photo and video entry type values
- Similarly, I suspected we were inheriting implicit behavior by copying exactly from TinyBeans, and this caught a few issues.
- Fixed timing in GIF-to-AVIF conversion on TinyBeans imports
- Added support for basic keyboard shortcuts
- Added support for swipe gestures on mobile
- Turned on caching of embedded static assets
- Added stronger typing for certain fields to prevent AI agents from doing dumb things with data types
- Added strong typing to
CommentTexttype - Added strong typing to
ReactionEmojitype - Added strong typing
Emailtype - Added strong typing to
UserIDtype
- Added strong typing to
- Added AGENTS.md guidance about defining symbols close to where we use them
- Added a quick pre-commit check to stop AI agents from testing unexported symbols
- Replaced Font Awesome with Lucide icons
- Added video badges on video thumbnails
- Simple, but distinguishes them from static photos
- Fixed a gap in tinybeans-export where it wasn’t exporting threaded conversations
- Updated Playwright from 1.57.0 to 1.58.2
Go App Starter
- Added a standard /about page
- Added more rules to AGENTS.md
- Added a CLAUDE.md that redirects to AGENTS.md
- Added a nix build target for the Dockerfile
- Added folders to gitignore that I use with AI agents
- Set npm dependencies to auto-install from nix flake
- Moved ESLint ignores to eslint.config.js
- Updated to prettier 3.8.1
- Upgraded to go 1.26
- Removed an outdated feature on the template landing page
Misc
- Disabled dependabot on beancount-capitalone and beancount-mercury
- Fixed the built-in microphone on my Framework 13
- I knew it wasn’t a hardware issue because it worked fine on Ubuntu, but I could never figure out why it was so messed up on NixOS
- I asked Claude Opus 4.6, and it correctly diagnosed it as a bad input gain setting
- After incorrectly diagnosing it as a kernel module issue
- I set the gain to 0.4 and now it sounds great!
- Argued about with the vendor about a bug bounty