Skip to content

[RFC] Remote RF-quiet receive 'antennas' — WebSDR & KiwiSDR #3613

Description

@svabi79

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    GUIUser interfaceNew FeatureNew feature requestaudioAudio engine and streamingmaintainer-reviewRequires maintainer review before any action is takenpriority: lowLow priorityprotocolSmartSDR protocolrfcsafetyEquipment protection concernspectrumPanadapter and waterfall

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions