OpenRiot v7.9.24 — Four Versions in a Trenchcoat

“The street finds its own uses for things.” — William Gibson, Burning Chrome


Release Overview

v7.9.24 rolls up everything from v7.9.20 through v7.9.24 into a single release that rewrites the backup tool, hardens the disk manager, ships a proper Kate installer, wallpaper mascots, a clipboard exorcism, supersonic post-resume restoration, and finally — finally — tells Firefox’s incognito windows apart from the normal ones. The ghost is in the wallpaper. The packets agree with the WiFi. And Firefox Private Browsing now wears a dot instead of an agent hat.


🕵️ Firefox Private Browsing Icon

i3 reports class=firefox for both normal and private windows. The only way to tell them apart is the window title containing “Private Browsing”. Three separate code paths (window switcher, workspace icons, polybar workspace module) now detect this and substitute the private browsing icon.

Glyph Before After
Normal Firefox 󰈹 󰈹 (unchanged)
Private Browsing 󰈹 (same!) 󰡖 (incognito dot)
Agent hat N/A Deprecated

Detection heuristic: if class is firefox and the window name contains “Private Browsing”, emit firefox-private as the class for icon lookup. All three consumers (windowicon, workspaceicons, polybar) share the same exported helper: windowicon.IsPrivateFirefox().

The private icon itself was debated for exactly thirty seconds: agent hat → incognito dot 󰡖. The dot reads better at 14px polybar scale.

File Change
source/windowicon/windowicon.go NEWIsPrivateFirefox()
  helper; collectWindowClasses
  emits firefox-private
source/workspaceicons/workspaceicons.go collectWindows emits
  firefox-private
source/window/switch.go walk checks IsPrivateFirefox
  for icon lookup
source/polybar/polybar.go collectAllClasses + collectWindows
  emit firefox-private
config/window/icons.toml firefox-private: 󰡖

💾 Migrate — OpenBSD Backup Tool (v7.9.20 recap)

Migrate, a pure-Go backup/restore tool, joined the OpenRiot ecosystem. Six surgical fixes were required to make it work:

Fix What happened
Brace structure Rewrote mangled if block in ui.go
Missing imports Added drives and platform packages
LUKS warning runtime.GOOS != "openbsd" guard
1 byte drive ParseDriveSize: strip spaces, extract
  trailing alphas, multi-letter unit prefix
Slow backup Excluded .cargo, .rustup, .npm,
  .go/pkg/mod, .cabal, .stack, .m2
No progress info Added Elapsed/ETA fields, rendered as
  00:02:34 / 00:01:23 remaining

The most spectacular bug: a 1.8 TB USB drive was detected as 1 byte because FormatBytes("1.8 TB") outputs with a space, but ParseDriveSize took the last character as the unit. "1.8 TB" → strip space → "1.8TB" → last char = "B" → multiplier = 1 → int64(1.8 * 1) = 1 byte. You need at least 1.8 TB of total drive capacity.

The Migrate binary ships at config/bin/migrate and installs under the Utilities rofi submenu — alongside WiFi, Monitor, Drive Manager, Benchmark, System Monitor, and System Settings.

🖼️ Visual Overhaul — Mascot Wallpapers (v7.9.22-23 recap)

Kate IDE is now an optional install (saving ~300MB of KDE deps). When installed, it gets Ayu Dark theme, BreezeDark UI, and FiraCode Nerd Font out of the box. Rofi entries are automatically stripped when declined.

All 20 backgrounds and 52 lock screens were rebuilt with the OpenRiot mascot — the same ghost from the install screen, now haunting your desktop too. Grids returned. CRT glow returned. The vague “dark wallpaper” look is dead.

⌨️ Clipmenud Exorcism (v7.9.21 recap)

After weeks of blaming i3, Polybar, picom, and operator error, the root cause of intermittent missing keystrokes was found: clipmenud. XFixes-based clipboard monitoring competed with the X event queue and dropped key-press events under load. The clipmenud exec line in i3 config is now correctly commented out (the old comment said “disabled” but clipmenud was still running). Full input fidelity restored.

Polybar module intervals were staggered to coprime values so no two modules ever fire simultaneously, and the rightmost module group was recolored from purple to cyan-dim for cleaner visual harmony.

🔌 Post-Resume Restoration (v7.9.17 recap)

