Catching Up — a Companion Module, More StoreCast Sources, and a Week Rebuilding mlvpn-rs
No personal updates to report — this stretch was entirely project work, catching it up in one post instead of several thin ones.
September 30 — a church-laptop StoreCast deployment
Added a real deployment profile to StoreCast for the church's Acer laptop: an on/off switch for the computer's own local audio output (off sends silence to the sound card, keeping it clocked, while SonoBus and the hold-music feed keep getting the real store feed), and a logind override so the lid switch and suspend keys do nothing — it's an appliance now, not a laptop. The church plays two separate Google accounts (Spotify and YouTube Music) through their own per-source browser profiles so they don't collide.
October 1 — a real Bitfocus Companion module
Built companion-module-jpps-storecast from scratch: a plug-in for Bitfocus Companion, the software that drives those physical button panels A/V operators use, so an operator can control StoreCast — play/pause/skip, favorites, and announcements — right from a button instead of a screen. Pairing a panel with a box just needs its network address and a 4-digit code to confirm it's really that box, and it shows StoreCast's live status right on the buttons. Had to pin which version of Companion's own toolkit this plugs into, after finding the current stable release of Companion itself doesn't support the newest one yet.
Spent the rest of the day hardening it against real failure cases from a review pass: it now notices within 25 seconds if a box goes silent and reconnects on its own, it won't crash anymore if a connection drops mid-handshake or you switch which box it's talking to, a connection attempt can't accidentally overlap with a newer one, it gives up on a stalled connection attempt after 5 seconds instead of hanging, and once it's paired with a box over a secure connection it will only ever talk to it securely again — so a weaker, unencrypted answer can't be used to steal the pairing code. Pairing also survives a restart now, and backs off properly instead of hammering a box that's still booting. Fixed one more real bug: the volume buttons were silently sending repeated nudges while disconnected, as if they'd worked.
On the StoreCast side, added the matching half: pairing codes are stored as something that can't be reversed back into the original code, never show up in a settings backup, admins approve each pairing request from the System page, and Companion can now tell StoreCast to play a specific playlist and get its live status back.
October 3 — five more music sources
Added Apple Music, Spotify's web player, Pandora, CloudCover, and Moodby as StoreCast sources, all built around one shared way of driving a web music player instead of writing five separate ones from scratch. Then added Spotify's actual desktop app as its own source, since the church plays downloaded Spotify playlists to get through internet outages, and the web player can't play music it hasn't downloaded. It runs in the background the same way the web sources do, but controls playback through the desktop app's own remote-control hooks instead. Signing into the desktop app needs a Google account, and Google won't let you sign in from inside a hidden browser window, so that one step hands off to a visible one.
October 5–6 — a full week rebuilding mlvpn-rs
The biggest stretch of the week went into mlvpn-rs, working through real throughput and reliability problems one at a time instead of guessing at a single fix.
Correctness first: fixed a bug where, if a link's address could mean either of two different internet address formats, the connection could get permanently stuck trying the wrong one with no way to recover — this used to self-correct in an older version, but got lost in a rewrite. Fixed a scoring bug where an idle backup link could look better than the main link even while the main link was healthy and actually carrying traffic, which could cause it to switch over for no good reason. Repaired six broken network tests along the way, one of which needed its own dedicated test network just to prove the daemon could actually send home a diagnostic report when asked.
Then performance, a chunk at a time: cut out a lot of wasted memory work that was happening on every single packet in and out, split up how packets get sent so one slow connection can't freeze all the others, reworked how incoming packets get processed so they're no longer waiting in line behind each other unnecessarily, and made the system smarter about which link to favor based on how congested each one actually is. Also made the data-recovery feature (the one that rebuilds a lost packet from extra data sent alongside it) handle rebuilding from two losses at once, not just one, and smarter about which link that extra data travels over.
Two more real bugs found by actually testing it, not just reading the code: packets were getting held up waiting for a late one to arrive even when the data to deliver them was already there, which was costing most of the download speed on an unevenly delayed connection — fixed to deliver what's ready right away. And the part meant to detect a link quietly throttling my traffic was comparing two numbers that don't really match up time-wise, so a video call just starting up looked identical to real packet loss, and a perfectly healthy connection kept getting unfairly deprioritized in testing. Rewrote it to judge the problem from what's actually being delivered instead.
Visibility work: added a background check that figures out one overall health status (healthy, degraded, switching over, or down) twice a second, so anything that wants to check on it gets a fast answer. Rebuilt the terminal status tool around one always-visible health banner and six focused screens instead of one giant wall of tabs, and added a small new tool that serves the same health information as a simple web page for anything else that wants to show it. Released all of this as version 0.7.7.