← Ordo Artificum

JF8Call

JS8Call-compatible station application

A new, clean-room implementation of a JS8Call-compatible station application — built for Linux, Windows, and Raspberry Pi, with a complete WebSocket API, headless operation, and a strict separation between the modem and the user interface. Designed from the start to serve as the HF connectivity layer inside larger, more complex communications systems.

Early Alpha Software

JF8Call is functional and in active use, but it carries no guarantees of stability, completeness, or fitness for any purpose. Builds are time-limited. Expect rough edges. All feedback — bug reports, feature requests, observations from actual on-air use — is genuinely welcome and appreciated.

Alpha — works, feedback welcome GitHub

Download

Linux (x86-64) AppImage
JF8Call-0.6.6-ALPHA-x86_64.AppImage
# make executable and run
chmod +x JF8Call-0.6.6-ALPHA-x86_64.AppImage
./JF8Call-0.6.6-ALPHA-x86_64.AppImage
# headless / server mode
./JF8Call-0.6.6-ALPHA-x86_64.AppImage --headless

Requires FUSE2 on the host. If AppImages don't run on your distro: sudo apt install libfuse2 or extract with ./JF8Call*.AppImage --appimage-extract.

Windows (64-bit) .zip with .exe files and required DLLs
JF8Call-0.6.6-ALPHA-win64.zip
# extract the zip, then run
JF8Call-0.6.6-ALPHA-win64\jf8call.exe
# jf8-tool is also included in the zip
JF8Call-0.6.6-ALPHA-win64\jf8-tool.exe status
# all required DLLs are included in the zip
# no installer, no registry changes

Requires Windows 10 or later (64-bit). No install required — extract the zip to any folder and run. The zip contains jf8call.exe, jf8-tool.exe, and all required DLLs (Qt6, PortAudio, Hamlib, MinGW runtime).

Raspberry Pi aarch64 binary — Pi 3, 4, 5, Zero 2
JF8Call-0.6.6-ALPHA-aarch64
# install runtime dependencies
sudo apt install libqt6widgets6 libqt6websockets6 \
   libhamlib4 libportaudio2
# make executable and run
chmod +x JF8Call-0.6.6-ALPHA-aarch64
./JF8Call-0.6.6-ALPHA-aarch64
# headless mode (no display required)
./JF8Call-0.6.6-ALPHA-aarch64 --headless

Tested on Raspberry Pi 4 running Raspberry Pi OS (64-bit, Bookworm). In --headless mode, no display or desktop environment is required — suitable for a Pi running headless as a digipeater or gateway node.

jf8-tool

A native command-line tool for the JF8Call WebSocket API — no Python, no dependencies, just a single self-contained binary. Control a running JF8Call instance from scripts, cron jobs, or the terminal.

Linux (x86-64) AppImage
jf8-tool-0.6.6-ALPHA-x86_64.AppImage
# make executable, optionally rename for convenience
chmod +x jf8-tool-0.6.6-ALPHA-x86_64.AppImage
cp jf8-tool-0.6.6-ALPHA-x86_64.AppImage ~/bin/jf8-tool
# use it
jf8-tool status
jf8-tool send "W4ABC HELLO"
jf8-tool monitor
jf8-tool stream --output /tmp/rx.log
Windows (64-bit) included in the JF8Call zip

jf8-tool.exe is included inside JF8Call-0.6.6-ALPHA-win64.zip. No separate download needed.

# from a Command Prompt or PowerShell in the extracted folder
.\jf8-tool.exe status
.\jf8-tool.exe send "W4ABC HELLO"
.\jf8-tool.exe monitor
Raspberry Pi aarch64 binary
jf8-tool-0.6.6-ALPHA-aarch64
# install runtime (needs Qt6 Network + WebSockets)
sudo apt install libqt6websockets6 libqt6network6
chmod +x jf8-tool-0.6.6-ALPHA-aarch64
./jf8-tool-0.6.6-ALPHA-aarch64 status

Pairs well with JF8Call running in --headless mode on the same Pi.

Quick reference

jf8-tool status
jf8-tool config get
jf8-tool config set callsign=W5XYZ grid=DM79AA
jf8-tool send "W4ABC HELLO" --submode fast
jf8-tool tx hb
jf8-tool tx snr W4ABC
jf8-tool radio connect --model 3073 --port /dev/ttyUSB0 --baud 9600 --ptt 1
jf8-tool radio freq 14078.0
jf8-tool messages --limit 20
jf8-tool monitor --filter message.decoded
jf8-tool stream --output /tmp/rx.log
jf8-tool --host 192.168.1.10 status # remote instance

