DIT DOTS KO6ETZ HAM RADIO • ELECTRONICS • SOFTWARE 14.074 MHz TX PWR RX

ShackLink Server

ShackLink Server – Complete Ham Radio Remote Control Solution

Complete solution for remote ham radio control: operate your shack from anywhere on earth. Tune frequencies, transmit (CW / RTTY / PSK31 / voice / SSTV / WEFAX images), watch the SDR panadapter, decode eight digital modes, and stream broadcast-quality audio to a Windows desktop, web browser, iOS / Android phone, or Home Assistant dashboard. Single port for full remote access through Cloudflare Tunnel, Tailscale Funnel, nginx, or a port-forward, with optional HMAC-SHA-256 authentication.

Install Kit Coming Soon
👋 From the developer, Sorin (KO6ETZ)

From my shack to yours

I love building apps, and ShackLink is what happens when I get to blend my two favorite worlds: software and ham radio. It began as a scratch-my-own-itch project. I wanted to run my own station from anywhere, exactly the way I like it, so I built it. It grew into something I’m glad to share, so the Windows server and desktop client are completely free. When the iOS and Android apps arrive, a small charge may apply on those platforms, just enough to cover the app-store costs.

It’s still under active development and heavily in beta, so you’ll meet the odd rough edge here and there. Feedback is hugely appreciated. It genuinely steers where this goes. One friendly heads-up: there’s a lot of information on screen, so a large monitor is highly recommended. What can I say? I like my eye candy. 😄

🎁 Windows server & client: free 🧪 Heavily in beta 💬 Feedback welcome 🖥️ Big-monitor friendly

📻 Why ShackLink?

Everything you need to control your ham radio remotely over your local network, or anywhere on the internet.

🌐 Operate From Anywhere

One unified HTTP + WebSocket port (8084) carries the entire client experience: control, audio, transmit, SDR spectrum. Wrap it in a Cloudflare Tunnel, Tailscale Funnel, or plain reverse proxy and your shack travels with you. HMAC-SHA-256 authentication (optional) gates every connection so unauthorized clients are dropped before any state is sent.

🎧 Dual Audio Streams

Two parallel audio paths: low-latency 12 kHz PCM for tuning and digital-mode work (~200 ms), and 192 kbps stereo MP3 (HiFi) for broadcast-quality listening. Clients toggle between them per-session; HiFi works in any browser / VLC / mpv just by opening the URL.

🔢 Eight Server-Side Decoders

CW (40+ WPM), RTTY (auto-detect baud + shift, two demod algorithms), PSK31 (9 BPSK / QPSK variants with AFC and FEC), FT8 / FT4 (relayed from a co-located WSJT-X via UDP 2237), SSTV (19 modes across Robot, Martin, Scottie, PD, Wraase, Pasokon with progressive image rendering), WEFAX (weather-fax decoder with phasing-lock detector, IOC 576 / 288 at 60 / 120 LPM), NAVTEX (SITOR-B FEC, 100 baud, 170 Hz shift, maritime safety messages), and APRS (AX.25 1200 baud Bell 202 AFSK packet radio with position and message decoding). All decoders run on the server, immune to network jitter.

🔊 Full Transmit Subsystem

Server-owned TX pipeline for CW, PSK31, RTTY, voice, and image modes (SSTV all 18 sub-modes + WEFAX). PTT via OmniRig. Single-owner lock prevents collisions across clients. TX:CONFIG protocol broadcasts every TX setting so server, desktop, web, and mobile clients stay in sync. Voice uplink uses 16-bit PCM (port 8082 on the LAN, channel-tagged binary on the unified WebSocket for remote). Image upload is chunked + SHA-256 verified. Test-no-RF mode lets you rehearse without keying the rig.

📡 SDR Panadapter

Up to 8 SDR devices simultaneously, each in its own slot with independent spectrum, demodulator, and optional per-slot decoder. Supports ExtIO plugins (Airspy, SDRplay, etc.), librtlsdr-direct (RTL-SDR), HackRF (in-process, RX+TX with WFM/NFM demod and polyphase FIR decimation), Hermes Lite 2 (Ethernet, HPSDR Protocol 1, 48–384 kHz, full-duplex RX+TX, N2ADR LPF auto-select, SWR protection), native sound-card I/Q, or a synthetic test source. Click-to-tune and drag-to-pan on every display surface (server, desktop, web, mobile, HA card). All clients can select which slot to view and switch the audio source between slots. Two modes: RF (independent SDR receiver) and IF panadapter (radio’s IF tap, displayed center tracks the rig’s CAT frequency). Per-client server-side zoom with a navigator overview channel. Configurable FFT size (4K–32K).

📈 Lab Measurements

Professional RF measurement workstation built on up to 8 simultaneous SDR sources. Multi-trace overlay with per-trace modes (ClearWrite, MaxHold, MinHold, Average, RMS), 8 markers with peak search and N-dB bandwidth, automated measurements (channel power, OBW, ACPR, SNR, harmonics/THD, IMD/IP3), DPX persistence display, spectrogram waterfall, two-SDR transfer function (S21) with limit masks, CSV and Touchstone S1P/S2P export, and C# scripting via Roslyn with a full MeasurementApi for measurement automation. Wheel-zoom at the cursor with zoom history, and a stitched multi-band view that splices disjoint SDR bands side by side, with a per-trace segment lane editor to keep just the slice of each band you care about. Plus a suite of dedicated instruments — modulation analyzer, phase noise, noise figure, zero-span scope, and a mask-trigger black-box I/Q recorder — and one-click video recording of the display.

🔌 Multi-Rig Support & Sync Rules

Control up to 4 radios through OmniRig v2 with custom names, each maintaining independent state. Drag-and-drop rig-to-rig sync rules (offset / invert sideband / sync frequency / sync mode) drive transverters, dual-radio diversity, or monitoring receivers automatically.

💻 Multi-Platform Clients

Windows desktop client, web browser, iOS / Android (.NET MAUI), and Home Assistant Lovelace cards. Auto-detect picks the lowest-latency LAN path when the server is local; manual hostname entry switches mobile to the auth-gated unified WebSocket for remote access.

💾 24 Server-Synced Memory Slots

Frequency/mode/label memories stored on the server and synchronized to all connected clients in real-time. Save, recall, clear, and label from any client — changes propagate instantly.

📍 Band Plan / Frequency Table

Built-in searchable reference of amateur allocations, calling frequencies, and mode segments for HF/VHF/UHF. Click any row to tune the radio instantly.

🎥 Recording & Visualization

Local audio recording (WAV / MP3) on every client. Live audio visualization with 4 modes (waterfall, spectrum, spectrum LED, oscilloscope) and 6 themes (Classic, Neon, Grayscale, Ham Radio, Semaphore, Rainbow), full peak-hold + gain / contrast / range controls.

📅 Scheduler & Automation

Program multi-step radio operations: tune, decode, record, transmit, on a schedule (one-time, daily, weekly, interval) or on demand. Chain programs together, use built-in templates (CW Beacon, FT8 Session, WEFAX Receiver, equipment test demos), import/export program sets. A step’s source can be an SDR slot as well as a rig: a step can take over an RX-capable slot or transmit from a TX-capable slot, not just an OmniRig radio. All TX modes supported: CW, RTTY, PSK31, SSTV (19 modes), WEFAX, and voice from file. Band plan validation, listen-before-transmit, max TX time cap, and auto station ID for Part 97 compliance.

🚀 System Architecture

A unified server architecture with multiple client connection options.

ShackLink Architecture

Network Ports

