FT8 Commander
Because this might be a controversial subject for some, please read the note below before reading the rest of the article.
For countries outside of the United States of America, consult your local rules.
FCC Part 97 about station control.
ยง97.109 Station control.
(d) When a station is being automatically controlled, the control operator need not be at the control point. Only stations specifically designated elsewhere in this part may be automatically controlled. Automatic control must cease upon notification by a Regional Director that the station is transmitting improperly or causing harmful interference to other stations. Automatic control must not be resumed without prior approval of the Regional Director.
WSJT-X is a popular software ham radio operators use to communicate using digital modes such as FT8, JT65, and FT4. With the automation of WSJT-X, operators can now set up the software to operate independently, with no need for manual intervention. With automation, the operator can program goals such as "contact" or "don't contact" stations from a specific continent, country, or grid square. The software can monitors the bands 24/7. When the DX station calls, the software tries to reach that rare station. The operator does not have to be near the radio for the contact to be made.
WSJT-X already runs most of the exchange automatically. Human intervention is necessary to select who to call from the list of stations calling CQ and click on the OK
button to log the contact once the exchange is done. These two tasks could easily and more efficiently be done by software.
I wrote a software called FT8 Commander to control WSJT-X and manage the entire calling process. The software listens for any stations calling CQ and automatically calls back the station depending on the criterium defined by the user.
Typical exchange
In the following log, we see a typical FT8 Commander exchange. The software replies to the calling station DU4DXT.
The transmission is stopped when DU4DXT replies to JK1OUD. Once the exchange with JK1OUD is over, the software calls DU4DXT again, then stops because DU4DXT is responding to YB7DBP. This happened several times until DU4DXT finally takes our call, and the QSO is logged.
07:21:59 - INFO[154] - Calling: DU4DXT, From: Philippines, SNR: -11, Distance: 11126
07:22:59 - INFO[127] - Stop Transmit: DU4DXT Replying to JK1OUD
07:26:29 - INFO[154] - Calling: DU4DXT, From: Philippines, SNR: -7, Distance: 11126
07:26:56 - INFO[127] - Stop Transmit: DU4DXT Replying to YB7DBP
07:28:59 - INFO[154] - Calling: DU4DXT, From: Philippines, SNR: -4, Distance: 11126
07:29:56 - INFO[127] - Stop Transmit: DU4DXT Replying to N5BGQ
07:32:59 - INFO[154] - Calling: DU4DXT, From: Philippines, SNR: -4, Distance: 11126
07:33:26 - INFO[127] - Stop Transmit: DU4DXT Replying to AF5CC
07:35:59 - INFO[154] - Calling: DU4DXT, From: Philippines, SNR: -7, Distance: 11126
07:36:26 - INFO[127] - Stop Transmit: DU4DXT Replying to KE6MYA
07:38:29 - INFO[154] - Calling: DU4DXT, From: Philippines, SNR: -5, Distance: 11126
07:38:56 - INFO[127] - Stop Transmit: DU4DXT Replying to WB6RHC
07:42:29 - INFO[154] - Calling: DU4DXT, From: Philippines, SNR: -1, Distance: 11126
07:44:00 - INFO[116] - Logged call: DU4DXT, Grid: PK23, Mode: FT8
Plugins
An operation goal is defined by a series of plugins. For example, I have a plugin that calls back any station calling CQ. When several stations call simultaneously, the station with the strongest signal is selected. This increases the chances of making contact. With this plugin, a significant amount of random contacts can be made quickly.
I have written other plugins to contact specific locations such as continent, country, CQ zone, ITU zone, or Maidenhead grid square.
To ensure your exchanges can be confirmed, the user can ask the software to only reply to stations with a LOTW account and ignore everyone else.
The plugins are written in Python, and it is easy for anyone to write their own plugin.
The challenge: 100 countries with 10 watts
I wanted to see how long it would take to contact 100 countries using automated software and only 10 watts. For that challenge, I wrote a plugin that replies to any call from any country I haven't worked at least 4 times before. 4 is to increase the chances of having a valid confirmation.
I started my challenge on March 6, 2023, when the 10-meter band was wide open. Unfortunately, the next day the band began to close, and with only 10 watts, contacting faraway countries became harder. Also, to make things more difficult, during those 2 weeks, I had to stop transmitting because a storm hit California and caused a 2 days power outage.
The software worked 2/3 of the 100 countries in the first couple of days. Then it became a game of patience. For the rest of the 2 weeks, the software monitored the band listening for any call from a country that wasn't already in the log. Two weeks later, I had contacted 105 countries.
The only thing that wasn't automatic was the band selection. Every once in a while, I looked at the following graphs to see what band was active. Depending on the activity, I manually changed bands. It would be easy to add in the software the capability to automatically select the band based on activity.


