| Crates.io | pota-adif-upload |
| lib.rs | pota-adif-upload |
| version | 0.1.0 |
| created_at | 2025-12-05 15:15:12.641897+00 |
| updated_at | 2025-12-05 15:15:12.641897+00 |
| description | CLI tool and library to upload ADIF files to Parks on the Air (POTA) |
| homepage | https://github.com/jsvana/pota-adif-upload |
| repository | https://github.com/jsvana/pota-adif-upload |
| max_upload_size | |
| id | 1968358 |
| size | 111,645 |
A CLI tool to upload ADIF files to Parks on the Air (POTA).
cargo install --path .
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 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
View recent upload jobs:
pota-adif-upload jobs
pota-adif-upload jobs --limit 20
View your registered callsigns:
pota-adif-upload callsigns
pota-adif-upload status
Remove stored credentials:
pota-adif-upload logout
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.
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(())
}
MIT