MRRC-FT8 runs the WSJT-X 3.0.2 Improved DSP core (FT8/FT4 decode and encode) behind a supervised worker, with a Python FastAPI control plane, rigctld radio control and a landscape mobile Web cockpit. Point a browser at it β decode the band, pick a station, and let the sequencer close one standard QSO.
Scan the QR code with WeChat to join the MRRC-HAM group.
QR code valid until Aug 29, 2026. Will be updated when refreshed.
Windows 11/10 x64 β embedded Python runtime + WSJT-X DSP decoder + Hamlib rigctld, no manual Python or Node.js install. First run generates a self-signed HTTPS certificate; default password abcd1234; LAN/remote access over HTTPS.
MRRC_FT8-Setup.exe β v1.1.0 Stable
60 MB Β· Windows 11/10 x64
SHA-256: ee866947731ac2318f4c1c7dc14511ba8a67b67ffbb68a2f32c8d9a3f68318b2
Full MRRC-FT8 station: FastAPI server + FT8 DSP (decode/encode) + rigctld + web/desktop client. Windows build: 832 tests passed; installer boot and serve verified. Radio/audio RF acceptance remains an operator-side check on a physical station.
The same improved decoder you know from WSJT-X, wrapped in a headless server with safe, deterministic scheduling.
Compiled selected Improved ft8var sources behind a C ABI into a
shared library. FT8 standard + Improved decoding with OpenMP
Auto/1β12 sub-bands, FT4 following the FT8 acceptance.
Fortran/OpenMP state lives only in a dedicated worker process behind supervised IPC. Every DSP call goes through one binding lock β no cross-thread packjt77 races, no Python callbacks from OpenMP threads.
Every schedule decision uses floor(epoch/TRperiod) β
the only slot identity rule. RX, TX, decode and sequencing all
align to the same absolute UTC slot grid.
Human selects the target β the sequencer drives one standard QSO to completion on the correct opposite TX slot, with a manual reply decision window, fit guard and central PTT safety controller.
The serial port has exactly one owner: rigctld. The server talks CAT over loopback TCP β frequency, mode, PTT β with no module ever opening the serial device directly.
Every completed QSO lands in the canonical SQLite store with start/band context captured at sequencer completion, plus ADIF export for your favourite logging suite.
Track worked entities straight from the cockpit: a full-screen
stats overlay parses the bundled cty.dat (exact,
digit-replacement and longest-prefix lookup) and summarises
total / per-entity / per-band β recomputed only after a QSO
write, never on every open.
With the Auto-call toggle on, the server safety-arms and auto-QSOs the first new-DXCC CQ when idle β no control lease needed, never interrupts an in-flight QSO, and completed entities naturally stop re-triggering.
The FT8 passband is ~0β3 kHz, so the spectrum frame emits exactly the 3 kHz span β no blank half-canvas, half the payload, and the client maps every bin across the full waterfall.
A mobile-first PWA built for a phone lying in landscape next to the rig: full control in landscape, degraded observer/STOP view in portrait. No build step β vanilla JS modules.
v1.1.0 is running the real FT-710 station. The 2026-08-03 field session closed the RX/TX root causes β UTC-ring eviction misalignment, Replay opposite-slot phase and the manual-Reply decision window β and real FT8 QSOs are being worked through the mobile cockpit. On 2026-08-04 the FT-710 rig controls were completed: filter bandwidth and ATT / PREAMP / AGC / RF gain now switch through raw CAT frames (hamlib's FT-710 level path is unreliable, and the AGC AUTO code was wrong), verified live on the station radio. v1.1.0 adds the DXCC live view (cty.dat entity stats, cached until a QSO write), the new-DXCC auto-call toggle (first new-entity CQ auto-worked when idle), and JTDX ADIF auto-sync with a 7-day LOG window.
The live cockpit: 20 m FT8 band activity and decodes on 14.074 MHz, TX state and slot timing.
Live edge: https://radio.vlsc.net:9988 β Caddy TLS with
acme.sh DNS-01 certificates; FastAPI and rigctld stay loopback-only.
macOS or Linux. Requires gfortran-mp-13 + FFTW3f for the DSP core, then a plain Python venv for the server.
CMake builds the Fortran shim + selected Improved sources into wsjt_core.
cmake -S dsp -B dsp/build -DCMAKE_Fortran_COMPILER=gfortran-mp-13 && cmake --build dsp/build -j
Editable install pulls FastAPI, uvicorn, numpy and the test deps.
python3 -m venv venv && venv/bin/pip install -e '.[dev]'
Improved sync8var allocates large work arrays on the thread stack β 10 MB, set before NumPy/OpenMP load.
export OMP_STACKSIZE=10M
Set MRRC_FT8_* env vars (password hash via --hash-password, call, grid, audio device, allowed hosts).
venv/bin/python -m server.main
Open the cockpit, log in, select a station and run a QSO. Full deployment templates (Caddy, LaunchAgent, systemd) live in deploy/.
https://your-host:9988 β login β band select β work the pileup
The app binds loopback-only; Caddy owns the public edge. macOS
LaunchAgent and Linux systemd units plus Caddy configs live in
deploy/.
Argon2id hash for MRRC_FT8_PASSWORD_HASH β prompts so the password never lands in shell history.
venv/bin/python -m server.main --hash-password
A .env (or the service env file) must define the hash, call sign and grid; optional overrides for allowed hosts and the audio device. The server refuses to start without the first three.
MRRC_FT8_PASSWORD_HASH=β¦ MRRC_FT8_MY_CALL=YOURCALL MRRC_FT8_MY_GRID=β¦
macOS: copy deploy/com.mrrc.ft8.plist to ~/Library/LaunchAgents/ and bootstrap it. Linux: install deploy/mrrc-ft8.service, create /etc/mrrc-ft8.env, and systemctl enable --now mrrc-ft8.
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.mrrc.ft8.plist
Copy deploy/Caddyfile to /etc/caddy/ and run Caddy as a LaunchDaemon; set MRRC_FT8_ALLOWED_HOSTS to the same domain so the Host/Origin checks pass.
reverse_proxy 127.0.0.1:8000
This site ships from the repo β website/deploy.sh backs up, uploads to www.vlsc.net/mrrc_ft8 and reloads nginx.
cd website && ./deploy.sh
Browser β TLS edge β FastAPI control plane β supervised DSP worker β shared native library. One owner per resource.
Full IBM TeamSD-style System Design Description β requirements, architecture decisions, safety analysis and version history.
What this project loads before editing, what a human still signs off, and what stays readable afterwards.
AGENTS.md, constraints.json (14 rules), the pre-edit hook ships as an installable snippet (install_hooks.py) and is not wired in this checkout, so no automated pre-edit gate is claimed here.wsjtx-3.0.2/ stays read-only and changes go through dsp/patched/, so the delta against the vendor tree remains reviewable.