Meta's ships facial recognition on smart glasses

Hacker News Top News

Summary

A security researcher discovered that Meta's Stella companion app for smart glasses (v273.0.0.21) contains a fully assembled, functional facial recognition pipeline—including three on-device models, a biometric embedding database, and a notification system—that is dormant on stock accounts but operable when invoked directly. The pipeline can detect faces, generate 2048-dimension embeddings, and fire 'Person Recognized' notifications, raising significant privacy concerns even though Meta has not been observed activating it for regular users.

No content available
Original Article
View Cached Full Text

Cached at: 06/05/26, 02:12 AM

# Meta's smart glasses companion app ships a complete, dormant face-recognition pipeline on a stock account. Source: [https://www.buchodi.com/meta-glasses-facial-recognition/](https://www.buchodi.com/meta-glasses-facial-recognition/) 04 Jun 2026 Stella is the companion app for Meta's smart glasses\. Inspecting version`273\.0\.0\.21`of the Android build \(`com\.facebook\.stella`\), I found the entire computational and storage stack for on\-device facial recognition: three face models, a local database schema, a cosine\-similarity vector index dimensioned to match the models, a write path that stages biometric records to disk, a fully wired notification surface, and a user\-facing "Connections" widget\. I want to be precise about what that does and does not mean, because the gap between the two is important\. **What I can demonstrate:**the machinery is present, it is wired together\. Several facial extraction and facial fingerprinting models are present and I was able run the recognition pipeline end\-to\-end on a test image and it detected a face, generate a 2048\-dimension biometric embedding, searched a local index, and on a match fired an Android notification stating to the user "Person Recognized"\. To get the pipeline to run I invoked its existing handler directly with a test photo\. **What I cannot demonstrate:**that any of this is active for ordinary users\. On a stock, unenrolled account the user\-facing UI does not appear, and the screen the recognition notification deep\-links to is missing from the build\. I also did not observe Meta server\-pushing identity data to the relevant database on my test account\. So this is not "Meta is secretly identifying the people you look at\." It is: the complete apparatus to do exactly that is sitting on the device, assembled and functional, gated by Meta\. All findings below are reproducible against`com\.facebook\.stella`v273\.0\.0\.21\. --- ## Three face\-recognition models ship on the device \(~100 MB\) Three ExecuTorch \(`\.pte`\) models arrive on the device via NMLML, Meta's asset\-delivery system, downloaded from Meta\. Asset name \(Meta's naming\)FileSizeFunction`android\_facerec\_scrfd``SCRFD\.pte`3\.4 MBDetects faces in an image`android\_facerec\_kps\_aligner``KPSAligner\.pte`117 KBCrops and aligns each detected face`android\_facerec\_sface``SFace\.pte`96 MBConverts a face into a 2048\-number embedding \(the biometric fingerprint\)These map onto open\-source architectures, the same model families that other apps and academic projects already use: - **SCRFD***Sample and Computation Redistribution for Efficient Face Detection*\(InsightFace, ICLR 2022\)\. Reference implementation:`github\.com/deepinsight/insightface`\. - **SFace***Sigmoid\-Constrained Hypersphere Loss for Face Recognition*\(Zhong et al\., 2021\)\. Reference:`github\.com/zhongyy/SFace` - **KPSAligner**keypoint\-based alignment, standard practice since 2015 \(MTCNN, dlib, InsightFace\)\. Meta's SFace variant seems to be scaled larger than the public reference \(96 MB vs\. ~40 MB; 2048\-dimension output vs\. the reference's 128–512\)\. Worth stating plainly:**shipping detection and embedding models is not, by itself, evidence of recognition**\. Plenty of apps run on\-device face detection for framing or autofocus\. --- ## A cosine\-similarity face index, dimensioned exactly to the on\-device fingerprinter The recognition pipeline that actually runs and reads into this database: ``` /data/user/0/com.facebook.stella/files/rldrive/person_profiles/objects.db ``` This lives under**RLDrive**, Meta's cross\-device sync framework, in a`person\_profiles`namespace designed to be populated remotely\. I did**not**directly observe Meta pushing data to`person\_profiles`specifically on my test account\. I want to be clear that I'm describing the channel's existence, not an observed transmission\. The schema: ``` CREATE TABLE person ( nodeid INTEGER PRIMARY KEY, name TEXT, uri TEXT, blob BLOB, deleted INTEGER, version BLOB ); CREATE TABLE face ( nodeid INTEGER PRIMARY KEY, mediaPath TEXT, -- the face_id used in the deep link personUri TEXT, -- soft reference back to person.uri blob BLOB, deleted INTEGER, uri TEXT, version BLOB ); CREATE VIRTUAL TABLE face_mediaPath_vec USING vec0(mediaPath float[2048] distance_metric=cosine); -- 2048-float biometric fingerprint per face, cosine-distance search -- (uses the sqlite-vec extension) ``` Each`face`row points at a`person`via`personUri`\. Each`face\.mediaPath`is the primary key into`face\_mediaPath\_vec`, which stores the 2048\-number embedding\. Recognition is a cosine\-similarity query against that index, followed by a join into`person\.name`for the notification text\. A few things line up: - `vec0`is the open\-source**sqlite\-vec**extension, which turns SQLite into a vector\-similarity engine\. - The dimension`float\[2048\]`is the exact output shape of the SFace embedder shipped on the app\. - The`cosine`metric is the standard choice for comparing face embeddings\. The schema permits multiple`face`rows per`personUri`\(no`UNIQUE`constraint\), but whether a production deployment uses one\-to\-one or one\-to\-many is not visible from a non\-enrolled device\. **End\-to\-end test confirms both branches and isolates where writes go\.**I SHA\-256\-snapshotted and row\-counted the database, then ran the full recognition pipeline twice: once against an empty index \(no\-match\), once against an index pre\-loaded with a single embedding \(match\): - **No match**\(empty`face\_mediaPath\_vec`\): one`\(uuid\.jpg, uuid\.emb\)`pair was written to`NameTagsPending/`\. No notification\. - **Match**: an Android notification fired through the production`nametags\_recognition`channel \- title*"Person recognized"*, body*"Recognized Michel Foucault"*\. Nothing was added to`NameTagsPending/`\. --- When the device sees a face that the local index does not match, Stella writes it to: ``` /data/user/0/com.facebook.stella/files/NameTagsPending/ ``` Each unrecognized face produces a pair of files named with a fresh UUID: - a`\.jpg`— the cropped, aligned face, the output of SCRFD \+ KPSAligner; and - an`\.emb`— the 2048\-number SFace fingerprint\. The directory is mode`0700`and survives reboots\. Writes happen**only**on the no\-match branch; matched faces go to a notification and leave no on\-disk trace\. I verified the embedding's structure directly: ``` File: NameTagsPending/1566ab46-[...].emb Size: 8,192 bytes (2048 × float32, big-endian) L2 norm: 0.999999 ← canonical L2-normalized face embedding Min/max: −0.092110 / +0.098950 Mean: +0.000292 ``` Together,`\(uuid\.jpg, uuid\.emb\)`is a complete, indexable biometric record of one face — the same shape and encoding the cosine index in`person\_profiles/objects\.db`is built to match against\. The name*NameTagsPending*most literal reading is "faces pending a name" — biometrically encoded, awaiting a label\. I'll note the structural fact and let it carry its own weight: a face image and its fingerprint, stored side by side in plaintext, mode`0700`, surviving reboots, is precisely the dataset you would assemble if you intended to retroactively identify faces once a label arrives\. ![](https://storage.ghost.io/c/b8/53/b853e3d4-3186-409d-9c7f-7da931a60431/content/images/2026/06/10_foucault_input.jpg)****The original photo****the pipeline received as input \(1970 portrait of Michel Foucault by Jerry Bauer, 1970, 318×418 px JPEG, 28 KB\) Public domain, via[Wikimedia Commons](https://commons.wikimedia.org/wiki/File:Photo_of_Michel_Foucault_on_1970_dustjacket_of_The_Order_of_Things.jpg?ref=buchodi.com)\.![](https://storage.ghost.io/c/b8/53/b853e3d4-3186-409d-9c7f-7da931a60431/content/images/2026/06/12_foucault_face_crop_from_NameTagsPending.jpg)****The cropped face Stella's pipeline produced****and wrote to NameTagsPending/\. Output of SCRFD \(detector\) \+ KPSAligner \(aligner\)\. 83×118 px RGB JPEG, 4,396 bytes --- ## The notification surface is fully wired Stella defines a dedicated Android notification channel ``` NotificationChannel{ id = "nametags_recognition" name = "NameTags recognition" description = "Notifications for recognized NameTags connections" importance = IMPORTANCE_HIGH (heads-up + sound + badge) sound = system notification sound } ``` The notification template is hardcoded in the recognition handler\. Title is always*"Person recognized"*; body is always`"Recognized " \+ name`, where`name`comes from the`person`table in`person\_profiles/objects\.db`: ``` NotificationCompat.Builder(ctx, "nametags_recognition") .setContentTitle("Person recognized") .setContentText("Recognized " + matched_name) .setAutoCancel(true) .setContentIntent( PendingIntent.getActivity( ctx, matched_name.hashCode(), Intent.ACTION_VIEW with Uri "fb-viewapp://name_tags?face_id=" + face_id, FLAG_IMMUTABLE | FLAG_UPDATE_CURRENT)) .build() NotificationManagerCompat.notify(matched_name.hashCode(), notification) ``` The notification is tappable: its`contentIntent`is a deep link of the form`fb\-viewapp://name\_tags?face\_id=<face\_id\>`, a Meta\-authored URL scheme meant to open a person\-profile screen inside Stella\. One honest caveat: in v273,**I could not find that destination screen**\. Tapping the notification routes Stella to its default tab, because the target Compose destination is absent from the navigation graph\. The notification fires; the screen it points at isn't built into this release\. ![](https://storage.ghost.io/c/b8/53/b853e3d4-3186-409d-9c7f-7da931a60431/content/images/2026/06/MF_stella_notif-1-1.png) --- ## A user\-facing "Connections" entry point exists in the APK Stella v273 contains a widget rendering a card under a section header titled**"Connections"**, with the text*"See your connections"*/*"Remember the people you met and make new connections\."*Both strings are hardcoded literals in the APK not server\-pushed\. On a stock, unenrolled account, the card does**not appear**on the Glasses tab at all\. It became visible during testing\. In normal use, a user would not see this\. ![](https://storage.ghost.io/c/b8/53/b853e3d4-3186-409d-9c7f-7da931a60431/content/images/2026/06/07_engineer_button_first_tap-1.png) --- ## What this adds up to 1. The full on\-device face\-recognition stack: detection, alignment, embedding, vector index, storage, write path, and notification surface is present and assembled in Stella v273\. 2. It is functional\. Run end\-to\-end, it recognizes a known face and names it in a notification, and it stages unknown faces \(crop \+ fingerprint\) to disk\. 3. The index dimension, embedding shape, and storage schema are mutually consistent, this is a coherent system, not stray dead code\. 4. The pieces a user would actually touch: the "Connections" card and the profile screen the notification opens are either absent from the build or buried deeper\. 5. The database the live pipeline uses sits in a sync namespace Meta populates server\-side, alongside other namespaces it already populates, but I did not observe a push to the face namespace on my account\. What I am**not**claiming: that Meta is identifying strangers for users today, that enrollment data is flowing, or that any of this is enabled in production\. What's hard to wave away: building, shipping, and wiring this much apparatus down to an 2048\-dimension facial fingerprinting and a hardcoded "Person recognized" notification, is an engineering investment\. Capability that doesn't ship by accident\. Whether and when it goes into production is Meta's to answer\. *This research is published alongside reporting in WIRED\.*

Similar Articles

Meta Silently Added Face-Recognition Code for Its Smart Glasses to Millions of Phones

Wired

WIRED analysis reveals Meta secretly embedded face-recognition code called 'NameTag' into its AI app on millions of phones, capable of identifying people captured by Ray-Ban and Oakley smart glasses cameras, despite the company publicly claiming it was still 'thinking through' such a feature. The dormant system converts faces into biometric faceprints and checks them against an on-device database, reviving technology Meta claimed to have abandoned in 2021.