OpenRiot v5.0 — Mostly Harmless

“Don’t Panic” — The Hitchhiker’s Guide to the Galaxy, and also what we told ourselves when polybar icons kept falling off the right edge of the screen like lemmings.


Release Overview

After surviving the Vogon poetry of desktop Linux, OpenRiot v5.0 arrives like a ninja in a towel: silent, efficient, and surprisingly well-prepared for intergalactic bar fights. This release doesn’t just fix things — it fixes them with style, applying the stealth precision of a shadow warrior and the cosmic perspective of someone who knows where their towel is.

Total ninja strikes: 42. (Okay, fine, it’s 11 major changes. But 42 is the Answer, and we’re sticking with it.)


🥷 The Art of Invisible Clicks — Polybar Icon() Ninja Wrapper

The Problem: Nerd Font glyphs are like girls at a bar when you’re drunk — they are much wider than they actually claim to be. Polybar was calculating click-boxes based on the glyph’s “official” width (the advance metric), which meant the rightmost 2 pixels of every right-side icon were clicking into the void, like throwing a shuriken at a hologram.

The Fix: We channeled our inner master and created polybar.Icon(), a single wrapper function that appends %{O2} (a 2px invisible offset) to every icon destined for the right side of the bar. Now when you click the edge of the volume icon, it actually registers — no more missed strikes.

Modules now wrapped with silent precision:

  • volume — hear the silence of a perfect click
  • battery — charged and clickable
  • network-wifi / network-eth — connected to reality
  • cpu / memory — high performance, zero dead zones
  • wireguard — your VPN clicks are now encrypted and on-target
  • stealth — ironic: the stealth icon was the most visible problem
  • night-light — no more fumbling in the dark
  • laptop-monitor — toggles that actually toggle
  • proton-drive — sync status you can actually touch
  • transmission — torrent icons that don’t ghost you
  • openriot-update — check for updates without missing the button

“The first rule of riot club: your click targets should be at least as wide as they look.”

For custom/text modules (power, lock, settings, crypto), we applied %{O2} inline in config/polybar/config.ini — because even static icons deserve to be clicked.


🚀 Startup Sequences: Patience, Young Padawan

Polybar launch delays have been increased from sleep 35 and sleep 810 in config/i3/config. Why? Because Xorg on some hardware takes its sweet time initializing, and launching polybar before X is ready is like trying to hail a spaceship before it exits hyperspace. The extra seconds prevent race conditions and ensure your bar actually appears.


🖱️ Mouse Speed: The Mouse That Roared (Then Got Silenced)

The mouse.tp.scaling=0.8 setting has been commented out in both config/xinitrc/openriot-x11 and config/xsession/openriot-xsession. It turns out not everyone wants their trackpoint to feel like a caffeinated hummingbird. The default sensitivity is now restored — use xinput if you still want to tweak it.


🔋 APM: The Answer to Life, the Battery, and Everything

Added doas rcctl start apmd to install/packages.yaml. Previously, the Advanced Power Management daemon wasn’t starting automatically on some installs, leaving batteries unmonitored and users confused about why their laptop was plotting to hibernate at 40%.

“I never could get the hang of Tuesdays. Or battery thresholds.” — apmd, probably


📥 Transmission: From Daemon to Deliverance

The Great Transmission Refactor™:

  1. Config target fixed: The installer was trying to install a directory where a file should go. ~/.config/transmission/settings.json now receives its actual config, not a folder named after it.

  2. Removed dead daemon config target: The old transmission-daemon config path in packages.yaml was a zombie — it referenced a location that no longer existed or mattered. Decapitated and removed.

  3. Renamed directory: config/transmission-daemon/config/transmission/. Because calling it “daemon” when we configure the client is like calling a restaurant “kitchen.”

  4. Path expansion fix: Removed unexpanded ~/Downloads paths from config/transmission/settings.json. Transmission doesn’t expand ~ — it literally creates a folder named ~ in your home directory. We have now prevented the creation of a $HOME/~/ inception folder.

  5. mpv MimeType integration: Added MimeType declarations to config/applications/mpv.desktop and registered handlers in packages.yaml via xdg-mime. MPV now handles video/audio files from Firefox and file managers like a proper galactic hitchhiker.


