A passive Bluetooth Low Energy (BLE) density scanner for the Flipper Zero.
Warning
🚧 UI PROTOTYPE & FIRMWARE LIMITATIONS
Neither the official Flipper Zero firmware nor current custom firmwares (like Unleashed or Xtreme) allow external SD card apps (.fap) direct access to low-level BLE radio commands (e.g., hci_send_req for passive scanning).
Therefore, this app currently serves as a technical UI prototype. The custom "System Mass Index" tachometer interface works flawlessly and proves the design concept, but the operating system currently refuses to provide the raw radio sensor data to the app sandbox, keeping the display reading at 0.
Because external .fap apps cannot send the necessary HCI commands to the radio, there is only one way to make the true scanner fully operational: build it directly into the firmware as a core system app.
By placing this source code into the applications/user/ directory of a Custom Firmware source tree (e.g., Unleashed) and compiling the firmware from scratch, the API sandbox restrictions are bypassed. The scanner logic in density_scanner.c can then be rewritten to use the genuine BLE observation APIs (aci_gap_start_observation_proc()) to achieve true passive background scanning.
BLE Density Gauge passively monitors Bluetooth Low Energy (BLE) advertisement traffic to estimate the density of nearby electronic devices — phones, smartwatches, earbuds, laptops, and anything else broadcasting BLE signals.
No device lists. No MAC addresses. No tracking. Just a beautiful analog tachometer showing the System Mass Index of your environment.
The app's scanning engine is designed to hop across the three BLE advertising channels (37, 38, 39), sampling radio signal strength (RSSI) to detect nearby device activity. The more devices broadcasting, the higher the gauge climbs.
┌──────────────────────────────────┐
│ BLE DENSITY MEDIUM │
│ ──────────────────────────────── │
│ ╭─────────╮ │
│ / . : . \ │
│ / . | . \ │
│ /───────o───────\ │
│ │
│ 0 50 100 │
│ │
│ EVT: 142 -67dBm 45s │
│ ██████████████████░░░░░░░░░░░░░░ │
└──────────────────────────────────┘
| Level | Devices | Typical Environment |
|---|---|---|
| EMPTY | 0–5 | Empty room, outdoors |
| LOW | 5–15 | Small office, café |
| MEDIUM | 15–40 | Crowded bar, lecture hall |
| PACKED | 40+ | Concert, train station, demo |
- Download the latest
.fapfrom Releases (or find it in your localdist/folder if you built it yourself) - Copy it to your Flipper's SD card:
SD Card/apps/Tools/ble_density_gauge.fap - On your Flipper: Apps → Tools → BLE Density
- Python 3.8+
- ufbt (Universal Flipper Build Tool)
pip install ufbt
cd ble-density-gauge
ufbtThe compiled .fap will be in the dist/ directory.
ufbt launchThe app uses the Flipper's radio hardware to cycle through BLE advertising channels:
- Channel Hopping: Rapidly switches between channels 37, 38, and 39 (the three BLE advertising channels)
- RSSI Sampling: Takes multiple signal strength readings per channel, filtering out background noise below -90 dBm
- Rolling Window: Maintains a 60-second sliding window of detected events
- Density Scoring: Applies logarithmic scaling to map raw event counts to a 0–100 gauge scale
- No MAC addresses collected — only aggregate signal strength
- No data stored — everything stays in RAM
- Completely passive — the Flipper only listens, never transmits during scanning
- Offline — no network connectivity required
- While the app is scanning, the Flipper's normal BLE connectivity (companion app) is temporarily unavailable
- BLE is fully restored when you exit the app
- The density readings are estimates based on radio traffic, not exact device counts
- Signal reflections and environmental factors can affect readings
MIT License — see LICENSE
Pull requests welcome! Areas for improvement:
- Calibration profiles for different environments
- Historical density graph over time
- Sound/vibration alerts at configurable thresholds
- Data export to SD card