Metadata-Version: 2.5
Name: olab-rf
Version: 0.1.0
Summary: Local-first RF telemetry package for ADS-B, AIS, scanner, and future Remote ID workflows.
Project-URL: Homepage, https://github.com/optimatorlab/olab_code/tree/main/packages/olab_rf
Project-URL: Source, https://github.com/optimatorlab/olab_code/tree/main/packages/olab_rf
Project-URL: Issues, https://github.com/optimatorlab/olab_code/issues
Project-URL: Changelog, https://github.com/optimatorlab/olab_code/blob/main/packages/olab_rf/CHANGELOG.md
Author: Optimator Lab
License-Expression: MIT
License-File: LICENSE
Classifier: Development Status :: 3 - Alpha
Classifier: Operating System :: POSIX :: Linux
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Requires-Python: >=3.11
Requires-Dist: numpy>=1.26
Requires-Dist: pyyaml>=6.0
Provides-Extra: ais
Requires-Dist: pyais>=3.1; extra == 'ais'
Provides-Extra: all
Requires-Dist: fastapi>=0.111; extra == 'all'
Requires-Dist: msgpack>=1.0; extra == 'all'
Requires-Dist: nats-py>=2.6; extra == 'all'
Requires-Dist: pyais>=3.1; extra == 'all'
Requires-Dist: pyrtlsdr>=0.5; extra == 'all'
Requires-Dist: uvicorn[standard]>=0.29; extra == 'all'
Provides-Extra: dev
Requires-Dist: httpx>=0.27; extra == 'dev'
Requires-Dist: pyais>=3.1; extra == 'dev'
Requires-Dist: pytest>=8.0; extra == 'dev'
Requires-Dist: ruff>=0.4; extra == 'dev'
Provides-Extra: nats
Requires-Dist: msgpack>=1.0; extra == 'nats'
Requires-Dist: nats-py>=2.6; extra == 'nats'
Provides-Extra: notebook
Requires-Dist: notebook>=7.0; extra == 'notebook'
Provides-Extra: pyrtlsdr
Requires-Dist: pyrtlsdr>=0.5; extra == 'pyrtlsdr'
Provides-Extra: web
Requires-Dist: fastapi>=0.111; extra == 'web'
Requires-Dist: uvicorn[standard]>=0.29; extra == 'web'
Description-Content-Type: text/markdown

# olab_rf

`olab_rf` is a local-first Python package for RF-derived telemetry. It
normalizes ADS-B, AIS, synthetic replay tracks, and scanner workflows into
Python APIs with a SQLite history store and an optional local web UI (a
demo/test surface over the Python backend, not a production frontend).

Migrated from `~/Projects/cuas_practice/src/ub_rf` per
[`docs/plans/olab_packages_reorg_plan.md`](https://github.com/optimatorlab/olab_code/blob/main/docs/plans/olab_packages_reorg_plan.md),
Migration sequence step 3. CUAS notebooks, data, tools, and project-specific
planning notes stay in `cuas_practice`, outside this package; `cuas_practice`
becomes a consumer of this package rather than owning the source.

The MVP is receive-only. Do not install Python dependencies into system
Python; use a project virtual environment.

```bash
python3 -m venv venv
source venv/bin/activate
pip install "olab-rf[web,ais,pyrtlsdr,nats]"
```

**Local development**, against an `olab_code` checkout, to run the test
suite or make changes:

```bash
pip install -e "packages/olab_rf[dev,web,ais,pyrtlsdr,nats]"
pytest packages/olab_rf/tests -q
```

System package installation is intentionally not automated. Run
`olab-rf-check` to inspect local tool availability before installing SDR
decoder tools.

Inspect saved SQLite values with:

```bash
olab-rf-history favorites --config olab_rf.yaml
olab-rf-history frequency-scans --config olab_rf.yaml
```

## Further reading

- Python API and validated active-channel scanner workflow: [docs/python_api.md](https://github.com/optimatorlab/olab_code/blob/main/packages/olab_rf/docs/python_api.md)
- Installation and decoder setup (RTL-SDR, `readsb`, `rtl_ais`, driver
  conflicts): [docs/install.md](https://github.com/optimatorlab/olab_code/blob/main/packages/olab_rf/docs/install.md)
- SDRTrunk/JMBE operator capability probe: [docs/sdrtrunk_capability_probe.md](https://github.com/optimatorlab/olab_code/blob/main/packages/olab_rf/docs/sdrtrunk_capability_probe.md)
- Demo web UI boundary: [docs/web_demo.md](https://github.com/optimatorlab/olab_code/blob/main/packages/olab_rf/docs/web_demo.md)
- Radio voice segment integration: [docs/voice_segment_integration.md](https://github.com/optimatorlab/olab_code/blob/main/packages/olab_rf/docs/voice_segment_integration.md)

## Examples

Runnable examples live under [`examples/`](https://github.com/optimatorlab/olab_code/tree/main/packages/olab_rf/examples): `replay_tracks.py`,
`frequency_scan.py`, `baseline_then_scan.py`, `history.py`, and
`iq_range_scan.py` (exercised directly by
`tests/test_iq_range_scan_example.py`).

## Test Strategy

Most tests are model-free and run unconditionally. Tests requiring an
optional dependency (`pyais` for AIS parsing, `msgpack` for the NATS
transport, `fastapi`/`uvicorn` for the web demo) self-skip via
`pytest.importorskip`/existing guards when that extra isn't installed —
CI's base-only install runs a green, if smaller, subset; install
`[dev,web,ais,pyrtlsdr,nats]` locally for full coverage.
