Work slowed down enough that I was able to unwind a bit more and approach the holiday season with some anticipation–which, for me, invariably means queueing up personal projects. So most of what happened in my free time over the past couple of weeks was coding-related.
I thought my HN Wrapped 2025 was hilarious, but it’s sort of true, and could have been created specifically for this post:

Plan 9
Yes, it lives. I still actually run a 9front VM, but until recently I had to use drawterm (the Plan 9 remote terminal) via a Linux machine, since the macOS version was completely broken.
So I decided to fix a few of my longstanding gripes with it, starting with adding display scaling so that fonts were readable on Retina displays and adding basic preferences and login dialogs. My fork is up on GitHub, and I sent a message to 9fans about it, but I have low expectations of the changes being merged upstream.
Bug Fixing
After running the TRMNL server I coded earlier this month for a while, I noticed that I wasn’t really sending compressed PNG images to the device (duh), and fixed a few other things.
Although I still have just the one device, I am making plans to improve playlist handling and persistence, likely allowing for scheduled playlists and “breaking news” of some sort.
My feed summarizer has been working pretty well, but I’ve been doing small tweaks to the way I’m identifying related items. Since I don’t want to run a full-blown vector embedding pass due to CPU constraints, I’ve been playing with minhash and SQLite FTS vectors to check similarity among news items, and it works well enough for my current purposes.
I also started adding more (and weirder) feeds that required more tweaks and a few refactors to the way I extract “full text” information, so those needed fixing as well.
So far, so good.
AI Hacks
I decided to create steward, an LLM test harness written in bun that could be a good basis for my own “agent”/coding assistant, and ended up testing it by having it clone itself in Python, which was sobering.
I am now looking at expanding it into a reusable component for a few “agents” I want to create, and giving it tools to look at metrics and logs in some of my other projects, which takes me to the next category of hacks:
Software Deployment and Homelab Maintenance
I have been working on a version of piku that flipped its “no containers” tenet on its head and fully embraced using “just” containers and docker compose, which I called kata (i.e., repeating things to approach perfection). I’d say it’s pretty much done (for now):
- It can build and run Node,
bun, Python, and even PHP apps (don’t ask…) with a Heroku-like buildpack approach. - It uses
traefikas an ingress (because I realized it was easier to use Docker labels for configuration and I wanted alignment with my Kubernetes setups). - It’s been running most of my personal services for a couple of months now, both in Azure and my homelab.
It is not going to replace piku (that still has a number of valid use cases), but after it’s soaked in and been polished over a few months I will move the current version under the main piku project.
Since watchtower was recently archived, I was nerd-swiped into rolling my own Docker container auto-update tool in a couple of hours (and yeah, it sort of ballooned out from there and can now handle pretty complex setups that watchtower itself didn’t handle…).
I decided to call it guerite, and I’m very, very happy with the icon that AI helped me create after a couple of rounds of prompting:

Hardware
Like the comic above hints at, I’ve been looking at building yet another keyboard (and components to build a ZMK trackball), and bootstrapped an ESP32 project to read my power meter over ZigBee.
And I got an LCD screen that is the exact size to fit into the Maclock (plus a spare clock, Pi Zero 2W and a couple of cables).
Those three projects (as well as at least one hardware review) are likely to be my biggest time sinks during the holiday break, and I am very much looking forward to all of it.
Happy Holidays!