Skip to the content
PCBKitNew board
2 layers40 × 25 mmFt8-pager interface, the printed circuit board in 3D

Ft8-pager interface

MrNash23/DIGIWAVE

Ham Radio Digi Modes on the T-LoRa Pager

Size
40 × 25 mm
Copper layers
2
Thickness
1.6 mm
Parts
50
Nets
31
Pads
131
Tracks, vias
463, 42
Pours
2
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
10 Oct 2026
Updated
7 Nov 2026

Overview

Ft8-pager interface is an open-source printed circuit board by MrNash23, from the MrNash23/DIGIWAVE repository on GitHub, published under the GPL-3.0 licence. It is a 2-layer board of 40 × 25 mm with 50 parts on 31 nets, routed with 463 tracks and 42 vias.

It is built around the ES8311, SN74LVC1G3157DCKR and SMF5.0CA, with the MMBT3904 and SMF15CA among its other parts. Its parts include 13 capacitors, 7 resistors, 3 diodes, 2 ICs and 2 connectors. It belongs with the radio and wireless and interfaces and adapters boards of this library.

Main components

5

README

README.md

DIGIWAVE

A pocket terminal for digital radio modes

Firmware for the LilyGo T-LoRa Pager: FT8, FT4, CW, RTTY, NAVTEX, WEFAX and SSTV on a device that fits in a jacket pocket, and a scanner that tells them apart.

DIGIWAVE running on the T-LoRa Pager: menu and FT8 decodes with waterfall

What it does

DIGIWAVE listens to the audio of a radio, decodes what it hears and shows it on the pager's display. In the modes that can transmit it also generates the audio and keys the radio. No computer is involved.


FT8

FT4

CW

RTTY

NAVTEX

WEFAX

SSTV

SCAN
ModeReceiveTransmit
FT8, FT4yes, with locator and country of each stationyes, with automatic QSO sequence and ADIF log
CWyes, in a 100 Hz window that is moved with the wheelyes, from the keyboard
RTTY (45.45 / 50 baud)yesyes
NAVTEXyes-
WEFAX (120 LPM)yes, saved as BMP on the SD card-
SSTV (Martin 1/2, Scottie 1/2, Robot 36, PD 120/180)yes, in colour, saved as BMP on the SD card-
Mode scanner (experimental)names the mode of a signal: FT8, FT4, CW, RTTY, NAVTEX, PSK31/63, SSTV, WEFAX-

Features

  • Mode scanner (experimental): the SCAN tile listens to the strongest signal, or to the one picked with the wheel, and names its mode from its width, tones, symbol rate and length of transmission, with the measured shift, baud rate or speed. Enter opens the mode that decodes it and takes the tones over, for instance mark, shift and speed of an RTTY station
  • Waterfall under the decodes in FT8, FT4, CW, RTTY and NAVTEX
  • Full FT8/FT4 contacts: call CQ or answer a station with one press; the sequence runs by itself and the contact is written to an ADIF logbook on the SD card
  • Worked before: stations already in the logbook of the device are greyed out in the list, on this band or only on another one
  • CQ with an addition (POTA, SOTA, DX, QRP ...), distance to every station heard, and figures over the logbook: QSOs per band and mode, countries, farthest contact
  • Weather by RTTY: the frequencies of the German weather service DWD are in the RTTY list; choosing one sets speed and shift
  • CB (11 m) operation for FT8 and FT4: CB callsigns such as 26AT016, the message sequence of WSJT-CB and the country list by division number
  • The own contact at a glance: what is sent appears in the list with what is heard, and while calling or working a station the list shows just that contact (key V switches between it and everything heard)
  • A free spot to transmit: the spectrum of the last half minute shows where the band is quiet; key G moves the TX frequency there, key F tunes it with the wheel on the waterfall, and key E chooses the first or the second slots for calling CQ
  • Voice announcements (optional): a new station calling CQ, a station calling you, a QSO started and logged, spoken through the pager's speaker
  • Band and frequency for the logbook: the radio is tuned by hand, so key B in FT8 and FT4 opens the list of the usual frequencies per band (or takes a typed one). FT8, FT4 and CB operation each remember their own
  • Exact time from GPS with the pulse-per-second signal. Without reception the phone page sets the clock from the phone's time, measured like NTP, and the real-time clock keeps it in between
  • Locator from GPS, or entered by hand
  • Phone page over Wi-Fi (switched on and off in the setup): the pager opens its own access point and serves a page with the decodes, the main controls, received WEFAX pictures and the logbook download. In the logbook, key Q shows QR codes that join the Wi-Fi and fetch the ADIF file
  • Home network: set up from the phone without typing on the pager. Setup > Home Wi-Fi shows a code that joins the pager and one that opens a page listing the networks in reach, where the password is pasted. The pager then joins that network besides its own access point whenever its Wi-Fi is on, and answers there as digiwave.local, so a logging program at home can take the logbook over and send its own QSOs back (see Logbook over the home network). With Wi-Fi off, the home network is left alone too
  • Worked from home: QSOs a logging program puts on the card mark those stations as worked in the list of decodes, and key A in the logbook shows them together with the own QSOs, with their distance
  • Broadcast plans of the German weather service DWD for WEFAX and RTTY: the menu names the next broadcast and the plan counts down to it; the plans can be edited on the phone page
  • Battery charge in the corner of the screen, from the fuel gauge checked against the voltage curve of the cell
  • Power saving: the display goes off after three minutes without input, and the device goes to sleep when nothing is received either. Pressing the wheel wakes it. "Switch off" is in the setup