8080
TCP
Radio control commands
8081
TCP / UDP
12 kHz PCM downlink & discovery (UDP payload advertises the HiFi port)
8082
TCP
Voice TX uplink (token-auth PCM, LAN)
8084
HTTP + WebSocket
Unified single port — web client at /, HiFi MP3 at /hifi.mp3, and WebSocket at /ws carrying control + audio + voice TX + SDR for browsers, HA cards, and remote mobile. Optional HMAC auth gate. The only port to expose for full remote access.
8085
TCP / LAN
SDR spectrum stream (binary SDL1 frames). Remote clients receive the same frames over the unified WebSocket.

📡 End-to-End Data Flow

How radio, server, and clients connect across the five network ports.

CAT
Audio-in
Audio-out
8080 TCP
8081 TCP
8082 TCP
8085 TCP
8084 HiFi
8080-8085 LAN
8084 unified WS
8084 unified WS
8084 unified WS
8084 HiFi
8084 HiFi
📻 Radio
OmniRig COM
TX audio card
RX audio card
ShackLink Server
Desktop Client
LAN
Mobile MAUI
LAN auto-detect
Mobile MAUI
remote / proxied
Web Client
Home Assistant

LAN clients (desktop, LAN-discovered mobile) use the multi-port path 8080/8081/8082/8085 plus 8084 for HiFi. Browser, HA, and remote-mobile clients ride a single unified WebSocket on port 8084: one port-forward suffices for full remote access.

🔊 TX Subsystem

One shared transmit pipeline on the server. Clients never touch PTT or the soundcard directly. They remote-control the server’s TxEngine. Supports CW, RTTY, PSK31, voice, SSTV (19 modes), and WEFAX (IOC 576/288 at 60/120 LPM). All TX settings are server-owned and broadcast to every client via the TX:CONFIG protocol.

TX tab in CW mode

CW: QSO chat panel with CQ/QSL/73 quick-send and TX/RX VU meters

TX tab in Voice mode

Voice: hold-to-talk PTT, mic device picker, and test-no-RF mode

TX tab in SSTV mode

SSTV / WEFAX: the image TX panel with preview and live build-up as the encoder transmits

Server
Any client
port 8080
auth token validated
samples
keys
HandleTXCommand
TxEngine
single-owner lock
MaxTxSeconds timer
CW / PSK31 / RTTY
encoder
BufferedWaveProvider
~2s, 12 kHz, 16-bit mono
WasapiOut
shared, 100 ms latency
OmniRig PTT
PM_TX / PM_RX
TX:KEY /
TX:TEXT /
TX:SEND /
TX:UNKEY
Voice PCM
8082 binary
or WS binary
TX audio card
📻 Radio

A single-owner lock ensures only one client keys the radio at a time. Text modes go through an encoder; voice pipes PCM straight into the same output buffer.

Digital-mode TX lifecycle

RadioPTT (OmniRig)TxEngineServer (HandleTXCommand)ClientRadioPTT (OmniRig)TxEngineServer (HandleTXCommand)Clientloop[every 50ms while queued]encoder drains its queueIsFinished → trueTX:KEY:CW1StartTx(encoder, clientId)2rig.Tx = 0x803sleep 50ms (PTT settle)4start WasapiOut & generator5lock acquired6TX:KEYED:CW7broadcast TX:STATUS:ON:CW8TX:TEXT:CQ CQ DE N0CALL9EnqueueText10encoder.GenerateSamples(600)11audio out (12 kHz PCM)12TX:SEND13FlushAndStop14stop WasapiOut15sleep 50ms (audio tail)16rig.Tx = 0x4017release lock18TX:COMPLETE19broadcast TX:STATUS:OFF:20

TX:SEND is the normal flush-and-stop path. TX:UNKEY aborts mid-character; TX:ABORT releases a stuck lock from any caller.

Voice TX — binary uplink handshake

TxEngineServer :8082Server :8080ClientTxEngineServer :8082Server :8080Clientloop[while token valid]next ValidateVoiceTokenreturns false → loop exitsTX:KEY:VOICE1StartVoiceTx, mint token2TX:KEYED:VOICE:<token>3broadcast TX:STATUS:ON:VOICE4open TCP 80825“AUTH:<token>\n”6ValidateVoiceToken7“OK\n”8raw 16-bit mono 12 kHz PCM9FeedVoiceAudio10TX:UNKEY11StopTx — invalidate token12broadcast TX:STATUS:OFF:13

The token pattern lets the voice uplink stream with no per-packet framing overhead while still enforcing “only the current lock owner writes audio.”

Lock state machine

TX-KEY any mode, StartTx acquires lock
TX-SEND, encoder finished, StopTx
TX-UNKEY by owner
TX-ABORT by any caller
owner socket disconnected, auto-abort
MaxTxSeconds elapsed, TX-TIMEOUT then abort
Idle
Keyed
TX-TEXT appended in text modes
PCM bytes fed, VOICE via 8082 or WS binary
Transmitting

Only one client can own the lock at a time. Non-owners get TX:ERROR:NOT_OWNER on any TX:TEXT/SEND/UNKEY/AUDIO attempt.

📦 Components

The ShackLink ecosystem includes multiple client applications for different platforms.

🖥

Server (Windows)

Main server connects to your radio via OmniRig. Manages all clients, audio streaming, and all eight digital decoders.

💻

Desktop Client

Native Windows app with VFO knob control, frequency display, audio playback, all eight decoders, and full TX support via TCP.

🌐

Web Client

Browser-based interface with tabbed work area. Frequency tuning, memory channels, audio streaming, all eight decoders, and image TX.

🏠

Home Assistant

Two custom Lovelace cards: radio control surface with all eight decoders and TX, plus standalone SDR waterfall card.

📱

Cross-Platform App

.NET MAUI app for Windows, iOS, and Android. Touch-friendly controls, all eight decoders, voice TX, and SDR panadapter.

🔌

Arduino Integration

USB serial protocol for hardware projects. Build controllers with physical knobs and buttons.

📷 Screenshots

See ShackLink in action across different platforms.

Server Application

Server Application – Main window with frequency display, meters, and controls

Server SDR Waterfall

SDR Panadapter – Real-time spectrum scope and waterfall with click-to-tune and markers

Server Spectrum Bars

Spectrum Analyzer (Bars) – Classic bar-style spectrum display with peak hold indicators

Server LED Visualization

Spectrum Analyzer (LEDs) – Retro LED-style spectrum display with segmented bars and peak indicators

Server Clients List

Client Management – Monitor and manage all connected WebSocket clients in real-time

Desktop Client SDR 3D Waterfall

Desktop Client – Windows client with SDR panadapter and 3D waterfall

Web Client

Web Client – Browser interface with frequency control and digital decoders

Home Assistant

Home Assistant – Lovelace dashboard integration

Cross-Platform App SDR 3D Waterfall

Cross-Platform App – Windows, iOS, and Android with SDR panadapter and 3D waterfall

👥 Client Management

Monitor and manage all connected clients from the server.

🌐 WebSocket Clients

View all connected web browsers and Home Assistant instances. See client IP addresses, connection time, and real-time status.

🕑 Auto-Refresh

Client list updates automatically every few seconds. New connections appear instantly, disconnected clients are removed.

🔒 Connection Control

Disconnect individual clients when needed. Useful for troubleshooting or managing server resources.

📊 Status Monitoring

Track audio streaming status and subscription state for each client. Identify which clients are actively receiving audio.

Accessing the Clients List

  1. Click the Show WS Clients button on the server main window
  2. A dialog opens showing all currently connected WebSocket clients
  3. The list auto-refreshes to show real-time connection status
  4. Select a client and click Disconnect to terminate its connection
