Fedler Studio, a Branded FreePBX, a Revived Kasm Gateway, and Designing StoreCast
A short day out of the house and a long one at the keyboard, and a couple of things I'd been putting off finally got fixed.
Ace, then Fedler Studio
Worked my Ace Hardware shift from 8:00 to 13:10. From 13:30 to 15:00 I was at Fedler Studio fixing printer and email issues.
A JPPS-branded FreePBX
Shipped the first stable release of freepbx-branding, a Debian package that gives the FreePBX 17 admin UI the JPPS look. It works entirely through FreePBX's own branding settings, so no FreePBX files get modified, and removing the package restores stock branding. It's a full dark theme in the JPPS colors, audited across 18 admin pages, with the JPPS wordmark in the navbar, plus a small helper command to apply, reset or check the theme. It's already running on the Ace Hardware PBX, which got the beta first.
One thing I learned building it: my test machine sat on the locked-down network I use for smart-home devices, which blocks outbound internet by design, so I moved it to my regular test network to be able to install things and keep working.
A Kasm outage that had been sitting there since June
Got remote access set up to my Kasm Workspaces server and found something I hadn't known about: all three of its connection proxies (the parts that carry RDP and remote-desktop sessions) had been down since June 11. Their year-long tokens had expired and they'd missed the chance to renew themselves. It only surfaced because an apt upgrade restarted Docker, but the errors predated it.
Fixed it without hand-crafting new tokens myself: two of the three now re-register themselves automatically and can recover from any future outage on their own. The third needed me to re-register it by hand. It still won't fix itself if it's down for more than about three days, so that one stays on my watch list.
A Google black hole on my VPN path
Any machine whose traffic gets forced through my mlvpn-rs link couldn't reach Google's address ranges at all. That's not slow, it's a total silent black hole: the connection never completes and nothing comes back. It explains why some hosts on my network could never reach YouTube or Google's storage, and it's now folded into the ongoing loss investigation. In the meantime I moved the Docker host onto the IoT VLAN, which routes around the problem.
Designing StoreCast
Most of the afternoon went into a new project: StoreCast, a small appliance for Ace's spare Dell that plays music to the store speakers and to the phone system's hold music. It replaces a flaky Bluetooth link, and it means nobody has to walk into a locked office to restart a PC when the music drops. It supports Apple Music, YouTube Music, Spotify, business-licensed services and a public-domain classical library. Each source backs up the others by genre, with local files as a last resort. It has a web interface with staff and admin roles, and a SonoBus feed for remote listening.
Two decisions worth writing down. I wanted it to capture and record the streaming audio itself, and talked myself out of that on terms-of-service and copyright grounds; genre-matched fallback is the honest answer. And there's a public-performance notice at setup that has to be acknowledged, because music on hold isn't automatically covered by the exemptions that apply to a shop radio. The spec is approved and the implementation plans are written, starting with a set of feasibility spikes. Building starts Monday.