← Spektra RF · Licences & source
License
Spektra ships as two separate programs under two different licenses. This file is the authoritative map of which paths are covered by which license. If you only read one licensing file in this repo, read this one.
The App — proprietary
© 2026 Squaresmile Media. All rights reserved.
The desktop application — the Tauri shell, the browser frontend, and the
branding/assets that make up the packaged .app/.dmg/Windows installer UI —
is commercial, proprietary software. It is licensed to end users under the
terms of EULA.md, not under an open-source license.
Proprietary paths:
src-tauri/(Rust shell:Cargo.toml,tauri.conf.json, capabilities)index.htmljs/(except the vendoredjs/vendor/jspdf.umd.min.js, whose own MIT header stays verbatim — see THIRD-PARTY-NOTICES.md)css/advisor.js,analysis.js,export.jsfavicon.svgand other branding assets
Do not add an open-source license header to any file under these paths.
The Engine — GPL-3.0-or-later
The Python engine — the RF scanning/DSP backend that is frozen into the PyInstaller sidecar and shipped inside the App bundle — is free software licensed under the GNU General Public License, version 3 or later (GPL-3.0-or-later). The full, verbatim license text is at licenses/GPL-3.0.txt.
This licensing choice is not a preference — it is a requirement. The engine
links pyrtlsdr (GPL-3.0-or-later) and, at runtime, loads GPL-2.0-or-later
native libraries (librtlsdr, libhackrf, libairspy). Distributing a
program that links GPL code means the combined work must itself be
GPL-licensed.
The exact 24 GPL-3.0-or-later engine files (each carries its own SPDX header, see below):
Root (8): scanner.py, transport.py, transport_audio.py,
transport_dsp.py, transport_http.py, transport_waterfall.py,
demod.py, synthetic_sdr.py
sources/ (15): sources/__init__.py, sources/airspy_source.py,
sources/base.py, sources/demo_source.py, sources/device_constants.py,
sources/hackrf_source.py, sources/rfexplorer_source.py,
sources/rtlsdr_source.py, sources/sdrplay_source.py,
sources/serial_source.py, sources/soapy_enumerate.py, sources/soapy_source.py,
sources/tinysa_detect.py, sources/tinysa_source.py,
sources/tinysa_ultra_source.py
pyinstaller-hooks/ (1): pyinstaller-hooks/rth_soapy_plugin_path.py (a PyInstaller runtime
hook frozen into the sidecar to fix the SoapySDR plugin search path)
Nothing in EULA.md does or can limit anyone's rights under the GPL-3.0-or-later for these 24 files — the EULA governs the App only, and the GPL carve-out clause in EULA.md says so explicitly.
The boundary between them
The App and the Engine are separate programs. The Tauri shell spawns the
Engine as a subprocess (the PyInstaller sidecar) and talks to it exclusively
over local network sockets — HTTP on 127.0.0.1:38080 (walking to :38090
if occupied) and WebSocket on 127.0.0.1:38765. There is no shared process
memory, no linked library boundary, and no compiled-in coupling between the
two programs; they communicate at arm's length via a local network protocol,
the same way a browser talks to any local web server.
Third-party components
Everything else bundled into the shipped distributions — third-party libraries, tools, and installer resources not written for this project — is inventoried with its own license in THIRD-PARTY-NOTICES.md, including the written source offer required for the GPL/LGPL components.