SDRmm

Changelog

2.4.3

Features

  • Array processors and Triangulation draw their settings and readouts from the server, like decoders (45ae1f0)

  • Bearing fix node: VOR radials and other bearings cross into a live fix on the Map (45ae1f0)

  • Channels: IF filter with adjustable edges and notches that stay on their radio frequency (405dc29)

  • Decoder plugins: drop a WASM decoder into the plugins folder and it works like a built-in one; settings, readouts and logs come from each decoder (6a5e6ab)

  • Decoder views: sortable tables, meters, trends and pictures from kind hints; health footer on channel faces; scaled numbers and live option labels in settings (45ae1f0)

  • Decoders: table, meter, trend and picture hints, health footer for broadcast and tone squelch, Auto options show what was found (45ae1f0)

  • Inmarsat STD-C draws EGC sea areas on the Map: NAVAREA limits, coastal areas, rectangles and circles (a027dfb)

  • Plugins: bring array processors with their own form, readouts and events; the plugin ABI is version 1 and the server refuses any other (45ae1f0)

  • Plugins: reloads reopen running channels, plugins can transmit, and add their own palette groups and map symbols (45ae1f0)

Fixes

  • A server restart no longer reopens a workspace a client already changed (59bca0f)

  • Decoder log keeps its row limit when switching views (420ac0c)

  • FLEX: join pages split over frames, keep line breaks, flag pages missing a part (747d6c8)

  • Nix installs from a release source tarball and pins no hashes (3c709cb)

  • Palette and event kinds refresh when a plugin reloads (45ae1f0)

  • Plugin SDK: ITA2 text, bit-serial CRCs, Gray decoding and unit-energy RRC taps come from dsp and modem (6a5e6ab)

  • Propagation map: Activity shows heard stations where they are, not at the reflection point. Paths are thicker and dark blue. (2188e69)

  • Readout: DAB slideshows and broadcast files show and download again (7057d7e)

  • Triangulation readouts show right after load (45ae1f0)

  • Windows: MSI installs update through the MSI instead of adding a second install (cbfeb94)

2.4.2

Fixes

  • Airspy: IQ streams again on Windows (8709697)

  • FLEX: decode pages to long address capcodes (5566f07)

2.4.1

Features

  • A Schedule node runs radios and recorders by the clock, and a Satellite runs them for its passes (d785d5f)

  • Play back recorded positions: wire a recording's position output to a Map (5a52a55)

  • Rename the app from SDR-- to SDRmm (f340a5e)

Fixes

  • A decoder readout no longer crashes when its first frame arrives (cb9c5da)

  • A radio opened while the network search runs no longer lingers in the device list (a6a8c59)

  • ACARS puts H1 sublabel position reports and ADS-C reports on the map (92ce485)

  • FLEX decodes pagers up to 2.5 kHz off frequency (500e7a2)

  • Identify ACARS by its symbol clock, not an octave above it (c3f36c6)

  • P25 audio no longer drops out mid-call (ff93d84)

  • Rack faces fill their slot, move by the title bar, and show where a drag lands (e31da6d)

  • Read the platform trust store once instead of on every MQTT delivery (a6a8c59)

2.4.0

Features

  • A KrakenSDR is five Device nodes wired to one Array, not a device kind of its own (191d51b)

  • A recorder keeps an optional pre-roll, and the time machine node retires (191d51b)

  • A recording and a signal generator are picked by a Device node like any radio (191d51b)

  • Examples: twelve working workspaces you can import and change (d71cbca)

  • Note: markdown you leave on the canvas (e84e03d)

  • Remote access through app.sdrmm.com is gone; use your own tunnel (b4dd06d)

  • Rotator: Winegard Trav'ler mounts point over their motor console (e1e5a06)

  • SAME alerts: NOAA Weather Radio and EAS headers, with the counties they cover (04a3c80)

  • The server listens on 127.0.0.1 by default and refuses a wider bind without a token (191d51b)

  • The signal generator and the virtual radios share one synthetic backend (191d51b)

