pota-adif-upload

Crates.iopota-adif-upload
lib.rspota-adif-upload
version0.1.0
created_at2025-12-05 15:15:12.641897+00
updated_at2025-12-05 15:15:12.641897+00
descriptionCLI tool and library to upload ADIF files to Parks on the Air (POTA)
homepagehttps://github.com/jsvana/pota-adif-upload
repositoryhttps://github.com/jsvana/pota-adif-upload
max_upload_size
id1968358
size111,645
Jay Vana (jsvana)

documentation

README

pota-adif-upload

A CLI tool to upload ADIF files to Parks on the Air (POTA).

Installation

cargo install --path .

Usage

Login

First, authenticate with your POTA account:

pota-adif-upload login

You'll be prompted for your username and password. Credentials are stored securely in your system keyring, or in ~/.config/pota-adif-upload/credentials.json if keyring is unavailable.

You can also pass credentials via environment variables or command-line flags:

# Via environment variables
POTA_USERNAME=user@example.com POTA_PASSWORD=secret pota-adif-upload login

# Via flags
pota-adif-upload login -u user@example.com -p secret

Upload ADIF files

Upload one or more ADIF files:

pota-adif-upload upload activation.adi
pota-adif-upload upload file1.adi file2.adi file3.adi

Wait for processing to complete:

pota-adif-upload upload -w activation.adi
pota-adif-upload upload --wait --timeout 180 activation.adi

Check job status

View recent upload jobs:

pota-adif-upload jobs
pota-adif-upload jobs --limit 20

List callsigns

View your registered callsigns:

pota-adif-upload callsigns

Check login status

pota-adif-upload status

Logout

Remove stored credentials:

pota-adif-upload logout

Authentication

This tool uses AWS Cognito SRP (Secure Remote Password) authentication, the same method used by the POTA website. Your password is never sent over the network - instead, cryptographic proofs are exchanged.

Library

This crate also provides a library (pota_client) that can be used programmatically:

use pota_client::PotaClient;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = PotaClient::authenticate("user@example.com", "password").await?;

    // Upload an ADIF file
    let content = std::fs::read("activation.adi")?;
    client.upload_adif("activation.adi", content).await?;

    // Check job status
    for job in client.get_jobs().await? {
        println!("{}: {}/{} QSOs", job.reference, job.inserted, job.total);
    }

    Ok(())
}

License

MIT

Commit count: 0

cargo fmt