Update for the week ending on Friday, Sep 4, 2026
Refactoring English
- Started working on new blog post, “Antipatterns in Software Blogging.”
Book
- Declared 1.0 release of book
- Covered passive clauses in passive voice chapter
- Did final tweaks for 1.0 release
- Started researching the process of creating a print version
Website
- Merged together the purchase page and landing page
- Added a custom 404 page
- Added testimonials to the main page
- Moved the list of supporters off the landing page
- Cleaned up remaining references to “Early Access”
- It’s now just a regular purchase
HN Popularity Contest
- Fixed Bunny Shield rules
- I was accidentally blocking all requests to
/domainroutes
- I was accidentally blocking all requests to
- Migrated the site from Netlify to surge.sh
- Migrated the Netlify function logic to a Fly.io scale-to-zero service
- Migrated CI from CircleCI to NixCI
- Migrated HTML checks from htmlproofer to lychee
Hit the Front Page of Hacker News
This is the site for my old course, and I noticed one bug and went down a rabbit hole of updating everything to my new patterns
- The bug I noticed was that if you click a section in the navbar, it just uses JS to scroll instead of updating the URL with the anchor target, so now that’s fixed
- Converted the site from plain HTML to generated HTML with eleventy
- The site’s based on a template I purchased, but the code was terrible and was always such a pain to edit because it had tons of repetitive boilerplate.
- Conversion to eleventy was a great job for AI because it could refactor and verify that the generated output was functionally equivalent.
- Replaced a ton of extraneous dependencies like Bootstrap, FontAwesome, jQuery
- Added better linting to the frontend
- Converted everything to a nix-based build
- Switched from CircleCI to CrowCI + NixBuild.net
- Moved hosting to surge.sh
Weekly Snippets
- Move CI to NixCI
Mail Archiver
- Switched to batched JMAP operations
- We were doing JMAP calls on a per-message basis, which was creating thousands of HTTP calls for large threads, and I realized we could coalesce together the
- Added more robustness checks to bulk archive jobs
- Improved performance of indexing and page loading
- Added email address auto-complete
- Added more filters for searching emails by archive
- Migrated to go-evolutionary-migrate v2
go-evolutionary-migrate
- Moved the repo from Codeberg to Codefloe
- Added a CrowCI/NixCI config
- Tightened rules on SQL filenames
- I realized in Mail Archiver that I’d created two SQL migrations with the prefix
005-, and that’s something that the library should hard fail on so that we don’t apply migrations in unexpected order.
- I realized in Mail Archiver that I’d created two SQL migrations with the prefix
go-app-starter
NixOS config
- Removed myself from the
dockergroup- After everyone made fun of DHH for doing this by default, I realized this was my setup.
- Apparently, it’s a free elevation to root for anything that can run in the context of an account in the
dockergroup.
Hacker News Observer
- Added tracking for stories on the second chance pool and invited lists
- Downstreamed changes from go-app-starter
Misc
- Had call with another founder considering a sale of their business
- Did monthly bookkeeping