Fixes

  • A baseline writer refuses to run unless it is asked for by name (41b122b)

  • A channel keeps the first radio ID and tells no contact apart from the first (191d51b)

  • A closed DSC squelch no longer grows the decoder buffers without bound (191d51b)

  • A codeplug address that runs past the 32 bit space is refused instead of wrapping (191d51b)

  • A codeplug with two entries of one name keeps its references on the first (191d51b)

  • A collection file is on disk before its lanes look like recordings (191d51b)

  • A CPM demodulator only accepts the input domain it was built for (191d51b)

  • A dead subcarrier, an ISI-free response and a stalled clock no longer panic (191d51b)

  • A decoder log CSV export cannot smuggle a spreadsheet formula (191d51b)

  • A failed close of a radio session is reported instead of swallowed (191d51b)

  • A failed migration read no longer drops the audio chain it was lifting (191d51b)

  • A history capture marks the gap it spliced over (191d51b)

  • A label outside the constellation is refused instead of modulating point zero (191d51b)

  • A LoRa channel name is bounded by its own 32 character limit (191d51b)

  • A malformed RS41, wM-Bus or NAVTEX frame is rejected instead of stopping the decoder (f531d30)

  • A matrix cell out of range or a solve without a factorization is refused (191d51b)

  • A missing array surface slot counts as a dropped surface, not a dropped report (191d51b)

  • A NanoVNA zoom drag stays inside the measured band (191d51b)

  • A new node lands where it was placed instead of jumping as the viewport animates twice (191d51b)

  • A newly learned trunk plan is written down in channel order (191d51b)

  • A non-finite sample no longer drives the AGC to full gain (675e45d)

  • A notch width reads in hertz (191d51b)

  • A paired server cannot flood the phone with an oversized reply (191d51b)

  • A partial page write keeps the Radtel flash past the table it was given (191d51b)

  • A phone recovers from a sensor sample stamped in the future (191d51b)

  • A radio refuses more than 64 channels on one lane (191d51b)

  • A radio that advertises no sample rates keeps the rate it was given (191d51b)

  • A radio transfer that crashed no longer blocks every later identify, read and write (191d51b)

  • A read or write to a radio leaves the server answering other requests (191d51b)

  • A recording upload that lies about its size is refused instead of ending the server (74f800c)

  • A removed row no longer commits its neighbour's unsaved edit (191d51b)

  • A right-click or middle-click on a frequency digit no longer retunes (191d51b)

  • A rotator serial port can be picked while a GPS receiver is attached (191d51b)

  • A satellite track with an unreachable time is refused instead of hanging (191d51b)

  • A saved sweep that fails to load now says so (191d51b)

  • A scanner refuses a zero step or an over-wide range when the workspace is saved (191d51b)

  • A server without a token answers only its own addresses, localhost and the names it was given (191d51b)

  • A session can watch only so many sinks and ports, and a socket takes bounded messages (191d51b)

  • A short write to an AnyTone radio no longer zeroes the next contact record (191d51b)

  • A spectrum frame that does not fit the transform is dropped instead of killing its worker (191d51b)

  • A stalled recording no longer stalls a radio's settings or its shutdown (191d51b)

  • A stored Kraken workspace becomes five radios on one array (191d51b)

  • A stored workspace naming a backend this build dropped clears that node's radio (191d51b)

  • A time machine belongs to its workspace and arms again when you come back (6e5f37f)

  • A token the vault refuses starts no session (191d51b)

  • A truncated capture or a failed channel fit now surfaces (191d51b)

  • A truncated CPDLC route clearance is rejected instead of rendered blank (191d51b)

  • A vanished recordings folder no longer empties the recording index (2508fc5)

  • A video face counts the pictures it had to drop (191d51b)

  • A WAV with an extra chunk reports the right length (191d51b)

  • AD936x: sample datagrams are taken from the radio only, and an extreme errno is reported (191d51b)

  • ADS-B tracks a hub sized fleet and reports evicted tracks (191d51b)

  • Airspy, Airspy HF+ and HackRF open on Linux with a kernel module bound, instead of reporting the radio as in use (c2c5879)

  • Airspy: the receiver is switched on after its transfers are queued (191d51b)

  • An amp stage reads out in the unit its firmware reports (191d51b)

  • An array collection recording keeps every lane on the same sample (191d51b)

  • An array lane whose radio restarted is re-leased and reported as down (191d51b)

  • An array processor reports a surface it could not publish as a lost surface, not a lost report (191d51b)

  • An array reports a correction it could not clear and an aggregator that panicked (191d51b)

  • An audio spectrogram keeps its history when the palette changes (191d51b)

  • An event filter counts characters, not bytes, and the contains field stops at its limit (191d51b)

  • An imported recording lands whole or not at all, and a cut upload surfaces (191d51b)

  • An off-screen Scope stops redrawing its trace until it comes back (191d51b)

  • An oversized frame is refused at encode instead of writing a truncated length (191d51b)

  • An oversized ionosonde feed is refused while it is still arriving (191d51b)

  • An uploaded recording with backwards captures is refused instead of panicking (191d51b)

  • Android release builds fail without a keystore instead of writing an unsigned APK (191d51b)

  • APRS rejects coordinates past the pole and the meridian (191d51b)

  • APRS speed and altitude read in km/h and metres (dcd1bcd)

  • Array sample alignment no longer stalls while a processor retires (191d51b)

  • Blocks lost to a lagging stream reach the dropped count in diagnostics (191d51b)

  • Bluetooth: a truncated service UUID list is counted instead of dropped (191d51b)

  • CR-8: a tuning the radio cannot reach is refused, and its serial is read within bounds (191d51b)

  • D-STAR plays the voice of the frame that carries the superframe sync (191d51b)

  • D-STAR reports the slow data message and its full twenty characters (191d51b)

  • DAB: 80 kbit/s services at protection level 1 decode instead of staying silent (ad814ec)

  • DAB+: audio lost to reception errors leaves a gap of its own length instead of draining the buffer (b9f15d3)

  • DAB decodes unequal error protected sub-channels that carry padding bits (191d51b)

  • DAB reports a sub-channel whose size disagrees with its protection profile instead of playing silence (191d51b)

  • Decoder labels name the evidence: off air, reference fixture, or our own modulator (191d51b)

  • Degenerate DSP inputs are refused instead of panicking (191d51b)

  • Dependencies move to current, closing three zip advisories in the Windows updater (5d32ce3)

  • Desktop: a download's save dialog no longer freezes the app on Linux (29873c5)

  • Desktop installers are checked against the stamped version before release (191d51b)

  • Devices: a radio that refuses one re-arm is dialled again within the restart budget instead of ending the stream (89cbde5)

  • Devices: a radio two workspaces reach for at once is opened once, not dialled twice (4606dab)

  • Digital voice decoders report the frames they throw away (191d51b)

  • DMR discards an embedded or short link control that never terminates (191d51b)

  • Drone Remote ID: beacons that fail to parse are counted, and the encoder keeps the unknown track and accuracy codes honest (191d51b)

  • DVB applies a multi-section program or map table only once every section has arrived (191d51b)

  • DVB ignores a table announced for later until it becomes current (191d51b)

  • Each decoder is named once in the wire table that builds its settings and limits (191d51b)

  • ERMES: an inverted signal decodes, and dropped pager frames are counted (191d51b)

  • ESP-SDR: a lost start reply still stops the board, and one bad datagram is skipped (191d51b)

  • Every device backend has one name, shared by the engine, the doctor and the browser (191d51b)

  • Every modem throughput gate refuses a baseline recorded on another host instead of passing (191d51b)

  • Every serial port list hides dial-in nodes, pseudo ports and bridge duplicates (191d51b)

  • FLEX: out of range capcodes and unchecked block information words no longer make pages (191d51b)

  • French Remote ID: horizontal speed reads the full unsigned range (191d51b)

  • FunCube Dongle: transfers the kernel still owns keep their buffers until the device closes (191d51b)

  • GNSS rejects a C/A cross-correlation peak instead of locking the wrong PRN (191d51b)

  • GSM: the message log and cell readouts show the newest frames, not the first ones heard (720f42c)

  • HFDL reads the neighbour frequency bitmap byte aligned and attributes an uplink to its own aircraft (191d51b)

  • Inmarsat Aero burst demodulators are built once instead of once per burst (191d51b)

  • Inmarsat STD-C flags a gap in an EGC sequence and reports rectangular extents in degrees (191d51b)

  • ISM: a lone trailing half-bit and an overlong pulse no longer stretch a decoded row (191d51b)

  • ISM: an Oregon THGR122N frame whose temperature is not plausible BCD is dropped instead of reported (191d51b)

  • KiwiSDR: a held socket that will not arm says why instead of opening a second channel (191d51b)

  • Kraken: bank settings pause the stream the way a single dongle does (191d51b)

  • M17 extended addresses no longer print as a callsign (191d51b)

  • MIAM, ADS-C and ARINC 622 reject out of range values instead of wrapping them (191d51b)

  • NAVTEX reports characters lost in every copy (191d51b)

  • NFM keeps CTCSS and DCS out of the audio in every tone mode (191d51b)

  • NFM receive de-emphasises at 750 us and the transmitter pre-emphasises to match (191d51b)

  • NXDN keeps the last frame of an over and survives a jittered sync (191d51b)

  • NXDN names the RF direct channel correctly (191d51b)

  • OFDM: a preamble found at the very start of a stream decodes instead of panicking (d8489f3)

  • P25 counts network identifier errors over the protected bits (191d51b)

  • POCSAG: a page poisoned by an uncorrectable codeword is counted (191d51b)

  • Port types say what they carry: baseband, video, control, position and array (191d51b)

  • Rack grips take the keyboard and name themselves to a screen reader (191d51b)

  • Radar and spatial canvases stay sharp at browser zoom (604a646)

  • Radios: a capture that could not arm leaves the radio stopped (191d51b)

  • Radiosondes: the M10 and M20 GPS week stays in the current epoch without a code change (191d51b)

  • Reconnecting to the server no longer re-runs a tool over serial (191d51b)

  • Removing an array switches its noise source off instead of leaving it injecting (191d51b)

  • Retuning a DMR receiver forgets the last site's masked checksums and trunking tier (191d51b)

  • RTL-SDR: 28.8 MHz engages the upconverter, and a tuner reset that failed is reported (191d51b)

  • RTL-SDR: a serial write and an open stay on the dongle the scan found (191d51b)

  • RTL-SDR: a stalled demod register write is read back and written again, so frequency and gain changes work on Windows (ff1dec3)

  • rtl_tcp: a dial is retried while the server is between clients, instead of failing on one timeout (5594af5)

  • rtl_tcp: let go of the old connection before dialling the next one, so a server that serves one client at a time greets the reconnect (b0040ca)

  • rtl_tcp streams on the connection it was greeted on and waits out a server still letting go of its last client (8633698)

  • Saved signal generator nodes move to the virtual backend on load (191d51b)

  • SDRplay: a receiver selected behind a stuck lock is released again (191d51b)

  • SDRplay: a stream the API will not stop keeps the memory its callbacks use (191d51b)

  • Signal generator: a signal it cannot synthesise fails instead of streaming silence (191d51b)

  • SoapySDR: a 0.9 runtime is loaded, next to 0.8 (0f32b4a)

  • SoapySDR: a driver fault on a setting or a timestamp surfaces instead of being guessed at (191d51b)

  • SoapySDR: a probe helper whose output is held no longer wedges the capture thread (191d51b)

  • SoapySDR: the module farm is private to this process, and a stall probes only the radios in view (191d51b)

  • SpyServer streams on the connection it handshook on instead of dialling a second time (055ffcd)

  • SSTV Robot 72 sends its second chroma porch at the published 1500 Hz (191d51b)

  • The 4FSK curve matches the decoder that measures it, and a curve tolerance follows its error counts (41b122b)

  • The database takes a second process writing to it, and deletes clear the rows that pointed at what went (191d51b)

  • The decision-directed carrier detector slices each symbol once (191d51b)

  • The limits say how many channels and monitors one radio can host (191d51b)

  • The map panel survives switching the sink feed off and on again (191d51b)

  • The scanner refuses a sweep wider than the engine's target cap (191d51b)

  • The signal identifier finds a sync word at the very start of a capture window (191d51b)

  • The signal identifier reports a flat band's centre in hertz so its zoom lands on the band (191d51b)

  • The signal identifier says why a confirmation decoder or frame search could not run (191d51b)

  • The UI reads the audio rate, audio seeds, survey grid, decoder defaults and wM-Bus key shapes from the server (191d51b)

  • TLS and async internals updated for the rustls, webpki and tokio advisories (a3d5fd3)

  • Undo and redo no longer leave a gain stage twice in the saved settings (191d51b)

  • VDL2 ATN reassembly needs every segment covered and caps its pending buffers (191d51b)

  • VHF ACARS decodes the application layer, reassembles multi-block messages and counts rejected blocks (191d51b)

  • Virtual radios are offered only where the server serves them (191d51b)

  • VOR radials stay accurate at the shortest report interval and an out of range navaid interval is refused (191d51b)

  • w-MBus: variable length records read their BCD and binary encodings and refuse reserved ones (191d51b)

  • Weather satellites template: Meteor-M LRPT on 137.900 MHz, the NOAA APT satellites are off the air (e7b6ced)

  • Wire verdicts refuse a graph larger than a workspace may hold (191d51b)

  • YSF voice FR mode decodes to speech instead of noise (191d51b)

