Skip to content
Open
Show file tree
Hide file tree
Changes from 40 commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
732b14f
Enforce `main <- dev` governance, migrate to GPL-2.0-only, add CLI/UI…
Josephrp Mar 5, 2026
3c25acf
Merge branch 'main' into dev
Josephrp Mar 5, 2026
b0208a8
fixes license acceptance bugs
Josephrp Mar 6, 2026
04914dc
Merge branch 'main' into dev
Josephrp Mar 6, 2026
1426b5a
readme improvements and readthedocs ci (#22)
Josephrp Mar 6, 2026
bd99c98
chore(release): bump patch to 0.1.2
Josephrp Mar 6, 2026
b6e5e4c
Merge branch 'main' of https://github.com/Josephrp/radioshaq into dev
Josephrp Mar 6, 2026
5d3ed9e
adds language support and interface improvements (#23)
Josephrp Mar 7, 2026
45a49b0
Merge branch 'dev' of https://github.com/Josephrp/radioshaq into dev
Josephrp Mar 7, 2026
f9a7c88
adds gis functionality
Josephrp Mar 7, 2026
d81d636
removes stray .md
Josephrp Mar 7, 2026
ee5ec07
addresses review comments
Josephrp Mar 7, 2026
63ddfe0
addresses review comments
Josephrp Mar 7, 2026
b3f39db
solves failing tests
Josephrp Mar 7, 2026
eaf5fb9
improves testing ci
Josephrp Mar 7, 2026
d8421b0
addresses review
Josephrp Mar 7, 2026
4b33e77
addresses final review
Josephrp Mar 7, 2026
27f383d
GIS location capture flow, dependency guidance, and test fixes (#25)
Josephrp Mar 7, 2026
f5c2398
solves failing ci env
Josephrp Mar 7, 2026
d70495b
Gis (#27)
Josephrp Mar 7, 2026
e332f9a
solves failing ci env
Josephrp Mar 7, 2026
a5c6916
Merge branch 'dev' of https://github.com/Josephrp/radioshaq into gis
Josephrp Mar 7, 2026
3f43b34
adds Country-specific compliance plugin (FCC, CEPT, R1 band plans) (#28)
Josephrp Mar 7, 2026
826407c
TTS/ASR provider plugin, Hugging Face Inference, local options, .giti…
Josephrp Mar 7, 2026
7062f4d
SMS/WhatsApp relay, emergency approval, contact preferences & testing…
Josephrp Mar 7, 2026
b3b7da8
Patch (#33)
Josephrp Mar 8, 2026
e2e9840
solves review comments
Josephrp Mar 8, 2026
d86d7ee
solves review comments
Josephrp Mar 8, 2026
5b8925f
solves review comments
Josephrp Mar 8, 2026
30a7663
solves review comments
Josephrp Mar 8, 2026
5a73159
solves review comments
Josephrp Mar 8, 2026
0e76266
solves review comments
Josephrp Mar 8, 2026
099503c
solves review comments
Josephrp Mar 8, 2026
08a0708
solves review comments
Josephrp Mar 9, 2026
ab1366b
solves review comments
Josephrp Mar 9, 2026
7864aa8
solves review comments
Josephrp Mar 9, 2026
876fd8d
solves review comments
Josephrp Mar 9, 2026
1f28909
solves review comments
Josephrp Mar 9, 2026
4f78956
adds hackrf (#34)
Josephrp Mar 14, 2026
9ab7010
adds submission to gemini hackathon
Josephrp Mar 14, 2026
fb6f8c7
Revert "adds submission to gemini hackathon"
Josephrp Mar 15, 2026
4960690
adds gemini & googlemaps (#36)
Josephrp Mar 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions .githooks/pre-push
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@ echo "[pre-push] Installing/syncing test dependencies..."
cd radioshaq
uv sync --extra dev --extra test --extra sdr

echo "[pre-push] Running unit + integration tests..."
uv run pytest tests/unit tests/integration -v
echo "[pre-push] Running unit tests..."
uv run pytest tests/unit -v

echo "[pre-push] Running integration tests..."
uv run pytest tests/integration -v

echo "[pre-push] All checks passed."
2 changes: 1 addition & 1 deletion .github/mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -75,5 +75,5 @@ nav:
- Quick Start: quick-start.md
- Radio Usage: radio-usage.md
- Configuration: configuration.md
- Monitoring: monitoring.md
- Response & compliance: response-compliance-and-monitoring.md
- API Reference: api-reference.md
34 changes: 27 additions & 7 deletions .github/workflows/publish-nightly.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
name: Publish Nightly to PyPI

on:
push:
branches:
- dev
workflow_dispatch:

permissions:
Expand Down Expand Up @@ -33,17 +30,40 @@ jobs:
runs-on: ubuntu-latest
env:
RADIOSHAQ_LICENSE_ACCEPTED: "1"
DATABASE_URL: postgresql://radioshaq:radioshaq@127.0.0.1:5434/radioshaq
TEST_DATABASE_URL: postgresql+asyncpg://radioshaq:radioshaq@127.0.0.1:5434/radioshaq
services:
postgres:
image: postgis/postgis:16-3.4
env:
POSTGRES_USER: radioshaq
POSTGRES_PASSWORD: radioshaq
POSTGRES_DB: radioshaq
ports:
- 5434:5432
steps:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: "3.11"
- uses: astral-sh/setup-uv@v7
- name: Run test suite
- name: Install dependencies
run: cd radioshaq && uv sync --extra dev --extra test --extra sdr
- name: Wait for Postgres
run: |
cd radioshaq
uv sync --extra dev --extra test --extra sdr
uv run pytest tests/unit tests/integration -v
for i in $(seq 1 30); do
if python -c "import socket; s=socket.socket(); s.settimeout(2); s.connect(('127.0.0.1',5434)); s.close()" 2>/dev/null; then
echo "Postgres is ready on 127.0.0.1:5434"
break
fi
echo "Waiting for Postgres... ($i/30)"
sleep 2
done
python -c "import socket; s=socket.socket(); s.settimeout(5); s.connect(('127.0.0.1',5434)); s.close(); print('Postgres port open')"
- name: Run database migrations
run: cd radioshaq && uv run alembic-upgrade
- name: Run test suite
run: cd radioshaq && uv run pytest tests/unit tests/integration -v

build-and-publish:
name: Build and publish nightly artifact
Expand Down
31 changes: 27 additions & 4 deletions .github/workflows/publish-pypi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,17 @@ jobs:
runs-on: ubuntu-latest
env:
RADIOSHAQ_LICENSE_ACCEPTED: "1"
DATABASE_URL: postgresql://radioshaq:radioshaq@127.0.0.1:5434/radioshaq
TEST_DATABASE_URL: postgresql+asyncpg://radioshaq:radioshaq@127.0.0.1:5434/radioshaq
services:
postgres:
image: postgis/postgis:16-3.4
env:
POSTGRES_USER: radioshaq
POSTGRES_PASSWORD: radioshaq
POSTGRES_DB: radioshaq
ports:
- 5434:5432
steps:
- uses: actions/checkout@v6
with:
Expand All @@ -32,11 +43,23 @@ jobs:
with:
python-version: "3.11"
- uses: astral-sh/setup-uv@v7
- name: Run test suite
- name: Install dependencies
run: cd radioshaq && uv sync --extra dev --extra test --extra sdr
- name: Wait for Postgres
run: |
cd radioshaq
uv sync --extra dev --extra test --extra sdr
uv run pytest tests/unit tests/integration -v
for i in $(seq 1 30); do
if python -c "import socket; s=socket.socket(); s.settimeout(2); s.connect(('127.0.0.1',5434)); s.close()" 2>/dev/null; then
echo "Postgres is ready on 127.0.0.1:5434"
break
fi
echo "Waiting for Postgres... ($i/30)"
sleep 2
done
python -c "import socket; s=socket.socket(); s.settimeout(5); s.connect(('127.0.0.1',5434)); s.close(); print('Postgres port open')"
- name: Run database migrations
run: cd radioshaq && uv run alembic-upgrade
- name: Run test suite
run: cd radioshaq && uv run pytest tests/unit tests/integration -v

verify-tag-source:
name: Verify tag points to main history
Expand Down
40 changes: 38 additions & 2 deletions .github/workflows/test-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,49 @@ jobs:
runs-on: ubuntu-latest
env:
RADIOSHAQ_LICENSE_ACCEPTED: "1"
DATABASE_URL: postgresql://radioshaq:radioshaq@127.0.0.1:5434/radioshaq
TEST_DATABASE_URL: postgresql+asyncpg://radioshaq:radioshaq@127.0.0.1:5434/radioshaq
services:
postgres:
image: postgis/postgis:16-3.4
env:
POSTGRES_USER: radioshaq
POSTGRES_PASSWORD: radioshaq
POSTGRES_DB: radioshaq
ports:
- 5434:5432
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: "20"
cache: "npm"
cache-dependency-path: radioshaq/web-interface/package-lock.json
- name: Build web UI and stage for API-served bundle
run: |
cd radioshaq/web-interface && npm ci --no-audit --no-fund && npm run build
cd "${{ github.workspace }}"
mkdir -p radioshaq/radioshaq/web_ui
cp -r radioshaq/web-interface/dist/. radioshaq/radioshaq/web_ui/
- uses: actions/setup-python@v6
with:
python-version: "3.11"
- uses: astral-sh/setup-uv@v7
- name: Run tests
- name: Install dependencies
run: cd radioshaq && uv sync --extra dev --extra test --extra sdr
- name: Wait for Postgres
run: |
cd radioshaq && uv sync --extra dev --extra test --extra sdr && uv run pytest tests/unit tests/integration -v
for i in $(seq 1 30); do
if python -c "import socket; s=socket.socket(); s.settimeout(2); s.connect(('127.0.0.1',5434)); s.close()" 2>/dev/null; then
echo "Postgres is ready on 127.0.0.1:5434"
break
fi
echo "Waiting for Postgres... ($i/30)"
sleep 2
done
python -c "import socket; s=socket.socket(); s.settimeout(5); s.connect(('127.0.0.1',5434)); s.close(); print('Postgres port open')"
- name: Run database migrations
run: cd radioshaq && uv run alembic-upgrade
- name: Run tests
run: cd radioshaq && uv run pytest tests/unit tests/integration -v

32 changes: 30 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,10 @@ wheels/
*.egg-info
MANIFEST
.pytest_cache/
.ruff_cache/
.tmp_build/
.tmp_pytest/
dist-investigate/
.coverage
.coverage.*
htmlcov/
Expand Down Expand Up @@ -149,7 +153,7 @@ logs/
botpy.log
*.pid

# --- Shakods / PM2 ---
# --- RadioShaq / PM2 ---
# (logs/ above; PM2 dump is in user home)

# --- Docker / local dev ---
Expand All @@ -159,18 +163,42 @@ botpy.log
# --- Jupyter ---
.ipynb_checkpoints/

# --- Cache and temp folders ---
.cache/
cache/
tmp/
temp/
.tmp/
.temp/
*.cache
.sass-cache/
.stylelintcache
.vite/
.astro/
.rollup.cache/

# --- Misc ---
*.bak
*.tmp
*.temp
.cache/
result
result-*
*.dump
*.sqlite
*.sqlite3
db.sqlite3-journal

# --- RadioShaq local data ---
radioshaq/scripts/demo/recordings/
radioshaq/config.yaml

# --- RadioShaq web UI build output ---
radioshaq/radioshaq/web_ui/assets/

# --- RadioShaq local env / tools ---
radioshaq/.venv-wsl/
radioshaq/hackrf/

# --- Optional: uncomment if you don’t want lockfiles in vcs ---
# uv.lock
# package-lock.json
Expand Down
60 changes: 1 addition & 59 deletions .github/LICENSE.md → LICENSE.md
Original file line number Diff line number Diff line change
Expand Up @@ -259,62 +259,4 @@ DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR
A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH
HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

END OF TERMS AND CONDITIONS

How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible
use to the public, the best way to achieve this is to make it free software
which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach
them to the start of each source file to most effectively convey the exclusion
of warranty; and each file should have at least the "copyright" line and a
pointer to where the full notice is found.

<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this when it
starts in an interactive mode:

Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w`.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c` for details.

The hypothetical commands `show w` and `show c` should show the appropriate
parts of the General Public License. Of course, the commands you use may be
called something other than `show w` and `show c`; they could even be
mouse-clicks or menu items—whatever suits your program.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:

Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision` (which makes passes at compilers) written by James Hacker.

<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice

This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General Public
License instead of this License.
END OF TERMS AND CONDITIONS
9 changes: 8 additions & 1 deletion docs/api-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ The RadioShaq API is a FastAPI application. All protected endpoints require a **
| Area | Prefix | Purpose |
|------|--------|---------|
| Health | `/health`, `/health/ready` | Liveness and readiness (DB, orchestrator) |
| Metrics | `/metrics` | Prometheus scrape (uptime, callsigns, optional GPU). See [Monitoring](monitoring.md). |
| Metrics | `/metrics` | Prometheus scrape (uptime, callsigns, optional GPU). See [Response & compliance](response-compliance-and-monitoring.md). |
| Auth | `/auth/token`, `/auth/refresh`, `/auth/me` | Issue token, refresh, current user |
| Messages | `/messages/process`, `/messages/whitelist-request`, `/messages/from-audio`, `/messages/inject-and-store` | Orchestration and whitelist flow |
| Relay | `/messages/relay` | Band translation (e.g. 40m → 2m). Stores source + relayed transcripts; optional inject/TX when config enables. Recipients **poll** `GET /transcripts?callsign=<callsign>&destination_only=true&band=<band>` to retrieve relayed messages. |
Expand All @@ -18,9 +18,16 @@ The RadioShaq API is a FastAPI application. All protected endpoints require a **
| Audio | `/api/v1/config/audio`, `/api/v1/audio/devices`, `/api/v1/audio/pending`, approve/reject | Audio config and pending response queue |
| Transcripts | `/transcripts`, `/transcripts/{id}`, `/transcripts/{id}/play` | Search and play transcripts |
| Radio | `/radio/status`, `/radio/propagation`, `/radio/bands`, `/radio/send-tts` | Radio connected?, propagation, band list, send TTS |
| **GIS** | `/gis/location`, `/gis/location/{callsign}`, `/gis/operators-nearby` | Store/retrieve operator location (lat/lon), find operators within radius. v1: explicit coordinates only; `location_text` alone returns 400. Source `user_disclosed` and timestamp in responses. |
| Inject | `/inject/message` | Demo: push message into RX injection queue |
| Internal | `/internal/bus/inbound` | MessageBus inbound (e.g. Lambda) |

### GIS location (PostGIS)

- **POST /gis/location** — Store operator location. Body: `callsign` (required), `latitude` and `longitude` (required for v1), optional `accuracy_meters`, `altitude_meters`. If only `location_text` is sent, returns 400 with `error: "ambiguous_location"`. Response: `id`, `callsign`, `latitude`, `longitude`, `source` (e.g. `user_disclosed`), `timestamp`, `confidence`. Coordinates `0.0, 0.0` are valid.
- **GET /gis/location/{callsign}** — Latest stored location for callsign (explicit lat/lon). 404 if none.
- **GET /gis/operators-nearby** — Query: `latitude`, `longitude`, `radius_meters` (default 50000), optional `recent_hours` (default 24), `max_results` (default 100). Returns list of operators with `distance_meters`.

Generated API reference from the FastAPI OpenAPI spec (run `python radioshaq/scripts/export_openapi.py` from repo root before building to produce `docs/api/openapi.json`):

[OAD(docs/api/openapi.json)]
Loading