Current version: 0.1.0-pre2 — "RX2 Dual Receiver"
Modern PySide6 desktop SDR for Steve Haynal's Hermes Lite 2 and HL2+. Native Python HPSDR Protocol 1, TCI v1.9 server, glassy UI with lit-arc and LED-bar meters, a band-plan overlay with landmark click-to-tune, GPU-accelerated panadapter + waterfall, dual-receive (RX2) with focused-VFO operator model and SUB stereo split, a CW-focused audio toolkit (APF audio peaking filter + BIN binaural pseudo-stereo), and a deep WDSP-cffi noise toolkit drawing on Warren Pratt's WDSP — EMNR mode 1-4 noise reduction, adaptive line enhancer (ANF), all-mode squelch. Built-in weather alerts watch the operator's local conditions across multiple data sources (Blitzortung, NWS, Ambient, Ecowitt) and raise toolbar + toast notifications for lightning and high-wind events.
Pre-alpha — RX is functional; TX is in progress. Developed and tested against a Hermes Lite 2+ board.
The version string above is the single source of truth maintained in
lyra/__init__.py and surfaces in:
- The window title bar
- The Help → About Lyra dialog
- A permanent label on the right side of the status bar
- The User Guide's About section (rendered live from package metadata)
Bumping the version is a one-line edit in lyra/__init__.py; every
display surface follows automatically.
Latest release — see CHANGELOG.md
The current release is 0.1.0-pre2 — "RX2 Dual Receiver" (2026-05-12). Pre-release for tester bench-flight with Brent (N9BC), Timmy (KC8TYK), and N8SDR. The headline change is full RX2 dual receive on the HL2 — two independent receivers running side-by-side under a focused-VFO operator model.
- RX2 dual receiver — second receiver on DDC1 with its own VFO, mode, filter, AGC, and NR state. Both receivers run continuously whenever RX2 is enabled — no muting tricks or quick-toggles.
- Focused VFO model — exactly one VFO is "focused" at any time; panadapter, tuning knob, mode picker, band buttons, and GEN/TIME/ Mem recalls all act on the focused VFO. Green border on the focused VFO's frequency display marks where input goes. Swap focus by clicking the other VFO's LED, Ctrl+1 / Ctrl+2, or middle-click anywhere on the panadapter.
- SUB stereo split — single-button toggle on the TUNING panel. SUB off = mono on focused VFO. SUB on = RX1-left / RX2-right stereo split. Vol-A / Vol-B / Mute-A / Mute-B sliders are always visible (Phase 3.E.1 hotfix — predictable layout beats conditional widgets). Balance + AF Gain remain single shared controls.
- VFO B always-visible — the second frequency display (previously hidden) now sits permanently below VFO A. Click to give it focus; double-click to type a frequency.
- Persistence across sessions —
rx2_enabled,focused_rx, per-RX vol / mute, and per-RX mode all round-trip through the Lyra session file. Open Lyra exactly how you left it. - Audio-path latency reduction (post-pre2 polish, §15.7) —
rmatch ring 400 → 150 ms, HL2 TX-latency register 40 → 15 ms.
~275 ms shaved off the RX path vs pre-§15.7. See the User Guide
Troubleshooting topic for the tester-diagnostic env vars
(
LYRA_RMATCH_RING_MS,LYRA_HL2_TXLATENCY_MS,LYRA_TIMING_DEBUG).
For the previous v0.0.9.3 release ("WDSP AGC" — Warren Pratt wcpAGC engine, APF moved post-AGC, sounddevice device-info diagnostic), v0.0.9.2 (host → radio EP2 cadence rewrite, band-change fixes, 48 k IQ rate retirement), and the v0.0.9 / v0.0.9.1 batch (Memory & Stations, TIME button, EiBi overlay, etc.):
- TIME button (HF time-station cycle). Press TIME on the BANDS panel to jump to WWV / WWVH / CHU. Press again to step through 9 time-signal frequencies (2.5, 3.330, 5, 7.850, 10, 14.670, 15, 20, 25 MHz) in country-aware order — closest stations to your callsign first. Mode + filter set automatically.
- GEN1 / GEN2 / GEN3 customization. Right-click a GEN slot to save your current frequency / mode / filter. Confirm dialog prevents accidental overwrites. Defaults are sensible (40m / 20m SSTV / 10m), but every slot is yours to remap.
- Memory bank — 20 named presets. New Mem button next to GEN3 opens a dropdown of named operator memories (e.g. "OMISS Net 7.185", "30m beacon"). Add from the dropdown, manage from Settings → Bands → Memory: rename, reorder, delete, CSV import / export.
- Shortwave broadcaster overlay (EiBi). Lyra now paints station IDs on the panadapter — name + language + target region — for the broadcaster currently on-air at any visible frequency inside the SW broadcast bands (49m through 11m). Auto-suppressed inside your region's amateur allocations so it doesn't clutter ham bands. Pulled from the EiBi seasonal CSV with a one-click background updater (auto-update + manual install paths both supported). Multi-row label stacking when bands get crowded.
Plus: tooltip font bumped to 13 pt for readability, Settings dialog gained a Bands tab containing all of the above.
For the full version history (0.0.3 → 0.0.9), see CHANGELOG.md.
See docs/help/getting-started.md for the full guided tour or press
F1 inside the app for the in-app User Guide.
RX signal chain
- Native HPSDR P1 discovery + streaming (UDP, port 1024)
- Dual-receive (RX2) on DDC1 — independent VFO / mode / filter / AGC / NR per RX
- Spectrum-correct panadapter (HL2 baseband mirror correction applied)
- AGC with Fast / Medium / Slow / Long / Auto / Custom profiles (WDSP wcpAGC engine via cffi)
- Auto LNA back-off + opt-in pull-up (overload protection, range -12 to +48 dB)
- Manual notch filters — multi-notch, per-notch Q, live cut-depth visualization on the spectrum
- WDSP EMNR noise reduction (Mode 1-4 picker, AEPF post-filter, NPE noise estimator)
- Captured noise-profile library (snapshot the band's noise, recall later)
- Noise-floor reference line with auto-threshold feeding AGC
- Passband overlay with draggable edges for live RX BW tweaks
- Peak markers (Line / Dots / Triangles, in-passband only)
Bands and modes
- IARU regional band plans (US / R1 / R3 / NONE)
- Colored sub-band segments + FT8 / FT4 / WSPR / PSK landmark triangles — click a triangle to tune and switch modes
- SSB (USB/LSB), CW, AM, FM, DIGU / DIGL
UI
- Docked-panel workspace (drag to float / tab / reset layout)
- Lit-Arc S-meter with LED-bar alternative (click the chip-row in the Meters panel header to switch styles)
- Focused-VFO indicator (green border) + middle-click-to-swap on the panadapter
- Waterfall with eight palettes (Classic / Inferno / Viridis / Plasma / Rainbow / Ocean / Night / Grayscale)
- Click-label color picker in Settings → Visuals (text of each field painted in that field's current color + bolded for at-a-glance configuration view)
- Optional OpenGL rasterization backend so resize/fullscreen doesn't pause audio
- Y-axis drag-to-rescale on the spectrum's right edge
- Two-way sync between front-panel View sliders and Settings
Integration
- TCI v1.9 server — drives SDRLogger+, DX clusters, CAT clients
- DX spot rendering with age fade and multi-row collision packing
- Per-session notch bank, per-band frequency memory
Audio out
- HL2 audio jack (EP2 → AK4951 onboard codec, default for HL2 hardware) or PC Soundcard (WASAPI via PortAudio with adaptive rmatch resampler)
- Automatic fallback when the IQ stream rate exceeds AK4951's 48 kHz
- Per-RX Vol-A / Vol-B / Mute-A / Mute-B sliders always visible (SUB-aware)
- UI: PySide6 (Qt6)
- Protocol: Native Python HPSDR Protocol 1 (UDP, port 1024)
- DSP: WDSP via cffi (bundled GPL DLLs in
lyra/dsp/_native/)- NumPy / SciPy glue for non-DSP signal handling
- Control: TCI v1.9 server
- Audio: HL2 audio jack (EP2 codec) by default; sounddevice / PortAudio (WASAPI) for the PC Soundcard output path
- Target OS: Windows-first
Requires Python 3.11+ on Windows.
Quickstart:
pip install -r requirements.txt
python -m lyra.ui.app
Or double-click LYRA.bat.
Step-by-step install for non-developer testers:
see INSTALL.md — covers Python installation, Git
setup, dependency install, common gotchas, and feedback channels.
A printable Word version is also at
docs/Lyra-SDR-Install-Guide.docx.
On first launch, Lyra tries to discover an HL2 on the local network. If the board is reachable it'll show up in the connection panel; if not, check firewall, cabling, and that the HL2 has power. Full troubleshooting guide in the in-app User Guide (press F1).
- Hermes Lite 2: http://hermeslite.com/
- Hermes Lite 2+: https://www.hermeslite2plus.com/
Lyra v0.0.5 and earlier (under MIT) were a clean-room implementation referencing only protocol documentation and operator-visible UI behavior — no Thetis source was incorporated.
Starting with v0.0.6 (under GPL v3 or later), Lyra is in full
license compatibility with the openHPSDR ecosystem. Future releases
may directly incorporate or link with GPL'd ham-radio libraries
(notably WDSP for PureSignal, CESSB, and advanced TX). All such
incorporations preserve upstream copyright + GPL terms; see
NOTICE.md for ongoing third-party disclosures.
ExpertSDR3 is closed-source commercial software from Expert Electronics — referenced from published manuals as a design inspiration only, no code involvement.
Tracked in docs/backlog.md. High-priority open items: TX path,
per-band notch memory, expose bundled RNNoise / SpectralBleach NR
via UI (DLLs already shipped, no front-end yet), installer for beta
testers.
GNU General Public License v3.0 or later — see LICENSE.
Lyra was originally released under the MIT License up through v0.0.5 ("Listening Tools"). Starting with v0.0.6, Lyra is relicensed under GPL v3 or later to match the licensing of the broader openHPSDR / WDSP ecosystem and to enable future integration with WDSP-based features (PureSignal, CESSB, advanced TX). Past releases (≤ v0.0.5) remain under their original MIT terms; the relicense applies only to v0.0.6 and later.
What this means in practice:
- You can use Lyra for any purpose, including commercial use
- You can modify Lyra freely
- You can redistribute Lyra and your modifications — but the result must also be GPL v3 (or later), and you must make source available
What it does NOT change:
- Donations are still welcome (PayPal, etc.) — GPL doesn't restrict receiving payment for the project
- Operators can run Lyra free of charge, no strings attached
- The complete source remains public on GitHub
For the canonical GPL v3 text, see LICENSE in this repository or
https://www.gnu.org/licenses/gpl-3.0.html.
© 2026 Rick Langford (N8SDR), Brent Crier (N9BC), Timmy Davis (KC8TYK), and Lyra-SDR contributors — see CONTRIBUTORS.md