2.3.0

Breaking changes

  • REST mutates nodes, not device sets: device set, channel, scanner, hunt, playback, time machine and network export routes are replaced by node routes and node actions, and a template is applied to a radio node (c0c462b)

Features

  • AD936x radios recall known frequencies from fast-lock profiles, sleep the TX synthesizer when idle, offer DDS test tones, AGC thresholds and chip settings, and show temperature and RSSI on the Device node (d2fbf05)

  • Antenna calculator: simulated SWR, impedance, gain, patterns and current for every design, matching networks, resonances, trim to resonance, NEC and Touchstone export, and saving to the NanoVNA library (bf77ea6)

  • Calls bring their clip on the events wire, kept only where a log or an output that saves audio receives them. Audio wires carry live audio only (c0c462b)

  • Decoder faces light up while audio passes the squelch, and the face the scope selected carries the accent on its top bar (7fbc3db)

  • Device: Stop closes the radio and keeps the node, Start opens it again (5bd6352)

  • FUNcube Dongle Pro+ driver: raw USB on Linux and Windows, Core Audio on macOS (4f73a2b)

  • GSM downlink decoder: cell info, paging, assignments and SDCCH follow (032c2df)

  • ISM sensors decoder: OOK and FSK weather stations, thermometers, tyre sensors, remotes and door sensors (2259ea8)

  • Map shows exactly what its wires carry, including DSC, VDL2, HFDL, Inmarsat and Iridium positions (c0c462b)

  • Only wired decoders fill the decoder log (c0c462b)

  • Pictures show on the Video node they are wired to (c0c462b)

  • Spectrum monitor finds faint LoRa as chirps and decodes it, reports front end clipping instead of its spurs, and keeps up at 10 MS/s (c347617)

  • Spectrum monitor: optional start and stop frequency (6650f00)

  • STANAG modem identifier: names HF data modems and reads 110A rates (39997e2)

  • TETRA decoder: cell identity, calls, talkers, SDS text and LIP positions from a downlink (36f9658)

  • Tetrapol decoder: system info, group calls, paging and voice activity on control and traffic channels (5677841)

  • Wireless M-Bus decoder: water, heat and energy meters in modes S, T and C, with AES keys per meter (54f477e)

  • Wires carry typed contracts. Saved wires no input takes are removed with a notice, and a beam steers from the DF bearing port (c0c462b)