WebSocket Clients List

WebSocket clients dialog showing connected browsers and their status

💡 Client Types

WebSocket clients include web browsers accessing the built-in web client, Home Assistant Lovelace cards, the mobile app’s remote (unified) transport, and any custom integrations using the WebSocket API on the unified port 8084 (path /ws). When authentication is enabled, every connecting client must answer an HMAC-SHA-256 nonce challenge before any state or audio is delivered.

🛠 Installation

Get up and running in minutes with these simple steps.

Step 1: Install OmniRig v2.0 or later

OmniRig v2 is required for up to 4-rig support.

1

Download OmniRig v2.0 or later

Get it from hb9ryz.ch/omnirig

2

Configure Radio

Set COM port, baud rate, and select your radio model

3

Test Connection

Verify frequency updates when tuning your radio

Step 2: Install ShackLink Server

  1. Download the latest release from ditdots.com
  2. Extract all files to a folder (e.g., C:\ShackLink)
  3. Run ShackLinkServer.exe
  4. When prompted by Windows Firewall, click Allow Access

📦 Required Files

Ensure all DLL files are in the same folder: NAudio.dll, NAudio.Core.dll, NAudio.Wasapi.dll, NAudio.WinMM.dll, NAudio.Lame.dll, Fleck.dll

Step 3: Configure Firewall (Tools → Configure Firewall)

Allow incoming connections on these ports:

  • 8080 – TCP radio control
  • 8081 – TCP audio streaming and UDP auto-discovery
  • 8082 – Voice TX uplink (LAN)
  • 8084 – Unified HTTP + WebSocket (web client, HiFi MP3, /ws) — only port needed for remote access
  • 8085 – SDR spectrum stream (LAN)

Step 4: Connect Clients

Open a browser to http://[SERVER_IP]:8084 for web client, or install desktop/mobile client and enter server IP.

🎧 Audio Streaming

Setup

  1. Connect radio audio output to your sound card’s line input
  2. Select the audio input device from the dropdown
  3. Click Start Streaming to begin broadcasting

🎙 Audio Format

Audio is streamed as 12kHz, 16-bit, mono PCM. This provides good quality while minimizing bandwidth (24 KB/sec).

HiFi MP3 Stream (192 kbps stereo)

The server simultaneously exposes a broadcast-quality MP3 stream at http://server:8084/hifi.mp3, served from the same unified port that hosts the web client and the WebSocket endpoint. One shared LAME encoder feeds every connected listener — no extra CPU per client. The encoder spins up automatically when the first client connects and idles when nobody’s listening.

  • Works in any browser / VLC / mpv — paste the URL and go. No client install needed.
  • ICY “Now Playing” metadata — clients that send Icy-MetaData: 1 receive the current rig / frequency / mode as a Shoutcast-style title, updated on every state broadcast.
  • Discovery-aware — the UDP broadcast on port 8081 advertises the server hostname, HiFi, SDR, WebSocket ports, and LAN auth requirement (ShackLink Server;name=<hostname>;hifi=8084;sdr=8085;ws=8084;auth=<required|none>) so non-default configurations still auto-detect, clients can display servers by name, and native clients know up-front whether they need to authenticate.
  • When to prefer which stream: use 12 kHz PCM for low-latency work (CW, digital modes, hearing your own TX), HiFi for casual listening or voice reception where broadcast fidelity matters more than ~1 s buffer latency.

Volume Control

The Audio tab includes a system volume slider that controls the default audio output device level. The volume level and the audio monitor on/off state are persisted across sessions.

Demo Mode

Enable demo mode to generate synthetic Morse code audio for testing without a connected radio. Useful for development, demonstrations, and learning.

📡 SDR Panadapter

Real-time spectrum and waterfall display from an SDR receiver.

SDR tab with 2D waterfall

SDR tab: scope, navigator, and 2D waterfall

SDR tab with 3D waterfall

3D terrain waterfall: the 2D scope stays live above it

SDR Management dialog

SDR Management: assign a source and audio input to each of 8 slots

Panadapter Settings dialog

Panadapter Settings: RF mode or IF mode with sideband offsets and pan policy

SDR waterfall popout in 3D

Waterfall popout: independent 3D view for a second monitor

SDR 3D waterfall with phosphor spectrum

Phosphor spectrum persistence over the 3D terrain

SDR 3D waterfall phosphor, alternate palette

The same view under a different palette

Channel Monitor list

Channel Monitor: per-bank frequency lists with range scan

Source Types

  • ExtIO Plugin (DLL) — Load any ExtIO-compatible plugin (Airspy, SDRplay, etc.). Device selection for adapters with multiple units is done through the plugin’s native GUI — click “Show Native GUI” after opening to access the plugin’s device picker.
  • RTL-SDR (librtlsdr direct) — Talks to rtlsdr.dll directly via P/Invoke. Use the “Device #” spinner to select between multiple RTL-SDR dongles (0-based index). Bypasses the fragile ExtIO_RTL plugin.
  • HackRF — In-process via libhackrf. RX + TX, half-duplex, 1 MHz – 6 GHz, up to 20 MHz bandwidth. WFM / NFM demodulation with polyphase FIR decimation for high sample rates.
  • Hermes Lite 2 — Ethernet SDR transceiver via HPSDR Protocol 1. Full-duplex RX + TX, 48–384 kHz sample rates, N2ADR LPF/HPF filter board auto-selection, SWR protection with auto-unkey, and temperature monitoring. Live frequency changes via C&C registers.
  • Native Sound-Card I/Q — A regular sound card capturing baseband I/Q from an external IF tap or quadrature converter. Pick the input device, set the sample rate, off you go.
  • Icom Native CI-V — Control an Icom CI-V radio (e.g. IC-705) directly, with no OmniRig required, and use its built-in spectrum scope as a first-class SDR slot. Works over USB serial or over the network (Wi-Fi) via Icom’s RS-BA1 protocol, which carries control, scope, RX audio, and TX voice. The scope reassembles from the radio’s CI-V waveform frames; center mode spans VFO ± span, fixed mode uses the configured edges.
  • IQ File Playback Slot — Map a slot to a saved I/Q recording (a SigMF pair, a .sigmf archive, or a legacy .sliq file) that loops forever, replaying captured spectrum like a virtual SDR. The LO is fixed at the recording’s center; click-to-tune moves the demod listen point, and FFT size stays adjustable.
  • Test Signal (synthetic) — Sine + Gaussian noise generator for development and testing without hardware.

Sources are assigned to slots from the SDR Management dialog (there is no longer a single source dropdown). Most drivers run in-process; only ExtIO plugins and RTL-SDR go through the 32-bit broker subprocess.

FFT Size

The FFT combo on the SDR tab controls frequency resolution (4096 / 8192 / 16384 / 32768). Larger FFT = sharper waterfall when zoomed, at the cost of more CPU. Default is 16384. Changes take effect immediately and persist per-device.

