Structured as What / Why / How / Protocol hints per the AI-assisted
feature-request guidance.
Scope note (2026-06-19): this RFC was broadened from WebSDR-only to cover
remote RF-quiet receive "antennas" in general — both PA3FWM WebSDR and
KiwiSDR. The shared concept, invariants, and the new "virtual RX antenna"
surface are described in the Extension — KiwiSDR section at the bottom.
What
An optional, listen-only WebSDR receiver inside AetherSDR: connect to any
PA3FWM WebSDR (host:port), tune it, and hear it through the normal RX audio
path — alongside the connected Flex. A small self-contained waterfall shows the
remote spectrum, and the WebSDR can optionally follow a chosen Flex slice
(frequency, mode, passband). The Flex stays master; the module never transmits
and never writes the Flex model.
Why
Receive performance at home is increasingly wrecked by local electrosmog —
switch-mode power supplies, PLC/powerline networking, solar inverters, LED
lighting, EV chargers, OLED TVs, cheap USB bricks. For many amateurs the noise
floor at the home QTH is S7–S9 of hash, and no amount of antenna work fixes a
problem that radiates from inside the house.
The common answer is to put the receiving antenna somewhere RF-quiet — a
rural plot, a club site, a remote shack, or a public WebSDR — and listen there.
But today that means leaving the cockpit: a separate browser tab, a separate
audio device, no integration with the rig you're operating.
Having a quiet remote ear right inside the SDR client is genuinely useful:
- A/B the local rig against a clean receiver — instantly tell whether a
weak signal is real DX or just your neighbour's plasma TV.
- Weak-signal / DX / digimodes from a low-noise site while still transmitting
on the home station.
- Diagnose your own QRM — compare home vs. remote on the same frequency.
- Operate from a noisy temporary location (hotel, holiday QTH) using a quiet
remote front-end.
This is a receive-only convenience, not a second radio: the Flex remains the
authority for state and is the only thing that ever transmits.
How
- A dockable panel:
host:port, frequency, Connect, a "WebSDR Audio"
toggle that routes speaker audio to the WebSDR (Flex audio muted while on),
and per-slice Follow buttons (in slice colours) to track a Flex slice
read-only.
- A self-rendered mini-waterfall (its own widget, not the GPU
SpectrumWidget) with a frequency scale, a listening marker + passband, dead
guard-band cropping, and click-to-tune.
- Audio joins the existing RX path via an
AudioEngine source gate; nothing is
ever sent to the radio.
- Settings as one nested-JSON object (Principle V); themed via ThemeManager
tokens; builds under HAVE_WEBSOCKETS (no new dependency).
Protocol hints
PA3FWM WebSDR speaks two WebSockets on the HTTP port: ~~stream?v=11 (audio:
a-law + an adaptive-predictor codec, tuned via GET /~~param?f=…&band=…&mode=…)
and ~~waterstream<band>?format=1 (palette-indexed waterfall rows), with band
geometry from /tmp/bandinfo.js. All of this is derived clean-room from the
JavaScript the server serves to every browser and from on-the-wire behaviour —
no proprietary binaries (Principle IV).
Status
Already implemented and proposed in #3612 (PR-first, per the de-facto
feature_request + PR practice). Aware of the new RFC gate in Constitution
v2.0.0 (#3602) — happy to file an RFC for this if maintainers prefer; just
say so and I'll add and link it.
Extension — KiwiSDR (added 2026-06-19)
This RFC is broadened to cover KiwiSDR receivers as a second instance of the
same concept: an optional, listen-only remote receiver surfaced inside AetherSDR
as an RF-quiet receive source. Everything in Why above applies identically
(local electrosmog; A/B against a clean receiver; weak-signal / DX from a
low-noise site; QRM diagnosis; operating from a noisy temporary location). The
receive-only invariants are unchanged: the Flex stays master, the module never
transmits, and it never writes the Flex model (Principle I).
Design refinement — virtual RX antennas
KiwiSDR is integrated through a more native surface than the standalone dockable
panel sketched in How: KiwiSDR receivers appear as client-owned virtual RX
antennas selectable from the existing slice/panadapter antenna controls.
Selecting one routes Kiwi audio through the existing RX DSP/speaker path and
shows Kiwi waterfall/FFT for that panadapter, reusing the existing waterfall
controls (rate, cell/gain, floor/black-level, auto) instead of a separate
widget. Kiwi antenna names are client-side only and are never sent to the
radio; Flex and Kiwi audio remain mixable, with independent per-source
NR2/resampler/FIFO state.
This "virtual RX antenna" model is the preferred surface for remote receivers
going forward and supersedes the standalone-panel sketch for KiwiSDR. A future
WebSDR implementation may adopt the same surface.
Cross-platform impact
Pure Qt + HAVE_WEBSOCKETS (already a project capability); no new external
dependency and no platform-specific native code. Identical on Linux, macOS, and
Windows.
Protocol hints — KiwiSDR
KiwiSDR speaks WebSockets for sound and waterfall. The wire format (6-byte SND
header + little-endian PCM; waterfall rows treated as raw display-intensity
bytes, not calibrated dBm; SET auth/mod/... control tokens) was derived
clean-room from user-provided protocol/spec text and black-box,
receive-only observation against user-approved public endpoints — no KiwiSDR
AGPL source, served JavaScript, server code, or decoder handlers (Principle
IV). Full provenance in docs/kiwisdr-cleanroom-design.md.
Status — KiwiSDR
Implemented in PR #3668 (clean-room, receive-only). Reviewed against
Principle I (no Flex mutation — Kiwi tokens namespaced and guarded at every
antenna-selection entry point), Principle V (one nested-JSON settings key),
audio thread-safety, and clean-room provenance — all pass; CI green.
What
An optional, listen-only WebSDR receiver inside AetherSDR: connect to any
PA3FWM WebSDR (
host:port), tune it, and hear it through the normal RX audiopath — alongside the connected Flex. A small self-contained waterfall shows the
remote spectrum, and the WebSDR can optionally follow a chosen Flex slice
(frequency, mode, passband). The Flex stays master; the module never transmits
and never writes the Flex model.
Why
Receive performance at home is increasingly wrecked by local electrosmog —
switch-mode power supplies, PLC/powerline networking, solar inverters, LED
lighting, EV chargers, OLED TVs, cheap USB bricks. For many amateurs the noise
floor at the home QTH is S7–S9 of hash, and no amount of antenna work fixes a
problem that radiates from inside the house.
The common answer is to put the receiving antenna somewhere RF-quiet — a
rural plot, a club site, a remote shack, or a public WebSDR — and listen there.
But today that means leaving the cockpit: a separate browser tab, a separate
audio device, no integration with the rig you're operating.
Having a quiet remote ear right inside the SDR client is genuinely useful:
weak signal is real DX or just your neighbour's plasma TV.
on the home station.
remote front-end.
This is a receive-only convenience, not a second radio: the Flex remains the
authority for state and is the only thing that ever transmits.
How
host:port, frequency, Connect, a "WebSDR Audio"toggle that routes speaker audio to the WebSDR (Flex audio muted while on),
and per-slice Follow buttons (in slice colours) to track a Flex slice
read-only.
SpectrumWidget) with a frequency scale, a listening marker + passband, deadguard-band cropping, and click-to-tune.
AudioEnginesource gate; nothing isever sent to the radio.
tokens; builds under
HAVE_WEBSOCKETS(no new dependency).Protocol hints
PA3FWM WebSDR speaks two WebSockets on the HTTP port:
~~stream?v=11(audio:a-law + an adaptive-predictor codec, tuned via
GET /~~param?f=…&band=…&mode=…)and
~~waterstream<band>?format=1(palette-indexed waterfall rows), with bandgeometry from
/tmp/bandinfo.js. All of this is derived clean-room from theJavaScript the server serves to every browser and from on-the-wire behaviour —
no proprietary binaries (Principle IV).
Status
Already implemented and proposed in #3612 (PR-first, per the de-facto
feature_request + PR practice). Aware of the new RFC gate in Constitution
v2.0.0 (#3602) — happy to file an RFC for this if maintainers prefer; just
say so and I'll add and link it.
Extension — KiwiSDR (added 2026-06-19)
This RFC is broadened to cover KiwiSDR receivers as a second instance of the
same concept: an optional, listen-only remote receiver surfaced inside AetherSDR
as an RF-quiet receive source. Everything in Why above applies identically
(local electrosmog; A/B against a clean receiver; weak-signal / DX from a
low-noise site; QRM diagnosis; operating from a noisy temporary location). The
receive-only invariants are unchanged: the Flex stays master, the module never
transmits, and it never writes the Flex model (Principle I).
Design refinement — virtual RX antennas
KiwiSDR is integrated through a more native surface than the standalone dockable
panel sketched in How: KiwiSDR receivers appear as client-owned virtual RX
antennas selectable from the existing slice/panadapter antenna controls.
Selecting one routes Kiwi audio through the existing RX DSP/speaker path and
shows Kiwi waterfall/FFT for that panadapter, reusing the existing waterfall
controls (rate, cell/gain, floor/black-level, auto) instead of a separate
widget. Kiwi antenna names are client-side only and are never sent to the
radio; Flex and Kiwi audio remain mixable, with independent per-source
NR2/resampler/FIFO state.
This "virtual RX antenna" model is the preferred surface for remote receivers
going forward and supersedes the standalone-panel sketch for KiwiSDR. A future
WebSDR implementation may adopt the same surface.
Cross-platform impact
Pure Qt +
HAVE_WEBSOCKETS(already a project capability); no new externaldependency and no platform-specific native code. Identical on Linux, macOS, and
Windows.
Protocol hints — KiwiSDR
KiwiSDR speaks WebSockets for sound and waterfall. The wire format (6-byte SND
header + little-endian PCM; waterfall rows treated as raw display-intensity
bytes, not calibrated dBm;
SET auth/mod/...control tokens) was derivedclean-room from user-provided protocol/spec text and black-box,
receive-only observation against user-approved public endpoints — no KiwiSDR
AGPL source, served JavaScript, server code, or decoder handlers (Principle
IV). Full provenance in
docs/kiwisdr-cleanroom-design.md.Status — KiwiSDR
Implemented in PR #3668 (clean-room, receive-only). Reviewed against
Principle I (no Flex mutation — Kiwi tokens namespaced and guarded at every
antenna-selection entry point), Principle V (one nested-JSON settings key),
audio thread-safety, and clean-room provenance — all pass; CI green.