Fixes

  • A restarted server opens the active workspace's radios without waiting for a browser (b5df47a)

  • A scope no longer retunes a lane on Auto (61b0b61)

  • A spectrum monitor that cannot start no longer logs a fake transmission (c0c462b)

  • AD936x radios load a decimating FIR for every rate, so the band edges no longer fill with converter noise (8f87bd8)

  • An opened decoder log row stays in view while new rows arrive (718458c)

  • Audio and baseband spectra come from the server, not a second FFT in the browser (b96ab41)

  • Audio recording: a stopped recorder reports the frames its file really holds (4795d54)

  • Baseband and position wires show their colour (c0c462b)

  • Benchmarks: one table per suite, decoders plotted on shared noise and speed axes (bd6feed)

  • Calmer faces: default chips lose their fill, healthy queues dim, idle recorder stats hide, decoder log reads easier (b4cdbc6)

  • Clearing a log keeps what other sinks hold; a decoder says why it is not running (c0c462b)

  • Custom waterfall palette survives reload (d2b08ce)

  • Decoder log search matches chip height; device footer keeps Forget radio beside its readouts; Queue shows only when lagging (5cb1239)

  • Desktop: downloads open a native save dialog (af6b69b)

  • Desktop: TLS updated for the rustls advisories (4795d54)

  • Desktop update checks send app version, OS and architecture (327e050)

  • Device faces animate between lane layouts: rows grow and fold, the node height and footer ease, ports and wires follow; RX1/TX1 keep their names when RX2 turns on; TX gain per lane once lanes are split (5cb1239)

  • Each Audio recorder keeps its own file, even when another one records the same channel (c0c462b)

  • Event filter position rule covers radiosondes; unknown filter kinds are removed with a notice; event output names kinds like the log (c0c462b)

  • Event port tooltips count delivered, ignored, unrouted and lost events (c0c462b)

  • Faces share one type scale, control height, slider and button style; plots follow the light theme (057b622)

  • FT8, FT4 and WSPR show windows skipped while the decoder is busy (367866e)

  • Input tooltips name the event kinds the input ignores (c0c462b)

  • Library and hotkeys act on the selected node only; arrow keys tune a selected decoder, and the server refuses a locked one (c0c462b)

  • Linux: NVIDIA machines keep the accelerated webview where the display allows it (363ff9f)

  • Locks hold for every client, undo, auto tuning and template re-apply; hunts and surveys refuse a frequency their radio cannot hear (888dbcb)

  • Node errors show as a header icon; wire refusals only toast (8f15994)

  • Nodes keep one width while their content changes (c0c462b)

  • Nodes mark the problems the server found, such as a radio that is not open (c0c462b)

  • Presets place their decoders on the canvas (c0c462b)

  • Propagation maps run on the server and keep the last 6 h across reloads (c0c462b)

  • Readouts respect event filters (c0c462b)

  • RTL-SDR: tuning and settings work on Windows dongles that refuse control requests while streaming (6412c4a)

  • Satellites, scanners and hunts steer only what their control wire reaches (c0c462b)

  • Scanner range fields keep Hz precision instead of rounding to 0.1 MHz (00a3e4d)

  • Scanners and hunts show the lane they watch, trunks and spectrum monitors offer audio, and logs take a call audio wire (c0c462b)

  • Scope: legend and channel labels no longer overlap the cursor readout (21339b3)

  • A decoder on a control wire is tuned only by that wire; the server refuses other retunes (d164be3)

  • Scope: shade the band edges where AD936x, HackRF and Airspy filters roll off and can alias (64bfe38)

  • Sinks count lost records, filtered records survive rewires, and a shut out IQ Recorder shows a problem (c0c462b)

  • Speaker: a large audio graph no longer stalls playback (6ce24b7)

  • Speakers, scopes and video nodes follow a rewire without reopening (c0c462b)

  • Spectrum: FFT size follows the sample rate, keeping bins near 1 kHz up to 262,144 points. Capture buffers hold 100 ms up to 335 MS/s. (d10d909)

  • Broadcast channels (WFM, analog TV, DAB, DRM, digital TV) no longer log calls (c0c462b)

  • Station filters and log stations: FT8 names the sender after CQ DX, radar tracks are T<id>, pictures name no station (c0c462b)

  • Virtual band source no longer clips (0d3358e)

  • Wiring hints come from the server (c0c462b)

