Update for the week ending on Friday, Jan 23, 2026
mtlynch.io
- Worked on my annual review post
- Standardized the structure of my annual update summaries
- Switched to the binary release of wordword rather than building from source every time in CI
- Experimented with merging book reports into notes section
- Remove bluesky embeds from an old post
- Updated the URL structure for annual review posts so that it’s
/bootstrapped-founder-year-Xrather than/solo-developer-year-X- I stopped saying “Solo Developer” in year 4, but I kept the URL structure for legacy
- I realized it was a good job for an LLM to update everything and add aliases for the old paths
- Updated dates on Refactoring English so it doesn’t look like work stopped in 2025
Refactoring English
- Published new chapter: “Structure Your Work to Stay in Flow State”
- Added email alerts when a webhook request fails to create a new subscriber in my early access mailing list
- Added minor fixes to the brevity chapter
- Added nix build targets for git pre-commit scripts
- Added a workaround for Buttondown’s firewall
- It was rejecting some subscribers because if I don’t specify an IP address for them, Buttondown assigns them the IP address of the server making the API request, which is a random EC2 instance
- The workaround was to use an arbitrary sentinel IP address and then add it to Buttondown’s firewall allowlist
- Complained to Buttondown about this design
- Switched to the binary release of wordword
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).
- Made more progress on the design doc
LLM Sandbox
- Added Claude Code to the sandbox
- Added bash completion and history to the sandbox environment
- Experimented with exe.dev, a paid, managed LLM sandbox
- I really like it!
- It ships with Codex and Claude Code, but it also has its own agent that you can access on the web, and it’s mobile friendly
- It’s really fun having the LLM do stuff from my phone
- The biggest downside is that the sandbox is fairly resource-constrained at only 2 vCPUs / 8 GB RAM / 25 GB disk
- Compare to sprites.dev, which is 8 vCPU / 8 GB RAM / 91 GB NVMe
- I use a dedicated SSH key and configured SSH to only offer that identity
- Protects me from rogue LLM acting with a more powerful SSH identity
- I move code in and out by setting my VM as a git remote from my local system and
git pushandgit pulling code to and from the VM.- Not perfect, and I don’t have a smooth flow yet
- Added mounting as read-only for my host system’s git config directory
- That way, commits in the sandbox have my name / email
ScreenJournal
ScreenJournal is basically Goodreads, but for TV and movies. Or letterboxd, but focused on small communities.
- Had an LLM find ways to take advantage of recent Go releases
- Update flake.nix to document nixhub
- Updated to playwright 1.57.0
- Fixed
.prettierignoreto ignoree2e-resultsdir
fusion
fusion is an open-source RSS reader I found when looking for an RSS aggregator to host on my NixOS system. I like that it’s written in Go and uses SQLite as a backend, so it’s pretty easy to self-host. The maintainer is very responsive to PRs as well.
- Had an LLM try overhauling the app to replace Svelte with vanilla HTML
- It worked pretty well!
- I might pursue this, but I want to figure out a better strategy for testing it through the migration.
Zestful
- Tried having an LLM convert from CRF++ to spaCy
- I set up a really complicated architecture so that my Python code could call the C++ code, and it would be way simpler if I just used spaCy instead, as it’s already in Python.
- I don’t actually want to tinker too much with Zestful because I don’t think I can grow the business at all that way, but I’m mainly curious to see how much LLMs can do
- I can’t tell how close it is because I’m so out of practice
- Tried some other repo cleanup stuff to make it more consistent with my other Python repos
Zestful website
- Converted the whole site from Vue to vanilla HTML in Hugo
- A 12 kLOC reduction!
- I got an annoying notification about an npm package update, and I thought, “What if I just have an LLM replace the whole thing?”
- It mostly got everything right, but I had to manually fix a few things like the site title and language
- Improved the navbar design
- Reduced image sizes
- Upgraded to node.js 20 and add Nix flake
- Update VS Code settings to format markdown, too
go-evolutionary-migrate
I saw someone else created a simple SQLite migration library and realized I keep copy/pasting the same file to every project, and I could extract it to a reusable Go module.
- Migrated
go-app-starterto use this library - Migrated
logpasteto use this library
wordword
- Published release 0.1.2
- Updated to Zig 0.15.1
- Removed woodpecker CI and switched nix run targets to build packages so they can run on NixCI
- Took another pass at shifting Markdown processing to the third-party zigdown package
Talk to Stan
Talk to Stan is a tool I’m working on that will respond to templated emails I get from spammy marketers and recruiters with a sequence of templated responses to ask the spammers an endless series of dumb questions.
- Used
sql.Namedto replace SQL?placeholders - Added an
AGENTS.md - Started work replacing Postmark’s inbound mail API with a real smtp daemon
- Postmark changed their plans so it’s no longer on the basic tier
- Postmark also is owned by a company I dislike, so I’m glad to move away
- Simplified
requireEnvto uselog.Fatalfinstead of returning error
Pointer Brother
Pointer Brother is a utility app I use for quick screenshot and image manipulation.
- Added e2e tests with playwright
- Refactored serve script to move logic from Nix to bash
- Removed unused
static-serverpackage from Nix flake - Added a NixCI badge
podofo
- Tried running my PDF fuzzing workflow on PoDoFo PDF reader and found a crash
- Though it’s probably not exploitable
MeshCore
- Tested device range from a few miles away on a mountain
meshcore.js
- Tried again to fix a race condition in WebBleConnection after my previous fix didn’t work
libmeshcore-client
- Started implementing parsing for contact reads/writes
- Updated
AGENTS.mdto use TDD
meshcore-open
- Added a Github Action to build the code in CI
- Fixed
flutter analyzeissues and added a CI job to prevent recurrences
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.
- Finished replacing bulma with bootstrap5
- Consolidated e2e npm dependencies into root package.json
- This was the only project where I tried to separate them, and it always got me confused about where Playwright was coming from
- Made e2e test more robust for time zone differences
- Added an AGENTS.md
- Fixed tsconfig for e2e tests
- Updated to playwright 1.57.0
LogPaste
- Ported e2e tests from Cypress to Playwright
- Switched to installing litestream from the official docker image
- Fixed the deploy step to match latest flyctl semantics
- Upgraded Go to 1.25.4
resticpy
- Gave feedback on a proposal to stream output
beancount-chase-bank
- Pinned Python environment to Python 3.13
- Created an
AGENTS.md - Had an LLM update all my PyPI dependencies.
NixOS Config
- Added a local NixOS module for running sprites.dev
- Seems to kind of work, but I get logged out
- Not sure if it’s my bug or sprites.dev’s bug given that it’s brand new
- Add safety checks to ensure I only mount my code repos or a directory under
/tmp- I realized how easy it would have been to accidentally load an LLM in my home directory and accidentally give it access to way too much stuff.
Misc
- Vibe coded a fix to a bug with the UI on Android Firefox
- Tried using LLMs to set up fuzzing for VLC, but it got pretty messy and didn’t find anything.
- It’s so messy that I’m not even sure if I’m fuzzing actual VLC code or just the glue code the LLM wrote
- Switched go-app-starter from WoodpeckerCI to Nix CI
- Finished reading The Phoenix Project