glasswatch
Passive BLE scanner for smart-glasses manufacturer IDs (Meta, EssilorLuxottica, Snap)
v1.0.0⚠ Ethics ⚠
False positives are likely. The vendors covered by this tool also ship VR headsets and other gadgets that share their Bluetooth company IDs. A hit is one signal among many, not proof of anything.
Do not harass anyone based on this output. Harassing a person over a suspected covert recording device can be a criminal offence in many jurisdictions — sometimes a more serious one than using such a device. Check your local law before acting.
This tool exists to inform you about your environment. Use it to walk away, not to confront. If you see a real concern, escalate through lawful channels (venue staff, professional authorities, legal counsel).
Quick Start
Install via jcli (recommended)
jcli install glasswatch
Or via the installer
curl -fsSL https://cli.johlem.net/tools/glasswatch/install.sh | bash
Grant the BLE capability (recommended)
sudo setcap 'cap_net_raw,cap_net_admin+eip' "$(which glasswatch)"
Smoke test (no scan)
glasswatch list-ids # see the catalogue we look for
glasswatch list-ids --json # machine-readable
Live scan
glasswatch scan # 60s default, low+ severity, human table
glasswatch scan --duration 0 --json # stream JSON Lines until Ctrl-C
glasswatch scan -s high -r -70 # only strong matches, close range
glasswatch scan --include-unmatched # diagnostic: show every advert
What it does
glasswatch listens for Bluetooth Low Energy advertising frames on a local BlueZ
adapter and surfaces frames whose manufacturer-specific data carries a company ID associated
with smart-glasses vendors (Meta Platforms / Oculus, EssilorLuxottica, Snap Inc.). It also
matches a small set of device-name substrings (rayban, spectacles, …).
Pure receive-side — no transmission, no active probing. No data is uploaded anywhere; the catalogue is static and lives in the binary.
Catalogue
| CID | Vendor | Model hint | Kind |
|---|---|---|---|
0x01AB | Meta Platforms (Oculus VR LLC) | Quest / Ray-Ban Meta / Meta AI Glasses | possible |
0x058E | Meta Platforms | Ray-Ban Meta / Meta AI Glasses | likely |
0x0D53 | EssilorLuxottica | Ray-Ban / Oakley smart frames | likely |
0x03C2 | Snap Inc. | Spectacles | likely |
Device-name substrings (case-insensitive): rayban, ray-ban,
ray ban, spectacles, meta glass, meta glasses,
meta ai glass, oakley meta.
Company IDs come from the Bluetooth SIG Assigned Numbers — public data, not copyrightable.
Severity grading
| Catalogue match | Name heuristic | Severity |
|---|---|---|
Likely | yes | high |
Possible | yes | high |
Likely | no | medium |
Possible | no | low |
| (none) | yes | medium |
| (none) | no | none (filtered out by default) |
Subcommands
| Command | What it does |
|---|---|
glasswatch scan [-d S] [-s low|medium|high] [-r DBM] [--json] [--include-unmatched] | Run a passive BLE scan and stream detections to stdout. |
glasswatch list-ids [--json] | Print the static catalogue of company IDs and name heuristics. |
Touches / Produces / Gates
- Touches (BLE radio, receive-only): passive listen on the local BlueZ adapter. No transmission, no active probing.
- Touches (D-Bus): the BlueZ session at
org.bluez. - Produces: one record per matching advertisement on stdout (human table or JSON Lines), plus the suite footer at end-of-scan.
- Gates: BLE scan needs
CAP_NET_RAW+CAP_NET_ADMINon Linux. Eithersetcapthe binary (recommended), run as root, or join thebluetoothgroup.--i-am-authorizedis NOT required — the scan is read-only.
Exit codes
| Code | Meaning |
|---|---|
0 | Ok (scan finished cleanly, or list-ids printed) |
1 | BlueZ unavailable, no adapter, scan failed |
2 | Usage error (clap) |
Credits
The choice of company-ID set is borrowed (as factual data) from
yj_nearbyglasses by
Yves Jeanrenaud — an Android + iOS app with the same goal. That project is licensed AGPLv3; the
Rust code in glasswatch is original (clean-room) and shipped under this
repository's terms. If you want a mobile version, install
yj_nearbyglasses.
The detection IDs themselves are public Bluetooth SIG Assigned Numbers and carry no copyright.
Build from source
cd tools/glasswatch/rust
cargo build --release
cargo test # 24 unit tests
Toolchain pin: Rust 1.85.0. Dependencies: clap, anyhow,
serde + serde_json, chrono, tokio,
btleplug, futures.
Build prereq: libdbus-1-dev + pkg-config. Runtime prereq: BlueZ
stack with bluetoothd running.