2.2.1

Fixes

  • Web UI loads over plain HTTP again (36663d4)

2.2.0

Features

  • 2.4 GHz survey: Wi-Fi, Bluetooth, 802.15.4 and ovens by airtime (f68bc38)

  • 406 MHz distress beacon decoder: EPIRB, ELT and PLB identity and position, plotted on the Map (03fead7)

  • AntSDR streams about 20 MS/s over Ethernet with the new sdrmm-iqlinkd board daemon (e38c99c)

  • BLE advertisements decoder: beacons, trackers, vendors and long range adverts (f68bc38)

  • Channels show rejected packets on their face, even when nothing decodes (e8772da)

  • Decoder log: Group by frequency or station, with hits, airtime and last heard (4cb8108)

  • DECT plays clear calls (G.726), reads all ten carriers from one 20 MS/s capture, and reports extended capabilities with DSAA2 and DSC2 (e4c4a84)

  • Drone Remote ID decoder: Bluetooth 4 and 5 long range, Wi-Fi beacon and NAN, French and DJI beacons, drone table and map (ce38bc1)

  • End-of-Train decoder: rear unit brake pressure, motion, marker light and battery, plus head unit status and emergency commands (b6f6f65)

  • ESP-SDR on an ESP32-S31 streams over Ethernet (15453ad)

  • Event output: append events to a CSV file. (be66fea)

  • Event output: desktop notifications in the desktop app. (a955400)

  • LoRa decoder: all spreading factors at once, LoRaWAN, Meshtastic and MeshCore with keys, map and node list (7f6bcc4)

  • Map: sonde burst and landing forecast, satellites with footprint and ground track, globe view (c4c5838)

  • MCP drives the canvas: tools add, wire, tune and remove nodes, so every change shows on the canvas. Tool arguments use the OpenAPI types. (e870371)

  • Multiple users: see who is here with live pointers, selections and drags; edits merge instead of conflicting; undo takes back only your own changes; switching workspace asks first and tells others (f45a21a)

  • NanoVNA: redesigned workspace with live sweeps, markers, band SWR, matching networks, cable distance view, saved antennas with overlays, Touchstone import, device settings, a correct calibration status, and about twice as fast sweeps (bcd32b8)

  • Noise figure: Y-factor measurement with a switched noise source (4be5507)

  • PER tester: packet and bit error rate of numbered test frames (4be5507)

  • Rotator node: points a GS-232 or rotctld rotator at a satellite, with manual, park and stop, azimuth-only mounts, 450° range and over-the-top flips (575f4d8)

  • Amateur and weather satellite elements, transmitters and callsign prefixes are downloaded once and cached, so satellite search works offline. The decoder log shows the country of amateur callsigns. (60afe04)

  • Scanner: keeps its settings, new All mode visits every busy frequency once, band presets with DAB blocks, priority and lockouts, detection over the noise floor (ce0d3fc)

  • SID monitor: VLF station levels with flare detection (4be5507)

  • Wi-Fi occupancy: busy time per channel, up to all of 2.4 GHz at 80 MS/s (f68bc38)

