Wifi Rig CTRL
Remote rig control over Wi‑Fi
Free · Designed for iPad. Not verified for macOS.
WifiRigCTRL is an iPhone / iPad app for remotely operating your amateur-radio transceiver via a Raspberry Pi or ICOM CI-V (Wi-Fi / Bluetooth).
Features:
- Real-time RX frequency, mode and S-meter display
- Change frequency, mode, power, squelch and filter width
- RX audio playback through the speaker (with noise reduction)
- PTT on/off and microphone transmit
- CW Morse send and receive-decode (BLE / USB-NCM keyers)
- RTTY AFSK transmit/receive (on-device software modem or via the Raspberry Pi's minimodem, with spectrum display)
- FT8 / FT4 receive-decode and transmit
- Automatic FT8 all-decode log to ~/ALL.TXT (WSJT-X compatible)
- Band Scope (CAT single-sweep / native ICOM CI-V scope, with POTA/SOTA spots overlaid)
- APRS beacon transmit (GPS)
- QSO log (ADIF export, POTA/SOTA references)
- Operating-location (JCC/JGC, grid) registration and operating sessions
- eQSL auto-upload, Smart Ham Log integration, PSKReporter spotting
- Band memory, POTA/SOTA spot integration (SP2ALART)
- Multiple profiles, API-key auth, WireGuard VPN
- Direct Wi-Fi / Bluetooth CI-V to Icom IC-705 / IC-9700
- One-tap Raspberry Pi SSH setup
■ Requirements (Important)
This app does not work on its own. You need one of the following, owned by you:
A Raspberry Pi Zero 2W that is already set up (connected to your radio, with Hamlib/FastAPI installed), or
An IC-705 or IC-9700 (for a direct CI-V connection)
Connect either one to the same Wi-Fi network as your iPhone.
Setup instructions and firmware for the Raspberry Pi are available on GitHub:
https://github.com/ji1ore/M5CoreHamCAT
■ Intended Users
This app is for licensed amateur radio operators who have a compatible radio setup.
*This app contains no ads and no usage tracking. All data it collects is used only on your device and is never sent to an external server.
more - Added a Day/Night display theme — long-press the theme-color button to switch
- Unified the theme palette (OCEAN / AMBER / MONO / AQUA) across every screen, tuned for day and night
- Improved CI-V direct operation
- Tuned the RX-audio lowpass to 3400 Hz to suppress full-duplex howling
- Note: this version bumps the Pi API to v3.27 — run Admin -> Update Pi (a version-mismatch notice is shown until the Pi is updated)
3.27 1 day ago
- Added a MEM SET button to the Band Scope so you can open memories (Preset / User / POTA / SOTA) directly
- FT8: QSOs with non-standard / compound callsigns (e.g. JF1AWC/1) now work. Hashed-callsign Type 4 messages (angle brackets) are matched correctly, replying RR73 on RRR so the QSO completes reliably
- Fixed RTTY transmit being cut short: the playback device is now released during TX, and leftover processes are cleaned up
- Note: this version bumps the Pi API to v3.26 — run Admin -> Update Pi (a version-mismatch notice is shown until the Pi is updated)
3.26 2 days ago
- New Band Scope: one-shot CAT sweep (works on any rig via the Pi) plus a native ICOM CI-V scope, with POTA/SOTA spots overlaid
- The SOTA tab in MEM SET is back; the spot valid-time is now adjustable on the RIG CONNECT screen
- CW TX: a GL button that appends "/grid" to the RST report (long-press to edit your grid), an S-meter with ticks, an SPK button, and picking a CW memory now fills the DX callsign
- Receive audio (SPK) is about 2x louder, with lower latency and better recovery after keying
- Fixed the mode-change frequency shift on FT-991A-class rigs (display frequency is kept across RTTY and memory recall; the Pi re-asserts and verifies the VFO after the mode command)
- The operating-location 6-digit grid auto-fills the FT8 grid and the log's My GL; SOTA chaser CSV now supports S2S
- Note: this version bumps the Pi API to v3.25 — run Admin -> Update Pi (a version-mismatch notice is shown until the Pi is updated)
3.25 3 days ago
- Fixed the ! mark (rig link lost) indicator briefly appearing right after connecting (while rigctld restarts on connect, the link is treated as OK until the first reply from the rig; fixed in the Pi api.py)
- The SOTA tab in MEM SET (the memory/spot panel) is temporarily hidden (SOTA logging, ADIF and the SOTA operating-location still work)
- Fixed the FTX-1 built-in APRS modem bug: after starting APRS, switching AP96 -> AP12 turned the rig's BEACON TYPE OFF so APRS stopped transmitting (fixed in the Pi api.py — set commands are now sent in order using a no-reply form, eliminating the ~2 s rigctld stalls and the auto-restart that lost settings)
- FTX-1 Main/Sub and ATU, and FT-991 BK-IN and ATU, now use the same method, fixing CAT stalls and command reordering
- FT8: CQ auto-QSO now replies to the earliest caller when several stations answer at once; TX audio frequency is remembered per rig and per band
- RTTY: wider manual tuning range, user-adjustable AUTO follow offset, and a tuning hint toward 2125 Hz
- Note: this version bumps the Pi API to v3.24 — run Admin -> Update Pi (a version-mismatch notice is shown until the Pi is updated)
3.24 18 Oct
[New: RTTY over Raspberry Pi (minimodem)]
- For Raspberry Pi connections, RTTY send/receive now runs through the Pi's minimodem: text is AFSK (Baudot) modulated on the Pi with automatic PTT, and received RTTY audio is streamed back to the app
- This complements the existing on-device software RTTY modem (used for CI-V direct connections)
[Improved]
- Faster TX-to-RX switchover after transmitting (send-completion detection sped up, so receive resumes sooner)
[Pi update required]
- Pi API bumped to v3.23 — run Admin → Update Pi (a version-mismatch warning shows until the Pi is updated; the update also installs minimodem on the Pi)
3.23 17 Oct
- Unified CI-V local FT8/FT4 decoding on mfsk-core (the Pi's high-accuracy engine) and made it much faster — reliably finishes within the slot, better weak-signal decoding
- Fixed your own transmitted FT8 message so it auto-scrolls into view at the bottom
- Fixed the frequency reverting after entering the FT8 screen when set from MEMSET or a spot
- Stabilized hand-off of frequency / mode / callsign / worked park from SP2ALART and spots
- Note: improved mode-set reliability requires updating the Pi (Admin -> Update Pi)
3.22 16 Oct
[RTTY receive rebuilt]
- Receive demodulator redesigned as a continuous quadrature matched filter with sub-sample timing recovery — more robust decoding against noise, off-nominal baud rates and fractional sample rates
- RTTY spectrum now zooms to the mark/space band so the signal fills the full screen width
[Operating-location management]
- Register JCC/JGC and Maidenhead grid via GPS or map
- POTA (green) / SOTA (red) pins on the current-location map (inactive POTA parks hidden)
- Operating sessions with UTC/local start and end times
- Operating-location selector bar on the FT8 / RTTY / CW transmit screens, so each logged QSO inherits the location
[QSO log additions]
- New fields: QSL method (JARL/hQSL/No/Card/1-Way), worked-station GL/QTH, My GL, operating place (MY_CITY)
- UTC/local time toggle on the entry form
- Cancel/Save moved to the dialog header (keyboard-safe)
[External integration]
- Automatic eQSL upload per My-Call account (comment maps to eQSL Remarks)
- Smart Ham Log (Cloudlog-compatible bridge) QSO upload with connection test
- PSKReporter reception-report sending toggle (FT8)
- QSO LIST shows eQSL/SHL sent status, with bulk send and per-park/summit bulk ADIF export
[Connect screen]
- My Call history dropdown added
[iCloud backup]
- Settings and QSO log are backed up automatically to iCloud Drive (auto-saved when the app goes to the background), and auto-restored on first launch after a fresh install with the same iCloud account. Manual save/restore is also available from the Connect screen (credentials stay in the Keychain and are not included in the backup)
[Bug fix]
- Fixed FTX-1 built-in APRS beacon not starting (BEACON TYPE was not switching to AUTO)
```
3.21 15 Oct
- **Fixed transmitted CW breaking up at the start and intermittently when the CW keyer is used together with Wifi_RIG (RX audio streaming)**
- Cause: each CW key event (ON/OFF) was sent only once over UDP. When the Wi-Fi was busy (RX audio stream plus CAT polling at the same time), a lost packet dropped a whole keying element (dit/dah).
- Fix: each key packet is now sent redundantly (5 times, ~4 ms apart). The server deduplicates by the packet timestamp, so at least one copy is guaranteed to arrive while the duplicates collapse harmlessly into a single event.
- This matches the existing reliability design that already sends the PTT OFF packet 5 times.
- The local sidetone was already correct, so its behavior is unchanged.
3.19 12 Oct
- Fixed CW sidetone sometimes dropping the first (occasionally second) element after idle
- Prevent Wi-Fi power-save from dropping the CW link or causing stuck transmit
- Raspberry Pi now boots to console with on-demand VNC (fewer audio dropouts; fixed Setup timeout on Pi Zero 2W)
- Integrated ufw firewall setup into WireGuard configuration (auto-installs and enables even on an unconfigured Pi)
- App ports allowed only from LAN and VPN subnets; SSH always allowed to prevent lockout
- Bound rigctld to localhost to block unauthorized direct control from the LAN
- Added device-path validation (path traversal protection)
- Fixed FT-991 / FT-991A break-in (BK-IN) not turning OFF
- Changed default WireGuard config filename to WG_Raspi.conf
- Pi API version: v3.18
3.18 9 Oct
[WireGuard VPN setup improvements]
- Fixed API Key setup failing after IP address change during WireGuard configuration
- Restored Pi password field (supports Pis where SETUP Pi has not been run)
- API Key is now set directly from Python — no sudo dependency on shell scripts
[FT8 improvements]
- Fixed CQ message appearing only once when sent multiple times
- Fixed FT8 decoding stopping after "Update Pi" (SSE reconnect now auto-restarts decoding)
- Fixed mfsk-decode alert persisting after SSE reconnect
[Raspberry Pi setup improvements]
- SETUP Pi completion screen now shows "Run Update Pi next" instructions
- Update Pi automatically triggers mfsk-decode build (10–20 min)
- Files transferred directly from app bundle via SFTP (removed GitHub dependency)
[Pi API update — requires Update Pi]
- USB audio initialization now also sets "Master" control to 100% (FT8 TX output improvement)
- NOPASSWD rules strengthened (daemon-reload, mkdir, tee added)
3.17 9 Oct
Pi Setup (SSH)
You can now set up a Raspberry Pi directly from the app. Enter the Pi's IP address, SSH username, and password on the new Pi Setup screen, then tap Run —
Hamlib, FastAPI, Direwolf, and mfsk-decode are installed automatically on a freshly imaged Raspberry Pi OS (approximately 5–10 minutes). No terminal required.
Works with any SSH username; not limited to the default "pi" account.
3.16 7 Oct
### New Features
- **QSO Log**
- Log contacts instantly from the main screen: callsign, RST sent/received, band, mode, frequency, date/time
- POTA / SOTA reference fields for both your station and the other station
- ADIF export — share selected QSOs or the full log as an .adi file
- Edit previously logged QSOs
### Bug Fixes
- **Fixed Pi API version mismatch display**: The "Pi API version mismatch" warning in the About screen was incorrectly showing "3.12 is required" instead of "3.13". This has been corrected.
### Pi API 3.13 (update via "Update" → "Update Pi" in the app)
- **FT8 decode depth default changed**: 3 (deep: sync>=0.5, 300 candidates) → 1 (fast: sync>=3.0, 75 candidates). In typical environments, "fast" provides the best balance of speed and accuracy
- **mfsk-decode updated to mfsk-core v0.13.0**: Migrated internal FT8/FT4 decode API to the DecodeRequest/on_result pattern for improved decode accuracy and compatibility
- **Improved PTT audio transmission stability**: Gracefully handles BrokenPipeError when aplay exits early, preventing crashes during transmission
- **Improvements to setup_fastapi_radio.sh**:
- `libncurses5-dev` → `libncurses-dev` (correct package name for modern Debian/Ubuntu)
- Added `curl` to apt package installs
- Rigctl version detection now explicitly checks `/usr/local/bin/rigctl` to avoid false positives when apt version is present
- Added rpath to `./configure` to reliably prefer `/usr/local/lib` over apt version of libhamlib
- Enhanced Python venv corruption detection and automatic repair
- Direwolf binary auto-detection (prefers self-built version, falls back to apt version)
3.13 5 Oct
### RTTY receive tuning overhaul
- **Spectrum display**: the scrolling waterfall is replaced by a bar graph of the current
frame's signal strength (`RttySpectrumView`), so the Mark/Space positions are visible at a glance
- **Improved auto-tune**: tracks the Mark/Space tones with hysteresis and falls back to the
standard tones (2125/2295 Hz) when the signal disappears
- **FIX mode**: long-press the Tune button to stop auto-tune; tap the spectrum to move the
decode position (the setting is persisted)
- **RX level indicator** added
### RTTY transmit
- TX path is now chosen automatically (AFSK audio through the Pi). The serial FSK options were removed from the UI because they competed with the CAT port and took rig control down
- TX dial offset (Mark tone, plus the FT-991A's 1000 Hz DATA SHIFT) is applied automatically so the signal lands on the displayed frequency
- Transmission is refused while the dial frequency is unknown (e.g. right after a link loss), so nothing goes out without a frequency/mode command
- **RTTY disabled in direct CI-V mode**: both RX and TX depend on the Pi's audio path, so the RTTY screen cannot be opened over CI-V
### Connection stability
- Detects the "frequency stuck at 0" state left behind by a FastAPI restart on the Pi and
automatically re-issues `/radio/open` (rigctld recovery, rate-limited to once per 30 s)
- Leaving the RTTY screen (SPK off) no longer stops the Pi RX audio stream
(it was cutting audio for other clients connected to the same Pi)
3.12 3 Oct
### RTTY Send/Receive Support Added
Long-press the FT8 button to open the RTTY screen.
- Software AFSK modem (RX: Goertzel-based 2125/2295 Hz demodulation with ITA2 Baudot decode)
- TX: AFSK tone generation via AudioTrack with automatic CI-V PTT control
- RTTY/RTTYR mode toggle button
- Tap frequency display to choose band preset (160m–6m, 2m, 70cm)
- Preset message buttons (CQ / RST 599 / TU 73 / QRZ / BK / PSE AGN / DE)
- FT8 button caption changed to two-line "FT8 / RTTY" display
3.11 28 Sept
### FT4 Waterfall Speed Bug Fix (WiFi CI-V mode)
### Compound Callsign QSO Sequence Support
3.10 23 Sept
### FT8 Screen — Numeric ALC / Power Display
The FT8 screen now shows numeric percentage values alongside the PO (power output) and ALC meters.
- Values update in real time during TX
- ALC value continues to be shown in red
- Both values reset to 0% automatically when TX ends
3.06 21 Sept
[New Feature]
- Built-in help screen (About → Help / Manual)
View the Japanese/English manual without leaving the app
[Fixes]
- Fixed a Broken Pipe error that occurred during PTT audio TX
(improved stability of the Pi-side audio_tx stream)
- Fixed duplicate SOTA spots appearing for the same activator and summit
(now shows only the most recent spot per activator/summit)
[Pi API Update]
- Pi API updated to 3.04.
Go to Admin → Update Pi to update your Raspberry Pi (takes ~1 minute).
3.05 20 Sept
### Fix: Duplicate SOTA Spots in Display
When multiple spots are received for the same callsign and summit, only the latest one is now shown.
- Applies to both the SOTA tab in the Memory screen and the SOTA overlay in FT8 view
- Fixes the issue where the same station kept appearing multiple times as their frequency was updated
### Fix: Frequency Offset When Changing Modes
Fixed a frequency drift issue that occurred when recalling a memory, tapping a SOTA/POTA spot, or responding to an SP2ALERT notification that requires a mode change.
- ICOM rigs automatically adjust the VFO frequency by the CW pitch offset when switching modes via CI-V. Sending frequency before mode caused the final VFO to be off by that offset
- Changed the command order to **set mode first, then frequency** across all code paths: memory recall, POTA spots, SOTA spots, and SP2ALERT integration
3.04 18 Sept
v3.03
[Changes]
• SOTA spot fetching now uses the REST API (telnet cluster removed)
— spots load reliably every time
• SOTA list now shows only the last 2 hours (was 24 hours)
— only currently active summits are displayed
3.03 17 Sept
v2.60
- BT CI-V audio: stream IC-705 RX audio to phone speaker over Bluetooth SCO
- CW BLE key stability improvements
- Pi API updated to 2.60 (tap "Update Pi" to update your Pi)
2.60.1 7 Sept
v2.60
- BT CI-V audio: stream IC-705 RX audio to phone speaker over Bluetooth SCO
- CW BLE key stability improvements
- Pi API updated to 2.60 (tap "Update Pi" to update your Pi)
2.60 5 Sept
- SP2ALART integration: tapping a spot notification opens the app with frequency & mode pre-set
- DireWolf fix: ADEVICE now read from .env (was hardcoded to plughw:0,0)
- Pi API updated to 2.51 (tap "Update Pi" to update your Pi)
2.51 23 Aug
- PTT-OFF watchdog: ensures TX stops reliably (fixes stuck PTT on FTX-1F etc.)
- CAT PTT fix: FTX-1 and similar rigs work with default radio settings
- USB audio device auto-detection (Setup and Update Pi)
- Pi API updated to 2.5 (tap "Update Pi" to update your Pi)
2.5 19 Aug
v2.34
[Bug Fixes]
- Fixed WebFT8 version retrieval failure in the About screen
- After running "Update Pi" from iOS, both Android and iOS could no longer
retrieve the WebFT8 version; now fixed
- Removed HTTPS certificate pinning; Pi-side script now exposes /server_version
[Pi-side Script Changes]
- create_api.sh: embedded server.py now includes /server_version endpoint
- create_api.sh: API_VERSION updated to "2.34"
2.34 11 Aug
v2.33
[WebFT8 Fixes]
- Fixed "stuck at Loading WASM" after webft8 update
- Auto-fetches missing wav-save.js and latest JS files from GitHub at startup
- Fixed waterfall not starting
- Fixed audio device selection timing issue at initialization
- Added AudioWorklet fallback for improved compatibility
[Update Screen]
- Added "Update WebFT8" button for quick server_webft8.py deployment
- "Update Pi" now automatically triggers WebFT8 update afterward
2.33 4 Aug
- Added a Day/Night display theme — long-press the theme-color button to switch
- Unified the theme palette (OCEAN / AMBER / MONO / AQUA) across every screen, tuned for day and night
- Improved CI-V direct operation
- Tuned the RX-audio lowpass to 3400 Hz to suppress full-duplex howling
- Note: this version bumps the Pi API to v3.27 — run Admin -> Update Pi (a version-mismatch notice is shown until the Pi is updated)
more Version 3.27 1 day ago
Data Not Collected The developer does not collect any data from this app.