Skip to main content
Yanked

This release has been yanked by its maintainers, and will be ignored by installers, except when explicitly specified.
Consider using release 1.1.1 instead.

PyFT8m

This repo contains a minimised FT8 decoder written entirely in Python, together with a minimal transmitter and GUI which can together comprise a simple transceiver.

The 'm' at the end of 'PyFT8m' is meant to indicate 'modular', as I've separated the transmitter and receiver from the GUI so that they can run standalone and be swapped out. They communicate with the GUI (or any other software you might want to write) via UDP - see below.

I started building this in October 2026 based on what I'd learned whilst writing PyFT8. Please see the readme file there for more information.

Capture

Uses

This isn't meant to do anything better than applications like WSJT-x and MSHV, but it illustrates what can be done in a very few lines of Python. Currently, the code comprises:

  • Receiver ~ 300 lines, including LDPC and OSD decoding
  • Transmitter ~ 300 lines
  • Tkinter GUI ~ 500 lines

That's an FT8 transmitter / receiver in about 1100 lines of Python. The Receiver and Transmitter are implemented in single Python files (apart from common use of a small UDP class) and communicate with the GUI only via UDP. The point of doing this is to keep the interfaces here minimal, so that in theory it's easy to swap out either transmitter, receiver, or GUI and replace it with something written in any other language, subject to meeting / adapting the UDP commands reference below.

To use it as a 'turnkey' transceiver, just install the project via pip:

pip install PyFT8m

... and then run the tk_gui either in a Python environment or by using a command like

python -m tk_gui

I haven't written too much of a step by step quide here, as the project is really intended for people who want to poke around and maybe modify the code. But hopefully even if you're new to Python or coding, you can have a look and work out how it's done.

UDP messages

The following shows the main points of the way that the UDP messages are constructed - please see the code for the absolute reference.

  1. All UDP messages apart from those sent to pskreporter.info or the waterfall data sent from the receiver to the GUI, are Python dictionaries serialised with JSON and encoded to bytes.
  2. All dictionaries start with a key called 'mtype' meaning 'messsage type'. The main ones are 'decode' (indicating that the dictionary contains various entries from a decoded message), 'shutdown', 'waterfall', 'rollover', 'test_info', 'set_tx_Hz', 'generate_tx_audio', 'send_tx_audio', 'stop_tx_audio'.

As the project grows, I might write a more formal spec for these messages.

Acknowledgements

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.

Metadata

Release files for PyFT8m 0.9.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for PyFT8m 0.9.4
File Size Uploaded Provenance Actions
pyft8m-0.9.4.tar.gz 25.0 kB Without provenance Details for pyft8m-0.9.4.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for PyFT8m 0.9.4
File Interpreter ABI Platform Actions
pyft8m-0.9.4-py3-none-any.whl Python 3 none any Details for pyft8m-0.9.4-py3-none-any.whl

Total release size: 48.5 kB

Release files / pyft8m-0.9.4.tar.gz

Download URL pyft8m-0.9.4.tar.gz
Size 25.0 kB
Tags Source
SHA-256 checksum
How to use checksums
686b0f1c791f55ccd06e1db3cca6dd95e3a60228dd86adba825c1fbca5e6c329
BLAKE2b-256 checksum
How to use checksums
3fffbf125ad12c149e58b216e06defb7dca134c5f72ca872b454ec4099561a56
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.14

Release files / pyft8m-0.9.4-py3-none-any.whl

Download URL pyft8m-0.9.4-py3-none-any.whl
Size 23.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
416b5f2025eba8135f6a65db1f0af671f18946bc5a734d9fafb6859576653421
BLAKE2b-256 checksum
How to use checksums
bc800a3213f3191a97cd2ae7dc1975a7343b82d64d2be0674c75bbcfd452366a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.14

Security for PyFT8m 0.9.4

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.9.4 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page