Skip to content

Longpath 0.6.0

Latest

Choose a tag to compare

@github-actions github-actions released this 30 Aug 12:14

Windows build withdrawn (2026-08-31). The Windows installer and
portable ZIP have been removed from this release — they were only
ever tested on macOS before publishing. Use the macOS or Linux
artifacts below until a tested Windows build is re-published.

Added

  • Phase 3F multi-pan + multi-slice foundation (8 sub-epics, ~110 commits stacked on a single PR per single-PR strategy).

  • Sub-Epic A: SliceModel per-band persistence schema (sliceLetter, chainIndex, ddcIndex, sampleRateHz per-band, diversityEnabled, widebandExtensionRequested, psPaused), BoardCapabilities maxSlices + widebandAdcs per SKU, RadioModel::maxSlices accessor, AppSettings schema v5 to v6 migration, DdcAssignment shared struct.

  • Sub-Epic B: 5-slice codec chain (CodecContext SliceConfig array, IP1Codec + IP2Codec applyDdcAssignment, per-codec Thetis-faithful DDC topology including HL2 mi0bot PS rate carveout, AlexController per-ADC BPF state machine with BpfMode enum (Auto/ForceBand/ForceBypass) + BpfEffective enum (Filtered/Bypass/WidebandLocked) + recomputeBpf event matrix).

  • Sub-Epic C: TxSliceArbiter (single-TX invariant, RF-safe MOX-drop handoff, per-MAC TxBoundSliceIndex persistence) + RadioModel addSliceOnPan/removeSlice + VfoWidget TX badge click handler + MainWindow status-bar feedback + deprecated setSplit cleanup.

  • Sub-Epic D: PanadapterStack (5 layout templates: 1/2v/2h/12h/2x2) + PanadapterApplet + FFTRouter (receiver to pan fan-out) + PanFloatingWindow (multi-monitor detach) + PanLayoutDialog visual picker + +PAN bottom-bar dropdown + View menu shortcuts (Ctrl+L, Ctrl+R) + CH 0 / CH 1 BPF indicators + layout state persistence + disconnect-before-removal helper.

  • Sub-Epic E: SpectrumStatusOverlay per-pan badge (slice letter, freq, mode, CH, TX/WIDE/DIV/PS HOLD pills) + VfoWidget right-click context menu (TX/Antenna/Rate/Diversity/Filter/Remove) + FilterPolicyDialog (per-chain BPF override) + AntennaPickerMenu integration into VfoWidget right-click context menu (chain-consequence hints) + AntennaSwitchToast trigger via RadioModel::antennaAutoSwitched signal with Tools menu test entry + TxBoundConfirmDialog trigger via RadioModel signal with Tools menu test entry + HardwareDdcRoutingPage per-DDC override table (7 rows, per-MAC persistence) + Antenna Conflict Policy radio group on existing Antenna Control tab.

  • Sub-Epic F: P2 wideband data path end-to-end (P2 wideband packet decode at UDP ports 1027-1034 -> WidebandFrameAccumulator -> WidebandFftEngine 16384-pt FFTW r2c -> SpectrumWidget setWidebandBins) + CmdGeneral byte 23 wb_enable wiring per Thetis network.c:879 + SpectrumWidget extendedMode state with zoom auto-derive + click-in-wing retunes DDC, click-in-island retunes slice + per-pan Extended view right-click toggle + wideband-extension-requested auto-bypasses Alex BPF.

  • Sub-Epic G (8/25 plan tasks shipped): RxChannel WDSP setExtDivRun/Nr/Output/Rotate wrappers + SliceModel per-band diversity persistence (phase/gain/fine-null) + Slice-A WDSP wire from SliceModel signals + DiversityRadarWidget (custom QPainter polar sensitivity pattern, CalcVrms port from Thetis) + DiversityDialog (Tools > Diversity..., Ctrl+Shift+D) embeds DiversityRadarWidget for live lobe rendering + 8 per-band memory slots (M1-M8, click-recall / right-click-store) + PS HOLD overlay (MOX + Diversity active visual gate).

  • VFO flag per-slice auto-creation (multi-slice UI): RadioModel::sliceAdded now auto-spawns a VfoWidget per slice so operators can manipulate each slice flag directly when multiple slices live on the pan.

  • Bottom banner cleanup + AetherSDR-shaped pan menu. Replaces three competing status-bar responsive systems (RxDashboard's internal drop-priority ladder, MainWindow's right-strip drop priority, and Qt's own uncontrolled squeeze) with one ChromeBarController: banner layout is now a pure function of bar width, with natural widths cached once and a single-pass fold ladder (design doc 2026-08-02-bottom-banner-and-pan-menu-design.md). Radio identity merges into StationBlock's second row; RX state pills densify into one borderless row and now follow the active slice (previously always Slice A, a correctness bug since Phase 3F landed multi-pan); PA telemetry and CPU merge into one SystemTile; the UTC clock moves to TitleBar; the four safety indicators (INH/PA/OVL/TX) get permanently-reserved 50 px slots so an alarm never shifts its neighbours. Net: about 1740 px of required width down to about 1286 px. The +PAN text pill becomes a drawn icon (ported from AetherSDR) opening PanLayoutDialog's painted thumbnail grid: nine layouts in all (four new: 2h1, 3v, 4v, 3h2), gated per-board and hiding (not greying) layouts the connected radio cannot host, with a footer line naming why. "Add slice on this pan" / "Float this pan" move off the +PAN button onto each pan's own right-click menu, so they act on the pan they were clicked from instead of routing through activePanId().

  • Rotor comfort (2026-08-11). Four teachable preset slots + Park + LP under the cardinal row: right-click teaches the current aim (or the rotator's fresh reading), left-click re-aims, the turn stays behind Rotate. Presets, names, and the park position persist. "Turn rotor to " now works from the panadapter spot menu on every pan including pan 0. The duplicate wide "Long path" button is retired in favour of LP.

  • Voice Check, rebuilt on the AetherSDR pattern (2026-08-11). Record-then-listen via a ported ClientPuduMonitor: a device-paced QAudioSource captures the take gapless, the channel strip runs OFFLINE over the finished take, playback is automatic and RX stays muted across the cycle. Embedded in the Channel Strip window (● Record / ▶ Play). Replaces every live-monitor construction — the radio paces nothing in the loop.

  • TX self-monitor path hardening (2026-08-11). MasterMixer opportunistic slots get an adaptive jitter cushion (doubles on starvation, bounded, never probed down) + seam fades; validated by an offline cadence simulation now in-tree as tst_master_mixer_cadence (six jitter/drift profiles, zero steady-state discontinuities asserted). Full narrative: docs/architecture/2026-08-11-tx-monitor-audio-path.md.

  • Network path instrumentation + repair (2026-08-11, remote bench). Socket-level sequence audits for the P2 mic stream (port 1026) and the DDC I/Q direction (5 s windows at qCInfo, clean heartbeat 1/min). New MicReorderBuffer between the mic decoder and the TX pump: speculative zero-latency reordering — late frames are slotted back into position (the dominant defect on routed/WLAN paths, ~0.2-0.5% of frames), true losses concealed by repeating the last 1.33 ms block. Measured live: every late frame rescued, zero out-of-order splices reach TX audio.

  • SunSDR2 QRP via TCI 1.4 client (2026-08-24, bench-verified against a real SunSDR2 QRP / ExpertSDR2, OE5SOS). New TciClient (src/core/TciClient.h, the mirror of the existing TciServer) plus MainWindow_SunSdr.cpp wiring, built in four steps: Verbindung (Radio > SunSDR (TCI) menu, connect/disconnect), Ton (RX audio into the existing MasterMixer, opportunistic slot), Bild (I/Q into a real FFTEngine/FFTRouter at a reserved pseudo stream index — same panadapter pipeline a real receiver uses, not a parallel one), Steuerung (vfo:/modulation: bidirectional with SliceModel, echo-guarded). Receive-only by design; VFO channel A only (no split). Hard safety invariant enforced from every angle (audio, panadapter, and control alike, not just control): a slice with a real DDC binding is never fed or controlled from this path, and the target slice is fully relinquished the moment it is deleted or later claimed by a real radio (releaseSunSdrSlice(), SliceModel::streamIndexChanged / RadioModel::sliceRemoved) — closing four real gaps an adversarial review found after the initial cut, on top of two live-hardware quirks (the device reports two receiver slots with cross-talking dds:/vfo:/modulation: lines; ExpertSDR2 accepts only the generic cw over TCI, not cwl/cwu). Full narrative: docs/architecture/2026-08-24-sunsdr-tci-client-design.md; measured wire protocol: docs/TCI-SunSDR-gemessen.md.

Fixed

  • A failed/timed-out radio connect attempt left Slice A permanently "bound" to nothing (2026-08-24, found live on the bench chasing an unrelated SunSDR report). P1RadioConnection/P2RadioConnection's connect-watchdog (onConnectTimeout, fires when no first frame arrives) tears the socket down and signals ConnectionState::Disconnected, but that path never runs RadioModel::teardownConnection() — it's a state signal, not the explicit-disconnect call chain, so teardownConnection()'s own releaseStreamBindings() call (the Sub-Epic I closeout defect F1 fix) never ran. RadioModel::connectToRadio()'s early setup, though, already placed Slice A onto a real stream before the watchdog had anything to time out on. Net effect: a native radio that's merely unreachable (auto-reconnect to a device that's off, or asleep on a flaky WLAN hop) leaves Slice A's streamIndex() permanently >= 0 with no radio behind it, even though every visible indicator correctly says "Disconnected." Every foreign-accessory safety gate in the codebase (SunSDR, KiwiSDR) reads exactly that field to mean "a real, possibly TX-capable radio lives here" and correctly refuses to touch it — so the phantom binding silently pushed every accessory connect onto a second, invisible slice with no panadapter pan open for it, while the operator watched the one pan on screen and reasonably concluded nothing was connected. onConnectionStateChanged()'s Disconnected case now calls releaseStreamBindings() directly (idempotent against the explicit-disconnect path already making the same call).

Removed (2026-08-18 — Entdoppelung der Bedienflächen)

Zwei Flächen fallen ersatzlos weg, weil sie dieselbe Bedienung ein
zweites Mal anboten. Beide Löschungen sind absichtlich und machen
Einträge unter Added weiter oben teilweise ungültig — sie bleiben dort
stehen, weil sie beschreiben, was in Phase 3F gebaut wurde, aber der
Stand von heute ist dieser:

  • Die VFO-Flagge (VfoWidget, VfoLevelBar) ist gelöscht. Sie war
    die letzte Fläche für sieben Bediengruppen, die damit fast still
    mitgegangen wären — Lautstärke und Stumm eingeschlossen, weil ein
    Kommentar in RxApplet.cpp eine „TitleBar master volume" als zweite
    Fläche nannte, die es in Longpath nie gab. Alle sieben sind vorher in
    die RxApplet gezogen und dort mit tst_rx_applet_inherited
    festgenagelt.
    • Damit hinfällig: „VFO flag per-slice auto-creation" (oben unter
      Added) — es gibt keine Flagge mehr, die je Scheibe entstehen
      könnte. Scheibe B braucht eine eigene Fläche; das ist Schritt 3 des
      freien Rasters (Spannweiten).
    • Ebenfalls betroffen: der TX-Abzeichen-Klick aus Sub-Epic C und
      das Rechtsklickmenü der Flagge aus Sub-Epic E. Welche Scheibe
      sendet, sagt jetzt die TX-Pille in der unteren Leiste.
    • parseUserFrequency wandert mit nach FrequencyInstrument und
      schließt dabei Fehlerbericht boydsoftprez#73 an einer zweiten Stelle: die
      Eingabe lief vorher durch ein blosses toDouble() mit der Annahme
      MHz, womit 7.230.000 still verworfen und 7230 als 7230 MHz
      gelandet wäre.
  • SMeterWidget ist gelöscht. Die analoge Anzeige stand doppelt: als
    fester Kopf der Applet-Spalte und als Instrument im Raster. Die
    2-kW-Skala für PGXL / RF-Kit gehört zur Leistungsanzeige und sitzt
    jetzt in der TxApplet; die Empfangsskalen hängen an der
    InstrumentApplet.
  • Die drei modusabhängigen Gruppen (FM-CTCSS, DIG-Versatz, RTTY
    Mark/Shift) haben den Umzug überstanden, waren dabei aber für einen
    Zwischenstand unerreichbar: VfoModeContainers baute weiter und
    hatte eigene Tests, wurde aber von keiner Fläche mehr konstruiert. Sie
    hängen jetzt in der RxApplet, und ein Test prüft die
    Erreichbarkeit, nicht nur die Sichtbarkeitsregel.

