Skip to main content

A terminal-based amateur radio logging application

Project description

TermLogger

A terminal-based amateur radio logging application built with Python and Textual.

TermLogger is currently currently in Alpha testing, if you find defects, please create an issue. You should export and backup your logs frequently.

Features

  • Fast keyboard-driven QSO logging - Optimized for rapid contest and everyday logging
  • Real-time dupe checking - Instant duplicate contact detection
  • ADIF import/export - Full ADIF 3.1 support for log interchange
  • ADIF log receive server - Receive logs on UDP ADIF and WSJTX format
  • Callsign lookup - QRZ.com and HamQTH integration
  • QRZ Logbook sync - Upload and download QSOs to/from QRZ.com Logbook
  • Club Log upload - Upload QSOs to Club Log
  • Real-time DX spots - DX cluster spots via HamQTH web API
  • POTA spots - Parks on the Air spot integration from pota.app
  • POTA park database - Automatic park info lookup with name, location, and grid square
  • Rig control - Hamlib (rigctld) and Flex Radio SmartSDR integration with auto-QSY

Operating Modes

  • General Logging - Standard everyday QSO logging
  • POTA Activation - Parks on the Air activation mode with progress tracking
  • POTA Hunter - Hunt park activators and track unique parks worked
  • Contest Mode - Contest logging with serial numbers and scoring
  • ARRL Field Day - Field Day with class/section exchange and bonus tracking

Installation

Recommended: pipx (isolated environment)

# Install pipx if you don't have it
pip install --user pipx
pipx ensurepath

# Install TermLogger
pipx install termlogger

Alternative: pip

pip install termlogger

From Source (for development)

git clone https://github.com/lacy-digital-labs/TermLogger.git
cd TermLogger
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"

Requirements

  • Python 3.11 or later
  • A terminal with Unicode support

Usage

termlogger

Key Bindings

Key Action
Tab / Shift-Tab Navigate fields
Enter Log QSO
F1 Help
F2 New mode / End mode (toggle)
F3 Clear form
F5 Lookup callsign
F6 Log manager (export/import/archive)
F7 Browse log
F9 Settings
F10 Exit
Ctrl+F Manual tune (frequency/mode)

Spots Table

  • Click on Band column header to cycle through band filters
  • Click on Mode column header to cycle through mode filters
  • Click on any spot row to auto-fill the QSO entry form
  • POTA spots display park info (name, location, grid) when selected

Configuration

Configuration is stored in ~/.config/termlogger/config.json.

Callsign Lookup

To enable callsign lookup, configure your credentials in Settings (F9):

  • QRZ.com - Requires XML subscription
  • HamQTH - Free registration at hamqth.com

QRZ Logbook Sync

Sync your QSOs with QRZ.com Logbook:

  1. Get your Logbook API key from qrz.com (requires subscription)
  2. Enter API key in Settings (F9) → Lookup tab
  3. Use Log Manager (F6) → QRZ Upload/Download buttons

Features:

  • Upload only sends QSOs not previously uploaded
  • Download skips duplicate QSOs automatically

Club Log Upload

Upload your QSOs to Club Log:

  1. Request an API key from Club Log helpdesk
  2. Enter credentials in Settings (F9) → Lookup tab:
    • Email: Your Club Log account email
    • App Password: Application password (not your login password)
    • Callsign: Callsign for uploads
    • API Key: Your Club Log API key
  3. Use Log Manager (F6) → Club Log button

Spot Settings

  • POTA Spots - Enabled by default, refreshes every 60 seconds
  • DX Cluster - Enabled by default, uses HamQTH web API

Rig Control

TermLogger supports automatic radio control through two backends:

Hamlib (rigctld)

# Start rigctld before running TermLogger
rigctld -m <model_number> -r <serial_port>

# Example for Icom IC-7300:
rigctld -m 3073 -r /dev/ttyUSB0

# Find your radio's model number:
rigctl -l | grep <radio_name>

Flex Radio SmartSDR

  • Enter the Flex Radio's IP address in Settings
  • Default port: 4992 (SmartSDR API)

Features:

  • Band indicator shows current frequency/band from radio
  • Frequency field updates from rig when focused
  • Auto-QSY: clicking a spot changes the radio frequency

Documentation

See the User Guide for detailed documentation.

Version Numbering

TermLogger uses calendar-based versioning: YY.MM.nn

  • YY - Two-digit year
  • MM - Two-digit month
  • nn - Release number within the month (01, 02, etc.)

Example: 25.12.01 is the first release in December 2025.

License

MIT License - See LICENSE for details.

Contributing

Contributions are welcome! Please read CONTRIBUTING.md before submitting pull requests.

All contributors must agree to the Developer Certificate of Origin (DCO) by signing off on their commits. See the contributing guide for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

termlogger-26.1.3.tar.gz (108.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

termlogger-26.1.3-py3-none-any.whl (112.9 kB view details)

Uploaded Python 3

File details

Details for the file termlogger-26.1.3.tar.gz.

File metadata

  • Download URL: termlogger-26.1.3.tar.gz
  • Upload date:
  • Size: 108.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for termlogger-26.1.3.tar.gz
Algorithm Hash digest
SHA256 91b9eaa6e02a8b85c81e48c2d2e7a7abc5fa5583efb263b3b44c7cae323a009b
MD5 bdbfc30c052825fe852d32f9b41cfa34
BLAKE2b-256 c1c8d7d646ab6f0b2e45ea09180e2b527cff87a4a037a3719c73c3211f58f2eb

See more details on using hashes here.

Provenance

The following attestation bundles were made for termlogger-26.1.3.tar.gz:

Publisher: release.yml on lacy-digital-labs/TermLogger

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file termlogger-26.1.3-py3-none-any.whl.

File metadata

  • Download URL: termlogger-26.1.3-py3-none-any.whl
  • Upload date:
  • Size: 112.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for termlogger-26.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 643ee293540ecd4066dc72c7506c2d8ea81bc298b98bb779dd09284a2942497f
MD5 2b781b875acf883ed693247f85856ca8
BLAKE2b-256 3d548eac54da5a0c410a728ec84878c65a89bfba847f34b821fe269e908e3e4d

See more details on using hashes here.

Provenance

The following attestation bundles were made for termlogger-26.1.3-py3-none-any.whl:

Publisher: release.yml on lacy-digital-labs/TermLogger

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page