Update for the week ending on Friday, Jun 19, 2026
Refactoring English
- Worked on adapting the design docs chapter into a public excerpt
Website
- Dropped newsletter signups from the website
- Now that the book is nearly complete, I’d rather the path be that people just buy the book instead of signing up to a mailing list.
- Rename “Chapters” to “Excerpts”
- It felt too confusing since the chapters don’t perfectly match to excerpts
- Styled book excerpts as cards instead of flat text
- Adjusted the early access page to better explain the current status of the book
Feedback App
- Started working on supporting separate user sessions
- Added support for tying comments to a specific book version
- Previously, it was assumed that there was only one version of the book, but really, there will be multiple drafts
- Ported improvements from go-app-starter
- Added a cleaner parse function for comment requests
- Added support for parsing the book version metadata from the book file uploads
- Created a better API for the book HTML files
- Added type checking for reading static assets
- Tighten chapter file discovery to match the book’s actual file layout
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).
- Finally finished magic login email-based authentication
- I’ve been yak shaving this for four months
- And fix a bug where I accidentally shipped dev mode logins to production
- It wasn’t a huge deal because the attacker would have had to guess one of <20 valid emails associated with the server
- Switched rate limiter to be per-IPv4 and per-email
- Changed semantics of
NewSenderto returnErrUnregisteredEmailinstead of empty entry- This was really confusing me, and I traced the issue to this “empty struct has subtle meaning” API bug
- Added an env var for litestream DB path
- Added renderTemplate wrapper to eliminate ExecuteTemplate boilerplate
- Added project milestone status to README.md
- Ported improvements from go-app-starter
- Tried to build the Docker image from the
Dockerfilein Nix- I eventually just gave up because it’s too hard.
- Nix blocks Docker from pulling images from the Internet, so I basically have to rewrite my whole Dockerfile
- Mitchell Hashimoto has a viable example
- It would be nice to have my Nix-based CI be able to check if my Dockerfile actually builds, but it’s too much hassle, and it’s not that hard to fix when I find out at deploy time.
- Updated to Litestream 0.5.11
- Inlined the arguments to ffmpeg
- Added log messages to record whether the login token generator is in dev mode or prod mode
- Changed Tinybeans import to convert MP4 videos to WebM
- Improved the design doc
- Got rid of the global rate limits to prevent an attacker from trivially DoSing the server
- Added a note about how Bunny’s S3 implementaton can’t support Litestream
- Converted the permissions lists into a table
- Fix the HTML rendering so that the table of contents appears after the title and metadata
- Moved database replication to milestone 5
- Refactored
docker-entrypointsemantics for clarity - Updated
upload-prod-dbto use the latest flyctl CLI semantics - Refactored tests to use a single helper function for email address creation
- Change
ImportMediato take a struct instead of an arg list so that callsites are more obvious - Moved
mustGetenvto main.go - Renamed
srcFileDatatest field to the more accuratedstFileDataExpected
ScreenJournal
ScreenJournal is basically Goodreads, but for TV and movies. Or letterboxd, but focused on small communities.
- Worked on support for “draft mode”
- Added ETag caching for static assets
- Make SQLite foreign key enforcement explicit
- Fix Go tool settings in Nix shell
- Modernized Docker and Fly runtime config
- Refactored HTML template rendering to use a common function
- Switched JavaScript tooling from npm to pnpm
go-app-starter
- Backported improvements from Grosiree
- Backported improvements from Little Moments
Grosiree
Grosiree is a shared grocery list web app I’m making with my wife to show her how vibecoding works.
- Moved my Grosiree instance to fly.io
- I was hosting on my Oracle free tier instance, but I found out from reddit that Oracle is taking it away and was about to start charging
- Backported a bunch of Go app project improvements from Little Moments
- Fixed range requests on static assets
- Documented
GROSIREE_SHARED_SECRETin .env.example - Added VCS metadata on about page
- Updated
fly.tomlfor recent config options
aw-web-ng
My custom frontend to ActivityWatch for tracking my time locally.
- Played around with CLI semantics.
- Added support for nested activities like “Book/Writing” vs. “Book/Website”
Misc
- Attended Tom Buchok’s founders dinner in Boston