OpenRiot v7.9.67 — The Panel Learns to Wait

“Press enter and the panel stopped thinking. The tunnel took ten seconds to stand up and the construct just sat there, motionless, holding a network handshake it had no business holding on the drawing thread. And the picture converter — the tool made to turn PNGs into wallpapers — had turned on the picture shelf and eaten nineteen images it couldn’t find a PNG for. The Turing Police would call the first a ‘blocking I/O anti-pattern’ and the second ‘an unexpected destructive side effect.’ We call them a panel that can’t move and a machine that ate its own face.” — The OpenRiot Crew, v7.9.67


Release Overview

The Control Center stops freezing when you press a key, and --convert-webp stops deleting images it was never asked to touch. One is a UI that couldn’t move; the other was data loss.

Total changes: actions moved off the UI thread, a display refresh, key-collision cleanup, cursor clamping, and a destructive converter bug fix.


⏳ The Panel Learns to Wait

Every action in the Control Center ran on the drawing thread. Press WireGuard and the panel froze while doas wg-quick up stood the tunnel up and then polled it for up to ten seconds. Press the update row and it froze on a version check with a ten-second HTTP timeout. Press screenshot and it froze until maim returned. The user saw a dead window and assumed the panel had crashed.

The fix is the shape it should always have had: every action now runs off the UI thread and the panel refreshes itself the moment the action finishes. Press WireGuard and the label flips to [ON] a second or two later — truthful, not guessed. Nothing blocks the drawing thread. The construct keeps breathing while the tunnel comes up.

While the panel was open to change, it also started refreshing brightness and HDMI on the same timer as everything else, so the brightness keys and external-display changes land in the panel instead of going stale.


🖼️ The Converter Was Eating the Pictures

openriot --convert-webp was built to turn backgrounds/ and Locked/ PNGs into WebP and delete the source PNGs. Somewhere along the way it learned a second trick: it globbed every *.webp in its target directories and deleted any that had no matching .png as “stale.”

Two things were wrong with that. First, the normal end state of a converted file is a .webp with no .png — the tool deletes the PNG itself. So the converter would have eaten its own output on the second run. Second, assets/ had been quietly added to the target list, and every image there — the ones the README shows you — is a standalone .webp with no PNG. One run deleted nineteen of them.

The converter now does one thing: it converts the PNGs in backgrounds/ and Locked/, removes the source PNG, and never touches anything else. assets/ is out of its reach.


🎯 Small Truths

  • Proton Drive hides in Privacy when it isn’t configured, matching the bar module that already auto-hides.
  • The faders icon moved to sit beside the gear on the bar and now wears the same color as its neighbors.
  • The cursor clamps when a row disappears, so it can’t sit on a button that isn’t there.
  • One action key. The p/r/s/l shortcuts are gone. enter is the only action, so l no longer means both “next section” and “lock.”
  • The binary is called by path, not by hoping PATH is set in a GUI session.
  • Tests exist. The Control Center has its first unit tests.

🧾 Files Changed

File Change
source/control/update.go Actions run off the UI thread
  (run/refreshMsg); display added to
  the refresh tick; letter shortcuts
  removed; cursor clamping
source/control/backend.go Dead volume helpers removed;
  absolute binary path; resolution launch
source/control/view.go Proton auto-hide; footers and Power
  rows updated
source/control/update_test.go NEW — section, wrap, clamp tests
source/imaging/webp.go No longer deletes standalone .webp;
  assets/ dropped from its targets
config/polybar/config.ini.tmpl Faders icon reordered and re-colored
README.md Release-notes TOC

🗣️ Final Words

“A panel that can’t move is just a picture. A converter that deletes the pictures is just a shredder with a nice name. The machine is supposed to do the thing it says and nothing it doesn’t, and both of these were doing the opposite. The Turing Police will file their memos about ‘concurrency hygiene’ while we press one key, watch the panel stay alive, and keep every image on the shelf.” — The OpenRiot Crew, v7.9.67