Fixes

  • AD936x radios reopen with AGC on without a gain error (1210a51)

  • AntSDR and Pluto boards are named by model and chip, like AntSDR AD9361 (1210a51)

  • AD936x radios open on the frequency they were set to, not a few hertz off (1210a51)

  • APRS: decodes 1200 baud packets about 1.5 dB weaker (e601c19)

  • Arrays ride out half a second of lag between radios instead of 100 ms (897bb45)

  • Auto tuning steps the centre off a decoder to a whole kilohertz (93b0429)

  • Auto-squelch no longer opens when the noise floor jumps (5e36bf5)

  • Benchmarks: decodes in noise next to other decoders, plus FLEX, selcall, NXDN, YSF (e68bd59)

  • DAB, DRM and DVB lock state no longer floods the decoder log; it shows on the channel face (4cf5233)

  • Decoded records arriving while a client connects are no longer dropped (704b602)

  • Decoders out of band say why: too wide for the sample rate, off the tuner, or crowded out by auto tuning (cf055bd)

  • DRM: xHE-AAC plays on air on every platform, including 4:1 SBR (e.g. BBC WS) (31fa1ef)

  • File sizes show one decimal, like 167.3 MB (798eea0)

  • FLEX: decodes weaker pages, drops pages with a bad checksum (fa6dade)

  • FT8: decodes more CQ calls, no OSD guesses on strong or unusual messages (3d643a2)

  • iqlinkd: samples read before the radio stops are sent, not dropped (897bb45)

  • Map labels read clearly on light and dark basemaps (3409b7b)

  • Network radios found by the search appear without a reload (93b0429)

  • Raising a radio's sample rate no longer drops samples (4f8aa58)

  • Recorder faces keep one layout whether unwired, idle or recording (798eea0)

  • Remote: links from app.sdrmm.com open the device again (e7182bc)

  • RTL-SDR, KrakenSDR: stop reading the AGC gain back, which stalled the dongle on Windows (0e39088)

  • Satellite face: fixed width, dial always shown, azimuth and elevation readouts (c4c5838)

  • Signal generator: BLE beacons and 2.4 GHz traffic (f68bc38)

  • Recorder, loss and clipping readouts update every second (93b0429)

  • Virtual test band: 4, 8, 10 and 20 MS/s (ce38bc1)

  • A workspace binds its radio when the radio turns up after the page loaded (bba0880)