Display Features

  • Embedded + Popout — Scope + waterfall on the SDR tab, plus a “Popout Spectrum” button for a resizable window
  • Auto-center — The waterfall automatically follows rig frequency changes for all SDR sources (HackRF, Hermes Lite 2, Sound Card I/Q, ExtIO/Broker), keeping the current signal centered on the display
  • Click-to-tune — Click on the waterfall to set the rig frequency (or the SDR LO in RF mode)
  • Drag-to-pan — Drag the spectrum or the frequency strip to slide the band; in IF mode the policy follows the server’s Pan mode setting
  • Memory markers — Toggle “Show memory markers” to overlay stored memory frequencies on the spectrum
  • DX spot markers — Live DX cluster spots drawn on the waterfall with callsign labels, color-coded by age
  • Broadcast station markers — Known broadcast station frequencies overlaid on the waterfall with station name labels
  • Gain / Contrast / dB floor — Adjustable via sliders on the popout toolbar
  • Per-client zoom — Each connected client requests its own zoom span; a navigator overview channel shows where you are in the full band
  • Navigator overview — A miniature full-band view showing the current zoom window position, enabling quick orientation within the band
  • Phosphor spectrum — Persistence-overlay mode that accumulates spectrum traces over time, visualizing signal density and intermittent signals
  • Phosphor histogram (experimental) — An optional GQRX-style density/histogram color mode for the phosphor overlay (coarse cells + IIR smoothing), alongside the existing amplitude-hue and Gaussian-spread modes. Still an A/B experiment pending a verdict
  • 3D waterfall (terrain view) — Toggle the waterfall pane between the flat 2D scroll and a rotatable 3D perspective terrain of spectrum history (right-click → 3D Waterfall, or the corner 3D/2D button). Orbit camera by dragging, plus Reset 3D View and an optional Fit Height to Pane. GPU-accelerated via OpenGL with a silent CPU fallback; heights and colors reuse the 2D waterfall palette for exact parity
  • Waterfall Ref (max-level) — A Ref slider sets the top of the waterfall color scale (default 0 dBFS) so strong signals actually reach the top of the palette; gain headroom now runs to +60. Mirrored on the Lab spectrogram
  • Zoom FFT — Server-side NCO + decimation zoom providing high-resolution narrow-band views without increasing overall FFT size
  • AGC speed / IF gain / Filter presets — SDR receiver controls for AGC attack/decay speed, IF gain adjustment, and predefined filter bandwidth presets
  • Multi-SDR slots — Up to 8 devices simultaneously, each in its own slot with independent LO, FFT size, demod settings, and optional per-slot decoder. Slot selector appears in all clients when multiple devices are active. One slot at a time feeds the audio output.

Architecture

ExtIO-based SDR sources use a 32-bit broker subprocess (ShackLinkSdrHost.exe) that loads the plugin, captures IQ data into a shared memory-mapped ring buffer. The server (64-bit) reads the ring, runs a windowed complex FFT, and produces dB-scaled spectrum lines at 30 fps. HackRF, Hermes Lite 2, and Sound Card I/Q run in-process (no broker), feeding IQ samples directly into the same FFT pipeline. Lines fan out to: the embedded display, the popout window, TCP 8085 stream (desktop client), and WebSocket binary frames (web/mobile/HA clients).

IQ Recording (SigMF)

Record live SDR I/Q to SigMF (the open Signal Metadata Format): either a SigMF meta+data pair or a single .sigmf tar archive, for later analysis or replay. The archive writer transcodes between sample formats (ci16, ci32, cf64, cu16). Zoomed (NCO + decimated) recordings are captured correctly and in real time. The legacy .sliq writer has been retired, but old .sliq files still play back. A recording can be replayed one-shot, or mapped to a looping IQ File Playback Slot (see Source Types above).

Per-Slot Audio Input

Each SDR slot can carry its own audio input device (an “Audio In” column per slot row in the SDR Management dialog) instead of one global input, so switching between, say, a USB-rig slot and an SDR slot no longer grabs the wrong sound device. Leave it empty to inherit the global Audio-tab device; SDR slots default to the SDR demodulator. The setting follows the audio-active slot (the one you hear).

🔬 Lab Measurements (RF Workstation)

Professional multi-trace spectrum analysis built on up to 8 simultaneous SDR sources. Available on both the server and the desktop client.

Lab tab with 2D waterfall

Lab tab: multi-trace analyzer, Traces/Markers grid, and spectrogram

Lab tab with 3D spectrogram

3D spectrogram terrain

Lab with peak markers

Peak markers on the selected trace

Lab with Spectral CCDF

Spectral CCDF panel below the analyzer

Lab stitch segments editor

Stitch segments: the lane-strip editor composes a gap-free multi-band view

Lab stitch segments in popout

The same composed view in the independent Lab popout

Lab palette variation 1

Palette variation

Lab palette variation 2

Palette variation

Lab palette variation 3

Palette variation

Multi-Trace Overlay (8 Traces)

The Lab tab provides a SkiaSharp-rendered spectrum display with up to 8 independent traces, each bindable to a different SDR slot. Per-trace controls include:

  • Trace modes: ClearWrite (live), MaxHold (peak envelope), MinHold (noise floor), Average (configurable N), RMS
  • Math traces: A+B and A−B operations between any two traces for comparison and delta measurements
  • Per-trace gain offset (−60 to +60 dB) and noise floor (−160 to −20 dB) via slider columns in the Traces grid
  • Color customization: independent trace color and peak-hold color per trace, chosen via color picker

Zoom & Stitched Multi-Band View

The mouse wheel zooms at the cursor on both the analyzer and the waterfall (Ctrl+wheel = gain, Ctrl+Shift+wheel = floor), backed by a zoom history (Zoom Back via right-click or the mouse’s back button), a Zoom Out ×2 action, a log-scale toolbar Zoom slider, and draggable navigator edge grips. Stitch mode deletes the empty gaps between disjoint SDR bands and splices the covered ranges into one continuous axis: a 40 m slice directly beside a 20 m slice.

  • Stitch segments (kept ranges): each trace can contribute just a chosen slice of its span to the stitched view, so you compose exactly the multi-band picture you want (e.g. only the FT8 windows of three bands, side by side).
  • Segment lane editor: the Segments toolbar toggle opens one lane per visible SDR trace: a live mini-spectrum of the slot’s full span with the kept range as a draggable band (drag edges to resize, body to move, empty space to draw, double-click for full span). The plot re-stitches live while you drag.
  • Quick actions: or simply zoom into a slice and right-click → Stitch Segment ▸ Keep Current View.
  • Honest by design: segments are render-side only (markers, measurements, and exports still read the full trace at real frequencies), kept ranges survive retunes (they ghost while the slot is away and re-apply when it returns), and no LOs move, so it works on rig-tracking and IF-locked slots too.

Marker System (8 Markers)

Up to 8 simultaneous markers with real-time frequency and amplitude readout:

  • Normal: frequency and amplitude at the marker position
  • Delta: frequency and amplitude difference between two markers
  • Band Power: integrated power within a specified bandwidth
  • Noise: noise density in dBFS/Hz
  • Peak search / min search: jump to the highest or lowest point, navigate left/right between peaks
  • N-dB bandwidth: find the −3/6/10/20/40/60 dB bandwidth around the current marker

The spectrum right-click menu adds Place Marker Here (drop a marker at the clicked frequency) and Clear All Markers (remove every placed marker and clear the marker grid in one action).

Automated Measurements

An eight-row Measurements grid (a label tab beside Markers) computes a chosen measurement per trace on every sweep, with blank-for-auto parameters and live Result/Detail columns; a quick readout also appears in the toolbar. Available measurements:

Channel Power

Total power within a defined channel bandwidth.

OBW

Occupied bandwidth containing 99% of signal power.

ACPR

Adjacent channel power ratio for transmitter testing.

SNR

Signal-to-noise ratio measurement.

Harmonics / THD

Harmonic distortion analysis with individual harmonic levels.

IMD / IP3

Intermodulation distortion and third-order intercept point.

CFO

Carrier frequency offset vs a reference, in Hz and ppm.

Occupancy

Percent of a band above the noise floor, averaged over a time window.

Duty Cycle

Percent of time a channel is keyed (active) over a time window.

Envelope

