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 zero android.* 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:test without 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
Share this project:

Updates

Submission history