Why a new implementation

JS8Call is valuable software, but its architecture reflects its origins as a research fork: the modem, the GUI, and the network code are tightly entangled, making it difficult to automate, integrate, or run without a desktop environment.

JF8Call is a new implementation that treats the modem as a library (gfsk8-modem-clean) and builds the application on top of a strict interface contract: every capability accessible through the GUI is also accessible through the WebSocket API, and vice versa. The two are not separate features — they are two views of the same underlying state machine.

One of JF8Call's explicit design goals is to make it easy to use as the HF connectivity layer inside larger, more complex communications tools and projects — and to stay out of the way while doing so. Run it headless on a Raspberry Pi, drive it entirely over the WebSocket API, embed it in an automated network or a custom digipeater — JF8Call is designed to be unobtrusive and easy to integrate, not just a standalone application.

Features

  • Complete WebSocket API. Every GUI action — tune, transmit, change submode, configure Hamlib, read received messages — is also accessible as a JSON command over WebSocket on ws://localhost:2102. Push events notify connected clients of every state change, including received frames, spectrum data, and status updates.
  • Headless operation. Run with --headless to start without a display. All audio I/O, decoding, and WebSocket API function normally. Suitable for Raspberry Pi gateway nodes, automated logging stations, or server-side integration.
  • TUI (text user interface). A full terminal interface is in development, allowing JF8Call to run on a Pi or remote machine over SSH with no desktop environment. The TUI and GUI share the same back-end and WebSocket API.
  • All five JS8 submodes. Normal (15 s), Fast (10 s), Turbo (6 s), Slow (30 s), and Ultra (4 s) — receive and transmit, switchable at any time.
  • Hamlib radio control. Frequency readback, VFO tuning, and CAT PTT for any Hamlib-supported transceiver. Optional — JF8Call runs perfectly without a connected radio.
  • Real-time waterfall. Scrolling spectrogram display with decoded signal markers and adjustable TX frequency cursor.
  • Multiple modems. JF8Call supports four modem back-ends through a common interface, all selectable in Preferences and via the WebSocket API: JS8/GFSK8 (the native JS8Call mode, all five submodes), Olivia MFSK (FEC-protected weak-signal HF, seven configurations from 4/250 through 32/1000), PSK31/63/125 and PSK FEC (seven submodes including BPSK31 through PSK500R with K=7 FEC), and Codec2 FreeDV (DATAC0/1/3, narrowband digital voice data modes). All modems use the same TX queue, Hamlib integration, and WebSocket API.
  • @ message protocol. Full support for the JS8 directed message protocol: @HB heartbeats, @SNR? and @INFO? queries with automatic replies, and directed station-to-station messaging.

WebSocket API

The API runs on ws://localhost:2102 by default. All messages are UTF-8 JSON text frames.

This is not a convenience feature. The WebSocket API is JF8Call's primary integration surface — the intended way for other software to use JF8Call as a modem and radio control layer. Send messages, tune frequencies, read configuration, receive decoded frames and spectrum data in real time. Every GUI action is available as a JSON command; every state change is pushed to connected clients as an event.

// send a command
{"type": "cmd", "cmd": "tx", "data": {"text": "W5XYZ DE K1JT TNX 73"}}
// server reply
{"type": "reply", "ok": true}
// unsolicited push event (new decode)
{"type": "event", "event": "rx", "data": {"from": "K1JT", "snr": -12, ...}}

Full API reference is available in the repository. The spectrum is pushed at ~5 Hz; status at 1 Hz; decoded frames immediately on receipt.

Credits & prior work

JF8Call is a new application, but the modes it implements exist because of the foundational work of others:

Joe Taylor (K1JT) & Steve Franke (K9AN)

Inventors of FT8 and the physical layer that JS8 — and therefore JF8Call — is built on. Their research, their published codes, and their open-source WSJT-X implementation are the direct foundation of everything that follows.

Jordan Sherer (KN4CRD)

Creator of JS8Call and the JS8 protocol. The free-text messaging, directed exchange, relay design, and five-submode structure that JF8Call implements are his design. JF8Call exists to be compatible with his network.

The name JF8Call follows Jordan Sherer's convention: just as he named JS8Call after his own initials (JS), JF8Call takes its name from the initials of its author, Jeff Francis (JF), N0GQ.

JF8Call is licensed GPL-3.0, consistent with the upstream JS8Call and WSJT-X tradition. The gfsk8-modem-clean library it depends on is also GPL-3.0.