v1.0 Β· Now Available

Your SunSDR2 DX
in Your Pocket

Native iOS SwiftUI app for remote control of the SunSDR2 DX transceiver. Real-time spectrum waterfall, low-latency audio, DSP noise reduction, one-touch PTT β€” a complete replacement for the web frontend.

GitHub Explore Features Join WeChat Group

Join the Conversation

Scan the QR code with WeChat to join the MRRC-HAM group.

WeChat QR code for MRRC-HAM group

QR code valid until Aug 29, 2026. Will be updated when refreshed.

Complete Transceiver Control

From spectrum waterfall to DSP noise reduction, channel presets to PTT β€” every feature is thoughtfully designed and optimized for iPhone touch interaction.

Real-Time Spectrum Waterfall

512-bin FFT real-time spectrum with web-matching colour ramp. Adaptive noise floor with configurable gain/bias contrast stretching.

  • Dynamic frequency scale (39k/78k/156k/312k IQ bandwidth)
  • Tap-to-tune on waterfall
  • 5-frame accumulation + 10fps throttle, zero main-thread overhead

Low-Latency Audio

RX: Int16 PCM 48kHz playback via AVAudioPlayerNode. TX: Microphone capture → downsample (48k→16k) → Int16 PCM → WebSocket.

  • RX 48kHz high-fidelity audio playback
  • TX 16kHz mono capture
  • Real-time RMS level meter
  • One-tap mute

Frequency & Mode Control

Large 56pt monospaced frequency display, step tuning, 12 amateur band presets, six modes: USB/LSB/CW/AM/FM/WFM.

  • 56pt digit frequency display, tap-to-enter in kHz
  • 5 step sizes: 1K/5K/10K/50K/100K
  • 12 band presets from 160m to 2m
  • CW/SSB/Wide/AM/FM filter presets

DSP Noise Reduction Panel

Complete WDSP digital signal processing control: NR2 noise reduction, NB noise blanker, ANF automatic notch filter, AGC automatic gain control.

  • NR2 noise reduction + level control + meter
  • NB / ANF / NF independent toggles
  • AGC: Off / Slow / Medium / Fast
  • Manual notch list (add/delete)

Channel Memory

3Γ—3 grid of frequency presets, always visible. Tap any cell to instantly tune frequency + mode. Empty slots show placeholder, ready for quick-save.

  • 9 channel slots in 3Γ—3 grid layout
  • Persisted via UserDefaults JSON
  • Swipe-to-delete, quick-save
  • One-tap frequency + mode tuning

System Settings

Server host configuration, IQ sample rate selector (39k/78k/156k/312k), Keychain auto-login, connection status diagnostics.

  • 4 IQ sample rate options
  • Keychain secure credential storage
  • 4 WebSocket connection status indicators
  • Favorites management with swipe-delete

Precision Engineering

4 WebSocket connections, zero external dependencies, built entirely on Apple frameworks.

SunsdrMobile iOS App SwiftUI Β· Combine AVAudioEngine sunmrrc Server FastAPI / Python radio.vlsc.net:8889 192.168.16.100 SunSDR2 DX 192.168.16.200 Port 50001/50002 HTTPS / WSS 4 WebSocket links UDP /WSCTRX Bidirectional Β· cmd:val /WSaudioRX ↓ Binary Β· PCM/Opus /WSaudioTX ↑ Binary Β· PCM /WSspectrum ↓ Binary Β· 512 uint8
Bidirectional Text
/WSCTRX
Bidirectional
cmd:val protocol β€” freq, mode, PTT, DSP
Downstream Binary
/WSaudioRX
Server β†’ Client
1B codec tag + Int16 PCM / Opus
Upstream Binary
/WSaudioTX
Client β†’ Server
Int16 PCM 16kHz mono
Downstream Binary
/WSspectrum
Server β†’ Client
512 Γ— uint8 dB (0=-120dB, 255=0dB)

Designed for iPhone Touch

Every pixel carefully laid out β€” the optimal balance of information density and ease of operation.

☰ CTRL RX TX FFT USB S7 23ms ⏻ β—€ 14.074.000 β–Ά 20m β–Ό 1K β–Ό S-meter S7 -30k -20k -10k 14.074 +10k +20k +30k πŸ”Š 45 AF RF SQL β—€ USB β–Ά β—€ SSB β–Ά 20m 14.074 40m 7.074 --- --.--- --- --.--- 10m 28.074 --- --.--- --- --.--- --- --.--- --- --.--- TX HeaderView 56pt Display WaterfallView 3Γ—3 Grid 96pt PTT

Main RX Screen

Spectrum waterfall + S-meter + audio level + gain sliders + mode selection + favorites grid + PTT

SMeterViewWaterfallView ModeSelectorFavoritesGrid PTTButtonGainSlider

DSP Panel

WDSP master toggle, NR2 noise reduction (with level meter and intensity slider), NB/ANF/NF toggles, AGC mode selection, manual notch management

NotchChartViewNR2 Card AGC ButtonGroupNotch List

Settings

Quick-save, favorites management (swipe-delete), server config + reconnect, connection status diagnostics, IQ sample rate selector

Quick SaveFavorites List Server ConfigStatusLine

Zero Main-Thread Burden

All heavy computation runs on background threads, ensuring smooth 60fps scrolling.

50%
Frame Skip Rate
Halves dispatch overhead
5Γ—
Frame Accumulation
Reduces waterfall processing frequency
10fps
Waterfall Frame Cap
UIImage update throttling
200KB
Waterfall VRAM
512Γ—100Γ—4 pixel buffer
4
Concurrent WebSockets
URLSessionWebSocketTask
0
Third-Party Dependencies
Pure Apple frameworks

Tech Stack

Swift 5.9 SwiftUI Combine AVFoundation AVAudioEngine URLSessionWebSocketTask CGImage / UIKit Keychain UserDefaults XcodeGen iOS 17+

Up and Running in 5 Minutes

Clone, generate the Xcode project, build, connect β€” just four steps.

Clone the Repository

Get the latest code from GitHub

git clone https://github.com/cheenle/SunsdrMobile.git

Generate Xcode Project

Use XcodeGen to generate .xcodeproj from project.yml

cd SunsdrMobile && xcodegen generate

Build & Run

Open the project in Xcode, select your iPhone, and press Cmd+R

open SunsdrMobile.xcodeproj

Connect to Your Radio

Enter your server address and password β€” auto-login via Keychain establishes all 4 WebSocket connections

radio.vlsc.net:8889 β†’ Keychain
View on GitHub

Runtime Environment

iOS 17.0+ Xcode 15.0+ Swift 5.9 Physical iPhone sunmrrc v3.4+ Self-Signed TLS Cert

The simulator lacks full AVAudioEngine microphone support β€” a physical iPhone device is required

Division of Work and Contracts Left Behind

What this project loads before editing, what a human still signs off, and what stays readable afterwards.

01 Β· Loaded before editing
CLAUDE.md Loaded, No Registry
Workspace CLAUDE.md is loaded before editing. This project has no machine-readable constraint registry, so the Agent works to the written contract only and no automated gate is claimed.
02 Β· Human sign-off
App Store Release and Real-Device Audio
App Store submission and every audio-path judgement on a real handset stay with a human. Simulator output is never presented as on-air evidence.
03 Β· Contract left behind
Client Capability Boundary
The description of what this client may and may not do remains as the contract between the app and the radio.