Lightweight WSPR analytics: DuckDB ingest + Streamlit dashboard.
Project description
📡 wspr-ai-lite
Lightweight WSPR analytics with DuckDB + Streamlit
Repository Workflow Staus
Python Package Publishing
Explore Weak Signal Propagation Reporter (WSPR) data with an easy, local dashboard:
- 📊 SNR distributions & monthly spot trends
- 👂 Top reporters, most-heard TX stations
- 🌍 Geographic spread & distance/DX analysis
- 🔄 QSO-like reciprocal reports
- ⏱ Hourly activity heatmaps & yearly unique counts
- 🚀 Works on Windows, Linux, macOS — no heavy server required.
✨ Features
- Local DuckDB storage with efficient ingest + caching
- Streamlit UI for interactive exploration
- Distance/DX analysis with Maidenhead grid conversion
- QSO-like reciprocal finder with configurable time window
- Ready-to-run on modest hardware
🚀 Quickstart
1. Clone & Setup
git clone git@github.com:KI7MT/wspr-ai-lite.git
cd wspr-ai-lite
# optional venv
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
2. Ingest Data
Fetch WSPRNet monthly archives and load them into DuckDB:
# adjust to whatever range you wish, but be reasonable !!
python pipelines/ingest.py --from 2014-07 --to 2014-07
- Downloads compressed monthly CSVs (caches locally)
- Normalizes into data/wspr.duckdb
- Adds extra fields (band, reporter grid, tx grid)
3. Run the UI
streamlit run app/wspr_app.py
Then open http://localhost:8501 in your browser.
📊 Example Visualizations
- SNR Distribution by Count
- Monthly Spot Counts
- Top Reporting Stations
- Most Heard TX Stations
- Geographic Spread (Unique Grids)
- Distance Distribution + Longest DX
- Best DX per Band
- Activity by Hour × Month
- TX/RX Balance and QSO Success Rate
🛠 Development
For contributors and developers:
- docs/DEV_SETUP.md --> Development setup guide
- docs/TESTING.md --> Testing instructions (pytest + Makefile)
- docs/TROUBLESHOOTING.md --> Common issues & fixes
make setup-dev # create venv and install deps
make ingest # run ingest pipeline
make run # launch Streamlit UI
make test # run pytest suite
Testing
Run unit tests for ingest and utilities:
pytest -q
Or via Makefile:
make test
🙌 Acknowledgements
- WSPRNet community for providing global weak-signal data
- Joe Taylor, K1JT, and the WSJT-X Development Team
- Contributors to DuckDB and Streamlit
- Amateur radio operators worldwide who share spots and keep the network alive
📬 Contributing
Pull requests are welcome! If you have feature ideas (e.g., new metrics, visualizations, or AI integrations), open an issue first to discuss.
🔮 Roadmap
- 📦 Phase 1: wspr-ai-lite (this project)
- Lightweight, local-only DuckDB + Streamlit dashboard
- 🚀 Phase 2: wspr-ai-analytics
- Full analytics suite with ClickHouse, Grafana, AI Agents, and MCP integration
- Designed for heavier infrastructure and richer analysis
📜 License
This project is licensed under the MIT License. Open and free for amateur radio and research use.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file wspr_ai_lite-0.2.0.tar.gz.
File metadata
- Download URL: wspr_ai_lite-0.2.0.tar.gz
- Upload date:
- Size: 26.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4397aae1e26e97db7a182562acd3aa6c6edd2efdb90129e7edec5a8a0a7bb073
|
|
| MD5 |
0b949be951fe7638eb18796b098a0fd2
|
|
| BLAKE2b-256 |
398acd1b0c477a2bf35b335cdcaff36e4ecabe24e43c86e0d57df3e391d83f96
|
Provenance
The following attestation bundles were made for wspr_ai_lite-0.2.0.tar.gz:
Publisher:
release.yml on KI7MT/wspr-ai-lite
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
wspr_ai_lite-0.2.0.tar.gz -
Subject digest:
4397aae1e26e97db7a182562acd3aa6c6edd2efdb90129e7edec5a8a0a7bb073 - Sigstore transparency entry: 427376611
- Sigstore integration time:
-
Permalink:
KI7MT/wspr-ai-lite@f1b04971ca9a7ec12617530fcd1c2c2c29733688 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/KI7MT
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f1b04971ca9a7ec12617530fcd1c2c2c29733688 -
Trigger Event:
push
-
Statement type:
File details
Details for the file wspr_ai_lite-0.2.0-py3-none-any.whl.
File metadata
- Download URL: wspr_ai_lite-0.2.0-py3-none-any.whl
- Upload date:
- Size: 9.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
824ec458e259c6bc32dac4466c2efae8a96292949e9fd7cbf6f3fe5f302e9e37
|
|
| MD5 |
eea9002df5bdb53f06109ec81530fc32
|
|
| BLAKE2b-256 |
72bdd784e6ed4bced266da5ac6cfc36661b95162c5d68a8fadcc16517f84961d
|
Provenance
The following attestation bundles were made for wspr_ai_lite-0.2.0-py3-none-any.whl:
Publisher:
release.yml on KI7MT/wspr-ai-lite
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
wspr_ai_lite-0.2.0-py3-none-any.whl -
Subject digest:
824ec458e259c6bc32dac4466c2efae8a96292949e9fd7cbf6f3fe5f302e9e37 - Sigstore transparency entry: 427376612
- Sigstore integration time:
-
Permalink:
KI7MT/wspr-ai-lite@f1b04971ca9a7ec12617530fcd1c2c2c29733688 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/KI7MT
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f1b04971ca9a7ec12617530fcd1c2c2c29733688 -
Trigger Event:
push
-
Statement type: