Inspiration
Modern environments are saturated with radio frequency emissions from Wi-Fi access points and Bluetooth Low Energy (BLE) beacons. However, many consumer scanning tools transmit analytics to third-party clouds or exaggerate tracking capabilities. We envisioned Radio Observer as a strictly local-first, transparent, receive-only observation utility for Android that delivers rigorous radio spectrum visibility with zero telemetry and zero cloud dependency.
What it does
Radio Observer functions as an on-device RF observer operating in receive-only mode:
- Local-First Architecture: Operates entirely on-device without network calls, telemetry, or third-party SDK leaks.
- RF Packet Ingestion & Parsing: Safely parses BLE advertisements and Wi-Fi infrastructure AP signals directly into structured Kotlin domain models.
- Conservative Classification: Implements conservative manufacturer detection (such as Apple 0x004C and Samsung 0x0075 ecosystem tagging) without making false claims about tracking or exact distance.
- Ephemeral Identity Flagging: Explicitly flags randomized BLE MAC addresses and locally administered BSSIDs, preventing them from being treated as persistent user tracking identities.
- Local Data Export: Provides explicit, user-initiated reporting and export (CSV/JSON) using Android's native Storage Access Framework (SAF).
How we built it
- Pure Kotlin/JVM Core (
:core:radio): Clean separation of concerns with domain models, BLE packet parsers, AP classifiers, RSSI signal buckets, and in-memory stores containing zeroandroid.*imports—fully verifiable via device-free host unit tests. - Declarative Android UI (
:app): Minimalist, high-performance UI built using Jetpack Compose. - Local Persistence & Export: Memory-safe observation buffering and SAF-driven file generation for direct CSV and JSON exports.
- Architectural Reference: Architecturally informed by the open-source MIT-licensed Fieldwatch project, engineered with custom pure-JVM parsers from the ground up.
Honest Limitations
- No Client Device Snooping: Wi-Fi classification monitors standard infrastructure access points only; client devices are not visible via standard Android Wi-Fi APIs, and monitor mode is neither used nor claimed.
- Ecosystem Membership vs. Tracking: Manufacturer ID matching identifies ecosystem presence only (e.g., Apple or Samsung devices) and does not prove stalking, AirTag attachment, or stable individual tracking.
- Physical RSSI Realities: RSSI values are grouped into relative signal buckets; they do not correlate to precise physical distance.
What we learned & Verification
- Engineering robust packet parsers in pure JVM code enables instant verification via
./gradlew :core:radio:testwithout emulator overhead. - Managing privacy-preserving RF observation requires strict guardrails against treating transient, randomized MAC addresses as fixed tracking beacons.
What's next for Radio Observer
- Integrating foreground service pipelines for passive, low-power continuous reception.
- Expanding manufacturer payload decoders for additional open sensor beacons.
- Enhancing local CSV/JSON export filters by signal bucket and observed timestamp.
Built With
- android
- ble
- jetpack-compose
- jvm
- kotlin
- local-first
- privacy-first
- wifi
Log in or sign up for Devpost to join the conversation.