Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Configuration and security

sdrmm serves the interface, receiver engine, REST API, WebSocket, and MCP in one process. By default it listens on 0.0.0.0:8080 without authentication.

Command-line options

sdrmm [OPTIONS]
OptionDefaultPurpose
--bind <ADDRESS>0.0.0.0:8080Address and port for HTTP and WebSocket traffic
--db <PATH>Platform data directorySQLite database for workspaces, presets, bookmarks, recording index, and decoder log
--recordings-dir <PATH>Platform data directoryDirectory containing SigMF recording pairs
--token <TOKEN>NoneRequire one shared bearer token for API, WebSocket, and MCP requests
--tls-cert <PATH>NonePEM certificate chain to serve HTTPS with; requires --tls-key
--tls-key <PATH>NonePEM private key for that chain
--tls-self-signedOffServe HTTPS with a self-signed certificate kept beside the database
--tls-name <NAME>Discovered addressesName or address that certificate must cover; repeatable
--routing-backend <NAME>open-route-serviceRouting service: open-route-service or graph-hopper
--routing-url <URL>The backend's own serviceBase URL, for a self-hosted instance
--routing-key <KEY>NoneAPI key for that service
--dev-corsOffAllow a separate frontend development origin
--doctorOffPrint environment diagnostics and exit
--doctor-ratesOffProbe connected receivers' sample rates and exit
--helpShow CLI help
--versionShow the build version

Use absolute database and recording paths for services so storage does not depend on the working directory.

Persistent data

Back up the database and recordings for a complete installation:

/srv/sdrmm/
├── sdrmm.db
└── recordings/
    ├── <capture>.sigmf-meta
    └── <capture>.sigmf-data

The database holds settings and decoded history; recording files hold IQ and audio. Stop the server before copying its database, or use SQLite's backup mechanism. Finish recordings before copying their files.

Logging

Set the RUST_LOG filter to adjust logging:

RUST_LOG=info sdrmm
RUST_LOG=sdrmm=trace,info sdrmm

Use trace logging for short diagnostic sessions; it can produce substantial output.

Shared-token authentication

Set a long random token before allowing untrusted clients to reach the server:

export SDRMM_TOKEN='replace-with-a-long-random-secret'
sdrmm

--token sets the same value, but the environment variable keeps it out of the process arguments. The browser prompts for the token and stores it for that origin.

REST and MCP clients send:

Authorization: Bearer replace-with-a-long-random-secret

WebSocket handshakes and browser downloads can use ?token=.... The application shell and GET /api/auth stay public so clients can load the login prompt. Other API, documentation, WebSocket, and MCP routes require the token.

All authenticated clients have the same permissions, including changing the active receiver. There are no per-user accounts or read-only roles.

HTTPS

Use a certificate chain and matching private key:

sdrmm --tls-cert /etc/sdrmm/fullchain.pem --tls-key /etc/sdrmm/privkey.pem

Both files must be PEM. Put the leaf certificate first, followed by intermediates. Keys may use PKCS#8, PKCS#1, or SEC1. Missing, unreadable, or mismatched files prevent startup.

For a local setup without a certificate authority:

sdrmm --tls-self-signed

The certificate covers localhost, loopback, and discovered LAN addresses. It is saved under tls beside the database and reused until renewal is needed. Compare the logged SHA-256 fingerprint when first accepting it on a client.

For containers, NAT, or a DNS name, specify the addresses clients actually use:

sdrmm --tls-self-signed --tls-name radio.example --tls-name 192.168.1.20

SDRMM_TLS_NAMES accepts the same comma-separated list. Explicit names replace discovered addresses; loopback remains covered. Changing names regenerates the certificate. Stable names avoid repeated certificate changes when a container address changes.

Prefer an authority-issued certificate where available. Self-signed certificates require clients to establish trust manually.

Network security

Use HTTPS to protect tokens and receiver traffic. For a reverse proxy:

  • Bind SDR-- to loopback or firewall its direct port.
  • Serve the application at the origin root.
  • Forward WebSocket upgrades for /api/ws.

An authenticated tunnel is another option. Rotate the shared token if it may have leaked.

Turn-by-turn routing

Field mode uses OpenRouteService or GraphHopper for driving routes. Set --routing-key, choose the service with --routing-backend, and use --routing-url for a self-hosted instance. The key stays on the server and is sent in an authorization header.

Without a reachable backend, field mode reports the problem and keeps heading guidance. Navigate in Maps can open the target in the phone's navigation app.

Development CORS

--dev-cors permits requests from a separate frontend origin during development. Leave it off for production and when the interface is served directly by sdrmm.