OpenRiot v8.0.1: The Prompts Were Always There
“The door was there the whole time. We had painted it the same color as the wall, hung a sign on it in a room nobody entered, and then stood outside wondering why the building felt empty. The lock worked. The handle worked. The only thing missing was someone telling the person on the other side that the door existed. So we opened it, turned the lights on, and let the prompts speak for themselves.” – The OpenRiot Crew, v8.0.1
Release Overview
OpenRiot 8.0.0 moved the desktop to OpenBSD 8.0. OpenRiot 8.0.1 is the release that makes the move behave correctly in the places where 8.0.0 made the machine too quiet.
This note carries the complete 8.0.0 story plus the repairs. If you are landing on 8.0.1, you have everything you need here.
The 8.0.0 release introduced one version source, a setup gate for old releases, 8.0 package pins, host-derived image defaults, and a repainted glass. The 8.0.1 release fixes the setup script’s temporary-file template, makes prompts visible while setup runs, updates packages whose installed version is older than the pin, and updates the dependency stack before installing those pins.
Total changes: everything from 8.0.0, plus visible prompts, honest package updates, and a dependency base that is current before the pins land.
8.0.1 Fixes
The Temp File Had No Xs
OpenBSD mktemp requires six X characters in the template.
setup.sh used mktemp -t openriot-setup, which fails on OpenBSD
before the install can begin. It now uses an explicit template:
mktemp "${TMPDIR:-/tmp}/openriot-setup.XXXXXX"
The Prompts Were Buffered
Setup captured each OpenRiot command’s output in a temp file and
only printed it after the command exited. That was done to capture
the exit status. It also hid every prompt. The release notes pager
and the syspatch question would wait on /dev/tty while the
terminal showed nothing.
Setup now streams output live and captures the status separately:
{ ./openriot "$flag" 2>&1; echo $? >"$tmp"; } | tee -a "$logfile"
The prompt is visible. The status is still returned.
Older Packages Were Called Newer
The package filter skipped any package whose base name was already installed, even when the installed version was older than the pin. It printed a false warning and moved on. The filter now skips only exact matches and queues version changes:
Updating rsync: rsync-3.5.0p0 -> rsync-3.5.1
Dependencies Were Stale
The pins are top-level packages. Their dependencies can be older than the current 8.0 tree. That produced real failures:
gnupgneededgcrypt.22.1, installedlibgcrypthadgcrypt.22.0.fioneeded a newerlibnfs.kateneeded newer glib, cairo, freetype, atk, and gio.
Setup now runs pkg_add -Iu before installing pins. The dependency
stack moves first. The pins land on a base that can satisfy them.
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 # optional
doas sysupgrade -R 8.0 -n
doas reboot
Skipping the backup removes the only rollback path. -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 # recommended: merge base config changes
doas fw_update # optional: only if firmware updates are available
curl -fsSL https://openriot.org/setup.sh | sh
Setup runs pkg_add -Iu before installing pins. You do not need to
run pkg_add -u separately unless setup cannot complete.
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. If you made a backup, keep it 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, streamed output, pre-update |
Fixed mktemp template |
|
source/installer/packages.go |
Queues outdated package updates |
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, 8.0 URLs, pkg_add -Iu |
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 door was never locked. It was never even closed. It was simply quiet, and the machine had learned to wait without saying why. We taught it to speak while it waits, to update what is old instead of calling it new, and to bring the foundation up before the roof. The people who sell silence as a feature will call that noise. We call it a machine that tells you where the door is before you walk into the wall.” – The OpenRiot Crew, v8.0.1