Changed

  • MainWindow refactor: m_spectrumWidget single-widget pointer replaced with m_panStack (PanadapterStack containing N PanadapterApplet instances). 125 call sites migrated to activeSpectrumWidget() helper for backward compatibility.
  • RadioModel gains TxSliceArbiter ownership + FFTRouter ownership + WidebandFftEngine instances (one per ADC, default 122.88 MHz).

Deferred (post-bench polish backlog, queued for Phase 3F-1)

  • Per-slice DSP routing (NR / AGC / CTUN / audio bus per slice). Foundation epic for Phase 3F-1: currently the slice-flag controls update the model + reassign DDCs, but DSP audio output is still bound to Slice A.
  • Sub-Epic F T7-T10 visual rendering of wideband bins as background fill behind DDC island with dashed boundary indicators
  • Sub-Epic G T6-T10 full DiversityDialog UI (quick-nudge buttons, Cross-fire / Lock-angle modes, Sync A-to-B, Link ATT)
  • Sub-Epic G T11 direction-finding group (antenna spacing + calibration)
  • Sub-Epic G T14 auto-find-null gradient descent
  • Sub-Epic G T15-T20 DiversityDialog polish (status badges, error handling, restore-defaults)

Known limitations for v0.6.0

  • Per-slice DSP routing is hardcoded to rxChannel(0). A second slice's VFO flag controls update the model + reassign DDCs at the codec layer, but the DSP audio you HEAR is still Slice A's. Per-slice DSP routing (NR / AGC / CTUN / audio bus per slice) is a separate epic (Phase 3F-1).
  • AntennaSwitchToast + TxBoundConfirmDialog are wired via Tools menu test entries. Real conflict-detection emission lands when the antenna conflict-policy state machine is fleshed out (Phase 3F-1).
  • HardwareDdcRoutingPage table persists overrides per-MAC, but the codec layer doesn't yet read them. Codec consumption wires in Phase 3F-1.
  • Diversity PS HOLD overlay is visual only (no actual DSP pause integration with PsccPump). Real pause integration is a follow-up.

