Thanks to the outstanding efforts of
Eric, F1NSK, who also provided the original source code, we are moving forward with the new
PhantomSDR+ v3.9.0 release.
The main feature of this version is the integration of PhantomSDR+ with AetherSDR (https://www.aethersdr.com/ (https://www.aethersdr.com/)) the excellent control software originally developed for
FlexRadio systems and, more recently, extended to support additional transceivers.
The PhantomSDR+ codebase has been modified to allow communication with AetherSDR using the
KiwiSDR-compatible protocol This required extensive testing and several adaptations in order to map the specific capabilities and behavior of the PhantomSDR+ server to the protocol expected by AetherSDR.
In addition, all installation packages and installer scripts
for all the Linux distributions currently supported by PhantomSDR+ had to be revised and rebuilt to ensure that the new integration can be installed and configured reliably, without introducing compatibility or dependency issues.
For details about this major architectural change, as well as several other important improvements included in version 3.9.0, please read the following notes:
New in v.3.9.0- KiwiSDR client emulation — Kiwi clients can now connect to your receiver.** The server answers the KiwiSDR protocol alongside its own, on the same host and port you already publish, so AetherSDR, `kiwiclient` and other Kiwi software connect to a PhantomSDR-Plus receiver directly, with no proxy and no second port. It is a full session, not a listen-only tap: changing frequency, sideband or passband in the Kiwi client really retunes what PhantomSDR demodulates, and both the audio stream (`/kiwi/<id>/SND`) and the waterfall (`/kiwi/<id>/W/F`) are served. The S-meter reproduces what your web page actually displays, stage for stage — not just the power behind it, but the offset and range expansion the page puts on top — so a Kiwi client and the page show the same signal at the same strength, confirmed on a strong local station where both read −37 dBm. It is off until you switch it on — add `[kiwi_emulation]` with `enabled = true` to the `.toml` your receiver actually runs with and restart; leave it out and not one line of the bridge runs. The installers now offer it as a step of their own, and `./kiwi_install.sh` adds it to an existing tree at any time. One thing to know when you first listen: the bridge hands a Kiwi client exactly the samples a browser gets — measured identical — but the browser then rebuilds them with its own EQ and compressor, which a Kiwi client has not got, so the stream sounds thin by comparison. `audio_gain` (dB, Kiwi clients only) closes that gap, with a look-ahead peak limiter behind it so the level can actually reach the web page's without the 16-bit clamp flattening the peaks — 55 dB is where the two measured level with each other on a strong signal, and driving it to 70 dB did not clip a single sample in a quarter of a million. The waterfall and the spectrum are on a real dB scale. PhantomSDR stores each bin as a signed byte; a Kiwi client reads an unsigned one, so copying it straight across folded the scale back on itself and the display came out both saturated and upside down. Each bin is now converted to an absolute dBm before it is sent, so a carrier reads the same level at every zoom — what a genuine KiwiSDR gives you — and the spectrum agrees with the page's own calibrated S-meter to 0.1 dB. Frames are always 1024 bins now, instead of coming out short near the ends of your coverage and being drawn at the wrong scale, and the greeting carries centre frequency as well as bandwidth so clients can finally zoom all the way out. The waterfall also runs at the rate the client asked for. it was delivering 14 frames a second while announcing 23, which is what made the spectrum and waterfall look sluggish even though nothing was actually late — retuning measures 35–50 ms and the audio runs dead on real time. Kiwi clients now get the full rate, `SET wf_speed` is honoured, and `wf_fps_max` sets the ceiling. The web page's own waterfall keeps its cadence and no extra FFT work is done for either. Full section: **[docs/Aether_config.md](docs/Aether_config.md)**, in all seven languages.
- SSTV no longer gives up during QSB or a burst of QRM. The decoder was abandoning a picture part-way through on ordinary fades and short bursts of interference, clearing the mode and restarting the image from the top line. Three separate faults in the code that decides a lock is dead: the "was this ever a real signal" hit-rate test stayed switched on for the whole picture, although a genuine weak picture near 0 dB finds only about one sync pulse in nine — it now switches itself off once a lock has found five real pulses, so a false lock on noise still dies within about twenty lines. The backstop was a fixed count of forty missed lines, which is eight seconds on Martin M1 but only two and a half on Robot 36 — it is now twelve **seconds** of silence whatever the mode. And the sync detector only ever updated its comparison level when it found a pulse, so after a fade it was still measuring against the pre-fade signal and rejected exactly the weaker pulses that QSB gives you on the way back. A fade is now ridden out: the line timing free-runs across it, so the picture comes back **in register** — a band across the image and the rest carrying on where it belongs — while drawing stops after four seconds of genuine silence so a dropout no longer paints a screenful of static. Measured over ten runs each, a 2 s burst of QRM on Robot 36 broke the picture every time before and never now, and 3 s and 10 s fades that used to end the decode are ridden out; an 18 s fade still ends it, because by then the signal really is gone. Complete pictures on Martin M1, eight runs each: 0/8 → 2/8 at 0 dB, 1/8 → 3/8 at +1 dB, 3/8 → 5/8 at +2 dB, unchanged at +3 dB and above — better or the same at every level, with no change to how readily it locks onto something that is not there.
- The installers gained a Kiwi step, and all four now point at systemd. A fresh install can set the KiwiSDR bridge up during installation instead of afterwards; it is offered, not forced, and `PHANTOM_KIWI=y|n` covers unattended runs. Separately, the Arch, Fedora and openSUSE installers used to finish by telling you to start the admin panel with `./manage_admin.sh` — that starts a copy systemd does not know about, and with the units installed the two fight over port 3000. All four now print the `systemctl` form the Ubuntu installer already printed. A full unattended install of every supported distribution was then emulated in a container — Ubuntu 22.04/24.04/26.04, Debian 12/13, Arch, Fedora 44 and openSUSE Tumbleweed, with all four optional sub-installers enabled — and turned up four more bugs: `install-stats-server.sh` refused to run as root and stopped every `sudo ./install.sh` at step 15; the unattended final rebuild never ran on Arch, Fedora or openSUSE; RADE could not build on Fedora for want of libtool's m4 macros; and `procps` was in no dependency list anywhere, although `pgrep` is used by every launcher. All eight finish cleanly now. Container runs prove the software builds and starts, not that it works on air.
- Nagle's algorithm is switched off on every connection. `TCP_NODELAY` was set nowhere in the server, and every frame it sends is comfortably under one MSS — a 1040-byte waterfall line, a 1034-byte audio frame — which is exactly what Nagle holds back until the previous segment is acknowledged. Against a peer's delayed acknowledgement that is up to 40 ms of queueing added to a frame that was ready to leave. There was nothing to coalesce in the first place: these are whole messages, one per FFT hop. This removes a worst case rather than speeding up the normal one, so most listeners will notice nothing — and it cannot be measured on a local network at all, where acknowledgements come back instantly and Nagle never engages.
- The admin panel can show the receiver's own log, and that log is a tenth the size. `spectrumserver.log` was the one log the panel could not display; it now has a tab of its own beside LOGWEBSDR, and the viewer reads only the tail of a file, so log size no longer matters to it. Separately, 88% of that file turned out to be two loops reporting that nothing had happened — 13000 lines a day here, now 1400, with nothing diagnostic lost. The launchers also bound it every five minutes instead of only at startup, so a receiver left running for months finally has a ceiling on it.
- The KiwiSDR bridge has a manual of its own. [docs/Aether_config.md](docs/Aether_config.md), in all seven languages and in the offline PDFs — what the bridge does, installing it, a reference table for every `[kiwi_emulation]` key, connecting a client, audio level, the S-meter, the waterfall rate, and a table of symptoms with what to look at for each.
As usual please download from here: https://github.com/sv1btl/PhantomSDR-Plus (https://github.com/sv1btl/PhantomSDR-Plus)
PhantomSDR Archive has also been updated : https://github.com/sv1btl/PhantomSDR-Plus_Archive (https://github.com/sv1btl/PhantomSDR-Plus_Archive)