OpenRiot v6.7 — Take One

“Trust, but record.” — Ancient OpenBSD proverb, probably muttered while running tcpdump -w evidence.pcap on a coffee shop WiFi


Release Overview

OpenRiot v6.7 ships the feature you didn’t know you needed until you tried explaining a bug over a screenshot. A native screen recorder lives in the polybar now. One click starts capturing your screen and audio. One click stops it. The file lands in ~/Videos/Recordings/ with a timestamp and a clean H.264 encode. No terminal. No ffmpeg flags to memorize. No forgetting to turn on the mic.

v6.6 was precision. v6.7 is proof.

Also: the gurk build system finally stops pinning to a commit from last year, the Rofi launcher stops lying about Transmission, and your audio daemon stops being permanently reconfigured for a feature you use twice a month.

Total changes: screen recorder, gurk latest-upstream, Rofi honesty, dynamic audio.


🎬 Screen Recorder

The Problem: Explaining a visual bug to a developer without a recording is like describing a color to a blind person. You take twelve screenshots, paste them into a Markdown file, and the recipient still asks “can you show me the transition?” Meanwhile, every screen recording tool on OpenBSD requires you to hand-craft an ffmpeg invocation from memory, guess your resolution, and remember whether snd/0.mon even exists today.

The Fix: A polybar module. One icon. Two states.

Polybar Integration

  • Idle: (teal, same block as night-light)
  • Recording: (red)
  • Click to toggle. No terminal needed.

The module lives in modules-right next to night-light, using the same teal formatting so the block stays visually coherent.

Dynamic Audio Monitoring

Instead of permanently reconfiguring sndiod at install time — which changes what your default audio subdevice captures and breaks apps that expect clean mic input — the recorder temporarily enables audio monitoring:

  1. Before recording: saves your current sndiod flags, sets monitor flags, restarts sndiod, waits 1s for stabilization.
  2. After stopping: restores your original flags, restarts sndiod.

Your music doesn’t get permanently mixed into your mic. Other recording apps don’t get confused. The monitor only exists while you’re actually recording.

PID File Tracking

No pgrep spam every 2 seconds. The recorder writes ffmpeg’s PID to ~/.cache/openriot/recording.pid. Status checks are open(2) + kill(2). If the process dies unexpectedly, the stale PID is detected and cleaned up on the next check.

Notifications

  • Start: “Screen Recorder / Recording is starting…”
  • Stop: “Screen Recorder / Recording is stopping… / Saved to: ~/Videos/Recordings/20260115-1437.mp4”

The path is shown as ~/Videos/... so it doesn’t get truncated in the dunst popup.

Output Spec

  • Directory: ~/Videos/Recordings/ (auto-created)
  • Filename: YYYYMMDD-HHMM.mp4
  • Video: H.264, CRF 23, ultrafast, yuv420p, 30fps, native resolution
  • Audio: AAC 192kbps via snd/0.mon (when available)
  • Fallback: screen-only if audio monitor can’t be enabled

📡 Gurk: Latest Upstream

The Problem: scripts/gurk.sh hard-pinned to 02d3c45 because the notify-rust patch only applied cleanly at that commit. Updating gurk meant manually finding a new commit hash, editing the script, and hoping the patch still matched. When upstream changed fn notify() line numbers, git apply failed with “patch does not apply” even though the code itself was identical.

The Fix:

Default to origin/main

GURK_COMMIT is now an optional environment variable. Unset, the script updates to latest upstream main:

./scripts/gurk.sh           # latest upstream
GURK_COMMIT=02d3c45 ./scripts/gurk.sh  # pin to known-good

patch Instead of git apply

The patch utility handles offset hunks automatically. When fn notify() moved from line 720 to line 857, patch found it by context and applied cleanly. git apply would have aborted.

Stricter Safety

If the patch won’t apply AND the notify-rust disabled on OpenBSD marker isn’t found in the source, the script aborts with an error. No silent builds of crashing binaries.

Directory Flattening

Source moved from ~/Code/gurk/gurk-rs/ to ~/Code/gurk/. The git repo stayed intact. The script and docs updated to match.

Result: gurk 0.9.3 built and verified on OpenBSD 7.9.


📋 Rofi: Already Running

The Problem: Clicking Transmission in Rofi when it was already running showed “Launching Transmission…” and spawned a second instance. Firefox had an “Already Running” check in the --browser CLI path, but Rofi launched apps directly without any instance guard.

The Fix: source/rofi/rofi.go now checks IsTransmissionRunning() before executing. If running, it sends “Transmission / Already Running” and returns. Also cleaned up dead notification logic for the old dynamic toggle icons (󰭽 and 󰅤) that were removed in v6.6.


🧾 Files Changed

File Nature of Change
source/screenrec/screenrec.go NEW Screen recording module with PID tracking, dynamic audio, notifications
source/commands/commands.go Register --screenrec-status and --screenrec-toggle
config/polybar/config.ini Add [module/screenrec] in teal block, interval 2s
scripts/gurk.sh GURK_COMMIT env override, default to origin/main, patch utility
scripts/gurk-patch.diff Updated for latest upstream offset compatibility
docs/Gurk.md ~/Code/gurk path, latest-upstream build instructions
config/bin/gurk Rebuilt binary (gurk 0.9.3)
source/rofi/rofi.go Transmission “Already Running” guard, dead icon cleanup

🗣️ Final Words

“v6.0 was beauty. v6.1 was correctness. v6.2 was readability. v6.3 was choice. v6.4 was independence. v6.5 was honesty. v6.6 was precision. v6.7 is proof.”

v6.6 made sure every bolt was torqued. v6.7 gives you the camera to film the engine running. The screen recorder doesn’t add complexity — it removes the friction of explaining what you see. The gurk build system stops holding your hand and starts trusting you to handle upstream changes. The Rofi launcher stops pretending it launched something it didn’t.

This release is for the moment when someone says “can you show me?” and you click one button instead of opening a terminal, googling ffmpeg flags, and hoping you remembered -thread_queue_size.

— The OpenRiot Crew

“A screenshot is a statement. A recording is evidence.”

← Back to README