docs(readme): restore it, and bring it up to date

THE README WAS GONE. A commit of mine last night replaced OpsLog's readme
with the text of the TCI protocol specification — 322 lines of ours for 77
of Expert Electronics' — and nobody noticed because nothing builds from
it. Restored from the commit before, then updated.

What it was missing, all of it shipped since: the Kenwood/Elecraft and
Yaesu CAT backends and their consoles, the SunSDR console, TCI audio in
both directions, CAT sharing over Hamlib rigctl or TCI, the Elecraft
KPA500/KPA1500 and the Tuner Genius XL, Cloudlog and HAMLOG uploads, the
RDA district work, the DXCC Challenge, the editable satellite list, four
main-view panes instead of two, and Esri basemaps in place of Carto.

Also a section on importing a log, which had none — including the rule
that matters most to somebody moving years of contacts across: a deleted
DXCC entity keeps the number the file gives it, because cty.dat only knows
where a callsign is today.
This commit is contained in:
2026-08-26 23:38:35 +02:00
parent 2fd9845b37
commit 23f425f95f
+398 -61
View File
@@ -1,77 +1,414 @@
# Transceiver Control Interface # OpsLog
## Introduction <a href="https://discord.gg/FYM8yw5pT" target="_blank">
<img src="https://img.shields.io/badge/Discord-Join%20the%20server-5865F2?logo=discord&logoColor=white" alt="Join our Discord" />
</a>
TCI (Transceiver Control Interface) is a network interface for control, data transfer and A modern, fast ham-radio logger for Windows — single-strip entry, real-time CAT
synchronization between transceiver/receiver, contest loggers, digital mode software, skimmers for **OmniRig**, native **FlexRadio/SmartSDR**, native **Icom CI-V** (USB **and**
and other software, as well as external power amplifiers, bandpass filter units, antenna switches, remote-over-internet, replacing RS-BA1) and **TCI** (SunSDR / Expert Electronics),
radio controllers and other devices. DX cluster with spot alerts, awards tracking, maps, contest logging, QSL
management and a QSL-card designer. Built with **Wails v2** (Go backend +
React/TypeScript frontend), **pure Go** (no CGO): SQLite for configuration,
optional **shared MySQL** for the logbook so several operators can run one log.
Fully themeable and bilingual (English / French).
TCI was created as a modern alternative to the outdated COM port and audio cable Developed by **F4BPO**.
interfaces, it uses a full duplex web socket protocol that runs on top of a TCP connection and
serves for server-client communications, providing cross-platform connectivity. Transceiver works
as a server, all other software and devices as clients. The server and clients can be inside the
same computer (program-server, hardware log, etc.-clients) and/or in separate physical devices
connected through the local network (classical transceiver, power amplifier, antenna switch, FFT
unit, etc.).
The TCI interface contains basic transceiver control commands (analog of CAT system), ---
receives CW macros from clients and broadcasts them, outputs transceiver IQ stream to clients,
receives spots from skimmers and Internet clusters, receives/outputs audio signal to work in
digital modes.
The TCI uses an extensible architecture and can be supplemented with new functions and ## Building / developing
commands, while keeping the old ones operational. Thus, the TCI interface can be extended and
supplemented to meet the specific needs of any software manufacturer and/or device
manufacturer (receivers, transceivers, power amplifiers, switches, etc.). The presence of a device
identifier allows the manufacturers of transceivers and receivers to switch to the TCI interface
while maintaining the device model designation. The extensibility of the TCI interface allows you
to create an individual set of commands and functions for each device model, while maintaining
the basic command set inherent to all transceivers.
Our company advocates universal unification of data exchange between devices and - **Dev:** `wails dev` (Vite hot-reload; Go methods reachable at http://localhost:34115).
software by creating the TCI interface for this purpose. Modern transceivers and software must - **Build:** `wails build` (use the project's wails v2.11 — `~/go/bin/wails.exe`).
communicate using one protocol - the TCI protocol. - **Regenerate Go↔TS bindings** after changing exported `App` methods:
`wails generate module`.
- **Release:** `.vscode/release.ps1` (Ctrl+Shift+P → *Tasks: Run Task*
*Release OpsLog*) — bumps the version, pushes source to Gitea, builds the exe
and publishes it to Gitea + GitHub releases.
## Interface description ---
Any command represents an ASCII string that contains a command name and a list of ## Logging
arguments corresponding to this command. There are reserved characters that cannot be
included in the command name and command arguments.
List of reserved characters: «:», «,», «;». - **Single-strip entry:** callsign, RST tx/rx, name/QTH/grid, band/mode,
TX/RX frequency (split), start/end time, comment/note. The contacted entity's
**flag** is shown large next to the RST fields.
- **Callsign lookup** (QRZ.com / HamQTH) with photo, auto-fill of name/QTH/grid
and the QRZ.com tab.
- **Offline DXCC** resolution from `cty.dat` (country, CQ/ITU zones, continent),
with `/MM` `/AM` `/B` (beacon) and call-area (`/8`, `/W6`) handling, plus
ClubLog DXpedition date overrides.
- **Editable lists** for bands, modes (with their default RST) and **satellites**
— the satellite name on the entry form is offered as a dropdown, because
SAT_NAME is compared character for character by the awards and by LoTW.
- **Recent QSOs**, **Worked-before** matrix (per band/mode slot), bulk re-resolve
from cty/QRZ/ClubLog, bulk send to QSL services. A live **selection count**, a
**Select all / Unselect all** toggle, and a row limit that keeps the full log
fast **but is lifted while a filter is active** (every match is shown, not just
the first page).
- **Advanced QSO filter builder** (field / operator / value, AND / OR, saved
presets) with filtered- and selected-row **ADIF export**.
- **Find duplicates** (Tools) — groups QSOs by same call + band + mode (optionally
same day / minute) and lets you pick which to delete.
- **ADIF 3.1.7 compliant** import/export: a full field dictionary, 30 promoted
columns, a generic "extra fields" editor and standard/all export modes.
- **Profiles:** every setting is per-profile; each profile can point its logbook
at the local SQLite file or a **shared MySQL** database (multi-operator).
Command structure: ## Maps & antenna
1. Name of the command;
2. Separating character between command name and arguments «:»;
3. Separating character between arguments «,»;
4. End of the command character «;».
If a command has no arguments, an end of command symbol is placed after the command - **Main view = two configurable panes** (per profile, Settings → General →
name. If the command is invalid, it is ignored. The case of letters does not matter. *Main view*): great-circle map, locator (street) map, the cluster grid, the
worked-before grid, recent QSOs, the **FT decodes**, or any of the radio
consoles — **FlexRadio**, **Icom**, **Yaesu**, **Elecraft K3/K4**, **SunSDR
(TCI)** — and the **Net control** panel. Up to four panes, in columns or a
quadrant.
- **Great-circle map** with short/long-path distance & azimuth, selectable
basemaps (Light / Topo / Street / Satellite — Esri tiles, key-free and
labelled) and the **antenna beam lobe(s)** drawn from the rotor azimuth.
- **Rotor compass** (azimuthal-equidistant, click-to-turn) driven by
**PstRotator** (UDP), a **4O3A Rotator Genius** (native TCP) or a **microHAM
ARCO** controlled natively — no PstRotator needed — over the **LAN** or **USB**
using its Yaesu GS-232A protocol.
- **Ultrabeam** support (Normal / 180° reverse / Bidirectional): the radiating
direction is shown in green and the **mechanical boom** in grey, on both the
compass and the map, so you never lose track of where the antenna points.
The ExpertSDR3 program acts as a server, which can have several client connections at ## DX Cluster
the same time, they will be synchronized with each other by the server. When connecting to the
ExpertSDR3, the client receives the current status of the ExpertSDR3, first sending initialization
commands, then parameters to set the status, such as frequency, modulation, etc.
When a parameter change occurs in the ExpertSDR3 (server) program, the server notifies - Multiple cluster servers with auto-reconnect, a master for commands.
all connected clients, i.e., clients do not need to poll the server constantly, any change of state - **Filter sidebar** (callsign search, hide-worked, group duplicates, band /
will be sent in time to all clients. If the client sends a new state, the server will set it to itself, as mode / status / source) shared by the Cluster tab and the Main-view cluster
well as send it to all clients, that is, the server acts as a synchronizer. All clients connected to the pane, with a show/hide toggle.
server will be automatically synchronized. This way of work allows to minimize network load, - Per-spot **status** (new / new-band / new-slot / worked), click-to-tune the
reducing traffic. rig, and a multi-band **Band Map** (panadapter-style strips). Optionally, all
**digital modes count as one** (DXCC-style) for the new/new-slot colouring and
the worked-before matrix badges (Settings → General).
- **POTA** spots are tagged with their park reference (via `api.pota.app`).
- **Spot alerts:** rules on call / country / band / mode /
spotter, with sound, visual and e-mail notification (Tools → *Alert
management*).
The TCI protocol implements the transmission of receiver IQ stream to clients, which is ## CAT control
necessary for the work of special skimmer software, they automatically find the station and
decode it throughout the band, and it also allows you to record radio signals in the file.
TCI is also used to transmit audio signals of the receiver to clients and to receive audio Six native backends (Settings → CAT), each with auto-reconnect and a fast,
signals from clients, i.e., the client can transmit audio signals to ExpertSDR3 for radio non-blocking connect so a powered-off radio never freezes the app. The settings
transmission. The audio stream exchange is designed to work with digital modes, where encoding ask two questions rather than one — **which radio**, then **how it is
and decoding is performed by third-party software, as well as in voice modes, where audio macros connected** — and only offer the links that radio actually has:
can be broadcasted, which is very much in demand in contest loggers.
When working in contests, it is important to record all on the air operation, for this purpose - **OmniRig** (Rig 1/2, hot-swap) — works with any OmniRig-supported rig.
the audio stream from the line-output is sent to all clients. The resulting audio stream can be - **FlexRadio (SmartSDR)** over the radio's TCP API — real-time slice freq /
recorded to a file or played back with a PC sound card. mode / split, UDP discovery, and **panadapter spots** (cluster spots pushed to
the Flex display; a click fills the call and **tunes the rig to the right
frequency AND mode**).
- **Icom CI-V** — native, over the radio's **USB** port *or* over the internet
via the radio's **built-in LAN server** (see *Remote Icom* below). No RS-BA1 or
Remote Utility needed.
- **Kenwood / Elecraft** — native ASCII CAT over USB or an RS232-to-Ethernet
bridge, for the K3 / K4 and the Kenwood dialect they share.
- **Yaesu** — native ASCII CAT (FA/FB/MD/VS…), which replaces OmniRig for an
FTDX and gives the Yaesu console below.
- **TCI** (WebSocket) — SunSDR / ExpertSDR3 and any TCI-compatible server:
freq / mode / PTT / split, panorama spots, **audio in both directions** and a
full console. See *TCI audio* below.
**CAT sharing:** OpsLog can hand the radio on to other programs while it holds
the port — a **Hamlib NET rigctl** server (WSJT-X, JTDX, MSHV, fldigi…) or a
**TCI** server. One or the other, on a port you choose.
Mode is taken from the radio; the digital sub-mode (FT4 vs FT8) is inferred from
the frequency. **Per-band Flex RX/TX antennas** can be configured and are applied
automatically on band change.
### FlexRadio control tab (SmartSDR-style)
Shown only when the CAT backend is a FlexRadio:
- **Transmit:** RF power, tune power, TUNE, MOX, speech processor (NOR/DX/DX+),
VOX (+ level + delay), monitor (+ level), mic gain.
- **Receive (active slice):** RX/TX **antenna** selectors and a **DAX** toggle
(TX audio through DAX, for WSJT-X & co), AGC mode/threshold, audio level,
NB / WNB / NR / ANF, and — on **SmartSDR v4** radios (8000 / Aurora series) —
the extra DSP tools **NRL, NRS, NRF** (with level) plus **RNN** (AI noise
reduction) and **ANFT** (FFT auto-notch), shown automatically when the radio
supports them. **RIT / XIT** with wheel / ± tuning.
- **Antenna tuner (ATU):** tune / bypass / memories.
- **Amplifier:** the amp card follows whichever amplifier is configured, with a
dropdown to pick it when **several amplifiers** are set up (e.g. two SPEs run
in parallel). See *Amplifiers & switches* below.
- **Live meters** over the UDP VITA-49 stream: S-meter (S-units), forward power
(W), SWR, ALC, PA temperature, voltage, plus the amplifier's meters.
### Elecraft K3 / K4 control tab
Shown for the Elecraft and Kenwood backends: power, AF/RF gain, mic gain,
squelch, preamp/attenuator, NB/NR/AGC, filter widths (200 Hz to 4.0 kHz, the
K3 maximum and the one FT8 wants), antenna selection, MOX and the ATU
(tap to tune, hold for in/out), RIT/XIT with ±10 / ±100 steps, key speed, and
live S / power / SWR meters. The SWR is read from the radio's own `SW;`.
### Yaesu control tab
Shown for the Yaesu backend: power, mic gain, AGC, NB/NR, preamp/attenuator,
filter width, RIT/XIT and the meters — the same shape as the others, driven by
the FTDX's own CAT set.
### SunSDR console (TCI)
Shown for the TCI backend. Drive and tune drive, mic gain, TUNE, power and SWR
while transmitting, volume, mute, squelch and its threshold, NB / NR / ANF,
APF in CW, AGC speed, filter widths **offered per mode**, RIT and XIT, and the
VFO lock. Levels can be dragged, scrolled, stepped or typed. The S-meter reads
real dBm, so its S-units are arithmetic rather than a calibration guess.
It costs nothing to keep open: TCI **pushes** every setting as it changes —
including changes made in the radio's own window, which the console follows
without asking anything.
### Icom control tab
Shown when the CAT backend is Icom (USB or network). A full RS-BA1-style console:
- **Twin VFO readout** (MAIN / SUB) with the big tabular frequency, mode badge,
band and RIT/ΔTX offset, and a **mode-button row** (SSB / CW / RTTY / PSK /
AM / FM).
- **Spectrum scope + waterfall** (panadapter): ON/OFF, CTR/FIX, double-click to
tune, and **◀ ⊙ ▶** buttons to centre the scope on the current frequency
(±50 kHz) and pan left/right.
- **Live meters** always visible: S-meter (click → fill RST), power in watts, SWR.
- **Receive DSP:** AF / RF gain, squelch, AGC, preamp, attenuator, filter
(FIL1/2/3), NB, NR, ANF and — **on CW only** — the **APF** (audio peak filter).
- **Passband / notch:** Twin PBT (inner / outer), manual notch + position.
- **Transmit:** RF power, MOX, TUNE, **split with an automatic offset**
(+5 kHz on SSB, +1 kHz on CW), and monitor. On **voice modes only**: mic gain,
speech compressor, VOX (+ gain + anti-VOX). Controls that don't apply to the
current mode are hidden automatically.
- **Bands & antenna:** one-touch band buttons and ANT1/ANT2 selection.
- **Clarifiers:** RIT and ΔTX with wheel / ± tuning (Ctrl+←/→ nudges RIT).
- **Power ON / OFF** buttons (manual by design — the app never wakes the rig on
connect).
- **CW keying** can run through the radio's own keyer (see *Keyers* below).
### Remote Icom (over the internet, no RS-BA1)
OpsLog speaks the IC-7610's built-in network protocol directly — it **replaces
both the Icom Remote Utility and RS-BA1**. Enter the radio's IP, the Network
User1 name/password and the CI-V address, and the whole Icom console works over
the LAN/internet: login + token (auto-renewed), CI-V tunnel, receive-side
retransmit for a rock-solid link even with the panadapter streaming, and manual
power ON/OFF. (Audio is out of scope — use the radio in USB + a voice link such
as Mumble.)
## Keyers & audio
- **CW keyer** with macros and F-key macros. The keyer engine is selectable:
**WinKeyer** (K1EL WK1/2/3 over a COM port), **FlexRadio CWX** (the radio's
built-in keyer over the SmartSDR API — type-ahead and backspace, no WinKeyer or
SmartCAT needed), **Icom** (the radio's own keyer over CI-V — no extra hardware,
works over the remote link too) or **TCI**.
- **Digital Voice Keyer** (DVK): record F1F6 voice messages and transmit them.
- **QSO audio recording:** continuous rolling capture; on *Log QSO* the contact
is saved to a per-QSO WAV (`CALL_YYYYMMDD_HHMMSS.wav`); mixes RX + mic.
### TCI audio — no virtual cable
A SunSDR carries its audio on the same WebSocket as its commands, so OpsLog can
take it directly. Pick **Radio (TCI network audio)** as the *From radio* or
*To radio* device and the QSO recorder and the voice keyer work with no virtual
audio cable, no second sound card and nothing to set in the Windows mixer.
Transmit needs no setting up in ExpertSDR3 either: the audio source is named on
each key-down, so it works in SSB as well as the digital modes, and the
microphone stays the source for every transmission that is not a voice message.
## Amplifiers & switches
- **Amplifiers** — configure **one or several** amps (Settings → Amplifier is a
list; e.g. two SPEs run in parallel for more power). Each amp's control card
appears on the FlexRadio tab and in **Station Control**, with a dropdown to
choose which one it shows; the bottom status bar carries **one clickable chip
per amp** (green = OPERATE, orange = STANDBY, red = offline). Supported:
- **PowerGenius XL** (4O3A) over direct TCP — operate/standby, fan-mode
selector and fault display.
- **SPE Expert** (1.3K-FA / 1.5K-FA / 2K-FA) over **USB** (virtual COM) or the
**network** (RS232-to-Ethernet bridge) — operate/standby, ON/OFF,
Low / Mid / High output level, an output-power bar and live status (band,
SWR, PA current, temperature, warnings/alarms).
- **Acom** (500S / 600S / 700S / 1200S / 2020S) over **USB** or the **network**
(RS232-to-Ethernet bridge) — operate/standby/off and live telemetry (forward
& reflected power, SWR, PA temperature, band, fan, faults). Power-ON works
over a serial cable that wires the DTR/RTS lines.
- **Elecraft KPA500 / KPA1500** over **USB** (serial) or — on the KPA1500 —
over the **network**. Operate/standby, on/off, forward power, SWR,
temperature, supply voltage and current, the band, and faults named in plain
words rather than as a code. The amplifier follows the radio's band by
itself, on the link already open — it has a band command of its own, so no
second serial port is involved.
An amplifier that takes its band from a transceiver instead (Acom, SPE) can be
followed a second way: OpsLog answers its frequency polls as a Kenwood rig on
a **second COM port**, independent of the control link.
- **Antenna Genius** (4O3A) antenna switch over TCP/GSCP — a docked A/B
antenna-switch widget, and an option to write the **selected antenna into
MY_ANTENNA** under the name the switch itself carries.
- **Tuner Genius XL** (4O3A) over TCP — SWR and power, TUNE / BYPASS / OPERATE.
- **Station Control** panel (dockable, drag-to-reorder widgets): the **rotator**,
**Ultrabeam** element control and **relay boards** — WebSwitch 1216H, KMTronic,
**Denkovi** USB (FT245 D2XX bit-bang, 4 or 8 relays) and generic USB-serial
(CH340 / LCUS, A0 protocol) — for station power, antennas and accessories.
- **Relay auto-control** (Settings): switch Station-Control relays automatically
from the rig frequency / band (like PstRotator) — per relay, a frequency window
or a set of bands.
## QSL & awards
- **Awards engine:** built-in + custom award definitions (shared **globally**
across profiles) — DXCC, WAS / WAZ / WAC, WPX, IOTA / POTA / SOTA / WWFF,
**DDFM**, worked/confirmed/validated by band & mode, OR rules and manual
reference assignment, live reference detection on call entry, **reference-list
import** for totals/names, and a **Rescan** that re-pulls the logbook (picks up
fresh LoTW/QRZ confirmations).
- **Award statistics** by band and by mode class, with the **DXCC Challenge**
worked out where it can be compared to LoTW's own figure — it counts confirmed
band-slots on ten bands, and 60 m is not one of them, which is the whole of the
usual discrepancy. The band columns follow the bands you actually have contacts
on, up to and beyond 23 cm.
- **Russian districts (RDA):** an offline district database that knows where a
callsign was **on the day of the contact**, a bulk fill for existing QSOs, and
a comparison against the district an imported log carries — each disagreement
settled on its own row, with the choice written into the contact.
- **QSL services:** ClubLog (batched ADIF upload), LoTW, QRZ.com, eQSL,
**Cloudlog / Wavelog** and **HAMLOG.online** — upload and **confirmation
download** (which auto-refreshes the award stats).
- **QSL Card Designer** (see below).
- **E-mail eQSL:** right-click a QSO → *Send eQSL by e-mail* via the configured
SMTP account. (Outlook/Hotmail disable basic-auth SMTP — use Gmail with an app
password, or a Microsoft app password.)
## Contest logging
- **Contest tab:** pick a contest (built-in ADIF `CONTEST_ID` list) and an
exchange (running serial or a fixed exchange). OpsLog auto-fills `CONTEST_ID`
and the sent/received serials (`STX` / `SRX`), enforces a window start/end,
flags dupes and keeps a live scoreboard.
## Statistics
- **Logbook statistics dashboard:** headline tiles (QSOs, unique callsigns, DXCC
entities, continents, % confirmed) plus charts — QSOs **by mode**, a per-band
**CW / phone / data** split, **activity over time** (rolling day / 7-day /
30-day / 12-month views), by operator and by continent. Date-range, per-operator
and per-contest filters, and a **Table** view that mirrors every chart.
## Multi-operator live status (special events)
For a multi-op special-event call on a shared MySQL logbook (e.g. **TM74TFR**),
publishing is **automatic** — no setting to turn on. Each OpsLog instance
heartbeats its current activity (operator call, band, frequency, mode) into a
`live_status` table every ~15 s, and drops back to *off air* automatically 5 min
after the last logged QSO. A small PHP renderer
([`docs/livestatus/tm74-status.php`](docs/livestatus/tm74-status.php)) on your
own web server reads that table and produces a live page/image you can embed on
the station's **QRZ.com** bio (`<img src="…/tm74-status.php?img=1">`). OpsLog
only writes to the DB — it is not a web server.
## Net control
- **Directed-net logging** (Tools → Net): a global roster (`nets.json`) plus an
in-memory active session — check stations in, then log them individually or the
whole net at once (**Log everyone**) using the CAT frequency. **Drag & drop**
between the two lists (roster → on-air starts a QSO, on-air → roster logs it),
and after each log the next on-air station is selected automatically so you can
chain contacts.
## Appearance & language
- **Themes:** four complete themes (Warm light, Warm dark, Graphite dark, High
contrast) plus **Auto** (follows the OS light/dark preference), selectable in
Settings → General. Every panel and every AG-Grid table follows the theme.
- **Bilingual:** full **English / French** UI, with a first-run flag chooser and
a switcher in Settings → General.
## Security
- **Secret vault:** opt-in passphrase encryption of the stored passwords
(AES-GCM + PBKDF2). Encrypted values are portable; a single unlock prompt at
launch decrypts them for the session.
## Integrations (outbound)
- **UDP emitters:** push the current frequency to **PstRotator**, radio info in
**N1MM `RadioInfo`** format, or an **ADIF record on each logged QSO** — so
external tools (rotator control, digital apps, other loggers) stay in sync.
- **CAT sharing:** a **Hamlib NET rigctl** or **TCI** server, so WSJT-X, JTDX,
MSHV, fldigi and the rest still reach the radio while OpsLog holds the port.
- **WSJT-X / JTDX / MSHV** decodes over UDP: the heard stations feed the band
map, the alerts and — on a FlexRadio — the panadapter.
## Other
- **Autostart:** launch external programs (WSJT-X, JTAlert, rotator control…) at
OpsLog startup, skipping any already running.
- **Backup:** optional database + ADIF backup at shutdown.
- **Update check** at startup and every 5 minutes (and on opening Help → About),
with a toast (toggleable), plus a **What's new** dialog that shows the changelog
(English / French) on the first launch after an update — reopenable any time
from the Help menu.
- **Anonymous usage telemetry** (a once-a-day heartbeat: random install ID +
version + OS — no callsign or QSO data; opt-out in Preferences).
---
## QSL Card Designer
Tools → *QSL Card Designer…* turns a few photos into a polished eQSL card:
1. Pick 16 photos (jpeg/png). OpsLog analyzes them offline (detail/luminance
grid) and proposes **3 designs** — callsign in the calmest zone of the best
photo, operator name, CQ/ITU zones + locator line, country flag, the other
photos as bordered inserts, and a per-QSO confirmation box.
2. Pick a proposal and fine-tune it: click an element to select, drag to move,
change font / style preset (gel gold, gel silver, classic white outline,
script, flat) and per-preset knobs in the right panel.
3. Save the template (photos are copied into `data/qsl/templates/<id>/`, so the
originals can move). One template can be the default per profile.
Sending: right-click a QSO → *Send eQSL by e-mail*. The card is rendered with
that QSO's data, rasterized to a ≤ 800 KB JPEG, archived in `data/qsl/outbox/`
and sent through the configured SMTP account to the address found by the
QRZ/HamQTH lookup. On success the QSO is stamped `EQSL_SENT=Y` (ADIF). The
e-mail subject/body templates live in the designer
(`{CALL} {DATE} {BAND} {MODE} {MYCALL}` variables).
Fonts: Archivo Black, Lilita One, Baloo 2, Oswald, Great Vibes, Allura (all
OFL, embedded — licenses in `internal/qslcard/assets/fonts/`); Cooper Black is
offered when MS Office installed it. Flags: flag-icons (MIT), embedded for the
commonly-worked DXCC entities.
---
## Importing a log
- **ADIF import** with duplicate handling (skip / update / import anyway) and an
optional field mapping for exports that use their own names.
- Optionally recompute country / continent / DXCC / zones from **cty.dat** and
the **ClubLog date-ranged exceptions** — which know that a callsign belonged to
a different entity on an older date.
- **Deleted DXCC entities are left alone.** cty.dat only knows where a callsign
is *today*: R1MVI resolves to European Russia now, but a 2004 contact was Malyj
Vysotskij — an entity the ARRL deleted in 2012 and which can never be worked
again. Where a record names one of the sixty-odd deleted entities, its own
number is kept.
## Data & storage
- **Config** (settings, profiles, rigs/antennas, cluster nodes, lookup cache,
award lists, QSL templates) always lives in the local SQLite file under
`data/` — instant even when the logbook is on a far-away MySQL.
- **Logbook** (QSOs) lives where the active profile points it: the local SQLite
file or a per-profile shared **MySQL** database.
---
*A French version of this document is available in [README.fr.md](README.fr.md).*