Repository navigation
Releases: PolarPatch/BlueWatch
Release list
v0.1.5
New
- Sub-GHz (433/868 MHz) discovery via rtl_433 and an RTL-SDR dongle. Optional, receive-only, off entirely unless the
rtl_433binary and an RTL-SDR are both present. Picks up weather stations, remotes/doorbells, BLE-independent TPMS sensors, and wireless utility meters (Wireless M-Bus, electricity/water/heat) -- all keyed alongside Bluetooth and LAN devices in the same device list.- New Config page for RTL-SDR (on/off, frequencies)
- Device Details shows live sensor readings (temperature, humidity, battery) for weather stations
- New
Utility Meterdevice type - New
/rfpage: a temporary, raw, un-deduplicated log of every decoded sub-GHz event, for seeing exactly what's out there
- Fingerprint-based identity linking. A device with no advertised name and a randomized (rotating) MAC address can now still be recognized across address rotations, by matching the set of service UUIDs/manufacturer IDs/appearance it consistently advertises. Deliberately conservative: refuses to link on a single generic signal, and requires the old address to have gone quiet first.
- BLE TPMS sensor detection (tire-pressure sensors advertising a dedicated service UUID).
- Camera vendor detection by name (Verkada, Axis, Hikvision, Reolink, Arlo, Ring, Blink, and others), and classifier rule changes now automatically re-evaluate every previously-seen device's stored type in the background.
- Hide Apple filter on the dashboard and All Devices, matching by vendor, identifier, or Apple's own company ID.
- Compact display API (
/api/display,/api/display/device,/api/display/radar) for driving small external screens/radar views off the same data.
Fixed
- Device Details was broken for every device, not just sub-GHz ones -- opening any device's detail modal threw a JavaScript error (
rfStateHtml is not defined) due to a function call with no matching definition.
Upgrading
git pull && ./install.sh. Sub-GHz discovery needs the rtl_433 binary (install separately, e.g. apt install rtl-433 or build from merbanan/rtl_433) and an RTL-SDR dongle; everything else works exactly as before without either.
Tested
Raspberry Pi 3 (Raspberry Pi OS Trixie, Bluetooth 4.1), RTL-SDR (RTL2838) dongle for the sub-GHz features -- confirmed live reception of weather stations on 433.92 MHz and Wireless M-Bus framing on 868.3 MHz.
v0.1.4
New
- Signal radar (
/radar). A live radar of everything around you. Distance from the centre is signal strength, with rings at -40, -60, -80 and -100 dBm. New devices pulse and get a NEW marker, devices that leave fade out, and an arrow shows whether a signal is getting stronger or weaker. A live event log sits under the radar. Inspired by Fieldwatch (seeCREDITS.md). The direction of a dot means nothing: one receiver cannot tell where a device is. - Redesigned dashboard and All devices. New sidebar with category tiles and activity strips, a Filters panel (hide classified, grouped or unknown devices; seen within, first seen, sightings and RSSI), and a date and time range search.
- Statistics graphs. Hourly overview graphs, backed by an hourly rollup so they stay fast with thousands of devices.
- Automatic device types. Types are now worked out from the Bluetooth advertisement and stored. Cycling and fitness equipment (FTMS trainers, Tacx, Elite Sterzo and Rizer, Garmin Varia radar) is recognised as wearable.
- Sticky alerts. Alerts for the device types you follow stay on the dashboard until you dismiss them, and reopen if the device returns after being away.
- Devices on your network. Local network devices are found through mDNS and shown next to the Bluetooth ones. Adapted from Neighborhood Rhythm (see
CREDITS.md). - Automatic CSV export and cleanup. Old observations are written to one plain CSV file per day and then removed from the database. Off by default, set up under Config, Export.
- Demo mode (
?demo=1) now also covers the radar, for safe screenshots.
Fixed
- Bluetooth controller hangs on Raspberry Pi 3. Throttled classic inquiry and added a controller reset, so the scan no longer stalls with 0 devices.
- Watchdog restarts on a busy Pi 3. The device list query is about twice as fast, pages in a background browser tab stop polling, and the watchdog tolerates slower scan cycles.
- Type alerts and return-after-absence alerts never fired for automatically classified devices.
- Login failed with "Invalid credentials" on phones. Rejected logins are now logged with the reason (never the values).
- Category menu did nothing, and a slow response could overwrite the selected category's device list.
- Device Details: the notes field uses the full width and shows "Saved" after saving. The search panel's Clear button now also clears the text search.
Upgrading
git pull && ./install.sh. The new mDNS discovery needs the zeroconf package, which the installer and pip install . add.
Tested
Raspberry Pi 3 (Raspberry Pi OS Trixie, Bluetooth 4.1) running from source. A fresh install and Docker were not re-tested for this release.
v0.1.3
Installation fixes
This release is about making BlueWatch easy to install. Thanks to @skinnypuppy and @buttim for reporting #1.
- Fixed: the web UI did not start in Docker (#1) and after a regular
pip install. The logo lived outside the Python package, so it was missing from the Docker image and from non-editable installs, and the web server refused to start without it. The logo (and the bundled data files) now ship inside the package, and a missing asset can no longer stop the UI from starting. - New: one-command Linux install.
./install.shnow works on Raspberry Pi OS, Debian and Ubuntu: it installs BlueZ, sets up a private virtual environment in/opt/bluewatch, and registers a systemd service that starts at boot../install.sh uninstall(--purgeto wipe data) removes it. Upgrade withgit pull && ./install.sh. - Fixed:
bluewatch.servicepointed at the system Python and failed withModuleNotFoundError; it now uses the installer's virtual environment. - Fixed: README instructions. The manual Linux install failed on current Debian / Raspberry Pi OS (PEP 668), the clone URL was a placeholder, and
cd bluewatchfailed on Linux (the folder isBlueWatch). - Fixed (macOS): ~2 minute startup delay caused by a Bluetooth pre-flight wait (same fix as upstream bluehood #48).
install.shalso now verifies that the dashboard really answers, and shows the correct PID.
Removed
- The unfinished
/nr(Neighborhood Rhythm) reverse proxy and its nav link. It will return in a later release once it is ready.
Tested
Native install with install.sh: Raspberry Pi 5 on Raspberry Pi OS Bookworm (32-bit, Python 3.11) and Trixie (64-bit), plus macOS (launchd). Docker Compose: Raspberry Pi 5 (Trixie, 64-bit) and Docker Desktop on macOS. Service starts after reboot on both Pi OS versions.
Notes
- Docker on Raspberry Pi needs a 64-bit OS and the Compose v2 plugin (see the README). On 32-bit Raspberry Pi OS use
./install.shinstead.
v0.1.2
Detection & classification
A large batch of new passive BLE fingerprints, every company ID / OUI / UUID independently cross-verified against the Bluetooth SIG and IEEE registries before being trusted (several catalog entries from third-party sources were found to be wrong -- shared-chipset vendors misattributed to a specific product -- and deliberately left out):
- Drone Remote ID (ASTM F3411/OpenDroneID) plus DJI (model-ID-aware routing between drones and its Osmo camera line), Skydio, Autel, Parrot, HOVERAir
- Smart locks: ASSA ABLOY, HID Global, Yale, SALTO, August, Allegion, Tedee, igloohome, Master Lock, Kevo, dormakaba, Paxton, Nuki (verified directly against Nuki's own open-source BLE library), Lockly, Kwikset
- Flipper Zero: both the new (0C:FA:22, IEEE-assigned) and legacy (80:E1:26, pre-assignment) MAC prefixes, plus its extra service UUIDs
- Vehicle OEM phone-as-key/infotainment: Ford, Honda, Hyundai, Toyota, Nissan, Subaru, BMW, Volkswagen, Porsche, Jaguar Land Rover, BYD, plus aftermarket BLE TPMS (Goodyear, Schrader, Pacific Industrial) and Samsara fleet telematics
- Smart glasses: Meta, Even Realities, Vuzix, Luxottica, Snapchat, plus name-gated Sony/Epson/TCL
- Plejd smart-home mesh, UniFi Protect cameras, cheap BLE-serial skimmer modules, Chamberlain/myQ, Hatch Baby, Chipolo, Pebblebee, Helium, Fieldy/Plaud recording wearables
- Apple Continuity: AirPods/Beats model + live activity state, walking the full TLV chain instead of just the first message
- Samsung TV/appliance power state, Fast Pair passive Model ID resolution + active GATT query + anti-spoof verification + battery levels
- Bluetooth SIG company-name fallback for devices with a randomized MAC and no other identifying signal
New features
- Live Signal panel on Device Details -- a real-time signal-strength graph (reads straight from the continuous scanner's in-memory state, not a periodic snapshot, so it's genuinely sub-second fresh), styled after Fieldwatch's own device card: gridded axis, presence timeline, current reading + trend arrow
- Priority box -- watched devices and type-alert-listed devices (e.g. "always show me a drone the moment one appears") surface immediately regardless of the main table's active filters, independent of whether they've been reviewed/grouped yet
- Real-time live-sighting stream (Server-Sent Events) -- the dashboard reflects a new sighting the instant it's scanned, instead of waiting for the next poll
- Split "Hide categorized devices" into two independent filters (hide-by-known-class, hide-by-group) -- the old combined toggle could hide a device that had never actually been reviewed, just because BlueWatch had auto-classified its type
- "Scan Unknown Devices" batch Scan Unit run, "First seen within" filter slider
- Self-healing BLE recovery: detects a silent scan hang (zero devices reported for several minutes with no error) and automatically resets the adapter, instead of requiring a manual restart
Fixes
- A systemic timezone bug: SQL-side
datetime('now', ...)cutoffs are UTC, but stored timestamps are naive local time -- several features were silently comparing against the wrong window - Three severe query performance bugs causing multi-second to 30+ second UI lag
- An XSS vulnerability in the Watched Devices list
- A blocking 5-minute
sleep()that froze the entire event loop (web server included) during BLE crash-loop recovery - The Apple vendor-name guess misclassifying randomized-MAC devices as "Phone" on weak evidence
bluewatch.servicenow restarts on any exit, not just on-failure
Not included in this release
ESP32-S3 second-radio support and the /nr Neighborhood Rhythm integration are both present in the source but explicitly not part of this release's feature set -- ESP32 support is still being validated for stability, and /nr is an active side-by-side evaluation of another project's dashboard, not a finished BlueWatch feature. Both stay behind disabled-by-default toggles.
Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
v0.1.1
Identification / fingerprinting
- Apple Continuity: walk the full TLV chain instead of only the first message (devices with chained Handoff + Nearby Info were previously invisible), plus AirPods/Beats model and live activity-state decoding
- Google Fast Pair: passive identification via the bundled KULeuven-COSIC Model ID registry (~2,900 known devices), an active unauthenticated Model ID GATT read as a Scan Unit fallback, plus battery-level decoding
- Samsung TV/appliance manufacturer-data class/power-state decoding, plus a
service_dataUUID fallback signal - Tesla key-fob detection, Microsoft Swift Pair, brand-new/unpaired AirTag setup-mode detection, Insta360 GO 3S fixed (was misclassified as a Find My tracker), GAP Appearance-code classification, and a batch of additional blesploit-derived fingerprints
- Fast Pair anti-spoof cryptographic verification, wired into Scan Unit (optional, off by default)
Scanning / reliability
- Continuous BLE scanning (was one-shot), auto-paused for classic scans and Scan Unit polls, with Scan Unit given priority
- Scan Unit retries on adapter-busy errors instead of failing
- Fixed: Type/Vendor/Identifier fields weren't reliably refreshing after a Scan Unit poll
New Config sections
- Type-based ntfy alerts (e.g. get pinged the moment a Flipper Zero shows up) -- configurable list, any device type
- Custom device Classes -- add/edit/delete your own classification types beyond the built-in set
- Watched Devices list under Config > Alerts, with a Remove button
- Clearer Fast Pair description
- Removed the dead Fast Pair API key field (no such API exists)
Dashboard
- "First seen" filter as a slider in the filter bar (Off / 6h / 12h / 24h / 48h / this week / this month)
- Fixed the manual "Scan Unit" device poll's UI bugs
Security fix
- XSS in the Watched Devices list (operator-editable device names weren't sanitized before going into the DOM)
Note: an ESP32-S3 second BLE radio integration is in active testing and not included in this release.
v0.1.0
First tagged release of BlueWatch as its own project, forked from
bluehood by Danny McClelland
and taken in a different direction since.
Features
- Known/unknown device categorization with nested, drag-and-drop categories
- Per-device arrive/depart notifications with temporary overrides
- Editable device Type and custom Identifier, independent of the advertised name
- RSSI and sightings-count threshold filters on the live dashboard
- Automatic MAC-rotation tracking: devices with a randomized MAC that share
an advertised name are auto-clustered, with a ×N badge showing how many
addresses have been seen for the same physical device - Possible name-spoofing detection: flags when a single MAC address
advertises a different name than it did before - Manufacturer-data fingerprinting: detects Apple Find My/AirTag broadcasts
(not just any Apple device), Flipper Zero, and smart glasses
(Meta/Oakley Meta, Even Realities, Vuzix) - WiGLE lookups, Prometheus metrics + Grafana dashboard, CSV export
- Configurable storage retention, web server port, and demo/screenshot modes
- Runs on Raspberry Pi, Linux, macOS, or Docker
See the README for the
full feature list and setup instructions.