Hardware-agnostic RF direction finding, signal classification, and phased-array research platform
Project description
rf-direction-finding
Hardware-agnostic RF direction finding, signal classification, and phased-array research.
What this is
rfdf is a Python platform for RF direction-finding (DOA), signal classification, and
phased-array experimentation. It is hardware-agnostic by design: every SDR, rotator,
antenna geometry, and compute provider sits behind an abstract interface (the HAL). The
B210 + AntRunner reference set is the first concrete validation of the abstractions, not
the system itself. A user with a HackRF, an RTL-SDR, or just a directory of SigMF files
is a first-class user.
rfdf runs standalone without ai-orchestrator. Installing the [orchestrator]
extra makes it a consumer of ernesto01louis/ai-orchestrator,
adding evidence-bundle production, Hindsight memory writes, L5 vault notes,
planner-dispatched GNU Radio flowgraphs, and ntfy alerts.
Validate RF research workflows on canned data before buying €8500 of gear.
Status
v0.1.0 — first stable release (Stage 7: orchestrator integration + REST
API). Stage 7 closes the build: an optional, lazy-imported integration with
ai-orchestrator —
consumer registration, citation-grade evidence bundles, Hindsight memory
writes, L5 vault notes, planner-dispatched GNU Radio flowgraphs, and ntfy
alerts — plus a standalone REST API (rfdf api serve) that doubles as the
orchestrator's capability callback target. The platform remains
standalone-first: pip install rfdf is a complete DOA + classification +
capture platform with no orchestrator awareness; the [orchestrator] extra is
a bonus, never a baseline. Prior stages: v0.1.0-alpha reference hardware
backends (USRP B210, AntRunner, GRBL rails, RTL-SDR/KrakenSDR contrib),
v0.1.0-beta the operator-facing software ecosystem (Ansible / Kasm /
Guacamole / monitoring, hosted alongside the platform, never a dependency).
With v0.1.0 the public API is stable under SemVer. See
docs/standalone-vs-orchestrator.md,
docs/orchestrator/, and ROADMAP.md.
Install (zero hardware path)
pip install rfdf # standalone — complete without an orchestrator
pip install rfdf[orchestrator] # + optional ai-orchestrator integration
The base install pulls only platform-essential dependencies (NumPy, SciPy, Pydantic, Typer, Rich, sigmf, structlog, platformdirs). Zero RF or ML dependencies are required to use the platform. Hardware and compute providers live behind extras and entry points.
Install (with hardware / compute extras)
| Extras | What it pulls in |
|---|---|
[sdr-uhd] |
Ettus UHD (B210 / B200mini / X-series) |
[sdr-pluto] |
pyadi-iio (PlutoSDR) |
[sdr-soapy] |
SoapySDR (HackRF, LimeSDR, others) |
[rotator-hamlib] |
hamlib-py (Yaesu / SPID / generic rotctld) |
[ml] |
PyTorch + TorchSig + scikit-learn |
[ml-onnx] |
ONNX Runtime for portable inference |
[compute-runpod] |
RunPod GPU rental |
[compute-modal] |
Modal serverless GPU |
[compute-vastai] |
Vast.ai marketplace GPU |
[compute-skypilot] |
SkyPilot multi-cloud GPU |
[orchestrator] |
ai-orchestrator-client integration |
[api] |
FastAPI + uvicorn (REST + WebSocket) |
[antenna] |
scikit-rf + PyNEC for antenna modelling |
[dev] |
Test + lint + type-check toolchain |
[all-hardware] |
All SDR + rotator extras together |
[all-compute] |
All compute backends together |
[all] |
The kitchen sink (ML + API + antenna + hardware + compute + orchestrator) |
Documentation
| Doc | What's in it |
|---|---|
| VISION.md | Why this exists, the principles, when-in-doubt questions |
| ARCHITECTURE.md | Layered design, HAL contracts, backend discovery, config precedence |
| ROADMAP.md | Stages 1–7 with status + acceptance criteria |
| CLAUDE.md | Working conventions (used by AI coding assistants) |
| CONTRIBUTING.md | Dev setup, branch flow, commit conventions |
| SECURITY.md | Threat model, secret handling, EIRP enforcement |
| CHANGELOG.md | Per-release changes |
License + acknowledgments
Apache-2.0. Matches ai-orchestrator and aero-research-platform.
This project builds on the work of many upstream RF and ML communities. Specific attributions live in docs/acknowledgments.md once that document is populated (Stage 3+).
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 rfdf-0.1.0.tar.gz.
File metadata
- Download URL: rfdf-0.1.0.tar.gz
- Upload date:
- Size: 296.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bbc3622fa2793f7648462d04c09358eb4a2e17e0e30e4691c48331f34ef2a983
|
|
| MD5 |
0590e61688b94e3a591d7506c40c1fa2
|
|
| BLAKE2b-256 |
794cf0b140766243ecf0e69c01d609847c6631cab1bf2f53ea5deb3187b93197
|
Provenance
The following attestation bundles were made for rfdf-0.1.0.tar.gz:
Publisher:
release.yml on ernesto01louis/rf-direction-finding
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rfdf-0.1.0.tar.gz -
Subject digest:
bbc3622fa2793f7648462d04c09358eb4a2e17e0e30e4691c48331f34ef2a983 - Sigstore transparency entry: 1572543539
- Sigstore integration time:
-
Permalink:
ernesto01louis/rf-direction-finding@6677a1769871e549f7a692f64c773f9e88154d2d -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/ernesto01louis
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@6677a1769871e549f7a692f64c773f9e88154d2d -
Trigger Event:
push
-
Statement type:
File details
Details for the file rfdf-0.1.0-py3-none-any.whl.
File metadata
- Download URL: rfdf-0.1.0-py3-none-any.whl
- Upload date:
- Size: 252.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
054afb2c5aff30f18f1b7c4f8187802d607c80781fae04150e0b7305aa4a8c72
|
|
| MD5 |
286564063016482c13ecfcf93bf625f3
|
|
| BLAKE2b-256 |
c7fada3c8f850d082802d9e09337bec8f5229de40fe652e5bb82a605fd7d5fb5
|
Provenance
The following attestation bundles were made for rfdf-0.1.0-py3-none-any.whl:
Publisher:
release.yml on ernesto01louis/rf-direction-finding
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rfdf-0.1.0-py3-none-any.whl -
Subject digest:
054afb2c5aff30f18f1b7c4f8187802d607c80781fae04150e0b7305aa4a8c72 - Sigstore transparency entry: 1572543558
- Sigstore integration time:
-
Permalink:
ernesto01louis/rf-direction-finding@6677a1769871e549f7a692f64c773f9e88154d2d -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/ernesto01louis
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@6677a1769871e549f7a692f64c773f9e88154d2d -
Trigger Event:
push
-
Statement type: