-
Notifications
You must be signed in to change notification settings - Fork 12
Configuration
This page is the authoritative map of all NovaSDR configuration keys. Values and behavior mirror the backend implementation.
Note
NovaSDR was previously called "PhantomSDR-Plus". Some legacy identifiers may appear in logs. Functionality is unchanged.
- How the config is structured
- Minimal valid example
- Sections and keys
- [server]
- [websdr]
- [limits]
- [input]
- [input.driver]
- [input.defaults]
- Choosing safe values
- Known compile-time options
A single TOML file (default: config.toml) contains all settings. The backend loads it on startup and fails fast on invalid or missing required keys.
- File loading and validation happen in
main(). - Runtime defaults and constraints are enforced in
broadcast_server::broadcast_server().
graph TD
A[config.toml] --> B[Load and validate]
B --> C[Apply defaults]
C --> D[Initialize FFT and streams]
D --> E[Start WebSockets and serve UI]
This is the smallest known-good configuration that will start the server. Adjust values to fit your setup.
[server]
port = 9002
html_root = "frontend/dist/"
otherusers = 1
threads = 1
[websdr]
register_online = false
name = "NovaSDR"
antenna = "Discone"
grid_locator = "JO62"
hostname = ""
operator = "ChangeThis"
email = "example@test.com"
callsign_lookup_url = "https://www.qrz.com/db/"
chat_enabled = true
[limits]
audio = 100
waterfall = 200
events = 200
[input]
sps = 2048000
frequency = 100900000
signal = "iq"
fft_size = 131072
fft_threads = 1
brightness_offset = 0
audio_sps = 12000
waterfall_size = 1024
waterfall_compression = "zstd"
audio_compression = "flac"
accelerator = "none"
smeter_offset = 0
[input.driver]
name = "stdin"
format = "u8"
[input.defaults]
frequency = 100900000
modulation = "WBFM"-
port(int, default:9002)
TCP listen port. -
host(string, default:"0.0.0.0")
Bind address. -
html_root(string, default:"html/")
Directory for static UI files. Use the built frontend path:frontend/dist/. -
otherusers(int, default:1)
Show other listeners on the UI (1) or hide them (0). -
threads(int, default:1)
Backend network worker threads.
Example:
[server]
port = 9002
host = "0.0.0.0"
html_root = "frontend/dist/"
otherusers = 1
threads = 1-
register_online(bool, default:false)
Publish station information to https://sdr-list.xyz at intervals. -
name,antenna,grid_locator,hostname,operator,email(strings)
Metadata displayed in the UI and used for listing. -
callsign_lookup_url(string, default:"https://www.qrz.com/db/")
Base URL for callsign lookups from the UI. -
chat_enabled(bool, default:true)
Toggle chat overlay.
Example:
[websdr]
register_online = false
name = "NovaSDR Station"
antenna = "Discone"
grid_locator = "JO62"
hostname = ""
operator = "DL1ABC"
email = "you@example.com"
callsign_lookup_url = "https://www.qrz.com/db/"
chat_enabled = truePublishing thread implementation: broadcast_server::update_websdr_list()
Connection caps per service type:
-
audio(int, default:1000) -
waterfall(int, default:1000) -
events(int, default:1000)
Example:
[limits]
audio = 100
waterfall = 200
events = 200Core stream parameters:
-
sps(int, required)
Input sample rate in samples per second. -
frequency(int, required)
Center or baseband frequency in Hz. -
signal(string, required)
"iq"for complex samples or"real"for single-channel direct sampling. -
fft_size(int, default:131072, power of two)
Primary FFT size for spectrum and waterfall. -
fft_threads(int, default:1)
FFT worker threads. -
brightness_offset(int, default:0)
Adjust waterfall brightness (negative darkens, positive brightens). -
audio_sps(int, default:12000)
Maximum demod output sample rate. -
waterfall_size(int, default:1024)
Minimum downsampled FFT size for waterfall levels. -
waterfall_compression(string, default:"zstd")
"zstd"or"av1"(requires AV1 compiled in). -
audio_compression(string, default:"flac")
"flac"or"opus"(requires Opus compiled in). -
accelerator(string, default:"none")
"none","opencl","cuda","mkl". Startup fails if a requested accelerator is not compiled in. -
smeter_offset(int, default:0)
S-meter calibration offset in dB.
Frequency mapping behavior:
- For
signal = "iq", the effective spectrum base equalsfrequency - sps / 2. - For
signal = "real", the spectrum base equalsfrequency.
Used throughout initialization: broadcast_server::broadcast_server()
Example:
[input]
sps = 2048000
frequency = 100900000
signal = "iq"
fft_size = 131072
fft_threads = 1
brightness_offset = 0
audio_sps = 12000
waterfall_size = 1024
waterfall_compression = "zstd"
audio_compression = "flac"
accelerator = "none"
smeter_offset = 0-
name(string, required)
"stdin"(current supported method). -
format(string, required)
One of:u8,s8,u16,s16,cs16,f32,cf32,f64. Must match your capture tool’s output.
Typical mappings:
- rtl_sdr →
u8(IQ) - hackrf_transfer →
s8(IQ) - airspy_rx →
s16(IQ) - rx_sdr driver=sdrplay →
s16(IQ) - rx888_stream →
s16(REAL)
Driver selection is handled in main()
Example:
[input.driver]
name = "stdin"
format = "u8"Initial UI state for new clients:
-
frequency(int, Hz) -
modulation(string) — One of:AM,SAM,FM,WBFM,USB,LSB
Default demod passbands are derived from this mode and the bin mapping:
broadcast_server::broadcast_server()
Example:
[input.defaults]
frequency = 100900000
modulation = "WBFM"Tip
If startup fails due to memory or CPU pressure, first reduce fft_size, then sps.
- Start with
sps = 2048000andfft_size = 131072. - Keep
waterfall_compression = "zstd"andaudio_compression = "flac"unless you compiled additional codecs. - Leave
accelerator = "none"until you confirm your OpenCL or CUDA runtime is installed and NovaSDR was compiled with that support. - Keep
fft_threads = 1unless you have headroom and measure a benefit.
If you request these but the backend was not compiled with them, NovaSDR exits early with a clear log message:
-
audio_compression = "opus"requires Opus at build time.
Check:broadcast_server::broadcast_server() -
waterfall_compression = "av1"requires AV1 at build time.
Check:broadcast_server::broadcast_server() -
accelerator = "opencl"or"cuda"or"mkl"require those backends at build time.
Selection:broadcast_server::broadcast_server()