Hardware: connecting a radio

T-LoRa Pager running DIGIWAVE with the interface board in its case on the 12-pin port and the cable to the radio

DIGIWAVE interface boardCase with the board, exploded viewCase from below with the 12-pin header

A small interface board plugs into the pager's 12-pin port. It carries its own ES8311 audio codec with line in, line out and a PTT output, and connects to the radio with one TRRS cable wired like the Digirig. The firmware uses it whenever it is plugged in (Setup, "Audio"); receive and transmit levels are set in the setup and with the two trimmers, which can be reached through the lid of its 3D-printed case.

Schematic, KiCad project, Gerber files with parts list, 3D views and the STL files of the case are in hardware, described on its own page.

Without the board, audio goes through the built-in microphone and speaker of the pager, so reception works held next to the speaker of any receiver.

Status

Work in progress.

  • The signal processing of all modes and the mode scanner are covered by 58 host tests.
  • On the device, FT8 reception has been checked against real signals; a slot is decoded in about 0.7 s.
  • NAVTEX and SSTV have only been tested against generated signals; WEFAX has received real weather charts.
  • The mode scanner is tested against generated signals down to 0 dB SNR and has named real RTTY of the German weather service (50 baud, 450 Hz shift).
  • Transmitting works through the interface board: PTT keys the radio and FT8 calls have gone out on the air.

Installing

DIGIWAVE is installed as one application next to others (for example Meshtastic) with the Launcher by bmorcelli: build the firmware, copy .pio/build/pager/firmware.bin to the SD card and install it from the Launcher. An update can also be written over USB straight into the Launcher slot of DIGIWAVE (ft8pag), at the offset its partition table gives it. The Launcher rewrites the table when applications are installed, so read it first (esptool.py read_flash 0x8000 0xc00 table.bin); with the present table the offset is 0x1a0000:

text
esptool.py write_flash 0x1a0000 .pio/build/pager/firmware.bin

Do not use pio run -t upload on a pager with the Launcher: it writes partitions.csv, the layout for running DIGIWAVE alone, together with its own bootloader, and so removes the Launcher and the other applications.

Building

PlatformIO with the pioarduino platform (Arduino-ESP32 3.3):

text
pio run -e pager        # firmware
pio test -e native      # host tests of the signal processing

Artwork in DIGIWAVE_Firmware_Grafiken is converted with python3 tools/make_assets.py, the voice announcements are spoken by Piper with tools/make_voice.py (setup in the script).

Operating

The same everywhere:

Wheelselect or tune: a tile, a station, the CW receive window, the RTTY tones
Wheel pressin the menu: open. In a mode: the list of its functions, with the keys that do the same directly
Enterthe main action of the mode: call the selected station, send the typed line, save the received picture
Backspaceone step back: typed text first, then the open list or page, then from the mode to the menu
Space + keydigits and symbols

FT8 and FT4 keep a line with their keys at the bottom of the screen; the other modes use the whole screen for text, spectrum or picture.

The scanner analyses every two seconds: the wheel picks a signal on the waterfall, A goes back to the strongest, Enter opens the mode that decodes it. A guess shows once two analyses agree. "Input too quiet" means next to no audio arrives: check the cable and the level of the radio.

Every WEFAX line is kept in memory (half an hour of reception), so a picture can be saved as a whole at any time, and is saved by itself when the station's stop tone ends it. Saved pictures can be looked at on the pager (WEFAX functions, "Saved pictures") and are shown, downloaded and deleted on the phone page.

Logbook over the home network

With a home network set up (Setup > Home Wi-Fi) and Wi-Fi on, the pager answers at http://digiwave.local. A logging program on a computer in that network can use three requests to keep its log and the pager's in step, in both directions:

Request
GET /api/log{"device":"DIGIWAVE", "call":"...", "qsos":12, "size":975, "station":14759, "stationqsos":92}: QSOs and size in bytes of the pager's logbook, size of the station file and the QSOs in it; a size is -1 while there is no such file
GET /log.adithe pager's logbook as ADIF
POST /api/stationreplaces the station file with the body (Content-Type: text/plain), which is written to the card as it arrives; answers 200 once it is in place

