glasswatch

Passive BLE scanner for smart-glasses manufacturer IDs (Meta, EssilorLuxottica, Snap)

v1.0.0
Linux

⚠ 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

CIDVendorModel hintKind
0x01ABMeta Platforms (Oculus VR LLC)Quest / Ray-Ban Meta / Meta AI Glassespossible
0x058EMeta PlatformsRay-Ban Meta / Meta AI Glasseslikely
0x0D53EssilorLuxotticaRay-Ban / Oakley smart frameslikely
0x03C2Snap Inc.Spectacleslikely

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 matchName heuristicSeverity
Likelyyeshigh
Possibleyeshigh
Likelynomedium
Possiblenolow
(none)yesmedium
(none)nonone (filtered out by default)

Subcommands

CommandWhat 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

Exit codes

CodeMeaning
0Ok (scan finished cleanly, or list-ids printed)
1BlueZ unavailable, no adapter, scan failed
2Usage 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.