Uses
What I actually run, rather than what I'd recommend. Most of it has been in service long enough to have opinions attached, so those are here too.
- Primary host
- Unraid
- Storage
- 30 TB
- Containers
- Several dozen
- Virtual machines
- Half a dozen
- Hypervisor nodes
- 2 × Mac Mini, Proxmox → OpenClaw
The Unraid box is the boring half of the homelab, and that's deliberate. It holds everything I'd be annoyed to lose and runs the services other people in the house depend on, which means it is explicitly not where I experiment.
Splitting the lab in two, one machine that has to work and one cluster I'm allowed to break, was the change that made the whole thing sustainable. Before that, every experiment carried a small tax of guilt.
The two Mac Minis are older machines running Proxmox, currently being repurposed as OpenClaw boxes. Second-hand Apple hardware makes a surprisingly good node: quiet, low power, and available cheaply precisely because nobody wants a Mac they can't update.
- Gear
- UniFi throughout
- Segmentation
- 3–4 VLANs
- Pressure
- Primary VLAN near address exhaustion
- Cluster link
- 1GbE
UniFi throughout, with three or four VLANs. The problem isn't that segmentation is missing. It's that it grew a device at a time. Things landed wherever was convenient rather than wherever they belonged, and the boundaries have quietly stopped meaning anything.
The forcing function is address space: the primary VLAN is running out of it. That's the useful kind of problem, because it makes a re-plan unavoidable rather than merely advisable.
What I'd change: start from the trust boundaries instead of the device list, size the subnets for what they'll hold in five years, and only then work out what moves where. Planned as meshwork.
- Nodes
- 6 × Raspberry Pi 4
- Distribution
- k3s
- Network
- 1GbE, no PoE
- Node storage
- SSD
- Shared volume
- USB-attached SSD as a cluster PV
- CNI
- Cilium
- GitOps
- Flux
Six Pi 4s on gigabit, booting from SSD. It is not fast, and I've stopped treating that as a flaw. Constrained hardware surfaces problems that generous hardware hides: memory pressure, slow disks, a control plane that actually notices when a node goes away. Everything I've learned here transferred upward.
The shared volume is a single USB-attached SSD exposed as a physical volume to the cluster. It works, and it is obviously a single point of failure. I know.
What I'd change: NVMe hats are the next real upgrade, and I expect storage latency to matter more than any tuning I could do first. That's on the backlog rather than written up here as though it were already done.
- Platform
- Home Assistant
- Protocol
- Z-Wave
- Sensors
- Doors and windows throughout
- Control
- Switches and plugs throughout
Home Assistant runs the house: contact sensors on every door and window, Z-Wave switches and plugs throughout, and as much of the routine behaviour automated as I can justify. The rule I hold to is that automation has to be strictly better than the manual version. A light that guesses wrong is worse than a switch.
It's the same appeal as the cluster, pointed at the house. A system you can query, script and reason about beats a collection of appliances that each know one thing. Putting printer telemetry on the same platform is what chamber is for.
- Installs
- Permanent and seasonal
- Cadence
- A new show every year
- Approach
- DIY, sequenced from scratch
DIY, permanent installs plus seasonal additions, and a new show sequenced every year. It's the most complete version of everything else on this page in one project: electronics, physical installation, a scheduling problem, and software that has to run unattended in the cold with an audience.
It also has the hardest deadline I work to all year. The show ships in December whether or not it's finished, which is a useful annual reminder that shipping and finishing are different things.
Currently unreliable. The WLED controller on the permanent run drops power in a way I haven't yet diagnosed. See festoon.
- Printing since
- 2017
- Primary
- Prusa Core One + INDX
- Nozzles
- 8
- Voron 2.4
- 350 × 350, torn down
- Speccing
- CocoaPress
- Previously
- Prusa Mini, smaller Voron
- Slicer
- PrusaSlicer / OrcaSlicer
- Materials
- PLA, PETG, ABS
- Next
- Flexibles
Printing since 2017, with some version of a machine on the bench ever since. The Core One with the INDX add-on is the workhorse now, and eight nozzles has changed what I bother to attempt. Multi-material stops being an event you plan around and becomes something you just do. The Voron 2.4 is in pieces while I decide whether it comes back as itself, and a CocoaPress is currently being specced, because apparently I now need a printer that extrudes chocolate.
Mostly PETG and PLA, with ABS regularly enough that the enclosure earns its keep. The next thing I want to attempt is an airless basketball in a flexible filament. A lattice that has to survive being bounced is a genuinely hard print, and failure will be obvious and immediate, which is my favourite kind of test.
I build printers from scratch on purpose. A machine you assembled is a machine you can fix, and there's no substitute for having had every part in your hands when something starts going wrong at layer 400. The Mini and the Voron are gone but both earned their keep as teachers.
- OS
- Omarchy (Arch), or macOS
- Editor
- VS Code
- Shell
- zsh + tmux
- Terminal
- Ghostty
- Font
- IBM Plex Mono
Boring on purpose. Everything here is reproducible on a fresh machine from a dotfiles repo in about ten minutes, which matters to me more than any individual tool being optimal.
Linux when I get the choice, macOS when I don't, and enough overlap between the two that moving between them costs nothing. The terminal is the part that has to be identical; everything above it can differ.
- Framework
- Astro 5
- Content
- MDX + Zod schemas
- Styling
- Plain CSS, no framework
- Client JS
- None
- Hosting
- Cloudflare, static
- Build
- Push to main
Static, no client JavaScript, no framework CSS. Content is MDX validated against Zod schemas at build time, so a malformed post fails the build rather than shipping broken.
Deliberately not self-hosted. It would be neater to serve this from the cluster it talks about, but then an evening of tinkering takes the portfolio down with it. The cluster is the half I'm allowed to break.