← Ordo Artificum

gfsk8-modem-clean

JS8/FT8 modem — ground-up rewrite

A complete rewrite of the FT8 and JS8Call modem, built from first principles against the published specifications in modern C++20. Not a fork. Not a port. A new implementation.

Working & available now GitHub

A rewrite, not a port

The original FT8 and JS8Call implementations carry the accumulated complexity of research software: tightly coupled components, mixed concerns, and dependencies on Qt, FFTW3, Boost, and Eigen that make the modem impossible to use outside of the original application framework.

gfsk8-modem-clean starts from the published specifications — the FT8 paper, the LDPC codes, the Costas array, the varicode tables, and the JS8 protocol definition — and reimplements the modem from scratch in C++20. Every module is designed from the start for testability, embeddability, and clean integration into other applications.

The result is fully protocol-compatible with JS8Call and JS8Call-improved: gfsk8-modem-clean decodes frames from real-world JS8 stations and produces frames that interoperate correctly with existing JS8Call installations.

Architecture

The library is organized into clearly separated layers, each with a single well-defined responsibility:

  • Codec layer — LDPC encode/decode, Costas array, symbol mapping, and varicode. No I/O, no FFT.
  • Modulation layer — 8-GFSK symbol-to-sample conversion for all five submodes at 12 kHz.
  • Decoder layer — FFT-based synchronization, frequency tracking, soft-symbol extraction, and LDPC decoding. Runs all five submodes simultaneously on a single audio buffer.
  • Public API — a minimal, stable gfsk8:: namespace surface that exposes only what callers need.

The FT8 foundation

FT8 is one of the most carefully engineered weak-signal communication systems ever built for amateur radio. Its 8-GFSK modulation, Costas array synchronization scheme, and LDPC forward error correction approach the Shannon limit for the conditions under which HF propagation typically operates. gfsk8-modem-clean implements this system faithfully and in full.

The JS8 protocol extension adds free-text messaging, directed exchange, relay forwarding, and SNR/grid exchange on top of the FT8 physical layer — with five selectable timing modes to match the tradeoff between speed and sensitivity to current propagation conditions.

Platform support

Linux x86-64
Native
Raspberry Pi
aarch64 cross-compile
Windows
MinGW cross-compile

Building

# clone and build
git clone https://github.com/jfrancis42/gfsk8-modem-clean
cd gfsk8-modem-clean
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -- -j2
# output: build/libgfsk8modem.a

KissFFT is vendored. No system packages beyond a C++20 compiler and CMake 3.20+.

Credits & prior work

gfsk8-modem-clean is a reimplementation, not a copy — but it would not exist without the people who did the original work:

Joe Taylor (K1JT) & Steve Franke (K9AN)

Inventors of FT8 and the foundational research behind every mode gfsk8-modem-clean implements. Their 2018 paper, their LDPC codes, their Costas array design, and their open-source WSJT-X implementation are the specification this library was written against. The digital HF community owes them an enormous debt.

Jordan Sherer (KN4CRD)

Creator of JS8Call and the JS8 protocol. His design decisions — the five submodes, the varicode scheme, the directed message protocol — define what gfsk8-modem-clean encodes and decodes. The JS8 specification exists because of his work.

gfsk8-modem-clean is independently authored and licensed GPL-3.0, consistent with the upstream FT8 and JS8Call tradition of open-source amateur radio software.