openriot --resume now runs automatically via /etc/apm/resume, restoring displays, WiFi, and WireGuard after suspend — with a 2-second hardware settle delay, laptop panel fix, and completion notification. No more manual cable unplug, NMTUI reconnect, or wondering why the VPN is dead.

🔐 Disk Manager (v7.9.18-19 recap)

The Disk Manager (openriot --disk) is a Bubble Tea TUI for discover, mount, umount, format, encrypt, and benchmark operations. Softraid-aware: virtual devices and physical chunks are mapped independently. Drives show [ROOT], [CHUNK], [MOUNTED], [ENCRYPTED], [AVAILABLE] flags with bus type and model name.

The passthrough odyssey required four iterations. The mount/umount rewrite handles three device types. And after seventeen failed attempts, detachSoftraidChunk() learned that bioctl -d needs the volume name, not the chunk name. The volume. Name.

🧾 All Files Changed (v7.9.20 — v7.9.24)

File Change
source/windowicon/windowicon.go NEWIsPrivateFirefox()
  helper; Firefox private
  detection in class collection
source/workspaceicons/ collectWindows emits
workspaceicons.go firefox-private
source/window/switch.go walk checks IsPrivateFirefox
  for icon lookup
source/polybar/polybar.go collectAllClasses +
  collectWindows detect private
  Firefox; unsafe.Pointer →
  binary.LittleEndian (v7.9.16)
source/network/network.go Log errors in CheckConnectivity
  (v7.9.16)
source/crypto/crypto.go Log 6 swallowed errors (v7.9.16)
source/installer/crush.go Log fish completions errors (v7.9.16)
source/installer/kate.go NEW — KatePreference,
  SetupKateConfig, StripKateFromRofi
  (v7.9.22)
source/installer/cmd.go Wire Kate into setup.sh (v7.9.22)
source/installer/packages.go cmd.Stdin; braille spinner;
  library mismatch detection;
  60m 0ad timeout (v7.9.14-15)
source/imaging/download.go Append .tgz to firmware URL
  (v7.9.15)
source/imaging/webp.go assets/ dir; remove PNG after
  conversion (v7.9.15)
source/resume/resume.go NEW — post-resume restoration
  (v7.9.17)
source/display/hdmi.go RestoreDisplays(); lidaction
  sysctls (v7.9.17)
source/backgrounds/ findFirstBackground() replaces
backgrounds.go hardcoded 01.png (v7.9.14)
source/theme/colors.go Suppress missing colors.toml
  warning as root (v7.9.14)
source/disk/ (17 files) NEW — Disk Manager TUI
  (v7.9.18-19)
source/commands/commands.go --disk, --resume, --polybar-all
  registrations; Blockchain submenu
source/settings/settings.go Disk Manager menu entry
source/polybar/polybar.go RunAll() workspace module;
  coprime intervals; purple→cyan-dim
Makefile image: all rebuilds first
config/window/icons.toml firefox-private 󰡖;
  openriot_disk, openriot_migrate,
  glyphriot, zcashmini, btop,
  kate, kwrite icons
config/rofi/apps.txt Utilities submenu; Blockchain
  submenu; Kate/Games launcher
config/rofi/utilities.txt NEW — Utilities submenu
config/rofi/blockchain.txt NEW — Blockchain submenu
config/rofi/games.txt Cromag Rally; kdiamond removed
config/i3/config Floating rules for disk/migrate/
  crypto TUIs; clipmenud commented
config/bin/migrate NEW — Migrate binary
install/packages.yaml kate module; cromagrally; fio;
  kdiamond removed; apmd resume hook
assets/disk.webp NEW — Disk Manager screenshot
assets/migrate.webp NEW — Migrate UI screenshot
assets/games.webp NEW — Games menu screenshot
assets/menu.webp Re-encoded
assets/qr-code.webp Re-encoded
Locked/43.webp NEW — 10 lock screens (v7.9.15)
Locked/52.webp  
Locked/16-32.webp All recolored, cleaned (v7.9.23)
Locked/53-60.webp NEW — 8 lock screens (v7.9.23)
backgrounds/06-15.webp Color corrected, mascot branded
  (v7.9.22-23)
backgrounds/19.webp NEW — 6 backgrounds (v7.9.15)
backgrounds/24.webp  
README.md Laptop table; polybar table;
  TOC fix; Disk Manager; Games;
  QR badge; donate badge

🗣️ Final Words

“Four versions. One trenchcoat. The dot knows what you did.” — The OpenRiot Crew, watching a private window finally get the icon it deserved