2.1.0

Features

  • AM: Sync detector for fading signals. Auto notch no longer removes speech. (70573ed)

  • RX1 and RX2 toggles replace the lane stepper on AntSDR/AD936x. API: rx_streams setting is now rx_inputs (0b50e3f)

  • Audio recorder: Skip silence pauses recording while the squelch is closed (24a0bda)

  • Canvas: nodes snap to the grid, finer as you zoom in (7301d38)

  • DAB: automatic mode detection, tuner offsets up to 40 kHz, clock drift and echo tracking for all modes (5dd39f2)

  • Denoise: DPDFNet 8 kHz radio voice models download on demand, smaller binary (9a7ce16)

  • DRM: full DRM30 and DRM+ receiver. FAC, SDC and MSC decoding, service choice, AAC and HE-AAC audio and text messages. (5dd39f2)

  • DVB-S2X: receive Annex E superframe formats 2 to 7, any scrambling codes, and Walsh-Hadamard rows (5dd39f2)

  • ESP32 boards running ESP-SDR firmware work as radios (16adecf)

  • Map: pick the map style or a custom tile URL, and draw tracks for aircraft, ships and APRS (2564dc7)

  • Nodes: double-click a title to rename it (10757cf)

  • Record each call: wire a channel's events to an Event output set to Recordings. AM, NFM and other analog channels now produce calls from their squelch, and every recorded WAV is named by time, mode and frequency. (c4d37f6)

  • Renamed to sdrmm: repo, Docker image, winget ID and the Linux desktop package (now sdrmm-app) (3e07dd2)

  • Scope: custom waterfall colours. (25c04d4)

  • Scope: true noise floor at every zoom, floor readout, clock marks on the waterfall, faster carrier release and a Blackman-Harris spectrum. Phones need the matching app. (d712357)

  • SSTV: USB, LSB, FM and AM modulation (5ea50cf)

  • Weather decoders: NOAA APT, Meteor LRPT, HF WEFAX, radiosondes (RS41, DFM, M10, M20, iMet-4) on the map, and APRS weather (1b7a14d)

Fixes

  • APRS, POCSAG and ACARS decode up to 4x faster. (ce1ee36)

  • APT and DNF repository moved to downloads.sdrmm.com. Re-add it with the commands from the install guide. (f139800)

  • Array dial: fast key presses no longer drop a step (0ccd1dc)

  • Arrays: warm start no longer skipped on slow machines (4e08419)

  • Benchmarks: show SDR-- app and SDR-- headless next to SDR++ and GQRX (09e39df)

  • Benchmarks: SDR-- app is the desktop app (c04038a)

  • CarPlay on iPhone devices (a8a5e11)

  • Clearer privacy policy (8391579)

  • CW skimmer no longer reports images on narrow radios like KiwiSDR (aa60766)

  • D-STAR and FreeDV no longer play audio from noise (2c8518b)

  • D-STAR decodes real repeaters: on-air sync and byte order (2c8518b)

  • Decoders steered by a Satellite node show the Doppler corrected frequency on their dial and scope marker (067a77e)

  • DF: multipath bearings flagged, no runaway estimates on a single line, sharper fixes while driving, honest ellipses (8d240d0)

  • DF: Turning state on phones, learned heading offset per station (Align), echo-shadowed bearings count less, no estimates from parallel bearings (b1ddc17)

  • Driving DF: correct bearings after turns, steady nav targets, no false 20 Hz pose errors, routes that keep your direction (fbc97c1)

  • DRM locks to mode D broadcasts whose time references stray from the standard (bbdcddb)

  • DRM plays streams with unequal error protection (2c8518b)

  • DSC and FLEX decode real transmitters: tone polarity fixed (aa60766)

  • ESP-SDR updates the Scope about four times as often (68199ca)

  • Event outputs show delivery failures and sent counts on the node (e294b80)

  • Faster Airspy conversion, AVX-512 FIR on recent x86, higher capture thread priority on Linux and Android (ca4fc0c)

  • Faster DVB-S2, DVB-T2, DECT, HFDL and DRM decoding (c1b4ea5)

  • GNSS: faster acquisition search (2efa7eb)

  • GNSS lab no longer reports satellites in noise (2c8518b)

  • HFDL hides unknown aircraft positions; KiwiSDR names its third-party app limit (aa60766)

  • Homebrew: sdrmm-app cask moved to homebrew-cask, install with brew install sdrmm-app (47e0c17)

  • Meteor LRPT: decodes real Meteor-M N2 passes (Reed-Solomon used the wrong symbol basis) (dda745c)

  • NXDN and dPMR now decode off-air signals of either polarity. NXDN shows Kenwood talker aliases; dPMR shows the channel code number. (807381e)

  • Radio clock decodes through fades and receiver AGC (aa60766)

  • Scope shows spectra right after a sample gap (16adecf)

  • Server formula moved to Homebrew core: brew install sdrmm (3e07dd2)

  • SoapySDR: radios without a preset sample rate, like LimeSDR, start at 2.048 MS/s (3c52a36)

  • Upload iOS releases to TestFlight using release tags. (4a02bf9)

  • WWVB decodes through receiver AGC (2c8518b)

