From 23f425f95fc2342c71c683a59dd727a585984536 Mon Sep 17 00:00:00 2001 From: rouggy Date: Wed, 26 Aug 2026 23:38:35 +0200 Subject: [PATCH] docs(readme): restore it, and bring it up to date MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- README.md | 459 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 398 insertions(+), 61 deletions(-) diff --git a/README.md b/README.md index bddba3a..03ff4d3 100644 --- a/README.md +++ b/README.md @@ -1,77 +1,414 @@ -# Transceiver Control Interface +# OpsLog -## Introduction + + Join our Discord + -TCI (Transceiver Control Interface) is a network interface for control, data transfer and -synchronization between transceiver/receiver, contest loggers, digital mode software, skimmers -and other software, as well as external power amplifiers, bandpass filter units, antenna switches, -radio controllers and other devices. +A modern, fast ham-radio logger for Windows — single-strip entry, real-time CAT +for **OmniRig**, native **FlexRadio/SmartSDR**, native **Icom CI-V** (USB **and** +remote-over-internet, replacing RS-BA1) and **TCI** (SunSDR / Expert Electronics), +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 -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.). +Developed by **F4BPO**. -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 -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. +## Building / developing -Our company advocates universal unification of data exchange between devices and -software by creating the TCI interface for this purpose. Modern transceivers and software must -communicate using one protocol - the TCI protocol. +- **Dev:** `wails dev` (Vite hot-reload; Go methods reachable at http://localhost:34115). +- **Build:** `wails build` (use the project's wails v2.11 — `~/go/bin/wails.exe`). +- **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 -arguments corresponding to this command. There are reserved characters that cannot be -included in the command name and command arguments. +## Logging -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: -1. Name of the command; -2. Separating character between command name and arguments «:»; -3. Separating character between arguments «,»; -4. End of the command character «;». +## Maps & antenna -If a command has no arguments, an end of command symbol is placed after the command -name. If the command is invalid, it is ignored. The case of letters does not matter. +- **Main view = two configurable panes** (per profile, Settings → General → + *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 -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. +## DX Cluster -When a parameter change occurs in the ExpertSDR3 (server) program, the server notifies -all connected clients, i.e., clients do not need to poll the server constantly, any change of state -will be sent in time to all clients. If the client sends a new state, the server will set it to itself, as -well as send it to all clients, that is, the server acts as a synchronizer. All clients connected to the -server will be automatically synchronized. This way of work allows to minimize network load, -reducing traffic. +- Multiple cluster servers with auto-reconnect, a master for commands. +- **Filter sidebar** (callsign search, hide-worked, group duplicates, band / + mode / status / source) shared by the Cluster tab and the Main-view cluster + pane, with a show/hide toggle. +- Per-spot **status** (new / new-band / new-slot / worked), click-to-tune the + 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 -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. +## CAT control -TCI is also used to transmit audio signals of the receiver to clients and to receive audio -signals from clients, i.e., the client can transmit audio signals to ExpertSDR3 for radio -transmission. The audio stream exchange is designed to work with digital modes, where encoding -and decoding is performed by third-party software, as well as in voice modes, where audio macros -can be broadcasted, which is very much in demand in contest loggers. +Six native backends (Settings → CAT), each with auto-reconnect and a fast, +non-blocking connect so a powered-off radio never freezes the app. The settings +ask two questions rather than one — **which radio**, then **how it is +connected** — and only offer the links that radio actually has: -When working in contests, it is important to record all on the air operation, for this purpose -the audio stream from the line-output is sent to all clients. The resulting audio stream can be -recorded to a file or played back with a PC sound card. +- **OmniRig** (Rig 1/2, hot-swap) — works with any OmniRig-supported rig. +- **FlexRadio (SmartSDR)** over the radio's TCP API — real-time slice freq / + 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 F1–F6 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 (``). 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 1–6 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//`, 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).*