# WSPR and FT8

At the end you have a computer that decodes WSPR, FT8 and FT4 from shortwave and writes one line for each message. You can count those lines to see which bands are open. You never transmit.

Spurious Emissions · Rev A · checked 2026-10-10 · https://spurious-emissions.net/guides/receive-wspr-ft8/

Some links are affiliate links: if you buy through them, I may earn a commission at no extra cost to you. As an Amazon Associate I earn from qualifying purchases.

## 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 `wsprd` and `decode_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](https://www.rtl-sdr.com/buy-rtl-sdr-dvb-t-dongles/) | 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](/guides/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](https://opensourcesdrlab.com/products/rx888-mkii-16bit-sdr-receiver-radio-ltc2208-adc-upgrade-rx888?DIST=QU5PHQ%3D%3D), 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](https://www.amazon.com/dp/B095K89WND?tag=spuriousemiss-20) with its power injector | Antenna | SMA | See listing, Amazon | Any shortwave antenna works |
| ☐ | ◆ [Turn Island Systems F3060](https://turnislandsystems.com/product/f3060-filter-shelf-30-60-mhz-lpf/) low-pass filter | Stops signals above 30 MHz | SMA | $80, Turn Island Systems | Required at 64.8 MS/s |
| ☐ | ◆ [TAPR RF Limiter](https://tapr.org/product/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 list[^60m] |
| 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

1. Install the clock service `chrony`.

   ```bash
   sudo apt install -y chrony
   ```

2. Wait one minute. Then read the clock error.

   ```bash
   chronyc tracking
   ```

   Result: a line `System time : 0.000... seconds slow of NTP time` (or `fast`). The number must be far below 1 second. The line `Leap status : Normal` shows 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](https://wsjtx.github.io/wsjtx/index.html), 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

1. Connect the antenna to the receiver.
2. Connect the audio path from the receiver to the computer.
3. Set the receiver to upper sideband (USB or USB Data).
4. Set the widest filter that the receiver has in that mode, up to about 5 kHz.
5. Turn the receiver's automatic gain control (AGC) off, or reduce its RF gain. The manual says this is usually best.
6. 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

1. Open the [WSJT-X downloads page](https://wsjtx.github.io/wsjtx/downloads.html). The installers are on GitHub: the page says that is the only official source.
2. Download the file for your system: `...-win64.exe` for Windows, `...-arm64-macOS.pkg` or `...-x86_64-macOS.pkg` for a Mac, `...-linux-x86_64.deb` or `...-linux-aarch64.deb` for Debian and Ubuntu.
3. Install it. On Debian or Ubuntu:

   ```bash
   sudo dpkg -i <package-name>
   ```

   On Windows, the manual says to install into a folder of its own, such as `C:\WSJTX`, not into `C:\Program Files`. For any 64-bit Linux there is also an AppImage file that needs no installation.

4. Set the clock (section 5).

### Set the options

1. Start WSJT-X. In the File menu, select Settings. On a Mac, select Preferences in the WSJT-X menu.
2. 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.
3. On the **Radio** tab, set **Rig** to `None`. WSJT-X then does not control the radio: you tune it by hand.
4. 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.
5. On the **Reporting** tab, leave **Enable PSK Reporter Spotting** off for now.
6. Click OK.

### Receive FT8

1. In the Mode menu, select **FT8**.
2. Select the band in the band control, so that the frequency in WSJT-X agrees with the receiver's dial.
3. Click **Monitor** if it is not green.

   Result: the status bar shows `Receiving`, and the waterfall (the Wide Graph window) scrolls.

4. 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.
5. 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

1. 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.
2. 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.
3. Click **Monitor**. One WSPR receiving period is 2 minutes.
4. 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](https://github.com/ka9q/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](/guides/shortwave-receiver/) until `systemctl is-active radiod@hf` prints `active`. The same steps are in sections 4 and 11 of [Build the station](/guides/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

1. Install `chrony` and read the clock error, as in section 5.

### FT8 and FT4

Decoder: `decode_ft8` from [ka9q/ft8_lib](https://github.com/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.

1. Build the decoder.

   ```bash
   cd ~ && git clone https://github.com/ka9q/ft8_lib.git && cd ft8_lib
   make && sudo make install
   ls /usr/local/bin/decode_ft8
   ```

   Result: the last command prints `/usr/local/bin/decode_ft8`.

2. Give `radiod` the channels. In `/etc/radio/radiod@hf.conf`, add the line `disable = yes` to the section `[FT8]`. Then add the project's two channel files at the end.

   ```bash
   cd ~/ka9q-radio/config/examples/fragments
   cat ft8.conf ft4.conf | sudo tee -a /etc/radio/radiod@hf.conf >/dev/null
   ```

3. Delete every frequency above 30 MHz from the lines you added. In the files of 2026-10-10 these are `50m310` in the section `[ft8-30-12-6m]` and `50m318000` in 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.

4. Check that the two settings files of the recorders exist. `make install` does not write to `/etc/radio/`.

   ```bash
   cat /etc/radio/ft8-decode.conf /etc/radio/ft4-decode.conf
   ```

   Result: two lines for each mode. If a file is missing, create it with `sudoedit` and these lines (for FT4, write `ft4` in both lines).

   ```ini
   MCAST=ft8.local
   DIRECTORY=/var/lib/ka9q-radio/ft8
   ```

5. Start the recorders and the decoders.

   ```bash
   sudo systemctl restart radiod@hf
   sudo systemctl enable --now ft8-record ft4-record ft8-decode@1 ft4-decode@1
   tail -f /var/log/ft8.log
   ```

   Result: 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.

1. Install the decoder.

   ```bash
   sudo apt install -y wsjtx
   ls /usr/bin/wsprd
   ```

   Result: the last command prints `/usr/bin/wsprd`. This installs all of WSJT-X from Ubuntu's package source. You use only `wsprd`.

2. Find the section `[WSPR]` in `/etc/radio/radiod@hf.conf`. If its `freq` line holds a frequency above 30 MHz, delete that frequency.
3. Make the two names agree. Read the `data =` line in the section `[WSPR]`. Read the `MCAST=` line in `/etc/radio/wspr-decode.conf`.

   ```bash
   grep -A12 '^\[WSPR\]' /etc/radio/radiod@hf.conf | grep 'data'
   cat /etc/radio/wspr-decode.conf
   ```

   Result: the same name in both, for example `wspr.local`. If they differ, put the name from the `data =` line after `MCAST=`. Then run `sudo systemctl restart radiod@hf`.

4. Start it.

   ```bash
   sudo systemctl enable --now wspr-decoded
   grep -v DecodeFinished /var/log/wspr.log | tail
   ```

   Result: 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.[^wspr15]

## 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:

1. `CQ`, a callsign and a locator: a station calls any station. The locator has 4 characters.
2. Two callsigns and a locator: the second station answers the first.
3. Two callsigns and a report such as `-15` or `R-15`: the signal-to-noise ratio that one station measured for the other.
4. Two callsigns and `RRR`, `RR73` or `73`: 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](https://pskreporter.info) takes FT8, FT4 and other modes. [WSPRnet](https://www.wsprnet.org) 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

1. In Settings, on the **General** tab, check `<CALL>` and `<LOCATOR>`. PSK Reporter asks for a locator of at least 6 characters.
2. On the **Frequencies** tab, enter `<ANTENNA>` for each band in the Station Information table.
3. On the **Reporting** tab, select **Enable PSK Reporter Spotting**.
4. Click OK. Leave **Monitor** on.
5. 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](https://github.com/pjsg/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.

1. Install the uploader.

   ```bash
   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/
   ```

2. Enter your values in both files. The files come with the author's example values: replace all three.

   ```bash
   sudoedit /etc/radio/ft8-pskreporter.conf /etc/radio/ft4-pskreporter.conf
   ```

   ```ini
   FILE=/var/log/ft8.log
   MODE=ft8
   CALLSIGN=<CALL>
   LOCATOR=<LOCATOR>
   ANTENNA="<ANTENNA>"
   ```

   The locator needs at least 6 characters here.

3. Start the two services.

   ```bash
   sudo systemctl daemon-reload && sudo systemctl enable --now pskreporter@ft8 pskreporter@ft4
   sudo ss -tnp | grep 4739
   ```

   Result: 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](https://github.com/rrobinett/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.

```bash
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

1. Turn the computer's sleep mode off. A sleeping computer decodes nothing.
2. Leave WSJT-X open with **Monitor** green.
3. 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:

1. In the PC's firmware settings, set it to start again after a power cut.
2. Check the services after each restart of the computer.

   ```bash
   systemctl status ft8-record 'ft8-decode@*' wspr-decoded
   ```

   Result: 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:

```bash
sudo systemctl try-restart ft8-record 'ft8-decode@*'
```

## 12. Check that it works

1. **The clock.** Run `chronyc tracking` (Linux). Pass: `System time` far below 1 second. Wait: one minute after the service starts.
2. **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.
3. **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.
4. **DT.** Pass: the DT values of 20 lines scatter around zero (section 8).
5. **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.
6. **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.
7. **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_ft8` prints is a score. Only `wsprd` and 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 `hf` computer keeps its time.** I did not check this for the guide. The `chrony` commands come from its documentation.
- **The newest ka9q-radio.** I built commit `b5bbb9aa`. The newest commit on 2026-10-10 is `71832bef`. 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 install` does 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](/guides/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.

[^60m]: 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.
[^wspr15]: 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.
