Windows x64. Download foxsdr-setup-0.75.0.exe below. Linux builds and the test suite exist but are unfinished and unproven against real hardware — see the notice at the top of the README.
A driver can no longer freeze the interface
A field report showed the interface locking up permanently, with the user left to kill the process. SoapySource::stopLocked was calling into the vendor driver synchronously on the GUI thread, holding the device lock, and for RTL-SDR that call joins the driver's own async thread — a join which never returned.
Every escape-path vendor call is now bounded at 1.5 s and abandoned rather than waited on. The abandoned worker outlives the object deliberately and captures nothing from it, so a receiver destroyed while a wedged call is still inside the driver cannot be read by it. A radio abandoned this way stays condemned until FoxSDR restarts — which is exactly what the on-screen message already promised.
The watchdog no longer reports its own clean shutdown
The newest field report was a false alarm caused by our own safety work: the hang watchdog was filing a report about a shutdown that had completed normally. The bounded waits added in 0.68.0 spend 4.5 s of a 5 s threshold on the teardown, which runs without a heartbeat by design. The teardown now has its own budget — and a shutdown that genuinely wedges is still captured, with every thread's stack, which is the property that mattered.
Three self-contained instrument windows
- Satellites Map — the whole satellite instrument in one window: equirectangular over the entire world, filled land, receiver position, overlays, trail style, a target register with visible sort keys, and a data plate that distinguishes "set a receiver position and this will compute" from "this plugin does not report it at all".
- Plugin Store and Fitted Modules — the catalogue and the operating panel, sharing one data plate. Fitted Modules shows the five states this application can genuinely distinguish — fed, not decoding, takes no signal, stopped by you, refused — and prints a refused module's reason verbatim. That message has existed since the beginning and nothing ever showed it; it is the answer to "my plugin doesn't appear".
Orbital altitude is banded in kilometres
The altitude ladder banded in feet, so every satellite fell into the "> 30 kft" band as one colour — the ISS at 421 km alongside everything else. Satellites now get their own ladder in km. The aircraft ladder is untouched.
The panel, on its own typefaces
Saira Condensed and Nova Mono, embedded, replacing Dear ImGui's bitmap fallback. The panel is the 1960s reference throughout: a cabinet, a 160 px brass deck with a round transport button and the tuned counter in its well, a FUNCTION SELECT rail where every row carries a state chip and a lamp, and annotated spectrum and waterfall — including an elapsed-time axis the waterfall has never had.
Five families of claims removed
Text the product had no right to draw, each found by auditing the last round's work:
- "Enforced by the console — a module cannot take anything not on this list." Plugins load in-process with no sandbox and no permission model. The reach panel now says so, and names the one thing that is enforced.
- "Checks its signature." There is no signature verification. There is a published sha256 the bytes must match, and the text now says exactly that, and that it vouches for nobody.
- The TUNED counter drew the source's centre frequency, not the tuned one.
- Five sentences said a plugin was not installed when they only knew it was not running.
- A lamp wired permanently lit, a coverage ring claiming reception over computed positions, and a scale bar measured vertically but drawn horizontally.
Tests
76, up from 70. Each new one was verified to fail before it passed.