VibeServer 4.1.50 — a corrupted RDS byte was hanging up the spectrum socket
If your waterfall keeps dying while the audio plays on perfectly, this is why.
A WebSocket client must, per RFC 6455, hang up when a text frame is not valid UTF-8 — and browsers do. RDS text arrives over a noisy link in the EBU character set, so a corrupted group can put a byte like 0x81 into the station's PTYN, PS or RadioText. That byte went into the JSON untouched, the browser closed the socket, and with it went the waterfall and tuning — while audio, which is a separate socket, never missed a beat. That asymmetry is exactly why it read as a network fault.
It is intermittent, and it follows the station rather than the receiver: the same corrupted field that killed every reconnect decoded a few minutes later as plain ASCII and the page recovered on its own.
Fixed at the wire. Anything that is not a well-formed UTF-8 sequence — truncated leads, bad continuations, overlong encodings, surrogates, past U+10FFFF — is dropped before it can reach a frame, in the one place every JSON string passes through. Real accented station names, the euro sign and emoji are untouched. New test-utf8 target covering all of it, built from the frame captured off air.
Servers running the Android app need the app updated too; a Pi or a Mac just needs this.