OpenRiot v8.0.0: One File to Point Them All

“The map had been copied onto every wall in the building. One copy in the lobby, one in the basement, one taped inside a cabinet nobody opened. Every copy agreed with every other copy until the day the street moved. Then the lobby map was right, the basement map was wrong, and the cabinet map had been printed with the wrong year. So we took the maps down and kept one ledger by the door. The ledger does not care which room you are standing in. It knows where the street went.” – The OpenRiot Crew, v8.0.0


Release Overview

OpenBSD 8.0 is here, and OpenRiot 8.0.0 moves with it. This is not a patch release with a new number. The machine learned to stop carrying the OpenBSD version in its pockets.

The release target now lives in OPENBSD_VERSION. The sets date lives in OPENBSD_RELEASE_DATE. The build reads both and stamps them into the binary. setup.sh fetches the required release before it touches anything. The image builder asks the host what it is running. The package pins were rebuilt against the signed 8.0 indexes. When the next release arrives, the version moves in one place, not twelve.

The desktop work is smaller but visible. The lock rotation was cut from forty-two frames to sixteen deliberate ones, and sixteen backgrounds were repainted for the new release.

Total changes: OpenBSD 8.0 support, one version source, a setup gate that refuses to guess, and a repainted glass.


The Eight Point Zero

OpenBSD supports upgrades one release at a time. A 7.8 machine cannot jump straight to 8.0. It goes through 7.9 first, or it gets a fresh install. A 7.9 machine has a clear path:

openriot --backup
doas sysupgrade -R 8.0 -n
doas reboot

-n downloads the 8.0 sets, verifies them with signify, and writes /bsd.upgrade without rebooting. doas reboot then runs the one-shot upgrade. After the reboot:

doas sysmerge
doas fw_update
doas pkg_add -u
curl -fsSL https://openriot.org/setup.sh | sh

sysmerge is the step that deserves attention. OpenRiot edits /etc/pf.conf, /etc/sysctl.conf, /etc/rc.conf.local, and /etc/X11/xenodm/Xsetup_0. The merge may ask about any of them. Re-running setup after the merge puts the OpenRiot versions back.

There is no supported downgrade from 8.0 to 7.9. Keep the backup until the machine has booted, locked, and connected at least once.

The full runbook is in docs/Migration-8.0.md.


One File to Point Them All

The old binary carried TargetOpenBSD as a Go constant, a date as a Go literal, a second version in main, a third in the Makefile, and a fourth in the image builder. Every copy had to be edited together. Missing one produced a setup script that believed two different things about the same release.

Now there is one source:

OPENBSD_VERSION        -> 8.0
OPENBSD_RELEASE_DATE   -> 2026-10-06

The Makefile reads both with bmake syntax and injects them into source/buildinfo. The installer, the migration checks, the update notifier, and the package URL all read the same values.

The image builder no longer starts with install80.img baked into its defaults. It asks uname -r what the host is running, derives the sets name, and lets --version override it when a different target is intentional.

This is the part that matters beyond 8.0. When 8.1 ships, the ledger changes, the build stamps the new value, and the code does not need a scavenger hunt.

Somewhere a vendor is printing the same version number onto twelve different boxes and calling it a release strategy. We kept one ledger and one door.


The Door That Says Not Yet

Running setup.sh on 7.9 used to start doing work. It would clone the new tree, try the new package pins, fall back to base names, and leave a 7.9 system wearing parts of an 8.0 release. The finish banner still said success.

That door is closed.

setup.sh now fetches the required OpenBSD release from openriot.org/OPENBSD_VERSION. It falls back to the repository file on GitHub, then to the installed copy. If the running release is older than the required one, it prints the upgrade plan and waits for ENTER. No doas, no package install, no config copy.

If the running release is newer than the target, setup warns and continues with base package names. That is the window where OpenRiot has not caught up to a new OpenBSD yet, and pretending otherwise would be a lie.

openriot --check-upgrade shows the same plan. The Polybar update indicator now notices an OS upgrade, not just an OpenRiot version, and opens that plan in a terminal.


Packages From the Signed Index

The 8.0 package list was rebuilt against the signed repository index, not against a release announcement or a guessed revision.

  • 102 package pins.
  • 5 firmware pins.
  • Every package name and version exists in the signed 8.0 package index.
  • Every firmware archive exists in the 8.0 firmware index.
  • No base-name fallback is needed for the target release.

The notable moves include Python 3.14.7, FFmpeg 9.0.2, Firefox 157, LibreOffice 26.8, and the Intel and DRM firmware updates.

On a release newer than the pin set, packages install by base name and fw_update handles firmware. The machine does not pretend an 8.0 archive belongs on 8.1.


The Glass, Repainted

The lock set was cut from forty-two frames to sixteen. Every one of the sixteen was repainted. The full background set remains fifty images, with the first sixteen replaced for 8.0.

The lock cache remains at:

~/.local/share/openriot/Locked/.cache/<width>x<height>/

After the upgrade, rebuild it:

rm -rf ~/.local/share/openriot/Locked/.cache
openriot --build-lock-cache

🧾 Files Changed

File Change
OPENBSD_VERSION NEW version source
OPENBSD_RELEASE_DATE NEW sets date source
source/buildinfo/buildinfo.go NEW build-time values
Makefile Reads version files, injects buildinfo
setup.sh Release gate, remote version, plan
source/installer/version.go Release compare and requirement
source/installer/cmd.go Package install guard
source/commands/helpers.go Upgrade plan and install guard
source/commands/commands.go Upgrade check and 8.0 URLs
source/update/update.go OS upgrade notification
source/imaging/prereqs.go Host-derived image defaults
source/imaging/build.go Version-derived sets path
source/imaging/runner.go Help text follows host
source/main.go Removed duplicate version
install/packages.yaml 8.0 pins and firmware
docs/Migration-8.0.md NEW migration runbook
README.md Upgrade section and 8.0 links
backgrounds/01-16.webp Repainted for 8.0
Locked/01-16.webp Repainted for 8.0
  Set reduced from 42 to 16
Locked/17-42.webp Removed
source/*_test.go 8.0 fixtures and release compare

🗣️ Final Words

“The street moved and every copy of the map argued about it. So we stopped copying the map. One ledger by the door, written in the only hand that signs the release. When the next street moves, the ledger moves first, and the machine follows it without a committee. The people who sell maps for a living will call that a governance problem. We call it knowing where we are.” – The OpenRiot Crew, v8.0.0