Dataset export (source data for model training):
- GET /api/v1/export?format=jsonl|csv|geojson with category/data_source
filters; streams a labeled dataset (signal params + identified device +
routed category) suitable for training a Sub-GHz classifier.
SQLite dev-mode (corrects FABLE brief: SQLite was NOT a drop-in swap):
- models.py made dialect-aware — JSONB->JSON, ARRAY(Text)->JSON, TSVECTOR
->Text via .with_variant(); PostGIS Geometry column + GiST index only
defined when not on SQLite (lat/lon + haversine bbox used instead).
- config/database.py honors DATABASE_URL / a full-URL override and builds
a SQLite engine (check_same_thread=False, no server pool) when the URL
is sqlite; PostgreSQL keeps pooling + UTC session.
Verified: create_all + Capture/CaptureMatch/Device CRUD + JSON round-trip
+ bbox query all work on sqlite; postgres mode still defines geom + gist
index; 52/52 unit tests pass.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>