The quiet software tooling renaissance A quiet renaissance has been happening in software tooling. New projects are cropping up that do things far better than the tools they replace, and in many ways, they carry the ideals of older unix tools into the 21st century. Newer tools typically discard decades of baggage, embrace modern standards, and ultimately just work better. And the best part about most of them is that you can start using them now, without having to get your team or coworkers or...| Jeff Sandberg's Blog
Make your repo ergonomic Throughout my entire career as a software engineer, I’ve had to clone and set up many projects. They have each done different things, and have been in a variety of different languages, built around a variety of different systems. Some are open source and public, others are proprietary and available only through the terms of my employ. One commonality nearly all of them share is that they suck to get set up on a new machine. Proprietary codebases are typically slight...| Jeff Sandberg's Blog
Writing in Djot I’ve completed an effort to get Djot support implemented into Tableau, the Elixir powered static site generator I use to run this blog, and have started writing posts in it1. So far I’m pretty happy with it, although there are a few oddities that I’ve had to work around, and some changes that will take getting used to. Still, if you’re looking for something a bit more stringent than Markdown, Djot might be a good candidate for you. History This is more of the history a...| Jeff Sandberg's Blog
Improving my HomeAssistant Automations with State Machines A little over a year ago, I migrated the bulk of my HomeAssistant automations from NodeRED to DigitalAlchemy, a TypeScript based automation system. Since then, I've slowly been adding more and more automations, of varying complexity. For simple ones, the built in event-based system works well enough, but as soon as you start having to track state across a few different entites, it becomes a big, unwieldly mess. State Machines? This is...| Jeff Sandberg's Blog
How a simple chicken coop door opener became a huge project The door and opener. I have hens. A decent amount of hens. And one thing you have to do when you have hens is secure them at night. Most people will agree that chicken is tasty, and most predators share that opinion. So a big hen house full of tasty birds is a tempting target for any number of raccoons, foxes, cats, opossums, and more. When we first got hens, we kept them in a small coop we ordered online. It wasn't particularly well...| Jeff Sandberg's Blog
DIY overengineered fridge/freezer monitor I've got a chest freezer that I like to keep an eye on. It's never failed me, but it has several thousand dollars worth of foods and meats in it, and sits out of the way, so it's not something you check every day. If it did fail, it could be catastrophic. Since I have Home Automation, this was entirely unacceptable. So I set out to monitor it. State of the market, 2024 At the time of this project, there were a variety of fridge/freezer products on the...| Jeff Sandberg's Blog
Trying, and failing, to build an ESPHome powered irrigation system I've been enthusiastic about ESPhome for a while now. It seems to be the perfect medium between turn-key home-automation appliances, and 100% DIY stuff. I've used it to measure the temperature of my chest freezer, to fix up a cat feeder no longer supported by the manufacturer, and to add an optical rain sensor to my weather station. So naturally, when reading through the documentation, and coming across the Sprinkler controlle...| Jeff Sandberg's Blog
Co-op campaigns are a rarity these days, and that should change As I've aged, my interest in competitive multiplayer games has waned. I find that I have no interest in fighting other players online, that I don't really care about the score I get, and that having those things present in a game tends to pair me up with players I'd rather not play with. At the same time, my interest in PvE and Co-Op games has grown substantially. While recent games have been rather good on the PvE front, they're...| Jeff Sandberg's Blog
I've been using the Kagi search engine for a bit over a year now, and while it's not fundamentally changed my life, it has made me reflect and think about some things, mainly where the internet has gone, where it was, and what we've lost along the way. It's safe to say that most of us spend most of our waking hours doing something with the internet…| pdx.su
Integrating old GE Interlogix Burglar Alarm sensors into HomeAssistant with SDR Previously, when I was setting up SDR to read my utility meters, while doing research into various tools for reading data with an SDR, I stumbled across a description of some home burglar alarm systems, and how they send data in an easily readable format. This piqued my interest, but I ultimately ignored it at the time, as I was already down a rabbit hole with the utility meters, and wanted to finish that project ...| Jeff Sandberg's Blog
Finally, a good shower Showers are a part of my daily routine. And I've been putting up with a lousy shower head for too long. But I've finally found a new one, one that I like. Yep, that's right, I've written an entire blog post about a showerhead. It's a bit of a review, a bit of me having a little nerd-out over a "gadget", and hopefully an interesting article. The past A lot of people will agree with me when I say that showers don't feel as satisfying as they used to. Not much has changed,...| Jeff Sandberg's Blog
When building this site, one thing I wanted to do was do it as cheaply and easily as possible. I didn't want to have to go out of my way to write for it, deploy it, update it, or anything else…| pdx.su
DIY Permanent Xmas lights This post contains Amazon Affiliate links. As an Amazon Associate I earn from qualifying purchases. Here in Utah, an increasingly common sight is houses with permanent "Christmas" lights. These are usually installed using aluminum channels, along the roofline, and make use of color-changing LEDs. Several of my neighbors have had them installed professionally, and I've always wanted something similar. However, the prices, and limitations, that come with professional i...| Jeff Sandberg's Blog
Running a minecraft server on fly.io Running a minecraft server can quickly become an expensive endeavor. Even a small server needs a reasonably powerful machine to run on, and with the landscape of hosting providers, that can quickly rack up in costs. Ideally, we'd run a server when we want to play, and not when we don't, minimizing the amount of useless time we pay for. And Fly.io makes it possible to do just that. Fly.io Fly.io is my favorite of the "new" cloud companies. They let you quic...| Jeff Sandberg's Blog
Making HomeAssistant automatically trigger libvirtd USB device mounts If you run HomeAssistant in a libvirt-based VM, such as in a qemu backed system, and you want to forward USB dongles (such as for z-wave or zigbee) from the host to the guest, you might run into issues where the dongle doesn't reconnect when the VM restarts, or when the host restarts. This can be quite frustrating, as any devices and automations you have that are tied to that dongle will not work until you manually reconnec...| Jeff Sandberg's Blog
Migrating my HomeAssistant automations from NodeRED to Digital-Alchemy For my home automation needs, I use HomeAssistant. And for more complex automations, I used to use NodeRED. Recently I undertook some effort to move over to DigitalAlchemy, which lets you write automations in Typescript. Here's what I learned in the process. Home Automations via HomeAssistant The platform I use for most of my home automation things is HomeAssistant. It's a powerful platform, and will probably show up in ot...| Jeff Sandberg's Blog
Thoughts on Hoselink Garden Hose Reel This post contains Amazon Affiliate links. As an Amazon Associate I earn from qualifying purchases. I recently needed a new garden hose reel for the front yard, and wanted something a bit more convenient than what I had before. I've had a hose cart I bought from Home Depot years ago, and its worked reasonably well, but its ugly as sin. I've had rather good luck with an Eley hose reel in the back, where I need 200 feet of hose, but don't want something tha...| Jeff Sandberg's Blog
As I dive deeper into HomeAssistant automations, one thing has been nagging at me: my energy usage statistics. I have a solar array, battery, and associated systems installed on my house, and they integrate somewhat well with HomeAssistant…| pdx.su
CalVer for Release Drafter Recently, I wanted to use CalVer with Release Drafter. This is for a project where the SemVer approach would result in a perpetually increasing patch version number, and a practically frozen major and minor version. Unfortunately, Release Drafter has no inbuilt support for CalVer, so we've gotta calculate version numbers ourselves. functionparseVersion(version){if(!version)return;constregexp=/^v?(?<calVer>\d+\.\d+)\.(?<incremental>\d+)/iconstmatches=version.match(re...| Jeff Sandberg's Blog
CSS is fun again CSS has been undergoing a quiet renaissance lately. Lots of big features which previously required an external tool to use, are now native parts of the language, and its growing more and more all the time. If you haven't used CSS in a long time, for whatever reason, now is the time to take a look again. Brief history, and how CSS became "not-fun" Back in the late 90s, we styled our websites using inline attributes. bgcolor, font, and friends ruled the roost. And this was okay...| Jeff Sandberg's Blog
Why I (generally) don't use indented syntax templates anymore Sass, Pug, Haml, Slim, Stylus, and their friends all aim to make writing various bits of your frontend easier. And they mostly deliver on this primary promise. But they are all victims to the vagaries of open software development, and seem to have mostly fallen by the wayside. I loved using these through my career, so its with a bit of sadness that I realized I don't want to use them for new projects. What they set out to do (and u...| Jeff Sandberg's Blog
Use CSS attributes not classes A common pattern in CSS, particularly when using frameworks, is to use a bunch of classes to affect how something looks. Things like btn btn-primary btn-blue are far too common. There is a better way, with support built into CSS too What's the purpose Let's dissect the classes being used on our aforementioned button. We've got btn, which is pretty straight forwards, it indicates that it's a button. Then we've got btn-primary, which probably indicates that the bu...| Jeff Sandberg's Blog
There's a worrying trend in modern web development, where developers are throwing away decades of carefully wrought systems for a bit of perceived convenience. Tools such as Tailwind CSS seem to be spreading like wildfire, with very few people ever willing to acknowledge the regression they bring to our field…| pdx.su
Some Elixir Testing Tricks Testing in Elixir is pretty great. ExUnit, combined with the functional nature of Elixir, makes it very easy to test almost everything in your codebase. However, it is very easy for boilerplate to creep into your tests. Common setup patterns, similar assertions, and more can quickly make your test suite feel cumbersome. But ExUnit files are just Elixir files. So you can write bits of code that will help you out tremendously. Common Setup You're testing something in ...| Jeff Sandberg's Blog
Rest in Peace, Reddit Compact Reddit has recently disabled/removed access to the compact interface, which was useful on mobile and low power devices. As my first professional project ever, I'd like to reflect on it, 13 years the wiser. Origins Back in 2009, I had a Blackberry Storm. It wasn't a great device, but it was neat for the time. The screen was "big," it looked pretty, and it could browse the web, albeit poorly. The built-in browser was mostly optimized for WAP style sites, a few step...| Jeff Sandberg's Blog
The little things matter When working on software, I've noticed a tendency in myself and others to overly focus on the MVP. We aim to get the big stuff working as soon as possible, with some vague promise that we'll apply polish later. While this is efficient from a corprorate perspective, I still feel it does a disservice to building quality systems in the long run. Think about the various systems that you've used. Think about what you like about some of them, and what you don't like about o...| Jeff Sandberg's Blog
Updating my Fish Shell prompt and Theme I've been using Fish Shell for nearly a decade now, and over that time I've gradually developed a theme and prompt that I enjoyed. At the start of this year, I rewrote it from the ground up, eliminating many years of accumulated cruft. My theme is available at https://github.com/paradox460/paradox-theme The beginning Around the new year, the Fish team released a new update, 3.6, that brought with it many new features, and some breaking changes. Historic...| Jeff Sandberg's Blog
I wish Asciidoc was more popular I've been using Markdown for a long time, and have grown accustomed to it. It has various quirks, features, and oddities, but what doesn't. But recently I decided to take a look at Asciidoc, a Markdown "competetor". I found it a great little document toolchain, but it won't replace Markdown. Both Asciidoc and Markdown allow you to write text based content using a simplified markup syntax. Instead of heavier syntaxes, such as LaTeX, HTML, and friends, or rich-t...| Jeff Sandberg's Blog
Fixing a broken smart cat feeder with ESP8266 Many years ago, I purchased a PetNet smart cat feeder. This one was well reviewed, and the app worked well enough not to be annoying. It let me set schedules, and dispense food in rather small increments, compared to its competition. Things worked fairly well for a few years, but in mid 2020, the company behind the product went out of business, and shut down their servers. The feeder would continue to work for a period, but you couldn't configure ...| Jeff Sandberg's Blog
Recently I moved this site off of the older Nuxt/Nuxt-content based static site generator to Tableau, an Elixir based SSG. Between not really ever being fully comfortable with how| pdx.su