Peak / current / floor at a frequency, held across sweeps.

Image Rejection

I/Q image-rejection ratio: a signal versus its mirror across the receiver’s DC, in dBc.

Noise-Floor Rise

Close-in noise floor near a strong carrier versus the far floor: a reciprocal-mixing proxy.

Spurious vs SM.329

Spurs reported as dBc below the carrier against a simplified ITU-R SM.329 mask, with a PASS/FAIL count.

Spectral Flatness

Spectral flatness (Wiener entropy) over a band, with passband ripple.

A Log to CSV toggle on the Measurements tab appends every enabled row to %LocalAppData%\ShackLink\Lab\measurements.csv about once per second for trend analysis. Readings are relative (dB/dBFS/dBc/%/Hz) by default.

Amplitude calibration (approximate dBm). There is no traceable power calibration, so the Lab is relative (dBFS) by default. You can assert an approximate reference per SDR slot: set the amplitude unit to dBm, then type a per-slot offset or use the Cal drop-down’s “Set from marker” helper (offset = known dBm − marker dBFS). Absolute readouts then show dBm*: the * marks it user-asserted, not traceable. Relative metrics are unaffected. Any gain change on the slot (MGC / LNA / AGC, conservatively IF gain) marks the calibration stale and reverts it to dBFS, so a stale offset never silently lies; the server also broadcasts a per-slot gain-change pulse so remote desktop clients invalidate their own calibration.

Display Modes

  • DPX persistence: temporal density display showing signal persistence over time. Color palettes (unified with the SDR tab): Classic (blue), Classic (green), CoolWarm, Viridis, Plasma, Inferno, Grayscale, Neon (cyan)
  • Spectrogram waterfall: time-frequency display with gain, contrast, floor, and speed controls. Synchronized frequency axis with the main spectrum. Toggles to a 3D perspective terrain view of the spectrogram history (GPU-accelerated, with a silent CPU fallback)
  • Spectral CCDF: complementary cumulative distribution of spectrum-bin amplitude vs the mean (frequency-domain spectral peak-to-mean, not time-domain PAPR / crest factor)
  • PSK constellation + EVM/MER: live I/Q scatter of recovered PSK31 symbols (2 points BPSK-31, 4 QPSK-31) with persistence, ideal-point overlay, lock indicator, and a true modulation-quality readout (Error Vector Magnitude %, Modulation Error Ratio dB). PSK31-only; honestly shows “—” when not locked. Computed server-side and streamed to the desktop client. A VSA summary adds peak EVM, a magnitude/phase-error split, residual carrier frequency error (after AFC), and I/Q offset, with a 60-second EVM trend
  • Audio SINAD: true signal-to-noise-and-distortion ratio of a steady tone in the demodulated audio of the active SDR slot (a CW/SSB beat-note, an AM/FM tone, or a test tone). Measured from the actual demod audio, not the spectrum; a ratio, so no calibration needed; honestly shows “—” with no tone. Computed server-side and broadcast to the desktop client

Instruments (Dedicated Measurement Windows)

An Instruments toolbar dropdown opens focused, single-purpose measurement windows — each a popout running alongside the analyzer, modeled on professional spectrum-analyzer application firmware. All but the Zero-Span Scope and the recorder also run on the desktop client.

Modulation Analyzer

AM depth / FM deviation (peak & RMS) / carrier offset / modulation rate of the slot you are hearing, on an analog needle face. Tapped from the demodulator, not the spectrum; AM/FM only; honest “—” with no carrier. (FSW-K7-style.)

Mask Trigger

Arm a limit mask over a trace; a violation fires a black-box pre/post I/Q capture to SigMF, a spectrum snapshot, and webhooks, with an event list and slot timeline. (Tek RSA FMT-style.) The client is a view-only console.

Zero-Span Scope (server)

An RF oscilloscope: envelope vs time of an IQ slot with scope triggering (Auto / Normal / Single / Free-run) and automatic burst measurements — rise/fall, width, period, duty, overshoot, on/off ratio.

Phase Noise

Carrier-tracked SSB phase noise L(f) dBc/Hz vs log offset: ENBW-correct, spur-excluded, window-skirt-masked, with a decade table (10 Hz–1 MHz), integrated jitter, and reference compare. (FSW-K40-style.)

Noise Figure

Guided Y-factor NF with a calibrated noise head: system NF (Mode A) or DUT NF + gain via Friis (Mode B), NF(f)/gain(f) curves, ENR head profiles, and gain-change voiding. (NFA / FSW-K30-style.)

Video Recording (server)

A ● Rec button records the Lab display (or the whole window) + system audio to MP4 in Videos\ShackLink, with selectable scope and 30/60 fps. Also on the SDR and Lab popout windows.

Lab Modulation Analyzer window

Modulation Analyzer: AM depth / FM deviation on an analog meter face, with the VSA table and trend

Lab Frequency Mask Trigger window

Mask Trigger: an armed limit mask with the event list and slot-lane timeline

Lab Zero-Span Scope window

Zero-Span Scope: RF envelope vs time with scope triggering and burst measurements

Lab Phase Noise window

Phase Noise: L(f) in dBc/Hz vs log offset with the decade table and jitter

Lab Noise Figure wizard window

Noise Figure: the guided Y-factor wizard with the NF(f) / gain curves and ENR head profiles

Advanced Tools

  • Transfer function (S21): two-SDR stimulus/response measurement with calibration and limit-mask overlays. Export as Touchstone S1P/S2P
  • Limit masks: regulatory and user-defined spectral masks for compliance visualization (spurious emission, harmonic suppression, bandpass)
  • C# scripting: Roslyn-powered scripting engine with a MeasurementApi providing programmatic access to traces, markers, and measurements. Editor in a separate popup window with example scripts
  • Cable loss compensation: predefined cable types and custom entry for length-based loss correction
  • Export: CSV (all traces with frequency/amplitude columns), Touchstone S1P/S2P, PNG screenshot, and measurement log

Tune From Spectrum

Enabled from the spectrum right-click menu (Tune From Spectrum), this turns the passive Lab display into an interactive listening surface that drives the SDR back-end:

  • Select a trace: click a trace to highlight it; audio-follow switches to that trace’s SDR slot, so you now hear that device.
  • Tune within the band: click again inside the selected trace’s band to move that slot’s demodulator (the listen point) to the clicked frequency.
  • No re-center: tuning moves the listen point only; the SDR LO is not re-centered, so the trace stays put instead of jumping (previously the LO auto-centered on the click, which shifted the whole trace by megahertz on wide / FM-band spans). You tune within the currently captured span; to listen outside it, use Band Browse to move the window.
  • Overlays: the selected trace can show a VFO frequency readout (Show Frequency) and a passband box (Show Passband).
  • Peak markers: mark the top-N peaks on the selected trace. The Peak Markers submenu configures count (3–10), color, size (2–8 px), style (filled circle / outline / square / diamond), and optional frequency labels.

Band Browse

Active while Tune From Spectrum is on, Band Browse shifts a slot’s SDR LO so you can sweep across the band:

  • Grab and drag a trace line horizontally, or click the plot then press Left/Right arrow keys, to shift that slot’s LO.
  • Held listen frequency: if the slot is the audio-active (listening) one, the absolute listen frequency is held by compensating the demod offset. Audio mutes when the held frequency leaves the captured span and resumes when a later shift brings it back into span.
  • Step size: with arrow keys, Shift = ×10 coarse step, Ctrl = fine step.
  • Refused for rig-tracking slots and IF-panadapter mode, with a brief on-display “Locked” notice.

Shift Station to Edge

