Add LOTW (Logbook of the World) integration with TQSL support#166
Add LOTW (Logbook of the World) integration with TQSL support#166Claude wants to merge 7 commits into
Conversation
Co-authored-by: brianbruff <753297+brianbruff@users.noreply.github.com>
Co-authored-by: brianbruff <753297+brianbruff@users.noreply.github.com>
Co-authored-by: brianbruff <753297+brianbruff@users.noreply.github.com>
|
@claude Implement the LoTW settings UX on the frontend. The backend API surface is already in place (see |
|
Claude finished @brianbruff's task in 11m 33s —— View job LoTW Settings UX — ImplementedAll tasks complete. Here's what was implemented across 6 files (commit Tasks:
What was builtSettings Panel → LoTW section (
Log History toolbar (
Infrastructure (
|
- Add LotwSettings to settingsStore (enabled, tqslPath, stationLocation) - Add LotwSyncProgressEvent to signalr.ts with OnLotwSyncProgress handler - Add lotwSyncProgress state to appStore (mirrors QRZ sync pattern) - Wire up onLotwSyncProgress handler in useSignalR.ts - Add LotwSettingsSection to SettingsPanel with TQSL status check, station location dropdown, and verify button - Add conditional 'Push to LoTW' button in LogHistoryPlugin toolbar - Add LOTW sync progress/complete display in LogHistoryPlugin Co-authored-by: Brian Keating <brianbruff@users.noreply.github.com>
initial tests on macos are not finding tsql @claude understand why this is not working on macos and add the suitable fix |
|
Claude finished @brianbruff's task in 2m 4s —— View job macOS TQSL Detection — Fixed
Root Cause — Two Bugs FixedBug 1 — TQSL writes TQSL is a wxWidgets GUI app and on macOS/Linux it writes version info to stderr, not stdout. The original check only looked at - if (exitCode == 0 && !string.IsNullOrEmpty(output))
- {
- var version = ParseTqslVersion(output);
+ // TQSL (wxWidgets app) writes version info to stderr on macOS/Linux;
+ // accept output from either stream.
+ var versionText = !string.IsNullOrWhiteSpace(output) ? output : error;
+
+ if (exitCode == 0 || !string.IsNullOrWhiteSpace(versionText))
+ {
+ var version = ParseTqslVersion(versionText ?? string.Empty);Bug 2 — Missing Apple Silicon Homebrew path On Apple Silicon Macs, Homebrew installs to pathsToCheck.Add("/Applications/TrustedQSL.app/Contents/MacOS/tqsl");
+ pathsToCheck.Add("/opt/homebrew/bin/tqsl"); // Apple Silicon Macs
pathsToCheck.Add("/usr/local/bin/tqsl"); // Intel Macs / Homebrew x86Both fixes are in commit |
Two bugs prevented TQSL from being detected on macOS: 1. TQSL (wxWidgets) writes --version output to stderr, not stdout. The detection only checked stdout (output), so it always fell through to "Not Installed". Now checks stderr as a fallback and also accepts a zero exit code even without version text. 2. Apple Silicon Macs install Homebrew to /opt/homebrew/bin/ not /usr/local/bin/. Added /opt/homebrew/bin/tqsl to the macOS search paths. Co-authored-by: Brian Keating <brianbruff@users.noreply.github.com>
|
was implemented by @EI6JGB |

Implements LOTW upload functionality following QLog's approach: TQSL command-line integration for signing and uploading QSOs to ARRL's Logbook of the World.
Backend Changes
Data Models
LotwSettingswith TQSL path, station location, and installation status cachingLotwSyncStatus,LotwSyncedAtfields toQsomodelModifiedwhen edited after sync (follows QLog's Y/N/M pattern)Service Layer
LotwServiceimplements TQSL integration:C:\Program Files\TrustedQSL\tqsl.exe), macOS (/Applications/TrustedQSL.app), Linux (/usr/bin/tqsl)tqsl -ltqsl -d -l "location" -u <adif_file>API & Real-time Updates
LotwControllerwith endpoints:/api/lotw/installation,/api/lotw/locations,/api/lotw/settings,/api/lotw/upload,/api/lotw/syncOnLotwSyncProgressevent for real-time upload progressGetUnsyncedToLotwAsync(),UpdateLotwSyncStatusAsync(),GetPendingLotwSyncCountAsync()(both MongoDB and LiteDB)Frontend Changes
API Client
LotwInstallationResponse,LotwStationLocationsResponse,LotwSettingsRequest,LotwUploadResponsegetLotwInstallation(),getLotwStationLocations(),updateLotwSettings(),uploadToLotw(),syncToLotw(),cancelLotwSync()Example Usage
Remaining Work
UI components still needed:
Original prompt