1. What this guide builds
A receiver, a computer with an exact clock, and a decoder program. The decoder writes one line for each message that it hears from an amateur station. This guide is receive only: nothing in it transmits.
There are two paths. Choose one.
- Path A: one band at a time. One shortwave receiver in upper sideband, and the program WSJT-X. Most amateurs start here. It works with the radio you own.
- Path B: every band at once. A wideband receiver with the program ka9q-radio, and the decoders
wsprdanddecode_ft8. This is what I use (marked ◆).
| Signal | Frequency | Antenna | Radio | Decoder | Computer |
|---|---|---|---|---|---|
| FT8 | One dial frequency on each band, 1.8 to 28 MHz (section 4) | Any shortwave antenna | A: one receiver, upper sideband. B: ◆ RX-888 Mk II | A: WSJT-X. B: ◆ decode_ft8 |
A: Windows, macOS or Linux. B: ◆ x86 PC with Ubuntu |
| FT4 | One dial frequency on each band, 3.5 to 28 MHz | The same | The same | A: WSJT-X. B: ◆ decode_ft8 |
The same |
| WSPR | One dial frequency on each band, 0.136 to 28 MHz | The same | The same | A: WSJT-X. B: ◆ wsprd |
The same |
Path A antenna -- receiver (USB mode) -- audio -- computer: WSJT-X
one band at a time exact clock
(optional) reports to
PSK Reporter, WSPRnet
Path B loop -- injector -- 30 MHz filter -- limiter -- RX-888 Mk II -- hf (x86 PC)
|
radiod (ka9q-radio) cuts one channel for each band |
FT8 channels -- ft8-record -- decode_ft8 -- /var/log/ft8.log
FT4 channels -- ft4-record -- decode_ft8 -- /var/log/ft4.log
WSPR channels -- wspr-decoded -- wsprd ------- /var/log/wspr.log
(optional) reports
What path A gives up: it hears one band and one mode at a time. You choose the band by hand, so you see one row of the band chart, not all of it. What path B costs: a second computer, a wideband receiver, a required filter, and an evening at a Linux command line.
In this guide, a decode is one message that the decoder read one time. One station gives many decodes in a day.
2. What you need
Prices are US dollars unless the cell says otherwise, as listed by the named seller on 2026-10-07. They change. A part marked ◆ is what I use. A blank box is for your pencil.
Path A, the lowest-cost path
If you own a shortwave transceiver or receiver with upper sideband, you may need to buy nothing.
| ☐ | Part | Job | Connector | Price |
|---|---|---|---|---|
| ☐ | A shortwave receiver or transceiver with upper sideband (USB) mode | Receives one band | Yours | You own it |
| ☐ | The antenna you use on shortwave now | Receives | Yours | You own it |
| ☐ | An audio path from the receiver to the computer: the receiver’s own USB sound device, or a cable from its line or headphone output to the computer’s line input | Carries the receiver’s sound to WSJT-X | USB, or 3.5 mm | See seller |
| ☐ | A computer with Windows 10 or later, macOS 13 or later, or Linux. WSJT-X asks for a 1.5 GHz processor, 200 MB of free memory, and a 1024 x 780 screen | Runs WSJT-X | You own it | |
| ☐ | An internet connection | Sets the clock (section 5) |
If you own no shortwave receiver, a software-defined radio (SDR) can take its place. An SDR is a USB receiver that needs a program on the computer to tune it. I did not run WSJT-X with an SDR. Section 6 says what that needs, and section 15 lists it as not run.
| ☐ | Part | Job | Price | Note |
|---|---|---|---|---|
| ☐ | RTL-SDR Blog V4L | A low-cost SDR | $37.95, rtl-sdr.com | I use one on VHF. I did not try it on shortwave |
| ☐ | Airspy HF+ Discovery | An SDR made for shortwave, 768 kHz wide | See listing | I do not own one |
Path B, what I use
Path B needs the wideband receiver from the guide Shortwave receiver. That guide has the receiver, the filter, the limiter and the computer in full. This table repeats the list, so you can see the cost.
| ☐ | Part | Job | Connector | Price | Note |
|---|---|---|---|---|---|
| ☐ | ◆ RX-888 Mk II, 16-bit, 10 kHz to 64 MHz direct | Hears all of shortwave at once | SMA, USB 3 | $152.79, OpenSourceSDRLab, 2026-10-11 | Copies exist. Mine is from OpenSourceSDRLab |
| ☐ | ◆ MLA-30+ active loop with its power injector | Antenna | SMA | See listing, Amazon | Any shortwave antenna works |
| ☐ | ◆ Turn Island Systems F3060 low-pass filter | Stops signals above 30 MHz | SMA | $80, Turn Island Systems | Required at 64.8 MS/s |
| ☐ | ◆ TAPR RF Limiter | Protects the receiver input | SMA | $20, TAPR | Needed if you also transmit nearby |
| ☐ | ◆ x86-64 desktop PC, 4 cores of Intel Haswell class (2013) or newer, 8 GB, a USB 3.0 socket on the main board | Runs the receiver and the decoders | Used market | Mine: HP EliteDesk 800 G1 SFF, Core i5-4570, 12 GB | |
| ☐ | SATA solid-state drive, 120 GB or more | Storage | See seller | The FT8 recorder writes files all day | |
| ☐ | RG-6 quad-shield coax, and two F to SMA adapters | Loop to receiver | F, SMA | See seller |
My Core i5-4570 was 29 % busy with the receiver and every decoder of my station, HFDL included. It dropped no data in a 19-hour test.
3. Before you start
Skills. Path A: install a program and set its options. Path B: type commands at a Linux command line, and edit a text file with sudoedit.
Time. These are my estimates. Path A: about one hour to the first decode, if the receiver and the audio path work. Path B: one evening after the receiver from the other guide runs.
Accounts. None to receive. Reporting is optional (section 9). PSK Reporter needs no account. I could not confirm what WSPRnet needs.
Values to choose first. Write these down. The steps use them as placeholders.
| Placeholder | Meaning | Example form |
|---|---|---|
<CALL> |
Your callsign, or a name for a receive-only station (section 9) | Your own |
<LOCATOR> |
Your Maidenhead locator. 4 characters is a square of 2 degrees by 1 degree. 6 characters is a few kilometers | 4 or 6 characters |
<ANTENNA> |
A short text that describes your antenna | small loop |
Caution.
<CALL>,<LOCATOR>and<ANTENNA>become public if you turn reporting on. The networks show them on a world map and keep them. Read section 9 before you enter a 6-character locator in any program.
The law, in short. I am not a lawyer. This is what I read, for the United States. To receive needs no licence. US law (47 U.S.C. section 605) restricts what you pass on from messages not meant for the public, and it makes an exception for amateur radio. Other countries differ. This guide never transmits. To transmit on these frequencies, you need an amateur licence.
4. The frequencies
Every mode has one agreed frequency on each band. You set the receiver to that dial frequency in upper sideband (USB). The signals then appear as tones in the receiver’s sound, between about 200 Hz and 3000 Hz.
These are the default working frequencies of WSJT-X 3.0.2, in MHz. I read them from its source file models/FrequencyList.cpp on 2026-10-10. Conventions change with time: the list in your copy of WSJT-X is the one to use.
| Band | FT8 | FT4 | WSPR |
|---|---|---|---|
| 2200 m | 0.1360 | ||
| 630 m | 0.4742 | ||
| 160 m | 1.840 | 1.8366 | |
| 80 m | 3.573 | 3.575 | 3.5686 |
| 60 m | 5.357 | 5.357 | none in the list1 |
| 40 m | 7.074 | 7.0475 | 7.0386 |
| 30 m | 10.136 | 10.140 | 10.1387 |
| 20 m | 14.074 | 14.080 | 14.0956 |
| 17 m | 18.100 | 18.104 | 18.1046 |
| 15 m | 21.074 | 21.140 | 21.0946 |
| 12 m | 24.915 | 24.919 | 24.9246 |
| 10 m | 28.074 | 28.180 | 28.1246 |
Notes on the table:
- A second FT8 frequency. The list has a second FT8 frequency on most bands, labelled for expeditions: 3.567, 7.056, 10.131, 14.090, 18.095, 21.091, 24.911 and 28.091 MHz.
- Region 3. The list gives 3.568 MHz for FT4 on 80 m in IARU Region 3 (southern Asia and the Pacific).
- WSPR is very narrow. All WSPR signals of one band sit in a slice 200 Hz wide. The center of the slice is 1500 Hz above the dial frequency.
- Start with 20 m by day and 40 m at night. That is my advice, not a rule. On my station those two bands had the most decodes.
How wide and how long each signal is, from the WSJT-X manual:
| Mode | Message | Time on the air | Slot | Width | Decodes down to (in 2500 Hz) |
|---|---|---|---|---|---|
| FT8 | 77 bits | 12.6 s | 15 s | 50 Hz | -21 dB |
| FT4 | 77 bits | 5.04 s | 7.5 s | 83.3 Hz | -17.5 dB |
| WSPR | 50 bits | 110.6 s | 2 minutes | 5.9 Hz | -31 dB |
5. The clock
Every station starts to send at the same moment. FT8 starts every 15 seconds. FT4 starts every 7.5 seconds. WSPR starts at an even minute. The decoder looks for a signal only near those moments. If your clock is wrong by more than about one second, the decoder finds nothing, although the signals are there.
The WSJT-X manual asks for a clock within 1 second of UTC. It also asks for a clock that never jumps. A good time program corrects the clock by a change of its speed, not by a step.
Set the clock on Linux
-
Install the clock service
chrony.sudo apt install -y chrony -
Wait one minute. Then read the clock error.
chronyc trackingResult: a line
System time : 0.000... seconds slow of NTP time(orfast). The number must be far below 1 second. The lineLeap status : Normalshows that the clock follows a time server.
Set the clock on Windows
The WSJT-X manual says that the time service built into Windows may not be adequate. It recommends the program Meinberg NTP Client. Its section “Installation, Windows” has the link and the steps. I did not run them.
Set the clock on macOS
The WSJT-X manual says: use System Preferences to select an external time source. On current macOS, find the date and time settings and turn the automatic setting on. I did not test how exact that is.
With no internet
A GPS receiver can set the clock. This guide does not cover that.
6. Path A: one band with WSJT-X
Program: WSJT-X, free and open source (GPL version 3). Its authors made FT8, FT4 and WSPR. The latest release on 2026-10-10 is 3.0.2.
Caution. WSJT-X is made for transceivers and it can key one. Do not click Enable Tx or Tune. Do not connect the computer’s audio output to the radio. If your radio is a transceiver, turn its VOX off.
Connect the receiver
-
Connect the antenna to the receiver.
-
Connect the audio path from the receiver to the computer.
-
Set the receiver to upper sideband (USB or USB Data).
-
Set the widest filter that the receiver has in that mode, up to about 5 kHz.
-
Turn the receiver’s automatic gain control (AGC) off, or reduce its RF gain. The manual says this is usually best.
-
Tune the receiver to 14.074 MHz by day, or to 7.074 MHz at night.
Result: you hear a mix of soft tones that all start and stop together, every 15 seconds.
Install WSJT-X
-
Open the WSJT-X downloads page. The installers are on GitHub: the page says that is the only official source.
-
Download the file for your system:
...-win64.exefor Windows,...-arm64-macOS.pkgor...-x86_64-macOS.pkgfor a Mac,...-linux-x86_64.debor...-linux-aarch64.debfor Debian and Ubuntu. -
Install it. On Debian or Ubuntu:
sudo dpkg -i <package-name>On Windows, the manual says to install into a folder of its own, such as
C:\WSJTX, not intoC:\Program Files. For any 64-bit Linux there is also an AppImage file that needs no installation. -
Set the clock (section 5).
Set the options
- Start WSJT-X. In the File menu, select Settings. On a Mac, select Preferences in the WSJT-X menu.
- On the General tab, enter
<CALL>and<LOCATOR>under Station Details. Select your IARU Region: 1 is Europe, Africa, the Middle East and northern Asia. 2 is the Americas. 3 is southern Asia and the Pacific. - On the Radio tab, set Rig to
None. WSJT-X then does not control the radio: you tune it by hand. - On the Audio tab, select the Input device that carries the receiver’s sound. The device must sample at 48000 Hz, 16 bits. Leave Output on a device that is not connected to the radio.
- On the Reporting tab, leave Enable PSK Reporter Spotting off for now.
- Click OK.
Receive FT8
-
In the Mode menu, select FT8.
-
Select the band in the band control, so that the frequency in WSJT-X agrees with the receiver’s dial.
-
Click Monitor if it is not green.
Result: the status bar shows
Receiving, and the waterfall (the Wide Graph window) scrolls. -
Set the level. Use the receiver’s gain control or the computer’s input level. With no signals, the scale at the lower left of the main window must read about 30 dB.
-
Wait for the end of the next 15-second slot.
Result: lines appear in the left window, Band Activity. Each line is one decode. Section 8 says how to read a line.
Receive FT4 and WSPR
-
For FT4: select FT4 in the Mode menu. Tune the receiver to the FT4 frequency of the band (section 4). The slots are 7.5 seconds long.
-
For WSPR: select WSPR in the Mode menu. Tune the receiver to the WSPR frequency of the band, for example 10.1387 or 14.0956 MHz.
-
Click Monitor. One WSPR receiving period is 2 minutes.
-
Leave Enable Tx off. If the window shows the control Tx Pct, set it to 0.
Result: at the end of each 2-minute period, WSJT-X lists the beacons that it decoded.
With an SDR in place of a receiver
I did not run this. The principle: an SDR program tunes the SDR to the dial frequency in upper sideband and makes sound. A “virtual audio cable” program carries that sound to the audio input of WSJT-X. Every other step in this section stays the same. You must find an SDR program and a virtual audio cable for your system. I name none, because I tested none.
7. Path B: every band with ka9q-radio
Receiver program: ka9q-radio. Its radiod service reads all of shortwave from the RX-888 Mk II. It gives each decoder its own channel on each band, over the computer’s internal network. Nothing here needs a screen.
First build the receiver. Follow the guide Shortwave receiver until systemctl is-active radiod@hf prints active. The same steps are in sections 4 and 11 of Build the station. The steps below start from there. They use the computer name hf and the settings file /etc/radio/radiod@hf.conf from those guides.
I ran these steps on Ubuntu Server 24.04 with ka9q-radio at commit b5bbb9aa (2026-09-25). The project changes every week. Where its files of 2026-10-10 differ from mine, the step says so.
The clock
- Install
chronyand read the clock error, as in section 5.
FT8 and FT4
Decoder: decode_ft8 from ka9q/ft8_lib, free and open source (MIT licence). The method is in the project’s docs/ft8.md. Two recorders write one short sound file for each band and each slot. The decoder reads each file, writes its decodes to a log, and deletes the file.
-
Build the decoder.
cd ~ && git clone https://github.com/ka9q/ft8_lib.git && cd ft8_lib make && sudo make install ls /usr/local/bin/decode_ft8Result: the last command prints
/usr/local/bin/decode_ft8. -
Give
radiodthe channels. In/etc/radio/radiod@hf.conf, add the linedisable = yesto the section[FT8]. Then add the project’s two channel files at the end.cd ~/ka9q-radio/config/examples/fragments cat ft8.conf ft4.conf | sudo tee -a /etc/radio/radiod@hf.conf >/dev/null -
Delete every frequency above 30 MHz from the lines you added. In the files of 2026-10-10 these are
50m310in the section[ft8-30-12-6m]and50m318000in the section[FT4]. Keep the quote marks around the frequencies that stay.The receiver cannot hear those frequencies at 64.8 MS/s. It would report false stations.
-
Check that the two settings files of the recorders exist.
make installdoes not write to/etc/radio/.cat /etc/radio/ft8-decode.conf /etc/radio/ft4-decode.confResult: two lines for each mode. If a file is missing, create it with
sudoeditand these lines (for FT4, writeft4in both lines).MCAST=ft8.local DIRECTORY=/var/lib/ka9q-radio/ft8 -
Start the recorders and the decoders.
sudo systemctl restart radiod@hf sudo systemctl enable --now ft8-record ft4-record ft8-decode@1 ft4-decode@1 tail -f /var/log/ft8.logResult: new lines every 15 seconds on an open band. Press Ctrl+C to stop the display.
The channels are wider than a voice channel. On 20 m, for example, the FT8 channel covers 14.0711 to 14.102 MHz, so it also takes in the expedition frequency. One ft8-decode@1 is enough for every band, by the project’s document.
WSPR
Decoder: wsprd, part of WSJT-X, free and open source (GPL version 3). The wspr-decoded service of ka9q-radio records two minutes on each band and runs wsprd on each recording.
-
Install the decoder.
sudo apt install -y wsjtx ls /usr/bin/wsprdResult: the last command prints
/usr/bin/wsprd. This installs all of WSJT-X from Ubuntu’s package source. You use onlywsprd. -
Find the section
[WSPR]in/etc/radio/radiod@hf.conf. If itsfreqline holds a frequency above 30 MHz, delete that frequency. -
Make the two names agree. Read the
data =line in the section[WSPR]. Read theMCAST=line in/etc/radio/wspr-decode.conf.grep -A12 '^\[WSPR\]' /etc/radio/radiod@hf.conf | grep 'data' cat /etc/radio/wspr-decode.confResult: the same name in both, for example
wspr.local. If they differ, put the name from thedata =line afterMCAST=. Then runsudo systemctl restart radiod@hf. -
Start it.
sudo systemctl enable --now wspr-decoded grep -v DecodeFinished /var/log/wspr.log | tailResult: at the end of the next full 2-minute period, lines with a time, a level in dB, a frequency and a callsign. Expect about 10 stations an hour at night on an indoor loop, and far more outdoors.
The project’s WSPR section has 15 channels: the 11 WSPR frequencies of section 4, and also 3.5926, 5.2872, 5.3647 and 13.5539 MHz.2
8. Read a decode line
In every example below, a grey block stands for a callsign or a locator. I never print the callsign or the locator of a station that I heard.
WSJT-X, FT8 and FT4
UTC dB DT Freq Message
183015 -12 0.3 1436 ~ CQ ▒▒▒▒▒▒ ▒▒▒▒
183015 -3 0.1 872 ~ ▒▒▒▒▒▒ ▒▒▒▒▒▒ ▒▒▒▒
183030 -19 -0.2 2210 ~ ▒▒▒▒▒▒ ▒▒▒▒▒▒ -15
183045 -8 0.2 2210 ~ ▒▒▒▒▒▒ ▒▒▒▒▒▒ RR73
| Field | Meaning |
|---|---|
| UTC | The start of the slot |
| dB | Signal-to-noise ratio, measured against the noise in a 2500 Hz channel. A negative number is a signal weaker than that noise |
| DT | Time offset in seconds: how far the signal’s start is from your clock’s slot |
| Freq | The tone’s frequency in the sound, in Hz. Add it to the dial frequency to get the radio frequency |
~ |
The mode mark: ~ is FT8, + is FT4 |
| Message | See below |
A standard message has one of four forms. The four lines above show them in this order:
CQ, a callsign and a locator: a station calls any station. The locator has 4 characters.- Two callsigns and a locator: the second station answers the first.
- Two callsigns and a report such as
-15orR-15: the signal-to-noise ratio that one station measured for the other. - Two callsigns and
RRR,RR73or73: the end of the contact.
The first callsign is the station that is called. The second is the station that sends. RR73 is not a locator, although it has the shape of one. A ? at the end of a line means a decode with lower confidence.
WSJT-X and wsprd, WSPR
This is one line of /var/log/wspr.log on my station. WSJT-X shows the same fields in its window.
1830 -24 0.2 14.097059 0 ▒▒▒▒▒▒ ▒▒▒▒ 37
| Field | Meaning |
|---|---|
1830 |
UTC time of the start of the two minutes |
-24 |
Signal-to-noise ratio in dB, in a 2500 Hz channel. Here the signal is about 250 times weaker than that noise |
0.2 |
DT, the time offset in seconds |
14.097059 |
The signal’s frequency in MHz |
0 |
Drift: how far the frequency moved during the message, in Hz |
▒▒▒▒▒▒ ▒▒▒▒ |
The beacon’s callsign and its 4-character locator |
37 |
The power that the beacon states, in dBm. 37 dBm is 5 watts. This value is an example |
decode_ft8, FT8 and FT4 (path B)
2026/10/06 18:30:15 23 +0.42 14,075,436.0 ~ CQ ▒▒▒▒▒▒ ▒▒▒▒
| Field | Meaning |
|---|---|
2026/10/06 18:30:15 |
UTC date and time of the slot |
23 |
A score from the decoder. It is not a signal-to-noise ratio |
+0.42 |
The time offset in seconds |
14,075,436.0 |
The signal’s radio frequency in Hz |
~ and the rest |
The message, as above |
Use DT to check your clock
Look at the DT column of 20 lines. With an exact clock, the values scatter around zero. If most lines show the same large offset, for example near +1.5, your clock is wrong by that amount. This is my reading of the column. The manual calls DT a diagnostic value and gives no limit.
9. Report what you hear (optional)
Two public networks collect reports from receiving stations and draw them on a world map. PSK Reporter takes FT8, FT4 and other modes. WSPRnet takes WSPR. A sender anywhere can then see that your station heard it.
Your callsign and your locator become public. Each report carries
<CALL>,<LOCATOR>and<ANTENNA>. The map shows your station at that locator to everyone. A 6-character locator places you within a few kilometers. PSK Reporter says that it keeps the records as an archive, and that licensing authorities use them. If that is not acceptable, do not turn reporting on. Reception works the same without it.
Choose the name you report under
- With a licence: your callsign. I report with my callsign and a number after a dash. That keeps the receiver apart from my transmitting station.
- With no licence: PSK Reporter says that you do not need one. It asks you to pick a name with your country prefix on it. Its example has the form
<PREFIX>/SWL/<PLACE>. Choose a place name as wide as your region, not your town. - The antenna text is public too. Write the antenna type, and nothing about where it is.
Path A: WSJT-X to PSK Reporter
-
In Settings, on the General tab, check
<CALL>and<LOCATOR>. PSK Reporter asks for a locator of at least 6 characters. -
On the Frequencies tab, enter
<ANTENNA>for each band in the Station Information table. -
On the Reporting tab, select Enable PSK Reporter Spotting.
-
Click OK. Leave Monitor on.
-
After 10 minutes, open https://pskreporter.info, follow its link to the map, and search for
<CALL>.Result: your station is on the map, with lines to the stations you heard.
WSJT-X reports only standard messages that hold the sender’s callsign and its locator. Most of those are CQ messages. So the map shows fewer stations than your Band Activity window.
Path A: WSJT-X to WSPRnet
In WSPR mode the main window has a box Upload spots. Its help text says: “Upload decoded messages to WSPRnet.org”. The manual says that WSJT-X can upload WSPR reports to WSPRnet automatically. I did not run this, and I could not confirm if WSPRnet needs an account for it.
Path B: the logs to PSK Reporter
Uploader: ftlib-pskreporter. It is a service that reads the decoder’s log and sends the reports. Its author runs PSK Reporter and wrote it for ka9q-radio.
-
Install the uploader.
cd ~ && git clone https://github.com/pjsg/ftlib-pskreporter.git && cd ftlib-pskreporter sudo apt install -y python3-docopt sudo install -m 755 pskreporter-sender /usr/local/bin/ sudo install -m 644 pskreporter.py /usr/local/lib/python3.12/dist-packages/ sudo cp pskreporter@.service /etc/systemd/system/ sudo cp ft8-pskreporter.conf ft4-pskreporter.conf /etc/radio/ -
Enter your values in both files. The files come with the author’s example values: replace all three.
sudoedit /etc/radio/ft8-pskreporter.conf /etc/radio/ft4-pskreporter.confFILE=/var/log/ft8.log MODE=ft8 CALLSIGN=<CALL> LOCATOR=<LOCATOR> ANTENNA="<ANTENNA>"The locator needs at least 6 characters here.
-
Start the two services.
sudo systemctl daemon-reload && sudo systemctl enable --now pskreporter@ft8 pskreporter@ft4 sudo ss -tnp | grep 4739Result: a line with an open connection. That means the service uploads.
Facts to know:
- The uploader reports a station only from a CQ message, or from a message with two callsigns and a locator.
- The reports of FT8 and FT4 carry no signal strength. The decoder’s number is a score, not a measurement.
- The uploader has an option
--no-send, which prints the reports and sends nothing. I did not use it.
Path B: WSPR reports
There are three ways, and I ran none of the public ones.
| Way | Goes to | State |
|---|---|---|
ftlib-pskreporter with its file wspr-pskreporter.conf and the service pskreporter@wspr |
PSK Reporter | Its README lists WSPR. I did not test it |
| wsprdaemon | WSPRnet | The usual public program. It installs and manages its own copy of ka9q-radio, so do not add it to this build without a plan |
| A small program of my own | WSPRnet | Not public |
10. Read band openings from the counts
Each decode proves that one path was open on one band at one moment. So a count of decodes for each band and each hour is a picture of the bands. You need no map for it.
Path A
WSJT-X shows the number of decodes of the last slot in its status bar. Write that number down for the same band at several hours of a day. To compare bands, change the band every few minutes and write each number down. With reporting on, the PSK Reporter map shows the stations that <CALL> heard.
Path B
The log has every band at once. This command counts today’s FT8 decodes for each UTC hour and each band. I wrote it for this guide and tested it on example lines only.
grep "^$(date -u +%Y/%m/%d)" /var/log/ft8.log \
| awk '{split($2,t,":"); f=$5; gsub(",","",f); printf "%s UTC %2d MHz\n", t[1], f/1e6}' \
| sort | uniq -c
Result: one line for each hour and band, with the count in front, for example 1250 18 UTC 14 MHz. The band appears as its frequency in whole MHz: 14 is 20 m.
What the counts show
On my station, one day in October with the loop indoors gave these numbers (rounded):
| What | Count in one day |
|---|---|
| FT8 decodes | 76,500 |
| FT4 decodes | 4,200 |
| WSPR decodes | 4,300 |
| Different stations | About 3,100 |
| Bands with decodes | 10, from 160 m to 10 m |
How to read your own counts:
- High bands by day, low bands at night. On that day, 20 m to 10 m had decodes from about 7 am to 9 pm local time only. 160 m and 80 m had decodes from about 6 pm to 8 am only.
- The logs are in UTC. Convert to local time before you compare with sunrise and sunset.
- A count is not a number of stations. One station that calls CQ for an hour gives hundreds of decodes.
- Compare a band with itself. A busy band such as 20 m always has more decodes than 160 m. Look at each band’s own busiest hour and its own empty hours.
- Zero has two meanings. The band is closed, or nobody sends. WSPR beacons run all day, so WSPR answers that question better than FT8.
- It changes. Shortwave changes with the sun, the season and the time of day. Keep one normal day as your baseline, and compare with it.
11. Run it unattended
Path A
- Turn the computer’s sleep mode off. A sleeping computer decodes nothing.
- Leave WSJT-X open with Monitor green.
- To hop between bands in WSPR mode, WSJT-X needs a radio that it controls. That is outside this guide.
Path B
The command systemctl enable --now in section 7 already makes every service start with the computer. Two more things:
-
In the PC’s firmware settings, set it to start again after a power cut.
-
Check the services after each restart of the computer.
systemctl status ft8-record 'ft8-decode@*' wspr-decodedResult: each service shows
active (running).
If the decoders stop while the recorders run, sound files collect in /var/lib/ka9q-radio/ft8. The decoders work through them after a restart. To restart only the services that already run:
sudo systemctl try-restart ft8-record 'ft8-decode@*'
12. Check that it works
- The clock. Run
chronyc tracking(Linux). Pass:System timefar below 1 second. Wait: one minute after the service starts. - The sound (path A). The waterfall shows short vertical streaks about 50 Hz wide that start and stop together. Pass: streaks in several places from 200 to 3000 Hz. Wait: 30 seconds.
- The first FT8 decode. Pass: one or more lines after a slot ends, on 14.074 MHz by day or 7.074 MHz at night. Wait: up to 5 minutes on an open band.
- DT. Pass: the DT values of 20 lines scatter around zero (section 8).
- WSPR. Pass: one or more lines with a callsign and a locator. Wait: up to 30 minutes. A beacon does not send in every slot.
- Every band (path B). Run
tail /var/log/ft8.log /var/log/wspr.log. Pass: new FT8 lines every 15 seconds on an open band, and new WSPR lines every 2 minutes. - Reports (optional). Pass: your station on the PSK Reporter map. Wait: 10 minutes or more.
Then write down the number of decodes in one normal day. That number is your baseline. Change one thing at a time, and compare with it.
13. If it does not work
| Symptom | Likely cause | What to do |
|---|---|---|
| The waterfall shows signals, and nothing decodes | The clock is wrong by more than about 1 second | Section 5. Then look at DT |
| Every line has the same large DT | The clock is wrong by that amount | Section 5 |
| No decodes, and the waterfall is empty or one flat color | No sound reaches the program, or the level is far too low or too high | Select the right Input device. Set the noise level to about 30 dB |
| Signals on the waterfall, cut off above about 2.7 kHz | The receiver’s filter is a standard SSB filter | Normal. Use a wider filter if the receiver has one |
| No decodes, and the receiver is in LSB, AM or CW | Wrong mode | Set upper sideband (USB) |
| Decodes on FT8, none on WSPR | The receiver is not on the WSPR dial frequency, or its dial may be off frequency | Section 4. All WSPR signals sit in a slice 200 Hz wide |
| A band is empty at noon, or at midnight | The band is closed at that hour | Normal. Try 20 m by day and 40 m at night |
Path B: /var/log/wspr.log stays empty |
The name after data = and the name after MCAST= differ |
Step 3 of “WSPR” in section 7 |
Path B: /var/log/ft8.log stays empty, and the recorders run |
The file /etc/radio/ft8-decode.conf is missing, or radiod was not restarted |
Steps 4 and 5 of “FT8 and FT4” in section 7 |
| Path B: stations on 6 m or 2 m in the log | A frequency above 30 MHz is still in the channel list. Those decodes are false | Step 3 of “FT8 and FT4” in section 7 |
| Path B: shortwave is full of signals that should not be there | No 30 MHz low-pass filter, so signals above 32.4 MHz fold back | Fit the filter: see the receiver guide |
| Path B: the uploader runs, and the map shows nothing | The locator has fewer than 6 characters, or the example values are still in the file | Edit the ...-pskreporter.conf files. Restart the two services |
| The map shows fewer stations than your log | Only messages with a callsign and a locator make a report | Normal |
| Few decodes, and many signals on the waterfall | The receiver overloads, or electrical noise from the house covers the weak signals | Reduce the gain. Move the antenna away from the house’s electronics |
14. What I did wrong
- My loop is still indoors. It sits near the computer, which is the worst place for it. It still heard about 3,100 stations in one day, and about 180 of them more than 5,000 miles away. Outdoors it will hear more. Do not wait for a good antenna to start.
- Two names did not agree. After the install, the WSPR channel name in the receiver’s settings and the name in the decoder’s settings differed. Nothing was decoded, and no error appeared. Check both names first.
- I left frequencies above 30 MHz in the list. The receiver cannot hear them at my sample rate. The decoder reported stations there anyway. They were false.
- I read the FT8 number as a signal strength. The number that
decode_ft8prints is a score. Onlywsprdand WSJT-X give a signal-to-noise ratio. - I counted decodes as stations. One station gives many decodes. Count different callsigns if you want stations, and keep that list private.
15. Not run and not confirmed
- All of path A. My station does not run WSJT-X as a receiving program. Every step in section 6 and the WSJT-X steps in section 9 come from the WSJT-X manual and its source code, read on 2026-10-10.
- The manual I read is ahead of the release. The online manual describes version 3.2. The latest release is 3.0.2. A label or a tab may differ in your copy.
- WSJT-X with an SDR and a virtual audio cable. Not run. I name no programs for it.
- The RTL-SDR Blog V4L and the Airspy HF+ Discovery on shortwave. Not run. The price of the Airspy HF+ Discovery: not checked.
- That WSJT-X accepts a receive-only name in place of a callsign. PSK Reporter describes such names. I did not test one in WSJT-X.
- That PSK Reporter accepts a 4-character locator. It asks for 6 or more.
- Tx Pct at 0. I recall that 0 means “never transmit”. The manual does not say so. Keep Enable Tx off in any case.
- The exact columns of the WSJT-X windows. The examples in section 8 follow the manual’s list of fields. The spacing and the time format may differ.
- The DT rule in section 8. It is my reading. The manual gives no limit for DT.
- Every waiting time in sections 6, 9 and 12, and the audio range of 200 to 3000 Hz. They are my estimates.
- The name and place of the macOS time setting, and of the map link on the PSK Reporter page. I did not open either on a screen.
- WSPRnet. Its rule for a listener with no callsign, and if an upload needs an account. Its site refused my reader on 2026-10-10. I saw only its map page.
- The Meinberg NTP steps on Windows, and the accuracy of the macOS time setting. Not run.
- How my own
hfcomputer keeps its time. I did not check this for the guide. Thechronycommands come from its documentation. - The newest ka9q-radio. I built commit
b5bbb9aa. The newest commit on 2026-10-10 is71832bef. The project also offers ready-made packages. I did not use them. - Step 4 of “FT8 and FT4” in section 7. The project’s document says that
make installdoes not write to/etc/radio/. I did not check on a new computer if the two files are there after the install. - The WSPR path to PSK Reporter,
--no-send, and wsprdaemon. Not run. - The count command in section 10. Tested on example lines, not on my station’s log.
- Log rotation. The ka9q-radio source has rotation files for the three logs. I did not confirm that the install puts them in place.
- The price of the RX-888 Mk II. I found no seller page I could read. Read https://www.rx-888.com before you buy.
- No step in this guide was run on a new, empty computer as written. The path B settings are the ones on my station, checked against each project’s documents.
16. Sources
All were read on 2026-10-10, except where a date is given.
The modes and WSJT-X. Home page: https://wsjtx.github.io/wsjtx/index.html · Downloads: https://wsjtx.github.io/wsjtx/downloads.html · User Guide: https://wsjtx.github.io/wsjtx/guide-full.html (sections System Requirements, Installation, Settings, Transceiver Setup, WSPR Mode, On-Screen Controls, Decoded Lines, Protocol Specifications) · Source: https://github.com/WSJTX/wsjtx (models/FrequencyList.cpp at tag v3.0.2, widgets/mainwindow.ui) · The older User Guide for version 2.7.0: https://wsjt.sourceforge.io/wsjtx-doc/wsjtx-main-2.7.0.html · The paper by the authors of the modes, not read again for this guide: https://wsjt.sourceforge.io/FT4_FT8_QEX.pdf
Path B. https://github.com/ka9q/ka9q-radio (read docs/ft8.md, docs/INSTALL.md, config/examples/fragments/ft8.conf, ft4.conf and wspr.conf, config/ft8-decode.conf, config/ft4-decode.conf, config/wspr-decode.conf, service/wspr-decoded.service.in) · https://github.com/ka9q/ft8_lib (README and decode_ft8.c) · https://github.com/pjsg/ftlib-pskreporter (README, pskreporter-sender, pskreporter@.service, the .conf files) · https://github.com/rrobinett/wsprdaemon
The clock. chrony, the chronyc manual: https://chrony-project.org/doc/4.5/chronyc.html
Reporting. PSK Reporter: https://pskreporter.info and https://pskreporter.info/pskdev.html · WSPRnet: https://www.wsprnet.org (map page only)
My station. The commands of path B are those of Build the station, sections 11, 13 and 14, checked against my station on 2026-10-07. The counts are from one day, 2026-10-06, rounded.
Parts. The maker or seller page linked from each row of section 2. Prices as listed on 2026-10-07.
Rules. 47 U.S.C. 605: https://www.law.cornell.edu/uscode/text/47/605, read on 2026-10-07.
Footnotes
-
The WSJT-X list has no WSPR frequency for 60 m. The ka9q-radio channel file listens on 5.2872 and 5.3647 MHz. The rules for 60 m differ from country to country. ↩
-
The 15 are: 0.136, 0.4742, 1.8366, 3.5686, 3.5926, 5.2872, 5.3647, 7.0386, 10.1387, 13.5539, 14.0956, 18.1046, 21.0946, 24.9246 and 28.1246 MHz. The frequency 13.5539 MHz is not in an amateur band. ↩