Also part of Tune From Spectrum, Shift Station to Edge parks a slot’s tuned signal at the left or right edge of its span (the server computes the LO from the listen frequency and demod mode). Pair a Right shift on a lower trace with a Left shift on a higher trace to butt two bands together for a wide, gap-free side-by-side view.

Popout Independence (Link Toggle)

The Lab popout window carries a Link toggle. Linked, it mirrors the tab: mode, settings, and data stay in lock-step. Unlinked, the popout becomes fully independent, with its own zoom, amplitude scale, palette, 3D camera, and pane layout (all persisted separately), so you can keep a wide overview on the tab and a zoomed detail view in the popout at the same time.

No-Data Legend Status

A checked (visible) trace whose SDR source is not delivering data still appears in the spectrum legend, its name shown dimmed with a short status word (Not started, No data, or Unavailable) in place of a frequency range, so you can see the trace is selected but waiting on its device.

Desktop Client Support

The full Lab tab is available on the desktop client with identical functionality. All UI code is shared via <Compile Include> links. The client’s SdrStreamPlayer feeds the same TraceEngine with SDL1 frames from the server’s spectrum stream (TCP 8085). Persistence, popout, scripting, transfer function, and export all work identically on both server and client.

Architecture

The Lab tab is a passive overlay on existing SDR spectrum data by default. When Tune From Spectrum is enabled it can select the audio slot (which device you hear), tune a slot’s demodulator listen point, and (for Band Browse) shift a slot’s LO; it still never alters the SDR capture pipeline or FFT. The desktop client uses dedicated commands for these actions (SDR:<n>:DEMODTUNE:<absHz> / SDR:<n>:LOSHIFT:<Hz> over TCP, sdrDemodTune / sdrLoShift over WebSocket); the server’s own SDR-tab panadapter click still re-centers as before, so only the Lab tune is no-re-center. The engine library (ShackLinkLab, netstandard2.0) provides TraceEngine, MarkerEngine, MeasurementEngine, PersistenceEngine, TransferFunctionEngine, LimitMaskEngine, CcdfEngine, and ScriptHost. UI rendering uses SkiaSharp with double-buffered offscreen compositing and GDI+ blit. Total CPU budget at full load (8 traces, 8 markers, persistence, spectrogram): ~15–20 ms per 33 ms frame.

📊 Audio Visualization

Real-time audio visualization with multiple display modes and customizable themes.

Audio tab 2D waterfall

Waterfall (2D) on the Audio tab

Audio tab 3D waterfall

Waterfall (3D terrain)

Audio tab oscilloscope

Oscilloscope: time-domain waveform

Visualization popout 2D

Visualization popout: 2D waterfall in its own window

Visualization popout 3D

Visualization popout: 3D terrain waterfall on a second monitor

Opening the Visualization Window

Click the Visualization button in the Audio Streaming section to open a modeless visualization window. The window stays open while you work with other controls.

Visualization Modes

🌊 Waterfall

Scrolling spectrogram display showing frequency over time. New data appears at top and scrolls down. Includes a smooth spectrum curve overlay. Great for identifying signals and monitoring band activity.

📈 Spectrum (Bars)

Classic bar-style spectrum analyzer with peak hold indicators. Shows real-time frequency amplitude across the audio passband. Peaks slowly decay to show recent maximum levels.

💡 Spectrum (LEDs)

Retro LED-style segmented display reminiscent of vintage audio equipment. 32 segments per bar with configurable peak indicators. Adjustable peak height from 1-10 pixels.

💨 Oscilloscope

Time-domain waveform display showing the raw audio signal. Useful for monitoring signal levels and identifying modulation patterns.

Color Themes

  • Classic – Traditional green VU-meter style (green/yellow/red gradient)
  • Neon – Vibrant cyan/magenta cyberpunk aesthetic
  • Grayscale – Clean black and white display
  • Ham Radio – Blue waterfall with green spectrum, optimized for radio use (default for Waterfall mode)
  • Semaphore – Traffic-light style: green at low levels, yellow at mid, red near the top
  • Rainbow – Bars colored by frequency position across the spectrum (left to right)

Display Settings

  • Sensitivity – Adjust input gain for optimal display levels
  • Contrast – Control the dynamic range of the visualization
  • Freq Range – Set the maximum displayed frequency
  • Peak Color – Choose peak indicator color (theme-based options)
  • Peak Height – Set peak indicator height (1-10 pixels)
  • Reverse – Flip waterfall scroll direction (new data at bottom)

💡 Settings Persistence

All visualization settings are automatically saved and restored between sessions. The window also remembers its position and size.

🔢 Digital Decoders

The server includes built-in decoders for eight digital modes: CW (Morse), RTTY, PSK31, FT8/FT4 (relayed from WSJT-X), SSTV, WEFAX, NAVTEX, and APRS. Select the decoder mode from the dropdown to switch between them: the choice is broadcast to every connected client.

Decoder tab decoding CW

CW (Morse): signal scope, element display, and decoded text

Decoder tab decoding SSTV

SSTV: image on the left, live audio-band waterfall on the right

Decoded image in the dashboard panel

A decoded image mirrored in the dashboard panel

Decoder popout decoding CW

Decoder popout: CW in its own window

Decoder popout with image and waterfall

Expand to Window: the detachable full-size decoder with image + waterfall

Morse (CW) Decoder

  1. Select CW (Morse) from the decoder mode dropdown
  2. Enable the decoder checkbox
  3. Choose decoder algorithm: Speed Priority or Accuracy Priority
  4. Decoded text appears in the display and streams to clients

RTTY Decoder

  1. Select RTTY from the decoder mode dropdown
  2. Enable the decoder checkbox
  3. The decoder auto-detects baud rate (45.45 or 50 baud) and shift (170/425/850 Hz)
  4. Monitor signal quality and lock status indicators
  5. Decoded text appears in the display and streams to clients

PSK31 Decoder

  1. Select PSK31 from the decoder mode dropdown
  2. Pick a modulation mode (9 variants):
    • BPSK-31 / BPSK-63 / BPSK-125: binary PSK at 31.25, 62.5, or 125 baud
    • QPSK-L-31/63/125: quadrature PSK with Viterbi FEC, lower sideband
    • QPSK-U-31/63/125: quadrature PSK with Viterbi FEC, upper sideband
  3. Set the center frequency (200–3000 Hz) to match the signal in the audio passband
  4. Enable AFC to automatically track frequency drift
  5. Enable FEC for Viterbi forward error correction on QPSK modes
  6. Adjust squelch to filter noise when no signal is present
  7. Decoded text appears in the display and streams to clients

SSTV Decoder

Receives Slow Scan Television images on voice modes (typically USB). The SSTV panel embeds a split view directly in the Decoder tab: decoded image on the left, live waterfall of the SSTV audio band (1200–2300 Hz) on the right, with a draggable splitter between the two so you can rebalance their sizes. A thin status strip at the bottom shows detected mode, current line, and progress.

  1. Select SSTV from the decoder mode dropdown
  2. Tune to a known SSTV frequency (e.g., 14.230 MHz USB on 20 m)
  3. The decoder auto-detects the mode from the VIS header and renders the image line-by-line alongside the waterfall
  4. For weak signals where VIS detection fails, pick a Forced Mode (e.g., Robot36). Choose AUTO to return to detection.
  5. Right-click the image for Save / Clear / “Expand to Window” (the last opens a detachable full-size decoder window with the same layout).
  6. Clients that connect mid-decode receive a catch-up stream so their display syncs with the server.

