Digital modes
Two ways to get FT8, FT4, RTTY and similar into the log: a live relay from WSJT-X or JTDX, or a bulk ADIF import after the fact.
Live relay from WSJT-X / JTDX
WSJT-X broadcasts every logged QSO over UDP. A small relay script listens for those and posts them to EzFD, so digital QSOs appear in the shared log without anyone retyping them.
Windows
The logger offers a prepared .bat file with your event details already
filled in — click the DIG mode hint in the entry form, or the Import
ADIF dialog. Download and run it.
macOS and Linux
Download wsjtx-bridge.cjs from the same place and run it with Node:
$ node wsjtx-bridge.cjs --event-id <uuid> --api-url https://your-server --operator W0AAA
| Flag | Environment variable | Default |
|---|---|---|
--event-id |
EZFD_EVENT_ID |
required |
--api-url |
EZFD_API_URL |
http://localhost:3000 |
--operator |
EZFD_OPERATOR |
(empty) |
--station |
EZFD_STATION |
1 |
--port |
EZFD_UDP_PORT |
2237 |
--spool |
EZFD_SPOOL |
~/.ezfd/wsjtx-queue-<event-id>.jsonl |
If the server goes away
WSJT-X keeps logging whether or not EzFD is reachable, so the relay keeps a
queue. A contact the server can't take is written to the spool file above and
retried — after 5s, then 10s, 30s, 60s and 2 minutes — until it lands. The
relay prints queued (N waiting) when that happens and Synced N queued contact(s) when they go through.
The spool is a file, not memory: closing the relay or rebooting the machine doesn't lose it, and the next start drains whatever is still there. So an EzFD restart, an nginx reload or a flaky field network delays digital contacts rather than dropping them.
The one thing it won't retry is a contact the server refuses on purpose — a
4xx, such as an event ID that doesn't exist. Retrying can't fix that, so the
relay says rejected and moves on; the contact is still in WSJT-X's own
wsjtx_log.adi and can be brought in with an ADIF import.
Queued contacts keep the time WSJT-X logged them. The relay sends how long ago
that was, measured on this machine's clock when the contact goes out, and the
server dates the contact by its own clock minus that age, so a contact that
waited out an outage lands at the time it was made. The relay also sends the
dial frequency and the WSJT-X mode (FT8, FT4, ...), which the ADIF export
writes back out as FREQ and MODE. A contact queued by a relay older than
this change has no time recorded in the spool and is dated when it arrives.
Configuring WSJT-X
In Settings → Reporting, enable UDP Server on 127.0.0.1 port 2237
(the default) and tick "Accept UDP requests". The relay listens on that port.
Both WSJT-X and the relay must run on the same machine unless you point the UDP server at the relay's address deliberately.
ADIF import
Import ADIF, in the logger's ☰ menu under This event, accepts any .adi file — a WSJT-X log,
an N1MM export, N3FJP, or a hand-built file.
Records are matched to bands by the BAND field, falling back to FREQ.
Mode is mapped to the app's three buckets: CW stays CW, SSB/USB/LSB/FM/AM
become phone, everything else becomes digital. The file's own MODE and
FREQ are kept beside that, so an imported FT8 contact exports as FT8 on its
real frequency rather than as generic digital at the band's default. The
Field Day exchange is read from CLASS and ARRL_SECT, falling back to
SRX_STRING.
The whole file goes in as one transaction: if anything fails partway, nothing from that file is in the log and importing it again is safe.
Imports are idempotent. A record already in the log — matched on callsign, band, mode and a ±2 minute window — is skipped rather than inserted, so re-importing the same file or two operators importing overlapping exports can't double the log. The result reports four counts:
| Count | Meaning |
|---|---|
| imported | New QSOs added |
| dupes | Added, but flagged as duplicates under the event's dupe rule |
| already in log | Skipped as already present |
| skipped | Unusable: an unrecognised band, or a callsign that is not one |
The ±2 minute window exists because ADIF only carries minute resolution and loggers round differently.
Which to use
The relay is better during an event: QSOs appear live for everyone, and the band conflict and checkout views stay accurate. Import is better for merging a log made offline — which for a distributed special event is a normal workflow. See Special event stations.