Update for the week ending on Friday, Sep 25, 2026
Short week due to a sick day with my son, who had a cold.
mtlynch.io
- Started writing “Why are Agent Harnesses so Dumb?”
Refactoring English
- Worked on “Antipatterns in software blogging” blog post
- Got a virtual mailbox
- Ugh, I hated this.
- It went through one of these ID verification vendors, who kept switching the flow from desktop to phone to scan my IDs, but they kept screwing up and forcing me to start over and re-do credit checks, so I got 4 different credit alerts
- They said they needed the IDs for ID verification, but they were actually also using it for address verification, so I got to the last stage and had to start over because my driver’s license has an old address.
Book
- Split the chapter headings across exactly two lines in PDF versions
- Before
- After
- Reduced line length on the digital PDF version
- Fixed alignment issues in the print version
- Let AI find performance optimizations to build the book, since all the Ruby extension customizations make the build super slow now
- Changed PDF version from A4 to US
- It was never intentionally A4, but it was defaulting to it because the Asciidoctor was silently ignoring the incorrect size syntax
- Shortened a few chapter titles
- Removed “Software” from a few titles since it’s extraneous. They’re an artifact of me initially publishing them as excerpts online where the reader doesn’t know it’s specifically about software.
- Switched “Apply Positive Phrasing” to “Stay Positive”
- More vague, but sounds more organic
- Made lots of little tweaks to avoid awkward page breaks in the print and PDF versions
- Fixed issues in incorrectly backticked text
- Removed obsolete styling rules for pending chapters
- No more pending chapters
- Changed PDF body from mostly black to pure black
- Got rid of cross-hatching in nested category diagrams
- They print weird and aren’t necessary.
- Switched to Anonymous Pro for code samples
- Fixed inline code size to match surrounding text
- Switched bad example emoji to use ballot X (✗) instead of multiplication sign (×)
- Changed inline code snippets to use black color instead of a distinct color
- Turned of center justification
Website
- Prepared site for official launch
- Linked to the print copy purchase URL
- Added a launch discount
- Fixed some layout issues on the landing page
- Fixed some perf issues on the landing page from Chrome Lighthouse tests
- Added a dedicated Open Graph image that doesn’t crop the cover awkwardly
- Capitalized people’s titles in testimonials
- Removed negative letter-spacing from body text
- I don’t even know how I ended up with this in the first place, but it was slightly squishing together the site’s text
Feedback app
- Migrated source from Codeberg to Codefloe
- Added a CrowCI config
- Began the migration off Buttondown for authentication
- So far, just put a placeholder column in the SQLite database to track custom Refactoring English reader IDs rather than Buttondown user IDs, which we currently use as the source of truth of a user’s identity.
- Get the admin email from an environment variable rather than querying Buttondown
Common backend
- Added a custom GET route so that the feedback app can validate a user by email
- Assign a UUID to every customer
- Backfill all customers from Kickstarter and Stripe
- Fix my shared
upload-prod-dbscript to work even when the target system has a persistent volume- The old solution relied on no persistent volume, where the app always downloads the latest snapshot from S3, so it’s easy to replace the prod DB by just stopping the app, replacing the snapshot on S3, then restarting the app server.
- Log every HTTP response in Apache style logging
Grosiree
Grosiree is a shared grocery list web app I’m making with my wife to show her how vibecoding works.
- Add stricter typing to more fields
- Prevent the user from adding duplicate grocery items
- Dropped revision metadata from builds because it screws up Nix caching.