Taking the logbook over. The pager only ever appends to its logbook and never deletes from it, so it is enough to ask /api/log now and then and to fetch /log.adi when size changed. Records may come again: match them on your side, by call, date, time, band and mode. The file starts with a header naming DIGIWAVE as programid, and every record carries station_callsign and my_gridsquare of where it was worked, which is useful for portable operation.

Sending QSOs to the pager. QSOs made elsewhere, at the home station for instance, go into the station file. The pager marks these stations as worked in the list of decodes and for the voice announcements, lists them in grey in the logbook (key A) with their distance, leaves them out of the figures and never returns them in /log.adi. The file is ADIF with these rules:

  • one record to a line, ending in <eor>, lines up to 400 bytes
  • oldest first: the pager keeps the newest 200 for its list
  • fields read: call and band (for marking as worked), gridsquare and my_gridsquare (for the distance), qso_date, time_on, mode, submode, rst_sent, rst_rcvd
  • at most 6000 records together with the pager's own logbook; the file is read at every start, so keep it smaller where you can. With more QSOs than that, send the newest of every call and band first
  • send it only when it changed: compare station in /api/log with the size of what you sent last, which also catches another card in the pager

Staying awake. Each /api/log or /log.adi keeps the pager from going to sleep for three minutes, so asking once a minute keeps it on while it is at home. The display still goes off.

Name and safety. The pager announces its name over mDNS with an IPv4 address only. Resolve digiwave.local for IPv4: a lookup for any address family can wait several seconds for an IPv6 answer that never comes (macOS waits five). The interface has no password; everything in the home network can reach it, the phone page with its transmit controls included.

Layout of the repository

  • lib/ft8core - hardware-independent decoders, encoders and QSO logic
  • lib/ft8_lib - vendored kgoba/ft8_lib (MIT)
  • src - firmware: audio and PTT interfaces, engine, user interface, web interface
  • test - host tests and reference recordings from ft8_lib
  • hardware - interface board (KiCad project, schematic, fabrication files) and printed case
  • PROJEKT.md - description of the project in German

Licence and credits

Copyright (C) 2026 Andres Leroi

DIGIWAVE is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. It comes without any warranty. The text is in LICENSE.

The hardware in hardware, interface board and case, is licensed under the CERN Open Hardware Licence Version 2 - Strongly Reciprocal (CERN-OHL-S-2.0), text in hardware/LICENSE.

It stands on the work of others:

  • FT8 and FT4 are protocols by Joe Taylor K1JT and Steve Franke K9AN; coding and decoding come from ft8_lib by Kārlis Goba (MIT)
  • CB operation follows WSJT-CB, from which the list of 11 m divisions is taken (GPL-3.0)
  • The voice announcements are spoken by Piper (GPL-3.0) with the voice ljspeech, trained on the public-domain LJ Speech dataset
  • The device is driven through LilyGoLib (MIT), the display through LVGL (MIT) with the Montserrat typeface (SIL Open Font License)
  • The platform is the Arduino core for ESP32 (LGPL-2.1) on ESP-IDF (Apache-2.0)

The complete list with versions, authors and licences is in THIRD-PARTY-NOTICES.md. The same credits are shown on the device under Setup, "About DIGIWAVE".

Parts

