Automation & AI
jupiterOS
One declarative computer for a seven-machine home fleet.
Problem
7 machines: four kiosks, a ZFS storage server, a build and serving host, and a cloud builder. I had set them all up by hand. Configuration drifted, nothing was reproducible, and a dead disk meant days of manual rebuild.
Diagnosis
The machines differ in hardware, not in intent. The real fix was not a better manual, it was one source of truth: describe every host declaratively so any of them can be rebuilt from a repository, and let CI verify changes before they land.
Action
- One NixOS flake describing all 7 hosts, each named after a moon of Jupiter: amalthea, metis, thebe and adrastea (the kiosks), europa (the NAS), callisto (build and serve), pallene (the cloud builder)
- 31 service modules shared across hosts: MQTT, PostgreSQL, netboot, Cloudflare tunnel, Headscale, MeshCentral, monitoring and more
- Secrets encrypted with sops/age; each host decrypts only what it needs
- 14 GitHub Actions workflows, one per build target, so a change that breaks a machine fails in CI
- A binary cache on europa so every host shares builds instead of recompiling
- ZFS storage with snapshots; callisto boots its root over iSCSI from europa; the kiosks netboot with iPXE
- Runbooks, architecture decision records, a style guide and incident notes written as the work happened
Outcome
- A new host is now a config away: describe it, build it, done
- Any machine can be rebuilt from the repository
- Secrets never sit in plaintext
- Four repurposed terminals run as daily-use kiosks instead of landfill
- About 1,100 commits between June and September 2026, with AI doing the typing under my direction
What I'd do differently
Pending
Reflection to be written by Jupiter.
0
Open a window and its geometry shows up here.
No events yet.
The desk blanks itself after a quiet spell, then runs one of thirteen effects named after the IRIX screen savers. Move the pointer or press a key to wake it; lock it and only Unlock brings it back.
Settings load with the desktop.
The environment
About this desktop
jupiter.au is set up as a working desktop: the Toolchest, the objects, the status strip and the windows stay with you on every page. Drag a title bar to move a window, pull any edge or corner to resize it, drag it to the side of the desk to snap it into place, and right-click a title bar for that window's menu. Right-click the desk itself for the root menu.
Toolchest
The panel in the corner carries the classic seven menus — Desktop, Find, People, Applications, Shared Resources, System and Help — above the command field. Collapse it to the chip with the arrow in its title strip, or press Ctrl+K to bring it back.
Desks
Four desks, as 4Dwm kept them. Each surface belongs to the desk it was opened on — switch with the status strip, the Toolchest, or Ctrl+Alt+1…4. The Desks Overview window maps all four at once.
The catalogue
The Icon Catalogue lists every application the desk knows — click to select, double-click to open, right-click for the icon's own menu. The objects on the right edge can be dragged into a new order, and the one that will take the drop turns royal blue.
Customise
Desktop → Customise… holds the background (signal wash, flat or dim), the bevels (flat 2026 or the classic two-line), and the way to the Screen Saver. Choices stick to this machine.
Screen saver
Thirteen effects named after the IRIX screen savers, with a timeout, a Random mode and an optional lock. Open the Screen Saver window to change them.
Desks
Four desks, as 4Dwm kept them. Each surface belongs to the desk it was opened on — switch with the status strip, the Toolchest, or Ctrl+Alt+1…4.
Winterm
Type help for the commands — ls, open,theme, date.
Loading the desks…
12 icons shown; sorted by Name
No audio hardware on this host.
Background
Bevels
Screen saver
The timeout, the effect and the lock live in the Screen Saver window.
