# AetherSDR **A cross-platform, open-source client for FlexRadio Systems transceivers** [](https://github.com/aethersdr/AetherSDR/actions/workflows/ci.yml) [](https://www.gnu.org/licenses/gpl-3.0) [](https://en.cppreference.com/w/cpp/20) [](https://www.qt.io/) [](https://github.com/aethersdr/AetherSDR/commits/main) AetherSDR brings full FlexRadio operation to Linux, macOS, and Windows — each a native build, no Wine or virtual machines. A native aarch64 build also runs on Raspberry Pi and other embedded ARM devices. Built from the ground up with Qt6 and C++20, it speaks the SmartSDR protocol natively and aims to replicate the full SmartSDR experience. **Current version: 26.9.2** — CalVer (`YY.M.patch[.hotfix]`). | [Download](https://github.com/aethersdr/AetherSDR/releases/latest) | [Discussions](https://github.com/aethersdr/AetherSDR/discussions) | [What's New](https://github.com/aethersdr/AetherSDR/releases) > **Native builds for Linux, macOS, and Windows** — Linux AppImage (x86-64 + aarch64), macOS DMG (Apple Silicon + Intel), Windows installer and portable ZIP. Every platform is built, tested in CI, and released together. 
Native. Open. Yours.
--- ## Highlights - **GPU-accelerated spectrum & waterfall** — QRhi rendering on the GPU (OpenGL/Metal/D3D11) with a per-pixel FFT trace at up to **60 fps**, an optional **3D stacked-trace** spectrum mode (perspective FFT history, floor-anchored ridges), ~71% CPU reduction over CPU paint, GPU-composited slice flags, and multi-GPU adapter selection - **Multi-slice & multi-panadapter** — colour-coded VFO overlays, independent TX assignment, diversity/ESC beamforming; up to 8 detachable pans with native VITA-49 waterfall tiles, with selectable S-meter / **SmartMTR** meter views per flag - **KiwiSDR public-receiver browser** — find and connect to public KiwiSDR receivers worldwide through an API-policy-aware directory (diversity receive with receive-only TX inhibit) - **Aetherial Audio Channel Strip** — a unified RX **and** TX DSP suite (gate, EQ, compressor, de-esser, tube, AetherVoice exciter, reverb, brickwall limiter) with a preset library and a per-side scope - **Six client-side noise-reduction engines** — NR2 (spectral), RN2 (RNNoise), NR4 (libspecbleach), DFNR (DeepFilterNet3), BNR (NVIDIA GPU AI — the Maxine denoiser in-process on a local NVIDIA RTX/GeForce GPU, Linux + Windows; see [`docs/nvidia-bnr.md`](docs/nvidia-bnr.md)), and MNR (macOS) - **DAX virtual audio + IQ** — up to 8 RX audio channels (radio-dependent — 8 on a FLEX-6700, 4 on 6500/6600/8600, 2 on 6300/6400) + 1 TX, and 4 channels of raw I/Q at 24–192 kHz for WSJT-X / fldigi / VARA / JS8Call, plus a per-slice **WFM demodulator** for satellite data - **AetherModem packet radio** — KISS-over-TCP TNC, connected-mode AX.25 BBS, a personal mailbox, and an **APRS client** (station map, GPS beacon, messaging) with a Direwolf-derived VHF demodulator - **AetherSweep** — in-panadapter SWR analyzer with log scale, threshold-band shading, and interpolated bandwidth at SWR ≤ 1.5 / 2.0 - **SpotHub** — DX Cluster, RBN, WSJT-X, POTA, FreeDV Reporter, N1MM+/DXLog contest bandmap, the EiBi shortwave broadcast schedule, and the KiwiSDR DX Community database, with auto-mode switch and per-feed spot colouring - **CW operator suite** — real-time Morse decoder, MIDI/keyboard straight-key & iambic paddles with full QSK, optional Quindar tones - **Copy Assist (speech-to-text)** — on-device transcription of received voice via whisper.cpp, docked under the waterfall with confidence color-coding; CPU or GPU (Vulkan/Metal, auto-detected), download-on-demand models, and an optional remote OpenAI-compatible endpoint. Not in the Intel macOS build — it would force a macOS 15.5 floor on hardware that mostly cannot reach it (see [`docs/asr-copy-assist.md`](docs/asr-copy-assist.md)) - **FreeDV RADE** — AI digital-voice codec with a client-side neural encoder/decoder - **PSK Reporter weather radar** — optional NOAA/NWS radar on the 2D map and 3D globe, with original-observation playback and adjustable speed (see [`docs/psk-reporter-weather-radar.md`](docs/psk-reporter-weather-radar.md)) - **PSK Reporter city lights** — optional NASA/GSFC 2016 VIIRS night-light overlay on the 2D map and 3D globe, fading through civil twilight with adjustable brightness, faint-light lift and warmth (see [`docs/psk-reporter-city-lights.md`](docs/psk-reporter-city-lights.md)) - **SmartLink remote + TCI v2.0 server** — Auth0/TLS WAN operation, and CAT + audio + IQ + CW + spots over a single TCI WebSocket - **Broad hardware control** — rigctld + virtual-serial CAT, MIDI mapping, the FlexControl knob, serial PTT/CW keying, and Multi-Flex operation alongside SmartSDR/Maestro - **Workspace canvas** — place pans and applets freely as resizable, layered items with edge and grid snapping, across several canvas windows if you want them; named workspaces recall which applets are open as well as where they sit, and can be bound to radio profiles. Off by default; the Classic shell is unchanged until you enable it - **Built-in demo mode** — a synthetic backend that generates its own RX audio and matching panadapter, with a fault-injection harness, so you can explore the full UI with no radio attached (it cannot transmit) --- ## How AetherSDR Is Built AetherSDR is developed using an AI-augmented open-source workflow: - **Project lead (Jeremy KK7GWY) + a core contributor team** working primarily through Claude Code and a mix of AI development tools — every commit goes through the merge gate; nothing reaches `main` without human review - **[AetherClaude](https://github.com/aethersdr/aetherclaude) orchestrator bot** auto-triages incoming issues, drafts implementation plans, and produces PRs for issues labelled `aetherclaude-eligible` - **Contributors use a mix of AI tools** (Codex, Copilot, Cursor, Gemini, Aider) — the project's [Constitution](CONSTITUTION.md) (14 principles, structured per [Cisco's Foundry Constitution](https://github.com/CiscoDevNet/foundry-security-spec) spec) codifies the conventions every contributor and every AI tool follows - **Branch protection enforces signed commits, CI green, and CODEOWNERS review** — every change goes through the same gate regardless of which AI tool (or human) produced it - **At active pace: ~50 PRs per week, ~15,000–30,000 lifetime downloads, ≥6 distinct AI tools touching the codebase** See [`AGENTS.md`](AGENTS.md) for the canonical project guide that every AI assistant reads first, and [`CONSTITUTION.md`](CONSTITUTION.md) for the principles that gate the contribution model. The full list of code contributors is auto-generated from GitHub commit attribution — see the [Contributors graph](https://github.com/aethersdr/AetherSDR/graphs/contributors). --- ## Supported Hardware Works with any FlexRadio transceiver, including: - FLEX-6000 series: FLEX-6300, FLEX-6400, FLEX-6400M, FLEX-6500, FLEX-6600, FLEX-6600M, FLEX-6700 - FLEX-8000 series: FLEX-8400, FLEX-8400M, FLEX-8600, FLEX-8600M - Aurora series: AU-510, AU-510M, AU-520, AU-520M - ML-, CL-, and RT-series devices Supported external devices include the 4O3A/FlexRadio PGXL (Power Genius XL) power amplifier and TGXL (Tuner Genius XL) antenna tuner, and — outside the radio seam entirely — ACOM S-series and SPE Expert (1.3K-FA / 1.5K-FA / 2K-FA) amplifiers over serial or ser2net TCP, and VK3AMP (600 W / 1000 W / 2000 W) amplifiers over TCP control with UDP telemetry. Active test target is FLEX-8600 firmware 4.2.18 (SmartSDR protocol v1.4.0.0); earlier 4.x firmware works; v3.x is unsupported. **Other radio families** ride the vendor-neutral `IRadioBackend` seam. Neither is a supported family yet, and FlexRadio remains the supported target: - **Hermes-Lite 2** — **experimental**. Four independent receivers, SSB voice, CW/RTTY decoding, AX.25 packet, band switching with hardware filters, manual notch filters, a host-side impulse noise blanker, host frequency calibration and per-radio state restore (including AGC mode and threshold). - **Networked Icom** — **early**. CI-V over the RS-BA1 UDP transport, brought up on the IC-705 (receive, scope, transmit, FT8) and completed against a live IC-7300MK2 (controls, meters, ATU, WSPR, PC Audio routing and the CW decoder). The connect path asks the radio for its own CI-V address rather than assuming one. Only the IC-705 and IC-7300MK2 are verified against their own CI-V guides — an unrecognised model gets no scope and no transmit rather than optimistic defaults. - **RTL-SDR** — **experimental, receive-only**. Discovers supported USB dongles through `librtlsdr` and provides one panadapter and one host-demodulated slice. No radio at all? **Demo mode** runs the full UI against a synthetic backend that generates its own audio and spectrum. ## Tested Controller Devices AetherSDR supports external station-control hardware through USB serial, USB HID, MIDI, and generic USB-serial adapters: - FlexRadio FlexControl USB tuning knob - Icom RC-28 USB remote encoder - Griffin PowerMate USB knob - Contour ShuttleXpress and ShuttlePro v2 jog controllers - MIDI controllers with learn mode, manual mapping entry, importable/exportable profiles (including vendor-supplied SmartSDR `.map` files), and relative-encoder support - Elgato Stream Deck+ natively over USB HID (hidapi builds), driving the LCD keys and the four encoder dials - Other Stream Deck models, on any platform, through the TCI server or the automation bridge using the control-surface software of your choice — AetherSDR provides the protocol, not the button layer - USB-serial PTT/CW interfaces for foot switches, straight keys, iambic paddles, amplifier keying lines, and external sequencers --- ## Download Pre-built binaries are available from [Releases](https://github.com/aethersdr/AetherSDR/releases/latest): | Platform | Download | Notes | |----------|----------|-------| | **Linux x86_64** | `AetherSDR-*-x86_64.AppImage` | Single file, no install needed. `chmod +x` and run. | | **Linux ARM** | `AetherSDR-*-aarch64.AppImage` | Raspberry Pi, ARM laptops. `chmod +x` and run. | | **macOS** | `AetherSDR-*-macOS-apple-silicon.dmg` | Apple Silicon (M1+). Intel Macs via Rosetta. Signed & notarized. | | **Windows Installer** | `AetherSDR-*-Windows-x64-setup.exe` | Setup wizard with Start Menu shortcut and uninstaller. | | **Windows Portable** | `AetherSDR-*-Windows-x64-portable.zip` | No install needed. Extract and run. | --- ## Building from Source ### Dependencies Install all dependencies for a full-featured build. Optional packages are noted — the build succeeds without them but the corresponding features are disabled. **Qt 6.8 or newer is required.** This is the same Qt the release binaries are built against (6.8.3 LTS), so what CI compiles is what ships. Distro Qt clears it on Debian Trixie, Ubuntu 25.10+, Fedora 41+ and Arch. It does **not** clear on **Ubuntu 24.04 LTS**, which ships Qt 6.4.2 — build there against a Qt from [aqtinstall](https://github.com/miurahr/aqtinstall) or the Qt online installer and point CMake at it with `-DCMAKE_PREFIX_PATH=/path/to/Qt/6.8.3/gcc_64`. On **macOS** the Qt does not come from Homebrew at all — see the macOS note below the install commands. ```bash # Arch / CachyOS / Manjaro sudo pacman -S qt6-base qt6-multimedia qt6-websockets qt6-serialport \ qt6-shadertools cmake ninja pkgconf autoconf automake libtool \ fftw rtl-sdr portaudio hidapi qtkeychain-qt6 # Debian Trixie / Ubuntu 25.10+ / Linux Mint 23+ # (Ubuntu 24.04's Qt is 6.4.2 — below the floor; see the note above.) sudo apt install qt6-base-dev qt6-base-private-dev qt6-multimedia-dev \ qt6-websockets-dev qt6-serialport-dev qt6-shader-baker qt6-shadertools-dev \ cmake ninja-build pkg-config autoconf automake libtool \ libfftw3-dev librtlsdr-dev portaudio19-dev libhidapi-dev qtkeychain-qt6-dev \ libxkbcommon-dev libopengl0 \ gstreamer1.0-pulseaudio gstreamer1.0-plugins-base # Fedora sudo dnf install qt6-qtbase-devel qt6-qtbase-private-devel qt6-qtmultimedia-devel \ qt6-qtwebsockets-devel qt6-qtserialport-devel qt6-qtshadertools-devel \ cmake ninja-build autoconf automake libtool \ fftw3-devel rtl-sdr-devel portaudio-devel hidapi-devel qtkeychain-qt6-devel # macOS (Homebrew) — everything EXCEPT Qt and qtkeychain; see the note below brew install ninja cmake pkgconf autoconf automake libtool \ fftw librtlsdr portaudio hidapi ``` > **macOS note — Qt and qtkeychain do not come from Homebrew.** Homebrew's `qt` > formula (aliased `qt6` and `qt@6`) is a *rolling* release — 6.11.1 at the time > of writing — while the DMG ships 6.8.3 LTS like every other artifact. Building > against Homebrew's Qt means testing a Qt no release ships. Install the matching > one and point CMake at it: > > ```bash > # A venv rather than a bare `pip install`: a PEP 668 python3 refuses the latter. > python3 -m venv ~/.venv/aqt && ~/.venv/aqt/bin/pip install aqtinstall > ~/.venv/aqt/bin/aqt install-qt mac desktop 6.8.3 clang_64 \ > -m qtmultimedia qtwebsockets qtserialport qtshadertools \ > --outputdir ~/Qt > cmake -B build -DCMAKE_PREFIX_PATH="$HOME/Qt/6.8.3/macos;$(brew --prefix)" > ``` > > `clang_64` is the only macOS desktop build Qt publishes, and it is universal2 — > there is no separate arm64 archive to pick. `$(brew --prefix)` stays on the > path for fftw, librtlsdr, portaudio and hidapi. > > Homebrew's `qtkeychain` is left out for a related reason: the formula depends > on `qtbase`, so installing it pulls a second Qt in behind your back. Build it > against the Qt you just installed instead — or skip it and build without > SmartLink credential persistence: > > ```bash > CMAKE_PREFIX_PATH="$HOME/Qt/6.8.3/macos" bash scripts/setup/setup-qtkeychain.sh > ``` > > **Two Qt installations visible to CMake at once is a real failure, not a > theoretical one** — it is what #711 and #812 were, and `CMakeLists.txt` puts > `$(brew --prefix)/include` on the global include path on macOS, so a Homebrew > Qt is discoverable whether or not you asked for it. If you have one, > `brew uninstall qt` (plus whatever pulled it in) before building. The release > workflow asserts this; your machine will not.