50
QtyValueFootprintReferences
81uCapacitor_SMD:C_0402_1005MetricC3, C7, C8, C9, C10, C11, C12, C13
3100nCapacitor_SMD:C_0402_1005MetricC1, C4, C6
310kResistor_SMD:R_0402_1005MetricR1, R2, R7
210uCapacitor_SMD:C_0603_1608MetricC2, C5
2SMF5.0CADiode_SMD:D_SOD-123FD1, D3
1100kResistor_SMD:R_0402_1005MetricR4
110k RXPotentiometer_SMD:Potentiometer_Bourns_TC33X_VerticalRV1
110k TXPotentiometer_SMD:Potentiometer_Bourns_TC33X_VerticalRV2
11kResistor_SMD:R_0402_1005MetricR6
133RResistor_SMD:R_0402_1005MetricR3
13V3TestPoint:TestPoint_Pad_D1.0mmTP9
13V3ATestPoint:TestPoint_Pad_D1.0mmTP10
1470RResistor_SMD:R_0402_1005MetricR5
1600R@100MHzInductor_SMD:L_0603_1608MetricFB1
1AGND-DGNDNetTie:NetTie-2_SMD_Pad0.5mmNT1
1ASDOUTTestPoint:TestPoint_Pad_D1.0mmTP4
1BCLKTestPoint:TestPoint_Pad_D1.0mmTP1
1DATATestPoint:TestPoint_Pad_D1.0mmTP3
1DSDINTestPoint:TestPoint_Pad_D1.0mmTP5
1ES8311Package_DFN_QFN:QFN-20-1EP_3x3mm_P0.4mm_EP1.65x1.65mmU1
1GNDTestPoint:TestPoint_Pad_D1.0mmTP11
1LRCKTestPoint:TestPoint_Pad_D1.0mmTP2
1MCLKTestPoint:TestPoint_Pad_D1.0mmTP6
1MMBT3904Package_TO_SOT_SMD:SOT-23Q1
1PJ-320D TRRSConnector_Audio:Jack_3.5mm_PJ320D_HorizontalJ2
1PTT_CTRLTestPoint:TestPoint_Pad_D1.0mmTP15
1Pager J3 2x6Connector_PinHeader_2.54mm:PinHeader_2x06_P2.54mm_VerticalJ1
1RING1TestPoint:TestPoint_Pad_D1.0mmTP13
1RING2TestPoint:TestPoint_Pad_D1.0mmTP14
1Ring1 selJumper:SolderJumper-3_P1.3mm_Bridged12_RoundedPad1.0x1.5mmJP2
1Ring2 selJumper:SolderJumper-3_P1.3mm_Bridged12_RoundedPad1.0x1.5mmJP3
1SCLTestPoint:TestPoint_Pad_D1.0mmTP8
1SDATestPoint:TestPoint_Pad_D1.0mmTP7
1SMF15CADiode_SMD:D_SOD-123FD2
1SN74LVC1G3157DCKRPackage_TO_SOT_SMD:SOT-363_SC-70-6U2
1TIP_RXTestPoint:TestPoint_Pad_D1.0mmTP12
1TX DC bypassJumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mmJP1

Questions

How big is the Ft8-pager interface PCB?

It measures 40 × 25 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Ft8-pager interface use?

50 parts, built around the ES8311, SN74LVC1G3157DCKR, SMF5.0CA and MMBT3904. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Ft8-pager interface KiCad files?

From the MrNash23/DIGIWAVE repository on GitHub, at the commit this page was made from: the board is hardware/interface-board/ft8-pager-interface.kicad_pcb and its schematic hardware/interface-board/ft8-pager-interface.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Ft8-pager interface design in my own project?

Its repository publishes it under the GPL-3.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

Similar boards

  • 6 layers100 × 70 mmCanardBoard, the printed circuit board in 3D

    CanardBoard

    waterloo-rocketry/canhw

    Hardware monorepo avionics PCB

    280 parts15GPL-3.0
  • 4 layers25 × 25 mmLaserCAN Board, the printed circuit board in 3D

    LaserCAN Board

    GrappleRobotics/LaserCAN

    59 parts3GPL-3.0
  • 4 layers40 × 52.2 mmTrackimal, the printed circuit board in 3D

    Trackimal

    Vtechcode/stm32f303_sim7600

    This is a device that is suitable for IoT and machine-to-machine communication. SIM7600E is an industrial-grade LTE Cat 1 module designed for global IoT and M2M applications.

    95 parts
  • 4 layers40 × 40 mmEsptof, the printed circuit board in 3D

    Esptof

    sikaxn/FRC-Custom-CAN-Sensor

    If you are looking for IronMaple ESP32‐FRC‐devkit resources, please switch branch to dev-board.

    43 parts12GPL-3.0
  • 2 layers95 × 55 mmWifi geiger counter, the printed circuit board in 3D

    Wifi geiger counter

    atomicra1n/wifi-geiger-counter

    A DIY Geiger counter PCB which can detect ionizing radiation and log readings over Wi-Fi. Built with an ESP32, and a HV multiplier circuit that steps up 3.7V to 400V for the GM tube.

    64 parts
  • 2 layers120 × 90 mmPLC STM32 Modbus, the printed circuit board in 3D

    PLC STM32 Modbus

    danhmanu/PLC-STM32F407VET6

    Mạch nguyên lý KiCad 10 cho bộ PLC: điều khiển qua LAN bằng Modbus TCP (module W5500 Lite), nạp code qua USB‑C (CH340C), 16 ngõ ra transistor cách ly quang, 10 ngõ vào analog 4–20mA.

    264 parts
  • 4 layers170 × 105.1 mmLive caption badge, the printed circuit board in 3D

    Live caption badge

    fakefred/live-caption-badge

    EECS 473 Project

    123 parts1
  • 2 layers41.2 × 10.5 mmDumb watch, the printed circuit board in 3D

    Dumb watch

    gschuk/dumb-watch

    Exercise Lab of Lecture Advanced PCB Design @ TU Darmstadt.

    61 parts1