Update for the week ending on Friday, Jan 2, 2026
mtlynch.io
- Fixed my MeshCore diagram in response to a reader suggestion
- Replaced dead links to unsplash
- They’re technically not dead, but they respond HTTP 401 to my dead link check on CI, so they lose their backlinks from me.
- I just replaced them with links to the Internet Archive
Refactoring English
HN Popularity Contest
- Changed domain links to domain-level view in Popularity Contest
- I used to link directly to the blog and had a little icon to drill deeper in the analytics, but I found people weren’t discovering the domain-level views
- Did a bunch of LLM-driven refactoring of the JavaScript
- It was mainly vibe-coded and there was a bunch of code duplication and ugliness across the two different views
- Made a few updates to metadata.
Howdy, Neighbor
Howdy, Neighbor is an open-source MeshCore client I created because there weren’t any aside from the CLI.
- Forked meshcore-web, a Vue-based web-only client that was an MIT-licensed prototype for the official but closed-source MeshCore client
- I had the idea last weekend that an LLM would probably do a pretty good job of porting the Vue code to Flutter, where it would be easy to build an Android, iOS, and web version all from the same codebase.
- I was sort of correct, as this did work and it was relatively easy (given that I know 0 Flutter/Dart), though I ended up having to babysit the LLM a lot.
- I set up a VM to act as an LLM sandbox
- I generally don’t give AI agents full permissions on my system because I’ve seen them leak private keys back to the LLM APIs or make bad changes to my system if I’m not watching, but I wanted a low-risk way to just let the agent do whatever it wanted without me having to babysit.
- I tried first with Debian, but one of the tools didn’t officially support Debian, so I switched to Ubuntu
- There was also a weird bug with Cline where I couldn’t sign into Cline from Debian without this bizarre workaround
- I couldn’t install the Playwright MCP, and installing the MCP is apparently just letting the LLM read the instructions to install the MCP and do what it wants
- I had to set up some scripts to get code in and out, as I was skittish about giving it access to my SSH identity
- Added Playwright e2e tests
- The idea was that I’d get the Vue implementation under test, lock in the correct implementation, then re-use the exact tests for the Flutter implementation
- Then I added a barebones flutter implementation
- Things went a bit awry here
- I thought Flutter’s web output would just be semantic HTML, but Flutter actually generates its own wacky custom flavor of HTML where every element is prefixed with
flt-. I think it’s actually acanvaselement that fakes HTML elements for compatibility or something. - In any case, my Playwright tests were breaking, and the LLM agent kept having to write all these helper functions in the tests so that a single function definition would work for both Vue and Flutter.
- At this point, I gave up and thought it wasn’t going to work.
- In the morning, I decided to try again and just jettison the Vue implementation because it wasn’t so complicated that I needed the tests to be exactly the same. That way, I could let the LLM write tests specifically for the Flutter implementation without forking logic for Vue vs. Flutter.
- Once the web implementation worked, I had the LLM add an Android version to the build
- It works!
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).
- Continued working on design doc
MeshCore
- Fixed a race condition in WebBleConnection in meshcore.js
- Added a browser-only export for meshcore.js
- This makes it so that web-only clients can import the library without getting a bunch of warnings about NodeJS dependencies.
Misc
- Fixed an out of space issue on my woodpecker instance
- It turned out podman was filling the disk with stale images, so I added a weekly job to prune them
- Updated my Woodpecker Nix code to Alejandra 4.0.0