Bench verification

  • Targeted ctest sweep: 17/17 green throughout the epic (all Phase 3F unit tests + cross-epic regression checks)
  • Hardware bench (G2, HL2, G2E if available, HermesII if available): pending per docs/architecture/2026-05-26-phase3f-verification/README.md (47-row matrix x 4 SKUs)

Fixed

  • Solid-magenta waterfall on macOS/Metal (2026-08-11). The dynamic-overlay texture was partial-uploaded (spectrum band only) after a recreate, alpha-blending undefined Metal memory over a healthy waterfall every frame. One-shot full upload after every texture (re)create; waterfall texture resizes now build fresh texture+SRB objects with checked create(). Found via the NEREUS_WF_DEBUG=2 green-fill discriminator, which stays in-tree.
  • Spot-menu clicks fell through to the pan overlay menu (2026-08-11). Spot/notch context menus now show async via popup() (no nested exec() inside mousePressEvent on the native QRhi surface) plus a 250 ms replay guard.
  • Voice-Check crash on the first take (2026-08-11). The offline strip pass ran without prepare(); any ENABLED stateful stage dereferenced unallocated delay lines (SIGSEGV in ClientReverb::process). finishPuduTake now prepares the offline chain; the reverb additionally bypasses when unprepared; regression pinned per-stage in tst_strip_dsp.
  • Sample-rate choices now survive an app restart (2026-08-12). The rate was the only slice property whose change never reached the per-band settings slot outside a band switch: pick 48 kHz in the VFO menu, quit, and the next launch restored the old 192 kHz — on a remote link that meant every session started at 9.5 Mbit/s until the operator re-picked the rate by hand. Two rounds: a signal-level hook stomped its own persistence (bindSliceToStream ADOPTS the stream default via the same setter at connect, and the hook wrote the default over the operator's persisted choice before the restore could read it); the save now lives at the intent site, requestSliceSampleRate. Regression pins both halves (adoption must not write the slot, the menu request must). Verified end-to-end on the remote bench: pick 48 kHz → quit → relaunch → file reads 48000.
  • MOX snapped the DDC rate to the configured 192 kHz on a wire idling at the 48 kHz connect default (2026-08-11, bench verification pending). Root cause: the restore path moved the stream allocator to the persisted per-band rate, but the wire push is gated on isConnected() and nothing re-ran it once the connection went live — so the radio idled on the connection's constructor default until the first MOX toggle applied the configured rate mid-TX (quadrupling the DDC stream on a marginal remote link, measured 3-9% loss both directions). The Connected transition now re-runs requestDdcAssignment() beside the Alex/BPF/TX-LPF pushes that exist for the identical reason; two supporting hygiene rounds keep the PS-orchestration rate store in sync (silent mirrors at setReceiverSampleRate and publishDdcAssignment). Full narrative: docs/architecture/2026-08-11-tx-monitor-audio-path.md.
  • Source-first audit caught a wire-format bug in Sub-Epic F Task 1 plan: the wideband enable mask belongs in CmdGeneral byte 23 (Thetis network.c:879), not CmdRx byte 23 (which is rx[1].rx_adc per Thetis network.c:1118). Following the plan as written would have silently broken RX1 ADC routing the moment any user enabled an alternate ADC. Caught + fixed before implementation landed.
  • Bottom banner + pan menu final audit fix wave. Two of ChromeBarController's width inputs were wrong: the per-ADC BPF chain indicator (idle to BYPASS (multi-band: 160m + 80m + 40m + 20m + 10m), up to ~170 px) and the StationBlock disconnect transition both mutated their widget without reporting the new width, so the budget could quietly go stale and the bar could overflow again on routine band changes or a disconnect. PanLayoutDialog was gating its layout grid on raw maxSlices instead of qMin(maxSlices, userDdcCount). Opening a new pan always claims its own DDC, so a board like HL2 (5 slices, only 2 DDCs) could paint five layout tiles it could only ever fill two of. All three fixed; the overflow chip and the RX dashboard's own non-pill residual (slice tag + mode + filter badges) are now also counted in the width budget, closing the remaining under-reporting the audit found.

Added (2026-08-28/29, on top of the Phase 3F work above)

  • Recording (Phase 3M). WavRecorder + WavRecorderController (off-the-air WAV capture via a third AudioEngine tap), IqRecorder + IqRecorderController (raw I/Q capture, pre-demodulation), RecordingScheduler (timed start/stop), and PlaybackRadioConnection — a fourth RadioConnection subclass that replays a captured file through the existing RX pipeline with no hardware attached.
  • POTA Alerts + Park Info. PotaAlertsClient + AlertsTableModel (upcoming activation alerts) and PotaParkInfoClient + ParkInfoDialog (park lookup from a right-click), both wired into Spot Hub as a new "Alerts" tab (11 tabs total, was 10). Spot List gains entity/mode/free-text filters and a band-pill solo-click model (click isolates to one band, click again restores all).
  • KiwiSDR waterfall panel + status pill. KiwiWaterfallPanel + KiwiWaterfallStripWidget (receive-only companion display), a KIWI status pill on the spectrum overlay, and the audio-to-mix wiring that closed out the stages-1-6/7a work.

Fixed (2026-08-28/29)

  • P2 (and P1) link-loss detection + automatic reconnect. A radio that goes silent mid-session (or times out on initial connect) now transitions to LinkLost and retries on its own instead of staying stuck showing "Connected" with a dead link.
  • Layout-profile persistence. Profiles now actually restore on next launch (applyCurrent() bypassing activate()'s identity guard, which previously no-op'd the startup restore); an explicit "Jetzt sichern" action lets the operator save a profile without waiting for a switch or quit; floating meter/applet windows and Rotor/Log stay hidden until first connect across all three independent windowing mechanisms (dock, container, floating applet) instead of flashing meaningless pre-connect state.
  • Follow-up review pass on the above: suppressed focus-stealing/toast-spam during an extended automatic reconnect (P2's retry has no attempt limit by design); LayoutProfiles::save()'s disk flush is now debounced instead of blocking the GUI thread on every window drag/resize; fixed several dock-vs-floating-window visibility bugs (Rotor dock losing drag-to-reposition, an unrelated dock spawning when hiding the logbook, Spot Hub actions showing an empty dock instead of the real floating panel).
  • Broken auto-connect-on-launch removed. Kept silently re-arming and connecting when actively unwanted; removed end to end rather than patched.
  • Window-geometry persistence for AntennaWindow, LogbookWindow, and the generic ToolWindow/PanFloatingWindow shells.
  • TCI binary IQ-rate header was hardcoded to 192000 Hz regardless of the radio's actual configured rate; now reads the same live value the text channel already reports.
  • Two CI infrastructure bugs, unrelated to any of the above, found while preparing this release (both had left every Linux/macOS build red since 2026-08-26): tests/CMakeLists.txt's test-sharding logic called set_tests_properties() on tests a given shard had excluded, aborting CMake's configure step outright; and an overbroad .gitignore pattern (themes/ with no leading slash) silently excluded resources/themes/ at any depth, hiding the operator's own Kreide/Flach/Tief palette files (authored 2026-08-20/22) from git the entire time — the build's theme-copy step failed the moment sharding stopped masking it. Both root-caused and fixed; the palette files were recovered unchanged from disk, no theme content invented.

Installation

Linux

x86_64: download Longpath-vX.Y.Z-x86_64.AppImage
aarch64: download Longpath-vX.Y.Z-aarch64.AppImage

chmod +x Longpath-vX.Y.Z-*.AppImage
./Longpath-vX.Y.Z-*.AppImage

macOS

Apple Silicon (M1/M2/M3/M4): Longpath-vX.Y.Z-macOS-apple-silicon.dmg

Intel Macs are not currently built on CI (GitHub Actions has retired the
macos-13 runner label). Intel Mac users should build from source for now.

This build is ad-hoc signed (no Apple Developer ID yet). On first launch:

  1. Open the DMG, drag Longpath to Applications.
  2. Right-click Longpath.app → OpenOpen in the dialog.
  3. After the first launch, double-clicking works normally.

Windows

Temporarily withdrawn. The Windows build for this release was only
tested on macOS before publishing and has been pulled pending real
testing on Windows. Build from source for now, or watch this release
for a re-published Windows build.

Verification

All artifacts are GPG-signed by KG4VCF. To verify:

gpg --keyserver keyserver.ubuntu.com --recv-keys KG4VCF
gpg --verify SHA256SUMS.txt.asc SHA256SUMS.txt
sha256sum -c SHA256SUMS.txt

Source & Licence (GPLv3 §6 / GPLv2 §3 corresponding source)

Longpath is distributed under GPLv3 (see LICENSE inside any
release artifact, or https://github.com/boydsoftprez/NereusSDR/blob/main/LICENSE).
The combined work links/bundles:

  • Thetis-derived C++ ports (GPL-2.0-or-later; combined under GPLv3
    via §5(b)) — see licenses/thetis.txt
  • mi0bot/Thetis-HL2-derived HL2 bits (GPL-2.0-or-later) — see
    licenses/mi0bot-thetis.txt
  • AetherSDR-derived Qt6 scaffolding (GPL-3.0) — see
    licenses/aethersdr.txt
  • Qt 6 (LGPL-3.0, dynamic linking) — see licenses/qt6.txt
  • FFTW3 (GPL-2.0-or-later, static on Windows / system on Linux+macOS)
    — see licenses/fftw3.txt
  • WDSP (GPL-2.0-or-later, static) — see licenses/wdsp.txt

Every release artifact ships a licenses/ directory containing the
three full FSF licence texts (GPLv2.txt, GPLv3.txt, LGPLv3.txt),
all per-dependency notices listed above, and a written source offer at
licenses/SOURCE-OFFER.txt covering GPLv3 §6(a) (primary: this release
page) and §6(b) (fallback: 3-year offer via email).

Corresponding source for every binary on this release page is provided
on the same medium:

  • Longpath itself — Longpath-vX.Y.Z-source.tar.gz (this release).
    Equivalent to a git archive of the tag commit. This archive also
    contains the vendored WDSP sources (third_party/wdsp/) and the
    FFTW3 Windows binary-plus-header tree (third_party/fftw3/).
  • FFTW3 (GPLv2-or-later) — fftw-3.3.5.tar.gz (this release).
    Exact upstream archive used to build the bundled libfftw3f-3.dll
    shipped in the Windows installer and portable ZIP. Upstream:
    https://fftw.org/pub/fftw/fftw-3.3.5.tar.gz. Provenance:
    docs/attribution/FFTW3-PROVENANCE.md in the source archive.
  • Qt 6 (LGPLv3) — dynamically linked on all platforms; replace the
    bundled Qt 6 libraries with your own modified build per
    licenses/qt6.txt. Linux: libQt6*.so.6 in the AppImage's
    usr/lib/; macOS: Qt*.framework in Longpath.app/Contents/Frameworks/;
    Windows: Qt6*.dll in the install directory. Upstream source:
    https://download.qt.io/archive/qt/.
  • WDSP (GPLv2-or-later) — statically aggregated; corresponding source
    is in Longpath's third_party/wdsp/ (included in
    Longpath-vX.Y.Z-source.tar.gz). Provenance:
    docs/attribution/WDSP-PROVENANCE.md in the source archive.

A written 3-year source offer applies independently per
licenses/SOURCE-OFFER.txt; contact kg4vcf@gmail.com to invoke it.

Reporting Issues

This is an alpha build for debuggers/testers. Please report issues at
https://github.com/boydsoftprez/NereusSDR/issues with: OS, radio model,
protocol version, and log file (~/.config/Longpath/nereussdr.log).