Update for the week ending on Friday, Oct 16, 2026
mtlynch.io
- Started September 2026 retro
- Started writing “The mustCreate Pattern for Go Tests”
- Rolled back launch discount in Refactoring English ad
- Deleted dead social links
- Update my author photo
- Updated my
.gitignorewith AI-agent ignores - Switched code blocks to VS Code style
- I’d had them a dark style, but I recently was convinced it’s better for light mode text to be with light mode code blocks
- Removed a workaround for the
<base>tag in preview deploys
Refactoring English
- Ordered print books for all Kickstarter premium backers
Book
- Bumped to 1.0.11 and ordered a new test print
- Added support for font ligatures
- Got rid of bulleted lists where the top-level item was only a single element
- Fixed more awkward page breaks
- Fixed the visual diff to ignore tiny shifts from float arithmetic
- Reformatted footnotes so they appear immediately after punctuation rather than before
- Removed spell check squiggles from three screenshots
Website
- Turned off launch week pricing
- Improved purchasing power parity scripts
Feedback Site
- Added logic to store new style user IDs for new user signups
- I’m still transitioning from Buttondown-based IDs, and this way, there’s less delicate timing to when I do the final migration
- Ported improvements from go-app-starter
Backend
- Ported improvements from go-app-starter
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).
- Ported improvements from go-app-starter
- Fixed a bug where encoded media content types depended on host MIME mappings
- Refactored code to share between production and development Nix apps
- Refactored test code to get rid of helper functions
ScreenJournal
ScreenJournal is basically Goodreads, but for TV and movies. Or letterboxd, but focused on small communities.
- Moved the repo from GitLab to CodeFloe
- Added a NixCI build workflow
- Dropped Nix VCS stamping
- It’s neat, but it screws up Nix build caching, which is expensive for CI
- Switched SMTP host to sendamatic
- Replaced repetitive test helpers with a generic implementation
Weekly Snippets
- Reduced Forgejo requests to avoid triggering 429 errors on Codefloe
- Excluded merge commits from forge activity
- Re-sorted forge activity from oldest to newest
- De-duplicated Forgejo merged pull commits
go-app-starter
- Backported improvements from child repos
- Correct external Go test package guidance
- Fail when flake target builds fail
- Limit Playwright workers to available cores
- Lint and typecheck E2E TypeScript
- Modernize Air development reloads
- Narrow Go test build inputs
- Upgrade Playwright to 1.59.1
- Upgrade evolutionary migrations
- Prefer accessible Playwright locators
- Remove VCS stamping
- Matched the project to the AGENTS.md conventions
- Place Go package declarations after imports in contributor guidance
- Allow filesystem writes in end-to-end tests, not unit tests
- Permit the existing Nix development workflow exceptions
- Stop HTTP tests when response statuses do not match expectations
- Use one E2E runner and worker policy in Nix and local builds
- Exercise registered static routes in cache and range tests
- Include failure causes in HTTP errors and contextual logs
- Consolidate comment punctuation and documentation formatting
- Expose one canonical Nix package name per app build
- Expose visit-count updates as an accessible status
- Run Fly deployment through a standalone script
- Use Nix-provided Go analyzers from PATH
- Use an injected clock for page timestamps and static cache versions
- Added better Go test guidance
- Excluded the pnpm lockfile from Prettier
NixOS Config
- Upgraded to opencode v2
- Enjoying it a lot
- I find it easily extensible, though I’m not sure how much of a difference it was from v1 because I didn’t bother extending v1 because I didn’t want to have to port everything to v2.
- Switched my AI sandbox from Podman containers to microVMs
- I had been working on this before the opencode v2 switch, but I had to rush it through because v2 doesn’t work with Podman the way I’d done before
- The main issue is that v2 expects to own its database exclusively, whereas v1 either didn’t or was more tolerant of shared access. I have many containers sharing a single database through a folder mount, but I can’t do this in v2.
- New solution is that I have a single OpenCode VM as a monolithic sandbox. I lose intra-project isolation, but I get stronger guest-host isolation because it’s a separate OS kernel.
- Gave the AI sandbox credentials to a separate
mtlynch-botaccount on Codefloe- The account has read-only access to all of my private repos, so it can make PRs but can’t merge them
- Added an OpenCode skill to request code review from Claude Code + Fable 5.1
- Added an OpenCode “AFK mode” where it completes a task without stopping to ask me questions
- I hate leaving a job running overnight and finding that it didn’t make progress because it stopped to ask me a question
Grosiree
Grosiree is a shared grocery list web app I’m making with my wife to show her how vibecoding works.
Home Network Manager
- Started experimenting with an idea to replace my OPNsense router at home.
- A domain-specific language that lets me define my network layout and firewall rules at a high-level
- A domain-specific language that lets me write assertions about my network (e.g., printer VLAN cannot make outbound requests to the Internet)
- A system that converts the rules into FreeBSD router config and then deploys a virtual network of VMs to test the rules and verify the assertions are correct
- The motivation is that I find it so easy to accidentally regress behavior when I’m configuring OPNsense, and I often don’t notice until weeks later (e.g., my wife discovers she’s unable to print when she needs to print)
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.
- Ported improvements from go-app-starter
- Fixed video playback in Chrome
- Accepted a PR to upgrade Alpine runtime image to 3.24
Maildir Viewer
beancount-chase-bank
- Added support for incoming real-time payment credits
- Added support for international incoming wire fees
- Added support for incoming wire transfers
- Simplified parser regexes
Misc
- Co-hosted the Indie Founders Western Mass meetup
- Did monthly bookkeeping