This repository contains Python code to decode and encode (all the way to audio) FT8, plus a minimal Command Line Interface for reception, and a nascent set of research code.

This started out as me thinking "How hard can it be, really?" after some frustration with Windows moving sound devices around and wanting to get a minimal decoder running that I can fully control.
I didn’t want to produce yet another port of the original Fortran / C into another language: instead I wanted to see how far I could get following audio -> spectrogram -> symbols -> bits -> error correction without resyncs and special treatments, writing my own code from scratch as far as possible. Also this has been, more than I expected, an exercise in writing Python ‘Pythonically’ for speed, which means absolutely not duplicating the big nested loops of Fortran and C. It also means writing code that is wide and short rather than thin and long, which suits my thinking style perfectly!
I use this code for my own hobby-level reseearch into FT8 decoding and Python coding techniques, and I'm also building a browser-GUI station controller (image below) which has an FT8 transceiver integrated within it. You can see that here but note that it's focussed on my station, i.e. ICOM-IC-7100 with an Arduino controlling antenna switching and magloop tuning.
The image below shows the number of decodes from PyFT8 and FT8_lib both as a percentage of WSJT-x V2.7.0 running in NORM mode, for a set of wav files copied from FT8_lib's 20m_busy tests.
On a quiet band with good signals, PyFT-8 typically gets 70% or 80% and often 100% of WSJT-x decodes. On a crowded band (e.g. 20m plot below), PyFT8 performs less well. WSJT-x uses signal subtraction to improve performance with overlapping signals. PyFT8 can decode overlapping signals surprisingly well, but not as well as WSJT-x.
[being written]
This repository is usually a little ahead of the releases I send to PyPI, but you can pip install it from there and just use the Command Line Interface (which can also transmit individual messages) if you want to.
Install using:
pip install PyFT8
And to run, use the following (more info here)
PyFT8_cli "Keyword1, Keyword2" [-c][-v]
* where keywords identify the sound device - partial match is fine - and -c = concise, -v = verbose
Otherwise, please download or browse the code, or fork the repo and play with it! If you do fork it, please check back here as I'm constantly (as of Jan 2026) rewriting and improving.
In pursuit of tight code, I've concentrated on core standard messages, leaving out some of the less-used features. The receive part of the code doesn't (yet) have the full capability of the advanced decoders used in WSJT-x, and so gets only about 60% of the decodes that WSJT-x gets, depending on band conditions (on a quiet band with only good signals PyFT8 will get close to 100%).
This project implements a decoder for the FT8 digital mode. FT8 was developed by Joe Taylor, K1JT, Steve Franke, K9AN, and others as part of the WSJT-X project. Protocol details are based on information publicly described by the WSJT-X authors and in related open documentation.
Some constants and tables (e.g. Costas synchronization sequence, LDPC structure, message packing scheme) are derived from the publicly available WSJT-X source code and FT8 protocol descriptions. Original WSJT-X source is © the WSJT Development Group and distributed under the GNU General Public License v3 (GPL-3.0), hence the use of GPL-3.0 in this repository.
Also thanks to Robert Morris for basicft8(*1) - the first code I properly read when I was wondering whether to start this journey. (*1 note: applies to FT8 pre V2)
WSJTx - focussed:
- WSJT-X on Sourceforge
- W4KEK WSJT-x git mirror (searchable)
Other FT8 decoding repos:
- weakmon
- FT8_lib
- 'ft8modem - a command-line software modem for FT8' including source code (C++ and Python) (bottom of page)
FT8 decoding explorations / explanations
- VK3JPK's FT8 notes including comprehensive Python source code
- G4JNT notes on LDPC coding process
FT8 decoding in hardware
- Optimizing the (Web-888) FT8 Skimmer Experience (see also RX-888 project )
- 'DX-FT8-Transceiver' source code, the firmware part of the DX-FT8 Transceiver project
FT8 encode/decode simulators:
Browser-based decoder/encoders
- ft8js - source github, uses FT8_lib
- ChromeFT8 Browser Extension, decoder adapted from ft8js