Supported modes (19 total): Robot 36 / 72 / 8BW / 24BW, Martin M1 / M2, Scottie S1 / S2 / DX, PD 90 / 120 / 160 / 180 / 240 / 290, Wraase SC2-120 / SC2-180, Pasokon P3 / P5 / P7.

FT8 / FT4 (via WSJT-X)

The server does not decode FT8/FT4 directly. It listens on UDP port 2237 for decode messages from an WSJT-X instance running on the same machine, and forwards each decode to connected clients.

  1. Run WSJT-X configured for your radio as usual
  2. In WSJT-X: File → Settings → Reporting → enable UDP Server on port 2237
  3. On the server, select FT8/FT4 from the decoder dropdown
  4. Decodes (time, SNR, DT, Δf, message) appear in the list and are broadcast to clients with SNR-based color coding

WEFAX Decoder (Weather Facsimile)

Receives grayscale weather charts on HF marine bands. The WEFAX panel uses the same split layout as SSTV: image on the left, live waterfall of the WEFAX audio band on the right, draggable splitter, status strip showing line / progress at the bottom. Slant / shift sliders correct any residual alignment drift.

  1. Select WEFAX from the decoder dropdown
  2. Tune to a known WEFAX broadcast (e.g. NOAA: 4346 / 8503.9 / 12789.9 kHz USB; DWD Hamburg: 3855 / 7880 / 13882.5 kHz USB)
  3. The decoder runs a phasing-lock detector first: looks for the white phasing pulse pattern that precedes the image and aligns the line phase from it. Mid-stream joins fall back to the legacy fold/cluster sync path automatically.
  4. Use the slant / shift sliders on noisy captures with broadcaster clock drift
  5. Save / Clear / Expand to Window via the toolbar or right-click on the image

NAVTEX Decoder (Maritime Safety)

Receives NAVTEX maritime safety broadcasts on 490 / 518 / 4209.5 kHz. The decoder implements the SITOR-B forward error correction protocol (CCIR 476, 100 baud, 170 Hz shift).

  1. Select NAVTEX from the decoder dropdown
  2. Tune to a NAVTEX broadcast frequency (e.g. 518 kHz for international English, 490 kHz for national language)
  3. Decoded characters appear in the text display and stream to all connected clients

APRS Decoder (Packet Radio)

Decodes AX.25 1200 baud Bell 202 AFSK packets. Displays callsign, position, and message data from APRS beacons.

  1. Select APRS from the decoder dropdown
  2. Tune to 144.390 MHz (North America) or 144.800 MHz (Europe/most regions) on FM
  3. Decoded packets appear as one-line summaries showing source callsign, position coordinates, and beacon text

Image TX (SSTV + WEFAX)

The TX tab supports sending images directly from the server (or any client). When you switch the TX-mode picker to SSTV or WEFAX, the chat panel swaps in an ImageTxPanel:

  1. Pick mode (SSTV: 18 sub-modes; WEFAX: IOC 576/288, LPM 60/120)
  2. Choose Image: the panel resamples and shows a preview
  3. Click Send: the encoder runs, PTT keys via OmniRig, the live build-up appears in the preview as the encoder transmits
  4. Test (no RF) mode: encoder runs but PTT stays low, for offline rehearsal. A WAV is saved next to the source image automatically.
  5. Non-transmitting clients see TX:STATUS and TX:PROGRESS so they can follow the line counter

From a remote client (web / mobile), the image is uploaded chunked over the WebSocket binary channel 0x04, SHA-256 verified, then staged server-side (per-client cap of 4, 10-min idle GC, 5 MB max). After staging, TX:KEY:SSTV:<imageId>:<mode> or TX:KEY:WEFAX:<imageId>:<ioc>:<lpm> kicks off the encoder.

💡 Why Server-Side Decoding?

Server-side decoding is more accurate than client-side because it processes the original audio without network jitter artifacts. CW works reliably at speeds up to 40+ WPM, RTTY auto-detects standard amateur radio parameters, PSK31 tracks drifting signals with AFC, and SSTV catches every image in full resolution.

Saving Decoded Text

Click the Save… button to save decoded text to a file. The default filename includes the decoder mode (cw/rtty/psk31) and timestamp. SSTV images can be saved via the Save button above the split, by right-clicking the image, or from the detached “Expand to Window” view.

📍 Band Plan (Frequency Table)

Built-in searchable reference of amateur allocations and common operating frequencies.

Band Plan tab

Band Plan embedded in the tab area

Band Plan popout

Popped out to its own window alongside the main UI

Click Freq. Table in the Audio Streaming panel to open the Band Plan window. It stays open alongside the main UI so you can hop around the band quickly.

Using the Band Plan

  • Filter by band category (HF, VHF, UHF) and by mode with the quick-filter buttons
  • Search by frequency, band name, or description
  • Select a row and click Tune (or double-click) to set the radio to that frequency and mode
  • The current row auto-highlights as the radio frequency changes
  • Calling frequencies are visually distinguished

🛠 Tools & Dashboards

Additional server-side tools accessible from the Tools tab.

Tools tab

The Tools tab: dashboard launchers, integration settings, Security, Colors, and the tooltips toggle

Custom Colors

Click the Colors button on the Tools tab to open a color customization dialog. Personalize the frequency display, meters, background, accent colors, and other UI elements. Changes are saved and restored between sessions. Beyond individual accents, several complete color themes re-tint the whole window in one click from the Colors dialog or the title-bar Theme menu.

Color Settings dialog

Color Settings: 19 accent colors in five groups, previewed live

Neon theme

Neon theme

Green theme

Green theme

Plasma theme

Plasma theme

Theme Submenu (Title Bar)

A Theme submenu is added to the window’s title-bar system menu on both the server and the desktop client, so you can pick a color theme straight from the system menu without opening the full Colors dialog.

Photo Panel (7 Right-Click Modes)

The panel beside the callsign strip is no longer a static photo. Right-click it to cycle through seven modes: Photo (the operator’s picture), Audio Visualization (live spectrum / waterfall / scope), Knob (a Freq-Knob rotary VFO dial), Propagation (live solar data), Signal Alerts (the threshold monitor), Decoder (a display-only mirror of the current decoder’s output), and Greyline (a day/night terminator map). The selected mode is saved between sessions. The desktop client shares the panel and the Knob mode.

Dashboard panel in Audio Visualization mode

Audio Visualization mode

Dashboard panel in Knob mode

Knob mode: rotary VFO dial with monitor knobs

Dashboard panel in Propagation mode

Propagation mode: live solar data

Dashboard panel in Decoder mode

Decoder mode: mirror of the active decoder

Dashboard panel in Greyline mode

Greyline mode: day/night terminator map (the Photo mode default is shown at the top of this page)

Tooltips Toggle

Toggle Show Tooltips on the Tools tab to enable or disable hover tooltips across all controls. Useful for learning the UI, then turning them off once familiar. Main form uses ApplyTooltips(); separate dialogs have their own ToolTip instances with dark-themed custom draw.

Broadcast Guide

A searchable station database covering shortwave broadcasts (EiBi + HFCC), local FM and AM stations (FCC, filtered by operator location), and NOAA weather channels. Quick-select band buttons span LW through 11 m plus FM and WX. Filter by frequency range, country, language, source, or station name. The On Now toggle shows only stations currently broadcasting based on UTC schedule. Track VFO auto-filters to the rig’s current frequency. Double-click any row to tune the radio (sets both frequency and mode). All filter settings persist between sessions. Available on both server and desktop client.

Broadcast Guide window

Broadcast Guide: shortwave / FM / AM / NOAA station database with band buttons, On Now filtering, and click-to-tune

Dashboards & Popouts

