Skip to content

requirementXYZ/DXCommand

Repository files navigation

DX Command 📡

A modern web dashboard for CW and FT8 operators chasing DXpeditions.

DX Command re-imagines the classic VE3NEA / DX Atlas tool family (Band Master, OmniRig, Morse Runner, Faros, DX Atlas, the WSJT-X ecosystem) as one dark-themed browser dashboard that talks to any radio supported by OmniRig.

Live DX spots Telnet cluster client plus Reverse Beacon Network, CW/FT8/FT4 classification, split-comment parsing (UP 2, QSX …)
Who hears them Every spot aggregates its spotters: continents + skimmer SNR — see at a glance if the band is open to you
Alerts Desktop notification + sound when a needed entity or watched call appears (spot or FT8 decode); quiet hours, "only heard by my continent", reviewable alert log
Click-to-tune One click sets frequency and mode and split on your rig via OmniRig
Band map Vertical ladder per band, CW/FT8 segments shaded, rig cursor, click to QSY
Slot matrix Click a DXpedition → band × mode grid of needed / worked / confirmed vs where it's been active, 24 h activity timeline, click-to-tune (Club Log style)
Needed DXCC ADIF import with auto-sync: watched log files re-import on change; QSL/LoTW fields mark slots confirmed
LoTW direct sync No export needed: pull worked QSOs and QSL confirmations straight from Logbook of the World (incremental, daily auto-sync or SYNC NOW in ⚙ SETUP)
DXCC table ☑ DXCC button: award-chart view of your standings — entities × bands, ✓ worked / ✓✓ confirmed, per-mode tooltips, mode filter, search, band totals
WSJT-X Live decode mirror with DXCC + needed colouring; double-click a decode → WSJT-X starts calling
Gray line World map with live solar terminator, clickable markers, time scrubber (where's the gray line at 0300Z?), great-circle path + azimuth
Band openings Per-band strip: spot rate + active DX continents in the last 30 min
NCDXF beacons Live 18-beacon schedule clock; click to listen (Faros heritage)
Solar data SFI / SSN / A / K / X-ray + band conditions (hamqsl.com)
Spot history SQLite persistence — spots survive restarts and feed the activity timelines (7-day retention)
CW Pileup Trainer Morse Runner-style pileups in the browser: full QSOs with 5NN + serial exchange copying, QSB/QRN/QRM realism, auto-ramping pileup depth, session scoring + local high-score table (Web Audio, works offline)
Demo mode Full simulation of rig + cluster + WSJT-X — try everything with no radio and no internet

Installation

Option A — Windows installer (recommended): download DXCommand-x64.msi from the latest GitHub release and run it. You get:

  • a Start Menu shortcut ("DX Command") and an entry in Apps & Features
  • a system-tray icon — double-click opens the dashboard; right-click for Open Dashboard / Start / Stop server / Exit
  • the dashboard opens as a seamless app window (no tabs or address bar, via your Chromium-based browser)
  • a heartbeat watchdog: close the dashboard window and the background server shuts itself down ~90 s later — nothing keeps running behind your back
  • your settings and data live in %LOCALAPPDATA%\DXCommand

Option B — portable exe: download DXCommand.exe from the same release, put it in a folder of its own and run it (config/data are created next to it; same app window + watchdog behaviour). (Build them yourself: build_exe.bat for the exe, installer\build.ps1 for the MSI — needs pip install pyinstaller pywin32 and WiX 5.)

Option C — from source:

  1. Install Python 3.11+ (tick "Add python to PATH").
  2. Get the code — either:
    git clone https://github.com/requirementXYZ/DXCommand.git
    cd DXCommand
    
    or on GitHub use Code → Download ZIP and extract it anywhere.
  3. Install the dependencies:
    pip install -r requirements.txt
    

Runs on Windows 10/11. OmniRig (for real rig control) and WSJT-X are optional — everything can be tried first in demo mode.

About the Windows SmartScreen warning

When you first run the MSI or the portable exe, Windows may show a blue "Windows protected your PC" dialog (Microsoft Defender SmartScreen), and some browsers may caution about the download. This is expected, and here is exactly why it happens:

  • DX Command is not code-signed. Code-signing certificates are issued to companies/individuals for an annual fee; independent ham-radio freeware very often ships unsigned, and SmartScreen flags any unsigned installer by default.
  • SmartScreen also weighs download reputation: a file few people have downloaded yet is treated as "unrecognised" regardless of its contents. As more operators install a given release, the warning tends to disappear on its own — and it resets with each new release, because every build is a new file to Windows.

The warning is a caution, not a virus detection. To proceed: click More info → Run anyway. If you'd rather not rely on trust alone, you have two good options: scan the file (right-click → Scan with Microsoft Defender, or upload it to VirusTotal) — or skip the binaries entirely and run from source (Option C), where every line that executes is in this repository for you to read.

Quick start (no radio needed)

Double-click run_demo.bat and open http://localhost:8073.

You get a fully working dashboard against a simulated radio, a simulated DX cluster running a Bouvet DXpedition pileup, and simulated WSJT-X Fox/Hound traffic. Click spots, watch the split light up, try the CW trainer.

Going live with your radio

All station settings live in the dashboard itself — click ⚙ SETUP (top right):

  • Callsign / grid — used for cluster login, azimuths and the map.
  • RadioDemo (simulated rig) or OmniRig Rig 1 / Rig 2.
  • DX spotsDemo feed or a real telnet cluster (host/port).
  • FT8 decodesDemo, WSJT-X UDP listener, or off.

Changes apply immediately (no restart) and persist to config.json. The 🧪 ALL DEMO / 📡 ALL LIVE buttons switch everything at once.

Prerequisites for live operation:

  1. Install OmniRig from https://dxatlas.com/omnirig/ and configure your rig (COM port, baud rate). Icom users: turn CI-V Transceive OFF in the radio.
  2. If you run WSJT-X: File → Settings → Reporting → UDP Server 127.0.0.1, port 2237 (defaults). DX Command listens on the same port.

    If another program (GridTracker, JTAlert) already claims port 2237, use WSJT-X secondary UDP or change the port in ⚙ SETUP.

  3. Double-click run.bat and open http://localhost:8073.

run_demo.bat always forces full simulation regardless of saved settings; run.bat honours whatever you last saved in ⚙ SETUP.

Operator smoke-test checklist (10 minutes)

  1. Rig link — header chip RIG ● green; turn the VFO: the dashboard frequency follows within ½ s. Change mode on the radio: dashboard follows.
  2. QSY from dashboard — type 14023.5 in the QSY box → radio moves; press a band button → radio moves to the CW segment of that band.
  3. Split — click a CW spot whose comment says UP …: radio should go split with TX offset shown in the orange SPLIT tag. Click an FT8 spot: split clears, mode DATA.
  4. Cluster — chip CLUSTER ● green and spots streaming within ~30 s of start. You must set your real callsign first — cluster nodes reject N0CALL (the dashboard shows a clear "rejected callsign" status if so). The client automatically sends SET/SKIMMER, SET/FT8, SET/FT4 after login so RBN/CW-skimmer and FT8 spots flow on CC Cluster nodes like VE7CC (configurable via cluster.init_commands in config.json).
  5. Needed flags — Import ADIF (top right) with your log export; worked slots lose their ★, "Needed only" filter shows the rest.
  6. WSJT-X — with WSJT-X decoding, decodes appear in the right panel; double-click a CQ → WSJT-X sets that DX call and (with Enable Tx armed) starts calling.
  7. Beacons — at hh:mm:00 with minutes divisible by 3, 14.100 shows 4U1UN (published NCDXF schedule). Click a beacon row and listen.
  8. Alerts — in the ALERTS panel enable desktop notifications (allow the browser prompt) and press ♪ to preview the sound. Add a call to the watch list and confirm you get an alert when it is next spotted.
  9. Slot matrix — click any DXpedition in the left panel: the band×mode grid should reflect your imported log (✓ worked, ✓✓ confirmed) and show ● where it has been spotted in the last 24 h; clicking an active cell tunes the rig.
  10. Log auto-sync — with WSJT-X installed, its wsjtx_log.adi is picked up automatically: log a QSO and watch a "Log synced" toast within ~30 s.

Anything off? Note the step number and send back console output from the black window.

Configuration reference (config.json)

{
  "callsign": "N0CALL",          // used for cluster login
  "grid": "IO95rj",              // your Maidenhead locator (azimuth/distance/map)
  "port": 8073,                  // web UI port
  "demo_mode": false,            // true = all simulators (or use run_demo.bat)
  "rig":     { "backend": "omnirig", "rig_number": 1, "poll_ms": 300 },
  "cluster": { "host": "dxc.ve7cc.net", "port": 23,
               "keep_modes": ["CW", "FT8", "FT4"] },   // drop SSB/RTTY spots
  "wsjtx":   { "enabled": true, "udp_port": 2237 },
  "spots":   { "max_age_min": 30, "max_count": 2000 },
  "watch_list": ["3Y0K"]         // calls that always alert & pin
}

Tip: point cluster.host at a local instance of VE3NEA's PskrDxClusterService (localhost:7309) for a very dense FT8 spot feed from PSK Reporter.

LoTW direct sync

In ⚙ SETUP → LoTW direct sync, enter your LoTW website username and password (the same login every logging program uses for LoTW downloads) and press ⟳ SYNC NOW — or tick daily auto-sync. Two reports are pulled from lotw.arrl.org: all QSOs you've uploaded (→ worked) and all QSLs received (→ confirmed ✓✓). Syncs are incremental after the first full download. Your LoTW password is encrypted at rest with Windows DPAPI, bound to your Windows user account: config.json stores only a dpapi: blob that cannot be decrypted on another machine or account, the server never sends the password back to the browser, and it is scrubbed from every error message. (A one-way hash is impossible here — the app must present the real password to lotw.arrl.org — so OS-level encryption is the correct protection.) Any plaintext password from an older version is migrated automatically on start.

  • data/cty.dat — full AD1C country file, downloaded automatically the first time the app runs an online configuration (including immediately when you SAVE & APPLY one in ⚙ SETUP). A bundled subset is used offline. Delete the file to force a refresh.
  • data/worked.json — your worked-slot state (rebuilt any time from ADIF import).
  • data/dxpeditions.json — optional: maintain your own DXpedition list here.

Tests

python -m pytest tests -q

65+ unit tests cover the cty.dat parser, spot parser/classifier, spot store, NCDXF beacon schedule, ADIF import & needed-tracking, the WSJT-X binary protocol (round-trip), and the simulated rig. The demo mode doubles as the integration harness: it exercises every code path except the COM/telnet/UDP edges themselves.

Architecture (short version)

Python 3.11 · FastAPI · one WebSocket for state, REST for commands · plain HTML/CSS/JS frontend, no build step. OmniRig is driven over COM from a dedicated STA thread; every external dependency (rig, cluster, WSJT-X, solar) has a simulator behind the same interface. See SPEC.md and PLAN.md for the full specification and heritage analysis.

Roadmap

Proposed next-release features, prioritised by operator value, live in ROADMAP.md — comments and issues welcome.

Disclaimer — no warranty, no support guarantee

DX Command is free software provided as-is, without warranty of any kind, express or implied (see sections 15 and 16 of the GPL-3.0 licence). In plain terms:

  • You operate your station; this software does not. DX Command can command your transceiver to change frequency, mode and split. You remain solely responsible for operating within your licence privileges, your national regulations and the band plans in force — including before you transmit.
  • Transmitting carries real risks — RF exposure, and damage to radios, amplifiers and antennas among them. Nothing here removes your responsibility to operate safely, and the authors accept no liability for injury, loss or damage to equipment, property or data arising from use of this software.
  • The information shown may be wrong. Spots, propagation figures, beacon timings, DXCC status and needed-flags come from third-party sources and heuristics; they can be incomplete, stale or simply incorrect. Treat the dashboard as an aid, never as authority — confirm what you work in your own log.
  • This is a hobby project, not a supported product. There is no service level, no guaranteed fixes and no obligation of response. Questions and bug reports are welcome in Discussions and will be looked at as time allows.
  • No affiliation. DX Command is independent of, and not endorsed by, ARRL (Logbook of the World), the NCDXF, Afreet Software / VE3NEA, country-files.com, hamqsl.com, NG3K, the Reverse Beacon Network, or any DX cluster operator. It simply interoperates with services they provide.

Use of this software is entirely at your own risk. If you do not accept that, please do not install it.

Credits

Functional heritage: Alex Shovkoplyas VE3NEA's outstanding freeware (https://dxatlas.com, https://github.com/VE3NEA) — Band Master, OmniRig, CW Skimmer, Morse Runner, Faros, HamCAP, DX Atlas. Solar data by Paul Herrman N0NBH (hamqsl.com). Country data by Jim Reisert AD1C (country-files.com). DXpedition data: Bill Feidt NG3K (ADXO). This project is an independent re-imagining, not affiliated with any of the above.

73 and good DX!

About

Modern web dashboard for CW and FT8 DXpedition chasers: DX cluster spots with needed-DXCC tracking, one-click OmniRig tuning with automatic split, WSJT-X integration, gray-line map, NCDXF beacon clock and a CW pileup trainer. A re-imagining of the VE3NEA / DX Atlas tool family.

Topics

Resources

Stars

Watchers

Forks

Releases

Sponsor this project

Packages

Contributors

Languages