The following video shows the evolution of the band in North America over the last 5 days of the challenge. Other videos are available on bsdworld.org as well as band activity graphs.
The software
The software's source code that I wrote can be found on my github account. It comes as is, with no warranty and no support. It is intended for experimenters who know their way around computers. I wrote it on MacOS, and I have also tested it on Linux.
If you use this code, especially when developing new plugins or fixing bugs, send me an email or a note. I am interested in seeing what kind of plugin ideas brilliant people have.
Conclusion
FT8 automation has become increasingly popular among amateur radio operators. Some pieces of logging software, such as, RUMlogNG, DXLab Suite and WSJT-Z, are already capable of automatically calling stations. WSJT-X has a UDP API that enables automating many of the tasks involved in operating FT8. The automation of FT8 has also sparked debates amongst operators. Some argue that automation takes away from the traditional skills of radio operation.
The ARRL prohibits automated contacts in general and for DXCC awards. I think it is a lost battle. The ARRL has no way to verify end enforce that rule. I already know several hams who used software automation to work the few countries they were missing to claim their DXCC award.
I like FT8. It is a highly efficient mode of communication that uses advanced DSP1 techniques to extract signals well below the noise floor. It is a great mode to make impossible contacts, such as EME for example. It is also great for propagation analysis or antenna testing. I also don't think FT8 should be allowed for contests or Field Day. Operating FT8 in these conditions requires no skills, only more power and bigger antennas. A basic piece of software could work 100 countries in 2 weeks with 10 watts and a vertical antenna. I could have done it in one week with a better antenna and more power.
I dream of going on a DXpedition and having my computer working hundreds of stations worldwide while sipping Margaritas next to the swimming pool.
Miscellaneous tools for MacOS users
Logging
If you are using MacOS, the following AppleScript automatically clicks OK
as soon as the WSJT-X Logging windows appear.
Both scripts below will stop running if the screen locks
#
# Click the OK button on the WSJT-X Logging window
# Works with WSJT-X 2.6.1
#
tell application "wsjtx" to activate
say "w s j t x is active"
tell application "System Events"
repeat
tell application process "WSJT-X"
set winList to every window
end tell
repeat with win in winList
tell application "System Events"
get entire contents of win
end tell
set theTitle to name of win
if theTitle contains "Log QSO" then
tell application process "WSJT-X"
click button "Ok" of group 1 of win
end tell
say "Contact Logged"
end if
end repeat
delay 2
end repeat
end tell
Calling CQ
The following AppleScript calls CQ and logs any contact.
Courtesy of my friend JC (W6IPA)
The original version can be found on gist.
# Set Alternate F1-F6 bindings
# TX Watchdogs 3 Min
# Hold TX Freq
# CQ:Max Dist
# tested on WSJT v2.6.1
set bundleId to "org.k1jt.wsjtx"
tell application id bundleId to activate
set txPause to false
set txWD to false
set lastLog to ""
tell application "System Events"
repeat
tell application process "WSJT-X"
set winList to every window
set frontmost to true
end tell
repeat with win in winList
set theTitle to name of win
if theTitle contains "Log QSO" then
tell application process "WSJT-X"
set call to value of text field "Call" of win
if call is not lastLog then
click button "Ok" of group 1 of win
set lastLog to call
else
click button "Cancel" of group 1 of win
end if
end tell
say "Contact Logged"
set txPause to true
else if theTitle starts with "WSJT-X" and theTitle does not contain "Wide Graph" then
tell application process "WSJT-X"
perform action "AXRaise" of win
set chkBox to value of checkbox "Enable Tx" of win as boolean
if value of item 1 of static text of static text 8 of win starts with "Runaway" then
set txWD to true
else
set txWD to false
end if
end tell
if not chkBox then
if txPause and not txWD then delay 20
tell application process "WSJT-X"
click button "Set Rx frequency to Tx Frequency" of group 1 of win
end tell
say "Calling CQ"
tell application "System Events" to key code 122
end if
end if
delay 1
end repeat
delay 5
end repeat
end tell
-
Digital Signal Processing ↩