July 29, 2026

A Second Outage, a First Oil Change, and Locking Down SRT Matrix's Privacy Story

The generator kicked on again, which finally forced the first oil change since I bought it four years and 200+ hours ago. ComEd's estimate crept out to 11 PM the next night before power beat it back on the same day. In between, SRT Matrix picked up a real privacy writeup for its licensing system, a tray-icon bug that was opening two browser tabs per click, and the start of a source/destination naming pass across the backend.

Power went out again — same story as a few days ago, different day. This time it's what finally got me to do the generator's first oil change since I bought it four years ago, with well over 200 hours on the original fill. Not a great maintenance record, but it's done now. ComEd's estimate kept sliding — the latest was an 11 PM window the following night — and then power just came back on ahead of all of it, so the generator went back to standby and the server moved back to shore power.

SRT Matrix: privacy writeup, a real tray bug, and a naming pass

Wrote up exactly what SRT Matrix's licensing system does with machine identification, since it was never actually documented anywhere a customer could find it. Short version: trial signup hashes an OS-generated install ID (not a hardware serial) with SHA-256 before it ever leaves the device, that hash exists only to stop someone from deleting local state to mint unlimited trials, and it plays no role in a paid license — those are usage-based, not hardware-locked, so any number of installs can share one key and reinstalling Windows or swapping hardware doesn't affect an existing license at all. That's now spelled out both in-app (About → License) and in the README.

Also caught and fixed a real bug on the Windows build: the tray icon was opening two browser tabs per click instead of one. Turned out the tray library reports a click event on both the mouse-down and mouse-up parts of a single click, and the handler was reacting to both instead of just the release.

Bigger thing that's now underway: splitting three files that had grown to 2,000+ lines each (the config, server, and relay logic) into focused submodules, and — since it touches nearly every file anyway — using the same pass to finish aligning the backend's internal naming with the "sources/destinations" language the dashboard and store already settled on, instead of the older "sites/stations" wording still baked into the Rust code underneath. Structural work, not user-facing, but the kind of thing that's much cheaper to do now than to keep working around later.

← Back to Blog