2.0.0

Breaking changes

  • Removed field mode, routing proxy, server basemap and browser GPS. Old array nodes are dropped from saved workspaces with a notice (8cf797b)

Features

  • Arrays: Beamformer, Spatial spectrum, Stitch, Correlator and Polarimeter nodes (8cf797b)

  • Arrays: rebuilt coherent array engine with drift tracking, warm start and live retunes (8cf797b)

  • Device: lane meters, setting chips and ports on lane rows (8cf797b)

  • Direction finder: root-MUSIC, ESPRIT, source count and triangulation heat on the map (8cf797b)

  • Node faces: one design for every node, settings as chips, health in the footer, squelch on the signal meter (0240b68)

  • Faster DSP: DVB-S2 LDPC decoding up to 48x, filters, resampling, tuning, FM demodulation and the waterfall 1.2x to 3x, and cheaper sample conversion for HackRF, RTL-SDR, Airspy HF+, SDRplay and PlutoSDR. (8622812)

  • KrakenSDR: bank supervisor and verification (8cf797b)

  • Passive radar: GPU cross-ambiguity with CPU fallback, CFAR detection, tracking and ADS-B truth on the map (8cf797b)

  • Phone remote: iPhone and Android apps with pairing, hunt, DF drive, radar watch, survey, CarPlay and Android Auto (8cf797b)

  • Recordings: array collections as one library entry, playback into an Array (8cf797b)

  • RTL-SDR: offer to write a serial to dongles without one (8cf797b)

  • RTL-SDR: tune HF on Blog V4 and V4 Lite over rtl_tcp (8cf797b)

  • Server: public /api/status for health checks (8cf797b)

  • Site: benchmarks page comparing SDR-- with other SDR software and libraries (4dd8e72)

Fixes

  • 4FSK voice (DMR, P25, NXDN, dPMR, YSF): long runs of one level no longer pull the slicer off (9555837)

  • AD936x: one lane by default, TX lanes follow RX (8cf797b)

  • ADS-B decodes about 10x faster (dd2c4e3)

  • ADS-B: preamble screen about 1.5x faster, same decodes (05bbb0b)

  • Airspy: image rejection above 100 dB across 90% of the band (e982c18)

  • DAB: locks and decodes 4 dB weaker ensembles (3a1497f)

  • Desktop: package installs update through their package manager (8cf797b)

  • Dial: typed entry keeps the dial height (8cf797b)

  • DMR, P25, NXDN, dPMR, YSF: faster symbol lock, DMR bit errors down up to 10x (556fbbb)

  • DVB-S: decodes about 6 dB weaker signals (3a1497f)

  • DVB-S2 and DVB-T2: LDPC decoding 0.4 to 1.6 dB more sensitive (3a1497f)

  • DVB-S2: locks at lower SNR and tolerates carrier offsets, pilots or not (3a1497f)

  • DVB-T: decodes long echoes and SFN, up to 9 dB better in multipath (3a1497f)

  • DVB-T2: decodes about 10 dB weaker signals, long echoes and SFN (3a1497f)

  • Faster DSP: DDC 1.6x, resampling 1.8x, filters 1.6x, tuning 2.4x (7f0fea1)

  • FLEX: about 9 dB more sensitive, tolerates detuning and clock drift (b84d218)

  • FreeDV and D-STAR: FDMDV modem and AMBE decoder in pure Rust (8cf797b)

  • Homebrew: cask renamed to sdrmm-app (8cf797b)

  • Noise reduction: spectral and neural denoisers use half the FFT work (bf2c2b4)

  • OFDM: smoothed channel estimate, about 1 dB more sensitive (dfec53c)

  • POCSAG: about 6 dB more sensitive, tolerates kHz detuning (b84d218)

  • Server: Origin and Host checks on every route (8cf797b)

  • Tuning: 100 dB rejection of nearby strong signals (was 74 dB) (e982c18)

  • Web: slower spectrum and paused media in hidden tabs (8cf797b)

  • Website: benchmarks in the header and on the home page (4964c88)

  • Website: changelog page and what's new on the home page (a235138)

Older releases are on GitHub.