↖️ Blog Archive

Improvement Week #002

Bradley Gannon

2026-05-20

TL;DR: This is my second Improvement Week, which is where I collect a bunch of small tasks into a week of improvement for anything on my network or in my lab. My main accomplishments this time around were: better backups, rebuilding my HF antenna, and more neovim tweaks. Also, I’m finally beginning to understand how the Nix ecosystem works.


Better Backups

After I set up NixOS on my primary machine, one of the first things I did was set up backups to my NAS. I rolled my own script to take periodic snapshots and sync them to the NAS, and it mostly worked fine. But a few times along the way the snapshots somehow diverged, so the script was consistently failing. This week I briefly worked on fixing the script, but I realized I’d probably be better off with a pre-built solution. zfs_autobackup caught my eye and was easy to set up. In addition to smarter synchronization, it also has sane defaults for thinning—that is, removing most of the older snapshots and keeping the more recent ones according to a schedule.

I also modified the systemd unit that drives the backups to trigger a separate notification unit in the case of failure. The notification script runs curl against my ntfy server, which forwards a message to my phone. That way I don’t have to remember to check the logs, and I’ll get an alert whenever something is actually broken.

This stuff is a little boring, but maybe that’s good. There’s more than enough excitement when restoring from backups.

neovim Tweaks

When I started using neovim several months ago, I imagined that I might only use it for certain development tasks and stick to VS Codium for the others, where I was already comfortable. Somewhere along the way, without realizing it, I dropped VS Codium completely and am all-in on neovim. It’s the only IDE stack installed on my machines now. I’m happy with it and have gotten it to be pretty reliable for what I typically do, and I feel like I know how to add new features as I find needs for them. The plugin ecosystem is great, so most of the time I don’t even have to think that hard. I just copy a snippet to install and configure the plugin, reload, and move on.

A big feature I was missing from previous IDEs was format on save. This turns out to be really easy with conform. I’d started by trying to roll my own system by registering callbacks on save events, but different formatters require different hand-holding to do their jobs, and conform abstracts over all that. I also added the gitsigns plugin to get visual indication of the buffer’s git state at the line level, and I disabled the annoying plugin update prompts. These are all good examples of the “I need this → search → copy → paste → reload → done” loop.

HF Antenna Rebuilt

A soldering iron, some coax cables, a multimeter, and various other tools laying in the grass
Turns out you can take your soldering iron outside and nobody will stop you.

Last year, my neighbor’s goats got out again and gnawed through a bunch of the coax connecting my HF antenna to my ham shack in the basement. I finally got around to ordering more coax and some connectors so I could replace the feedline and get the antenna going again. This was more or less a repeat of the initial setup, except this time I was able to borrow a friend’s pneumatic antenna launcher, which was a lot easier to use than my drone.

Various coax cable detritus (jackets, shields, and mangled dielectrics) in a loose pile on my workbench

I did learn that some variants of RG-58 coax are better than others. I needed a short jumper for a part of the antenna, so I tried using some of the old coax I had laying around. This particular stuff appears to have polyethylene (or maybe Teflon?) dielectric around a stranded inner conductor. I had a lot of trouble getting the dielectric off the conductor without taking some or all of the strands with it. I don’t remember it being this difficult, so I wonder if the dielectric and conductor have bonded somewhat over time. I spent over an hour making several attempts and completely failing before pulling out another spare spool. For whatever reason this other spool was much easier to work with, even though it seemed to otherwise have the same properties. The new coax, which I got from The Wireman, was by far the easiest to prep. I think this is mostly because that coax has a solid conductor, so the dielectric can slide over it much more freely. In the future I’ll have a strong preference for solid-core coax.

Rope, tools, and an open cardboard box of parts on the grass as the sun goes down

Anyway, I haven’t tested the antenna much, but it’s up higher than ever before, with the feedline draped over an old satellite dish on the house and some nearby trees. It could definitely use some trimming to optimize its resonance in the ham bands, but I was able to tune it up and make a few contacts on FT8 with 10 W. To my surprise, I was able to get a contact on 40 m with a station in western Russia about 4800 miles away, which I think is my further contact ever. It’s hard to say how much of this improvement is due to my antenna system changes versus other factors, but in any case I’m happy about it. I can also hear plenty of stations in Europe, and I managed to make my signal heard by two stations in Australia and New Zealand using WSPR. I’m excited to get back into digital modes again and see what I can do there now that I’m slightly smarter.

Other Bits and Pieces

I did a bunch of other little things, some of which are too small to mention. A lot of my time went towards a problem that nerd-sniped me somewhat, which was getting a Nix flake set up for CadQuery. I’ve used CadQuery for lots of projects, and until now I’ve only used it as a non-Nix dependency in a traditional Python virtual environment. This is fine, but that’s never stopped me before. What I think would be really cool is a fully self-contained flake that gives you a shell with a working CadQuery installation already set up. For more ordinary Python packages, this is pretty easy, but CadQuery depends on OCP, which is a Python wrapper around OCCT, a heavy C++ dependency. I went pretty deep on this and actually got the OCP Python wrapper to compile and import, and along the way I finally went back and learned some fundamentals of the Nix language and ecosystem. I’m still definitely a novice, but I know much more than before, and old code that I mostly copied from elsewhere is making more sense to me now. There’s still more to do to achieve my goal, such as packaging CadQuery itself and splitting the build into multiple stages to get caching, but I’m happy with the progress I made and am content to go back to using virtual environments for now.

Another small task I completed was to back up some old drives in what used to be my daily driver laptop between 2013 and about 2022. I found a fair amount of old code, astrophotos, notes, and even a few Minecraft worlds. While I was transferring the disk contents to my NAS, I went through some other old backups and found a few dozen recordings of conversations with my good friend Logan from 2019 and 2020. It’s been fun to listen back to some of them to hear ourselves predict the future. Mostly we seem to have the same core personalities, but there are notable improvements in our lifestyles, worldviews, and overall living situations. I imagine the recordings we’re making today will have similar effects on us in a few years.


There will always be more to do. My interests and needs change over time, so there’s no sense in trying to achieve a grand unified configuration for all time. As long as I set aside a little attention here and there for tweaks and tuning, I can reduce annoyances and increase the likelihood that I’ll get stuck on real project problems instead of issues with my tools.