🖼️ Wallpaper Cache: Flattening the Multiverse

Locked/default/ and Locked/stealth/ have been flattened into a single Locked/ directory. Stealth wallpapers now use the s suffix instead of living in a parallel folder dimension. Think of it as turning a multiverse into a neatly labelled filing cabinet.

Updated source/lock/cache.go and source/lock/lock.go to filter *s.png for stealth mode within the flat cache. Less recursion, more ninjutsu.


🌐 Proton Drive: Still Syncing in a Mostly Harmless Way

No structural changes, but we made sure the GetProtonDriveIcon() outputs are properly wrapped via the new Icon() function. Your cloud sync arrow now clicks as smoothly as it spins.


🧰 Infrastructure & Developer Experience

  • source/polybar/polybar.go: Centralized polybar.Icon() function lives here, right after imports, like a dojo master overseeing the students.

  • source/commands/commands.go: --polybar-transmission handler updated to print via polybar.Icon().

  • Go imports: Added openriot/polybar to battery, network, display, nightlight, wireguard, macspoof, and update packages so they can all call the dojo master.

  • config/polybar/config.ini%{O2} offsets applied to power, lock, settings, and crypto custom/text modules.


🛜 Known Intergalactic Phenomena (Not Our Fault, But Documented)

Hetzner SSL Certificate Expiry: If your internet feels slower than a Vogon civil servant, it might not be you. During testing we discovered Hetzner had an expired SSL certificate causing connection delays. The issue resolved itself, like most cosmic anomalies.

GL-iNet Router Toggle: For users routing through GL-iNet devices, make sure “Allow Access WAN” is enabled in the admin panel. Otherwise your packets will get lost in the Infinite Improbability Drive.


🧾 Files Changed

File Nature of Change
config/i3/config Polybar startup delays increased
config/xinitrc/openriot-x11 Mouse scaling commented out
config/xsession/openriot-xsession Mouse scaling commented out
install/packages.yaml APM service start, transmission fixes, xdg-mime registration
config/transmission/settings.json Corrected paths (removed unexpanded ~)
config/applications/mpv.desktop Added MimeType declarations
source/lock/cache.go Flattened cache logic for single-directory Locked/
source/lock/lock.go Updated to filter *s.png in flat cache
source/polybar/polybar.go Added Icon() wrapper; updated RunVolume(), RunProtonDrive(), RunMetrics(), GetRAM()
source/battery/battery.go Get() returns polybar.Icon(...)
source/network/network.go GetWifi(), GetEth(), getWifiIcon() return polybar.Icon(...)
source/display/laptopmonitor.go RunLaptopMonitor() prints polybar.Icon(...)
source/nightlight/nightlight.go Get() returns polybar.Icon(iconOn)
source/wireguard/wireguard.go Status() returns polybar.Icon("󰱓")
source/macspoof/macspoof.go StealthStatus() returns polybar.Icon("󰝴")
source/update/update.go iconForComparison() returns polybar.Icon(...)
source/commands/commands.go --polybar-transmission handler uses polybar.Icon(...)
config/polybar/config.ini Inline %{O2} for power, lock, settings, crypto

🗣️ Final Words

“Time is an illusion. Lunchtime doubly so. And so is the idea that a Nerd Font glyph fits inside its own bounding box.”

This release is dedicated to every user who ever clicked the edge of a polybar icon and heard only the sad, empty sound of the void. Your clicks matter. Your pixels count. And now, thanks to a little ninja magic and a 2px offset, they actually work.

Upgrade with the usual command:

curl -fsSL https://OpenRiot.org/setup.sh | sh

Don’t forget to bring your towel.

— The OpenRiot Crew

“So long, and thanks for all the fish… and the downloads.”