The Tools tab also launches a set of standalone operations dashboards, each in its own window for multi-monitor use:

  • Propagation: live solar data from hamqsl.com (solar flux, A/K indices, band conditions).
  • Greyline Map: day/night terminator showing where HF propagation peaks.
  • Band Activity: aggregated DX-cluster and FT8 activity across the bands.
  • Signal Alerts: frequency / threshold / duration rules that fire Discord and Telegram webhooks or auto-record.
  • Logbook (ADIF): built-in ADIF logbook viewer with search, sort, and DXCC country enrichment.
  • Spectrum Snapshots: a gallery of captured waterfall snapshots.
Greyline map

Greyline Map: day/night terminator with operator location

Greyline map, later moment

A later moment as the terminator sweeps across

Callsign Strip & UTC Clock

The callsign strip shows the operator callsign next to an NTP-synced UTC clock (shared by server and desktop client), with configurable layout, font, and colors. The same NTP-synced UTC clock also appears in the server and client window titles.

Rotary Frequency Knob & Memories

The frequency-entry popup is resizeable and includes a Freq-Knob rotary dial: an endless VFO knob with per-digit stepping and flywheel spin, the same shared SkiaSharp knob library that powers the photo panel’s Knob mode. Twenty-four memory presets (two pages of twelve) store frequency, mode, and a label, and open in an All Memories list for quick recall.

Frequency entry popup

Frequency entry: keypad plus the rotary Freq-Knob for per-digit tuning

All Memories list

All Memories: browse and recall any of the 24 slots

Waterfall Painter (Spectrum Art)

The Waterfall Painter rasterizes text, an image, vector primitives, or an animation into audio tones across an SSB passband, so each tone lights one pixel column on a receiver’s waterfall: “waterfall art” drawn straight into the spectrum. Rehearse silently by painting into the Test Tone synth slot (every client sees it on the SDR stream), then transmit one-shot on air through the TX engine. It is SSB-only by physics: the sideband auto-follows the rig and there is deliberately no AM/FM (FM would smear the art).

Waterfall Painter window

The Waterfall Painter window: source, gamma, and passband controls

Waterfall Painter rendering text

Rasterizing text into the passband

Painted art received on 2D waterfall

The art as received on the 2D waterfall

Painted art received on 3D waterfall

The same received art on the 3D terrain waterfall

Painted art received on 3D waterfall, another angle

Another camera angle on the received 3D art

🔄 Device Sync (Sync Tab)

Link rigs and SDR slots together so frequency and/or mode changes on one push through to another.

Sync tab device graph

The Sync tab: four rig tiles and eight SDR slot tiles wired with rule arrows (amber dashed = automatic Track Rig)

The Sync tab lets you wire up rules between equivalent devices: OmniRig’s four rigs and the eight SDR slots (rig→rig, rig→slot, slot→rig, slot→slot). Useful for transverters (source on IF frequency, target on RF with a fixed offset), dual-radio diversity setups, a monitoring receiver or panadapter that should always track the main rig, or making one SDR’s Lab trace follow another. For rigs a rule reads/writes VFO-A; for SDR slots it reads/writes the slot’s LO / center frequency (in-span demod retunes don’t fire rules).

Creating a Rule

  1. Open the Sync tab: you’ll see four rig tiles (Rig 1 – Rig 4) and eight SDR slot tiles (S0 – S7, empty slots dimmed)
  2. Drag between any two tiles. An arrow appears representing the rule.
  3. Click the arrow to select it. The rule’s properties appear on the right.
  4. Build chains by adding more rules (Rig 1 → Rig 2 → Slot 3): a change at the head applies to every hop in one pass. Bidirectional pairs and accidental cycles are safe: each device is written at most once per change.

Per-Rule Properties

  • Offset: Frequency offset (MHz) added to the source before writing to the target. Can be negative. Typical use: transverter IF offset.
  • Invert Sideband: USB↔LSB, CW-U↔CW-L, DIG-U↔DIG-L. Applied when Sync Mode is on.
  • Sync Frequency: Copy source frequency (+ Offset) to target (rig VFO or slot LO).
  • Sync Mode: Copy source mode (optionally inverted) to target. Rig→slot maps onto the slot demodulator; slot→rig maps the demod mode back.
  • Enabled: Per-rule on/off, disables without deleting.

Automatic Rules

SDR slots with Track Rig on show an amber dashed AUTO arrow from the currently selected rig, the rig-tracking mechanism made visible. Auto rules are read-only; deleting one turns Track Rig off for that slot. Slot tiles carry AUD (audio-active), TRK (Track Rig) and IF (IF-mode panadapter, LO pinned) badges.

Global Enable + Logic

The Enable Sync toggle at the top right is a master kill switch for the whole engine. For a change on the source device to propagate to target, three conditions must all be true:

  1. Global Enable Sync = on
  2. Per-rule Enabled = on
  3. At least one of Sync Frequency / Sync Mode = on

The engine separates genuine changes from its own echoes by value (a device reporting back the value just written to it is ignored), rate-limits each rule to ~3 writes/s, and cuts rule cycles deterministically (each device written at most once per change). Rules targeting a rig-tracking or IF-locked slot are skipped (those mechanisms own that slot’s LO); a tracked slot’s machinery moves don’t fire its outgoing rules. Manual moves do. All rule data (offsets, toggles, enabled states, global enable) is saved automatically on every change and restored on the next run.

📋 System Requirements

What you need to run ShackLink Server and clients.

🖥 Server Computer

  • ✓ Windows 7/8/10/11
  • ✓ .NET Framework 4.7.2+
  • ✓ OmniRig v2.0 or later installed (hb9ryz.ch/omnirig)
  • ✓ Sound card (for audio)
  • ✓ Network connection

💻 Desktop Client

  • ✓ Windows 7/8/10/11
  • ✓ .NET Framework 4.7.2+
  • ✓ Network to server
  • ✓ Audio output device

🌐 Web Client

  • ✓ Chrome 66+ / Firefox 76+
  • ✓ Safari 14.1+ / Edge 79+
  • ✓ Network to server
  • ✓ Any OS supported

🏠 Home Assistant

  • ✓ HA 2021.12 or newer
  • ✓ Network to port 8084
  • ✓ Lovelace dashboard

📱 Cross-Platform App

  • ✓ Windows 10+, iOS 14+, Android 8+
  • ✓ Network to port 8080
  • ✓ WiFi recommended

📻 Radio Equipment

  • ✓ OmniRig-supported radio
  • ✓ CAT interface
  • ✓ Audio cables (optional)

🔧 Troubleshooting

OmniRig Won’t Connect

  • Check if OmniRig is running and configured properly
  • Verify COM port settings match your radio
  • Restart OmniRig and the server application

Clients Cannot Connect

  • Verify the server is running and accessible
  • Check firewall allows ports 8080, 8081, 8082, 8084, 8085 (and UDP 8081 for service discovery) — Tools → Configure Firewall does this for you
  • Ensure client has correct server IP address
  • Try pinging the server IP from the client machine

No Audio

  • Select correct audio input device on server
  • Check sound card levels in Windows Mixer
  • Verify audio cables are connected
  • Ensure audio streaming is started on server
  • Check client volume is not muted

Digital Decoder Not Working

  • Enable the decoder checkbox on server
  • For CW: Adjust decoder mode (Speed/Accuracy) based on signal conditions
  • For RTTY: Ensure the signal uses standard amateur radio parameters (45.45/50 baud, 170/425/850 Hz shift)
  • Ensure audio streaming is active
  • Check audio levels (too quiet or too loud affects decoding)
  • Monitor the signal scope and quality indicators