TinyComputers.io

Sponsors

More Articles

Nothing Was Using the Cores: Three Idle Arm64 Boards, One HA k3s Cluster, and a BSD Build Farm

I had three small Arm64 boards on a shelf, each doing one modest thing and idling the rest of the time — an Orange Pi 5 Max running an occasional local LLM, two Raspberry Pi–class machines mostly serving a web page. Between them they had sixteen cores, forty gigabytes of RAM, and four terabytes of NVMe, and almost none of it was doing anything at any given moment. This is the story of resisting the urge to buy two more boards into a memory shortage, and instead turning that idle majority into a real three-node HA k3s cluster with embedded etcd, then teaching it to do the job the boxes had quietly been built for all along — compiling native FreeBSD, OpenBSD, and NetBSD Arm64 binaries — and the small pile of gotchas that stood between "three SBCs" and "a build farm," from a big.LITTLE crash loop to golden images that turned out to be live disks. And then everything else the reclaimed capacity paid for.

The Driver Nobody Wrote: OpenBSD's ena(4) Works Now — and Can't Go Upstream

Five weeks ago I ended a post about writing OpenBSD's missing ena(4) driver with a confession disguised as a list — every way the thing didn't work yet. This is the post where I cross them all off. The driver does a full disk install now, comes up multiuser with the AWS network card as its only interface, lets me SSH in over it, pushes 3.16 Gbit across multiple queues with receive-side scaling, and runs unchanged on OpenBSD-current. It is, by every technical measure I set for myself, done. And that is exactly when it walked into the one wall effort can't move: code an AI wrote has no human author, so it cannot go into OpenBSD's tree — not for lack of quality, but for lack of a person. This is the story of finishing it, the one bug I never cracked, and what it means to write working systems code that, in the eyes of the thing it was written for, nobody wrote.

The Doorbell That Killed the Device: Writing OpenBSD's Missing ena(4) Driver

A weeks ago I wrote about getting native OpenBSD/arm64 builds on Graviton by refusing to let OpenBSD touch AWS's network card at all — running it as a QEMU guest behind a virtio shim, because OpenBSD has no driver for Amazon's ENA adapter. This is the other half of that itch: actually writing the driver. It's the story of getting ena(4) to attach, watching the device kill itself a few microseconds after every bring-up, chasing five increasingly exotic theories for why, and finding that the real cause was the most boring thing imaginable — I initialized a queue in the wrong order. Plus the part nobody writes down: what "working" actually means, and exactly how far from "done" that still is.

The OS That Couldn't See the Network: Native OpenBSD/arm64 Builds on AWS Graviton Metal

I wanted native OpenBSD/arm64 binaries for a project that ships them, and assumed the answer was a Graviton instance. It isn't — OpenBSD's arm64 kernel has no driver for AWS's network card, so the instance boots into a void you can never reach. This is the story of getting there anyway: by refusing to let OpenBSD touch the cloud's hardware at all, running it as a KVM guest inside QEMU on a bare-metal Graviton host, and the two device-tree gotchas, the serial-console install I handed to an AI agent, and a last-mile build failure I confidently blamed on the wrong thing.

The Tunnel Was the Easy Part: Site-to-Site WireGuard Between My House and a VPC

I wanted to close a database's public port and reach it from my house as if the VPC were just another room. WireGuard did that in fifteen minutes. The other day and a half went to an IP-address collision I'd created years earlier, a load-balancing router quietly breaking the tunnel's return path, and the slow lesson that a VPN doesn't connect two networks — it makes you confront every assumption each made while pretending the other didn't exist.

Crystal by Reference: Making freeze() Mean It, Then Making It Fast

A programming language promised that frozen values couldn't change — and didn't keep the promise. The story of finding the holes, fixing them, and then collecting the reward: once immutability is actually enforced, you can stop copying immutable data and just share it. A case study in soundness, hidden bugs, and a 116x speedup, with lessons that apply well beyond one small language.

Topics

Reading Series

Written by Alex Jokela Software engineer by trade, tinkerer by nature, single-board computer hoarder by choice. More about me →