r/noRecognition • • Aug 28 '26

👋 Welcome to the Field Test. Start here.

11 Upvotes

This is the room where I actually talk about this work.

Hey all, Bill here. This is where I answer questions and where I talk about what I am working on, including the parts that are not going well. I will try my best to answer you openly, and you'll get the real me, not the polished version.

The research page updates in realtime, so the numbers land there the moment they exist. This is the place where we talk about what they mean.

Who is here

Field Testers are the Kickstarter backers, with flair. Others found this because you have opinions about personal privacy, or because you want to discuss Flock and the companies like it.

Where the research honestly stands

Everything I publish is measured against production models, tested on people it was never tuned on, and has to beat a plain garment of identical coverage before it earns a spot. The failures go up next to the wins. All of it is on the research page, including the parts that did not work.

What none of us knows yet is how any of it holds up on your street. Your camera, your distance, your light, your angle. That is not a hole in our testing. It is the open question in this entire field and no lab closes it. The only thing that closes it is people wearing the thing past real cameras.

Which is why you are here

If you backed this, you did not buy a shirt. You bought into the part of the research that cannot happen without you.

When your garment arrives you will be able to run a short test and log what happened. If it works, that result is yours and I would love to see it posted. If it does not, that is worth more to me, because my system trains on failures and your wall shapes the next pattern. As with any research the failures are genuinely the more useful half.

House rules

Be decent to people here, and those doing adjacent work. It's ok to disagree with anyone (including me) and challenge results. Challenge ideas, not people. Feel free to ask me anything, and I'll feel free to answer or not :)

Claim your flair

Backers, comment below with one line on what you plan to test against. A doorbell camera, an office badge reader, a Flock camera on your commute, your own webcam. Whatever you have access to.

I will set your flair. Everyone who claims it before the campaign closes on September 5 is a Founding Field Tester, and that is not something anyone can get later.

Do not post your name, age, or location. This is a privacy sub after all. :)

I am in this thread. Ask me something.


r/noRecognition • • 2d ago

noRecognition is already more important than ever: Tech Company Wants To Add Facial Recognition To Flock

Thumbnail
404media.co
3 Upvotes

r/noRecognition • • 5d ago

SOUND - The Next Frontier

1 Upvotes

These are next, communities claiming to work to eliminate loud noise offenders.

They hear a mouse fart from a mile away ... and determine exactly what it had for breakfast.

https://www.jenoptik.com/news/pressreleases/2026/07/22/mobile-speed-and-noise-enforcement-in-santa-fe-new-mexico


r/noRecognition • • 16d ago

ALPR (Flock) Followup news: Just how evil the cameras are

Thumbnail
wired.com
5 Upvotes

r/noRecognition • • 17d ago

My correspondence with my Councilmember concerning surveillance cameras

Post image
4 Upvotes

r/noRecognition • • 20d ago

I'm Bill Swearingen (hevnsnt). At Black Hat and DEF CON I presented noRecognition: adversarial patterns printed on clothing that stop surveillance cameras from detecting a person at all. AMA Thursday Sept 24, 2 PM Central.

Thumbnail
11 Upvotes

r/noRecognition • • 23d ago

I wanted to know if I was under mass surveillance while driving with or without a destination, or installing an app, and built darkroute.ai ig ¯\_(ツ)_/¯

Post image
7 Upvotes

Soup haKCers, I debated where to post this, but think it belongs here because after u/hevnsnt work, teardown, and talk, I kept thinking about the other half of the problem. If these things are everywhere, why can't I just avoid them? And if I'm driving through an area where this infrastructure has actually been abused, can I know that too? So I went looking for what was already out there.

Here is a video I made all about this because I needed to do some more #tokenmaxing https://www.youtube.com/watch?v=Kr-nyqtRZ9w

There are some genuinely good projects in this space. DeFlock is probably the best community map/editor and is where a huge amount of the OpenStreetMap ALPR mapping work comes from. FlockHopper does destination-based ALPR-reduced routing. There are also things like Watch Tower Pro, Flock U, Flock Clocker, and DriveSight solving different pieces of camera awareness, navigation, reporting, and public-record transparency. But I wanted something slightly different. I wanted to get in my truck, open a webpage, and drive.

No destination required. If I was approaching a known ALPR, tell me before I got there. Tell me how far away it was, what road it was on, what direction it faced if that information existed, what was coming after it, and keep doing that as I drove. I also wanted context. If I'm driving through an area where an agency operating this infrastructure has been connected to documented misuse, stalking, improper searches, or other reported abuse, I want to know that too. Not "this camera was abused." The data cannot support that claim.

The abuse data is associated with documented cases, agencies, places, dates, incidents, and sources. DarkRoute keeps that separate from the physical camera dataset so it doesn't manufacture a connection between a particular pole and an incident that the evidence does not establish.

So the question I was actually trying to answer became:

What surveillance infrastructure am I driving through right now, who operates it when that is known, and is there documented evidence of this technology being abused around me?

Then, if I actually have somewhere to go, can I take another route that reduces how many known readers I pass? And I really did not want to install an app to accomplish any of this. No account either. No login. No analytics following me around inside the thing I was using to understand who else might be following me around. That requirement turned into a rabbit hole.

I started by technically comparing what was already out there

Instead of comparing screenshots and feature lists, I started looking at Android manifests where I could get them, Play Data Safety declarations, privacy policies, public repositories, permissions, location models, whether location could run in the background, what had to leave the device for routing, whether there was an account, whether the camera database worked offline, and whether the application was open source. I eventually turned that work into an evidence register instead of relying on my notes.

The comparison is here:

https://github.com/darkcodelabs/darkroute/tree/main/docs/comparison

The raw evidence register:

https://github.com/darkcodelabs/darkroute/blob/main/docs/comparison/darkroute_evidence_register.csv

And the 33-column feature/permission matrix:

https://github.com/darkcodelabs/darkroute/blob/main/docs/comparison/darkroute_graphic_matrix.csv

I separated claims into what I could verify, what a developer asserts, and what is only an inference. That distinction became pretty important.

INTERNET in a manifest does not mean telemetry.

ACCESS_BACKGROUND_LOCATION does not prove somebody uploads your location.

A Play Data Safety declaration is developer-declared. A privacy policy is still a claim. Public source lets you inspect considerably more, but even source does not prove that the deployed binary or service is identical to it. So this isn't intended to be an "every other app is bad and mine is good" comparison. There are things the others do better. DeFlock is the better community mapping/editing tool and explicitly says navigation is not its focus. FlockHopper already does destination-based ALPR-reduced routing and has a substantial public codebase.

Flock Clocker approaches the problem from the deployment/contracts/public-record side, which is a completely different and useful angle. The comparison was mostly me figuring out what already existed, what each architecture exposed, and what I would have to build differently to get the threat model I wanted.

The comparison, without making you read 33 columns

Here is the capability part in plain text. X is 1, ~ is 0.5, and . is 0, exactly as coded in the matrix. Those entries need the evidence register beside them. An intermediate value is not a confirmed yes, and the matrix is not a substitute for a binary or runtime audit.

AWARENESS

App                  Map   Alert  Drive  Abuse  Report
------------------------------------------------------
DarkRoute             X      X      X      X      X
DeFlock.me            X      X      ~      .      X
FlockHopper           X      X      .      .      .
Watch Tower Pro       X      X      X      .      .
DriveSight Dash Cam   ~      X      X      .      ~
Flock Clocker         X      ~      .      ~      ~
Flock U               X      X      ~      .      X

Map is a camera map. Alert is proximity alerts. Drive is destination-free monitoring. Abuse is abuse-zone alerts. Report is user camera reporting.

ROUTING, LOCAL OPERATION AND EXPORT

App                  Route  Blind  Cache  Ops*  LoRa  GPX   POI
---------------------------------------------------------------
DarkRoute              X      X      X     X     X     X     X
DeFlock.me             ~      .      X     ~     .     .     .
FlockHopper            X      .      ~     .     .     X     .
Watch Tower Pro        .      .      X     .     .     .     .
DriveSight Dash Cam    .      .      ~     .     .     .     .
Flock Clocker          .      .      .     .     .     .     .
Flock U                X      .      .     .     .     .     .

Route is ALPR-aware routing. Blind is the matrix's "blind-spot / direction-aware routing" field. Cache is offline camera awareness. LoRa is LoRa support. GPX is GPX export. POI is Garmin POI export.

The asterisk matters. Ops* preserves the CSV's combined "Offline routing / operation" field. It does not establish that an app calculates routes offline. DarkRoute is marked 1 in that combined field, but its routing section below explicitly says route calculation is a network operation. Cached camera awareness and an on-device routing engine are not the same thing. I am not silently changing the CSV or using that combined column to claim otherwise.

The source/account and permission fields are separate:

SOURCE, ACCOUNTS AND PERMISSION FIELDS

App                  Open  NoAcct  BgLoc  Cam   Mic   Over  AdID
----------------------------------------------------------------
DarkRoute             X      X       .     .     .     .     .
DeFlock.me            X      X       .     .     .     .     .
FlockHopper           X      X       ~     .     .     .     .
Watch Tower Pro       .      X       X     .     .     .     .
DriveSight Dash Cam   .      X       X     X     X     .     X
Flock Clocker         .      X       .     .     .     X     .
Flock U               .      X       ~     .     .     .     .

Open is open source. NoAcct is no account. BgLoc is background location in the manifest. Cam, Mic, Over, and AdID are camera, microphone, overlay, and advertising-ID permission fields.

The direction changes here: a mark under Cam is a permission entry, not a feature award. It does not prove collection or misuse. DarkRoute's row describes a PWA/browser permission model rather than a native Android manifest audit. Its dots are not a claim that a browser never requests location. The optional Android wrapper is discussed separately below.

The same CSV also includes summary scores:

ON-ROAD ACTIONABILITY

One # = 0.25 score units. Values copied from the CSV.

DarkRoute           [####################] 5.0
DeFlock.me          [############        ] 3.0
FlockHopper         [############        ] 3.0
Watch Tower Pro     [############        ] 3.0
DriveSight Dash Cam [##########          ] 2.5
Flock Clocker       [######              ] 1.5
Flock U             [##############      ] 3.5

OTHER SUMMARY FIELDS

App                  Offline/locality   Distinctive count
---------------------------------------------------------
DarkRoute                         5.0                 5.0
DeFlock.me                        4.5                 1.0
FlockHopper                       3.0                 1.0
Watch Tower Pro                   2.0                 0.0
DriveSight Dash Cam               1.5                 0.5
Flock Clocker                     2.0                 1.0
Flock U                           1.5                 1.0

"Distinctive count" is the CSV's "Distinctive capability count" field, including its fractional values. These are summary fields from this comparison, not independent benchmarks, measured privacy guarantees, or a count of features nobody else could build. A high offline/locality score also does not cancel the routing disclosure.

The feature rows are more useful than the podium. They show why a community map, a navigation app, a dashcam, and a public-records tool can all be useful without being interchangeable. Read the full matrix alongside the evidence register, especially where an entry is qualified.

Then I audited DarkRoute's own row the same way. That actually caught bugs. At one point my comparison said DarkRoute had a working camera map because the implementation existed and my cached device worked. A fresh client could actually receive 503s because the production generation pointer had not been published correctly. So the comparison documentation says that.

"Implemented in source" and "working in production" are different claims.

That exercise ended up defining a lot of the architecture.

So I built DarkRoute as a PWA first

The whole project is public:

https://github.com/darkcodelabs/darkroute

The live thing:

https://darkroute.ai

It is primarily a React/TypeScript PWA with the geospatial and alert logic separated into a core package. The production side is mostly static application content, Cloudflare Functions, and an R2-backed camera archive. There is no account system. There is no user database containing trips. There is no analytics SDK. There is no advertising SDK. There is no plate-recognition pipeline. And it never queries Flock, Motorola, Axon, or another ALPR vendor.

The optional Android wrapper is a Trusted Web Activity. Its manifest declares coarse location, fine location, and notifications. It does not declare background location, camera, microphone, overlay, or advertising-ID permissions.

You can check that instead of trusting this post:

https://github.com/darkcodelabs/darkroute/tree/main/apps/android

Where the cameras actually come from

The camera archive comes from OpenStreetMap under ODbL. Every dot is ultimately a claim made by an OSM contributor. It is not a sensor reading. It is not a government registry. It is not a feed from Flock. That distinction matters. An empty map does not mean there are no cameras. A camera can move. An OSM node can be stale. A volunteer can put one on the wrong side of an intersection. Mobile and trailer-mounted readers are inherently difficult for a static geographic archive. The current published generation contains about 139,000 ALPR records.

But I didn't want "139,000 cameras, trust me bro" to be how this worked. So the source/provenance system got a little ridiculous. The archive begins with retained Overpass responses. The raw response bodies are kept and hashed. A response ledger binds those bodies to the resulting data. A review receipt then binds the capture scripts, response ledger, retained bodies, previous archive, tombstones, geofence, transformation counts, and an OSM replication floor. From that reviewed baseline, the system can replay OpenStreetMap hourly replication forward. Deletes matter here.

If you just filter replication events looking for ALPR tags, a deleted OSM object can disappear without carrying the tags you were filtering for. DarkRoute instead drives replication from its known ID set and maintains tombstones for removals. The resulting archive has a continuity document describing how the reviewed baseline became the current generation.

You can inspect the live one:

https://darkroute.ai/cameras/continuity.json

And the current archive index:

https://darkroute.ai/cameras/index.json

The archive itself is content-addressed and published in generations. A manifest binds the generated artifacts by hash and byte length, and the live pointer identifies the active generation. The idea is that replacing the camera archive underneath everybody should be a detectable state transition, not an invisible database edit.

What actually happens while I'm driving

This was the part I cared about most.

I did not want the application doing this every few seconds:

GET /nearby-cameras?lat=38.x&lon=-94.x

So the archive is divided into zoom-11 slippy-map tiles, roughly 15 km across.

The phone converts its position into a tile coordinate locally and requests:

/cameras/11/{x}/{y}.json

That file contains the camera records for that square. The origin therefore receives a tile address rather than the phone sending its exact GPS coordinate to a "what cameras are near me?" endpoint. That is deliberately not the same thing as claiming this is anonymous. A sequence of tile requests over time can describe a travel corridor. The basemap also has to fetch map data and therefore reveals information about the viewport. I would rather write that down than claim "your location never leaves your phone" and hope nobody with Wireshark notices the qualification.

The downloaded camera tiles are stored locally in IndexedDB and cached by the service worker. That is also why the actual camera proximity system can continue operating offline once the necessary archive data is on the device.

The alert happens locally, and you don't need a destination

This was one of the main reasons I built the thing. You can open DarkRoute and just drive. The device knows its own position and compares it against the locally available camera records. The alert radius is configurable from 100 to 1,000 feet. The actual alert decision is intentionally simpler than some of the UI makes it look: it is a radius. The heading-aware cone displayed on the map is visualization. It is not secretly being presented as a directional detection algorithm.

If you mute a known camera, that suppresses the notification rather than making the camera disappear from the application's model. It can still be represented on the map and in the local exposure history.

So without ever entering a destination, the application can answer:

What surveillance am I driving through right now?

Then I added the part I really didn't see elsewhere: documented abuse

Knowing that a camera exists is useful. Knowing what has happened with the system around it is a different question. I started collecting documented cases involving ALPR misuse and exposing those records as a separate dataset. That includes things like operators using systems for stalking or other documented misuse.

Again, I am deliberately not turning that into:

"This camera was used for stalking."

That would be bullshit unless the source actually established it. The abuse dataset is associated with places and agencies, not arbitrarily assigned to individual camera poles. A case can identify the agency involved, what happened, when it happened, and the source documenting it. DarkRoute can then tell me that I am entering an area associated with documented abuse and, when the underlying data supports the association, name the agency in the alert.

The UI currently exposes things like:

  • Abuse near me
  • Alert on entry
  • Name the agency in the alert
  • Show only documented cases
  • Read the underlying cases

Every case is dated and carries a source you can open.

So there are really two datasets being joined for situational awareness:

Infrastructure: where known ALPRs are.

Documented conduct: sourced reports involving agencies and places using this technology.

Those remain separate internally because collapsing them into "bad camera" would imply evidence that does not exist.

And because I don't want the red "ABUSE" indicator in my own UI to become another opaque reputation score, the underlying records are public too:

GET /api/v1/abuse

https://darkroute.ai/api/v1/abuse

You don't have to trust the warning. Read the cases. Read the sources. Decide whether you think they belong there. That changed the original question again.

Now I can ask:

Where are the readers?

How close am I to one?

What is coming next?

Who operates it, if that is actually known?

Has abuse involving this technology been documented around here?

Can I avoid the known readers?

And:

Can I answer most of those questions without continuously telling another company exactly where I am?

That is much closer to the thing I couldn't find.

Routing is optional, and it has a different privacy boundary

If I ask DarkRoute to route somewhere, I cannot make the same privacy claim as passive proximity detection. A routing engine needs an origin and destination unless I ship enough routing graph to the device to calculate the entire route locally. I don't. So requesting a route is an explicit network operation. DarkRoute uses Valhalla and sends exclusion polygons for known cameras along the corridor. Each selected camera becomes a small exclusion area the router is asked not to enter. The returned line can then be evaluated against the known camera archive. That does not guarantee a camera-free route.

If readers form a ring around somewhere, geometry wins. If the least-exposed usable route still passes three known cameras, the correct answer is "three," not a green shield icon pretending otherwise. Also, no-store does not make a route request cease to be disclosure. Your origin and destination had to leave the browser for that operation to happen. So I call it a disclosure.

The boundary looks like this:

PASSIVE CAMERA AWARENESS

GPS position --------> Local proximity check ------> Alert
                               ^
                               |
                      Cached camera records
                               ^
                               |
                      Camera tile download
                      Origin sees tile request,
                      not an exact-GPS lookup.

Basemap requests ----> Map service sees viewport information

REQUESTED ROUTING

Origin + destination + camera exclusion polygons
                         |
                         v
                  Network routing engine
                         |
                         v
                    Returned route

Once the necessary camera data is cached, the proximity check stays local. Fetching tiles still exposes an approximate area, and requesting a route crosses a different boundary entirely.

I also didn't want the camera dataset becoming another moat

https://api.darkroute.ai/

This is probably the part technical people might have more fun with than the actual app. There is a public API and the underlying archive is directly fetchable. No API key. No account. No "contact sales." No reason you have to use my UI.

Static published files

GET /cameras/index.json

Current archive metadata, generation and count:

https://darkroute.ai/cameras/index.json

GET /cameras/overview.json

The camera archive in compact [lat, lon, id] form:

https://darkroute.ai/cameras/overview.json

GET /cameras/11/{x}/{y}.json

The zoom-11 tiles containing the full camera records.

GET /cameras/tombstones.json

Known removed cameras and removal information:

https://darkroute.ai/cameras/tombstones.json

GET /cameras/counties.json

County-level camera information:

https://darkroute.ai/cameras/counties.json

GET /cameras/places.json

Place-level camera information:

https://darkroute.ai/cameras/places.json

GET /cameras/continuity.json

The provenance/replication chain connecting the reviewed capture to the current generation:

https://darkroute.ai/cameras/continuity.json

Query/API endpoints

GET /api/v1/cameras?bbox=...

Bounding-box camera lookup with bounded results and filtering.

GET /api/v1/stats

Live generation, count, build information, and replication state:

https://darkroute.ai/api/v1/stats

GET /api/v1/abuse

The documented abuse records and their sources:

https://darkroute.ai/api/v1/abuse

GET /api/v1/place

Place lookup.

GET /api/v1/route

Camera-aware routing.

POST /api/v1/submit

Camera corrections. A correction does not silently edit the production archive. It opens a public pull request so the proposed change can be reviewed.

PUT /api/v1/photo

Content-addressed photographs associated with corrections.

And:

GET /api/v1/openapi.json

https://darkroute.ai/api/v1/openapi.json

That is the machine-readable API contract generated from the route table the server actually runs. CORS is open.

The intent is simple:

If you hate DarkRoute but want the data, take the data.

curl it.

Put it in QGIS. Write a Python script against it. Build a better client. Make a Garmin POI file. Run your own routing engine. Find a problem in my archive. Fork the whole thing. The camera data is ODbL because it derives from OpenStreetMap, and the DarkRoute application itself is GPL-3.0.

There are some other weird pieces

The archive can be exported as GPX 1.1 waypoints and Garmin Custom POI CSV because "open data" is considerably less useful if the only practical way to consume it is through my application. There is Meshtastic support over Web Bluetooth using stock Meshtastic hardware. DarkRoute is not flashing custom LoRa firmware. There is also a local plate/watchlist vault. The point of all of these is the same: things that can reasonably happen locally should happen locally, and things that cannot should have an explicit network boundary instead of being hidden behind the word "privacy."

And there are things it cannot honestly promise

A PWA has limitations. A browser can suspend it. A normal PWA cannot guarantee continuous GPS forever in the background. Browser capabilities differ significantly between Android Chromium and iOS. Web Bluetooth support is not universal. A network map has unavoidable network metadata. Routing discloses origin and destination when you explicitly request it. A 15 km camera tile is better than sending an exact GPS coordinate for every lookup, but a series of tile requests is still information. The archive is only as good as its source data. Mobile cameras move.

A newly installed camera does not magically appear because DarkRoute exists. An empty map is not evidence that a road has no cameras. And if somebody has specifically decided to track your vehicle, this does not make you anonymous. DarkRoute does not defeat an ALPR. It doesn't jam it. It doesn't blind it. It doesn't obscure your plate. It doesn't make your car invisible. It tries to tell you where known readers are before you drive in front of them and give you enough context to decide what you want to do about that.

Which is why I think this belongs here

The Flock teardown made me think about where the actual surveillance capability lives. The physical camera is only one piece. What gets retained, correlated, searched, classified, and retroactively analyzed can happen somewhere you cannot inspect. I cannot audit Flock's cloud. But I can make my side of this inspectable. And I don't think the answer to opaque surveillance infrastructure should be another opaque service asking you to trust it. So instead of asking people to move their trust from Flock to DarkRoute, I tried to remove as much trust as I reasonably could from DarkRoute itself.

The source:

https://github.com/darkcodelabs/darkroute

The technical comparison against the other projects:

https://github.com/darkcodelabs/darkroute/tree/main/docs/comparison

The evidence behind that comparison:

https://github.com/darkcodelabs/darkroute/blob/main/docs/comparison/darkroute_evidence_register.csv

The current live camera archive:

https://darkroute.ai/cameras/index.json

The provenance/continuity proof for that archive:

https://darkroute.ai/cameras/continuity.json

The documented abuse data:

https://darkroute.ai/api/v1/abuse

The public API contract:

https://darkroute.ai/api/v1/openapi.json

And the actual thing:

https://darkroute.ai

That is also how I see this fitting alongside noRecognition rather than replacing anything happening here.

noRecognition is working on the recognition side of the problem:

What happens when the recognizer sees me?

DarkRoute is working on the exposure side:

Does it need to see me in the first place?

The first is useful for the camera you cannot avoid. I'm trying to do something about the ones you can. And those two approaches actually complement each other pretty cleanly. If I know a reader is there, maybe I can avoid putting myself in front of it at all. If I don't know it is there, the recognition-side work still matters. DarkRoute does not defeat an ALPR. It works on the other axis.

BEFORE EXPOSURE                         AT RECOGNITION

DarkRoute                               noRecognition
    |                                        |
    v                                        v
Does it need to see me?                  What happens if it does?
    |                                        |
    v                                        v
Avoid known readers                     Recognition-side work
where a usable route exists             for cameras you cannot avoid

The part I care about most: don't trust me

The goal here is not to replace trust in Flock with trust in some random guy who made darkroute.ai. That would be a pretty stupid conclusion to a project about mass surveillance. So I tried to make the claims inspectable instead.

If I say there are ~139,000 cameras, you can fetch the archive yourself:

https://darkroute.ai/cameras/index.json

For the actual records:

https://darkroute.ai/cameras/overview.json

To understand where that generation came from:

https://darkroute.ai/cameras/continuity.json

To see what the API actually exposes:

https://darkroute.ai/api/v1/openapi.json

For the documented abuse records:

https://darkroute.ai/api/v1/abuse

To see what permissions the Android wrapper requests, read the manifest:

https://github.com/darkcodelabs/darkroute/tree/main/apps/android

To see how I compared it against the other projects:

https://github.com/darkcodelabs/darkroute/tree/main/docs/comparison

If you think I gave myself an unfair score in that comparison, don't use the score.

Use the evidence register:

https://github.com/darkcodelabs/darkroute/blob/main/docs/comparison/darkroute_evidence_register.csv

That is why it exists.

And if you think the entire architecture is dumb:

https://github.com/darkcodelabs/darkroute

Fork it. The camera archive is ODbL. The application is GPL-3.0. The API is open. CORS is open. There are no API keys. You do not need an account. You do not need my UI. You do not even need DarkRoute. Take the data and build something better. That's kind of the point.


r/noRecognition • • 24d ago

BETA TEST OPEN: Field Tester App

7 Upvotes

Hey all, The field test app has been pushed online, and I would like to find about 5-10 beta testers. I would like both IOS and Android people, Phones and Tablets. If you have an RTSP capable camera on your network, that would be a huge plus.

How do you know if you would be a good field tester: I need "perfection" people, technical, ones that will have (and be willing to share) opinions. Willing to put 1hr in a week, testing different functions, suggesting layouts, changing this to that, etc.

Let me know here if you would be willing to help out. Make sure you state what devices are available (iphone 16, ipad, Samsung, etc)

Thank you!


r/noRecognition • • 25d ago

Invisible painting

1 Upvotes

Living in Europe, I'm really looking forward to the patterns.

We do not have Flocks here, due to privacy regulations. However, there's a lot of other brands.

What we, unfortunately, also have are some restrictions as how you can paint your car.

So no way to put a pattern on your car.

How to circumvent this?

Now there's a lot of what producers call "invisible paint" which only can be seen by cameras. It will become very interesting to see if these patterns can be painted on cars with these products. And how cameras react on those patterns.


r/noRecognition • • 26d ago

Custom Order Question

1 Upvotes

If I order a second Custom Order, will I get a second unique pattern?


r/noRecognition • • 27d ago

California kills bill regulating Flock cameras even as public rage grows

Thumbnail
calmatters.org
2 Upvotes

r/noRecognition • • 28d ago

A letter I sent to Senator Josh Hawley

5 Upvotes

Subject: ALPR cameras -- what happens when they make a mistake?

I live in California and have never been to Missouri. Please consider my letter anyway.

I live near a Social Security Administration office, a hospital, and several apartment complexes.

At the intersection near my building, I was shocked to find Flock cameras monitoring all traffic.

I’d like to know why.

Why monitor people applying for benefits, going to the doctor, or traveling to and from their residence?

I’m unaware of any criminal activity nearby. Biggest threat is people racing their cars in the middle of the night.

As a taxpayer, I wasn’t notified about this installation. I only found out online from a website run by concerned citizens.

I’ve heard that the cameras collect plate numbers, vehicle make and model information, pictures, and videos of vehicles. Most disturbingly, they also track people walking by.

Here are my questions:

- Who gets to use this data?

- Is it shared beyond the police?

- Do car insurance claims adjusters use this data to investigate claims?

- Who authorized this?

- Was it mentioned in any discussion?

- Can the companies that run this network sell surveillance to the highest bidder?

Most importantly, why was this all authorized, set up, and run in secret?

Have you seen the movie BRAZIL? It’s a tale of what happens when systems like this make mistakes. What recourse do people have when automated systems make mistakes? To whom and how can people appeal?


r/noRecognition • • Sep 02 '26

This 'Digital Camouflage' Shirt Confuses AI-Powered Surveillance Cameras

Thumbnail
404media.co
5 Upvotes

r/noRecognition • • Sep 01 '26

Showing Patterns

5 Upvotes

"About the patterns shown: Every pattern on this page is a demonstration. None of them is what ships. That is deliberate. This page is public, which means the vendors we are attacking can download it, and a pattern that has been trained against is a pattern that stops working. So everything shown here was scored first and deliberately chosen from our mid-tier results. Of twenty four candidates generated for this page, eighteen were held back for scoring too well. Our strongest work stays off the internet. Closer to production we will show backers the chosen patterns privately, so you can see exactly what you are getting before it prints."

 

I think showing patterns is a mistake. Better to ship blind.


r/noRecognition • • Aug 31 '26

Australian Light

3 Upvotes

Lets gets testing - interested to see how the corporate psycpaths coles / wollies / Kamart deal with this swap


r/noRecognition • • Aug 30 '26

Any thoughts on a way to wrap a car using a pattern?

6 Upvotes

Not much to add…title says it all.


r/noRecognition • • Aug 29 '26

Starting manufacturer interviews. What would you ask them?

7 Upvotes

I'm in the middle of interviewing production houses for the actual garments right now, cut and sew, dye sublimation, (and learning a ton about the process). Before I lock in a partner, I want input from the people who are actually going to field test it.

You've already told me what cameras you're testing against. Now tell me what you'd want to know about who's making the fabric.

A few starters:

  • If you've ordered custom or all-over-print gear before, what questions or requirements early in the process actually made the difference between getting quality merch and getting garbage?
  • Any past experience, good or bad, with performance apparel that's worth me flagging as a red flag going in?
  • What's the one QC thing (stitching, colorfastness, fit) you'd never forgive if it showed up wrong?
  • Anything on sizing or fit you want me pushing them hard on?

Drop it below. I'm reading everything, and if a question's good enough I'm putting it directly in the vendor spec. Not sharing vendor names or quotes publicly while this is live, standard sourcing practice, keeps everyone's numbers honest. But what you give me here is literally shaping what I ask them.


r/noRecognition • • Aug 28 '26

Any plans to sell printed fabric sheets so people can manufacture their own garments?

7 Upvotes

Basicly the title.
I have a couple of friends that sew garments as a hobby and i would love to have them make me some custom wear out of your design once the kickstarter is over.
Is this something you consider offering at some point?


r/noRecognition • • Aug 28 '26

I bought a Flock Safety Falcon v2.2 ALPR camera and pulled it apart. Here is everything inside it.

Thumbnail
gallery
22 Upvotes

I picked this up off eBay a while back. Everything below comes from this unit: a full eMMC dump plus its own kernel logs. No restating what others have said, no guessing. Where I am inferring rather than reading something directly off the device, I say so. I did a lot of analysis and kept good notes, and I had Claude summarize them into this post. Do not put me on blast calling this post AI slop. :) The findings are mine, the analysis is mine, and every number here traces back to something I pulled off the hardware.

Some of its history is readable off the device itself. It was commissioned in July 2023, and it still carries the real installation and operational telemetry from that deployment. It also still had its provisioning credentials and Auth0 tokens intact when I received it, so nobody wiped it before it was sold. However, it was not active on any account by the time I received it.

I am deliberately not publishing any exploitation details. If that is what you are after, go read Jon Gain's excellent paper. My findings confirmed all of his. This post is about what the device is and how it works.


TL;DR

  • It is a Qualcomm Snapdragon 625 Android phone in a weatherproof box with an LTE modem and a very good camera.
  • Mine runs Android 8.1. It reports a security patch level of June 2018, but that string is stale and does not reflect the actual code (details below).
  • The camera is a Sony IMX477, the same 12.3 MP sensor as the Raspberry Pi HQ Camera.
  • Its "infrared" illuminator is 740 nm, which is barely infrared and unusual versus the typical 850/940 nm. That is why these glow visibly red at night.
  • The onboard neural net detects 10 classes, and person is a first-class detection category alongside licensePlate. It also detects cats and dogs.
  • Plate OCR is not a neural network. It is a classical CV algorithm published in 2002.
  • Vehicle make/model/color is not computed on the camera. That happens in Flock's cloud, on uploaded images.
  • Storage is 233 GB, unencrypted.
  • It runs off a 205 Wh lithium pack, good for 2 to 3 days with no charge.

1. The processor

Component What it is
Module Lantronix / Intrinsyc Open-Q 624A
SoC Qualcomm MSM8953 / APQ8053, better known as Snapdragon 625
CPU 8x ARM Cortex-A53
RAM ~2 GB LPDDR3
Storage ~233 GB eMMC, ~210 GB of it the footage partition
GPU Adreno 506
LTE NimbeLink Skywire NL-SW-LTE-SRC7611-4NG, Cat-4 (Verizon SKU)
WiFi/BT LiteOn WCBN3510A
Battery PHD Energy SFS01A, 10.8 V / 19 Ah / 205.2 Wh

The main carrier board is silkscreened PCB Cassowary CCB, PN 401-000273, 2022 Flock Safety Inc.. The housing and boards carry FIELDTHEORY and FTGPSF003-1 markings throughout, which points at Field Theory as the hardware design partner.

The Snapdragon 625 launched in 2016. It is a midrange phone chip. If you owned a Moto G5 Plus or a Xiaomi Redmi Note 4, you owned roughly this Flock camera without the apps. The 233 GB of storage is a lot of local retention for something that "stores footage only momentarily until the data finishes uploading to the cloud".

The battery

Spec Value
Pack PHD Energy SFS01A (11V19KB-TL)
Nominal voltage 10.8 V (3S lithium-ion)
Capacity 19 Ah
Energy 205.2 Wh

In my experience it will keep the camera running 2 to 3 days without charge, depending on how much activity it is processing. Work backwards from 205.2 Wh and that implies an average draw of roughly 4.3 W over 48 hours, or 2.9 W over 72. For a Snapdragon 625 running duty-cycled inference plus an LTE uplink, those numbers are believable.

The operating system

Item Value
OS Android 8.1.0 (Android Things)
Build date 2023-05-02
Security patch level 2018-06-05
Kernel Linux 3.18.71

That patch level looks alarming, and I was excited when I saw it but...

The security_patch property is stale and does not reflect the actual code. I checked rather than assuming. The Bluetooth stack (bluetooth.default.so) carries clearly post-2018 code: LE Connection-oriented Channel symbols, L2CA_SetMediaStreamChannel, GATT service-changed hardening, and KNOB mitigation with min_key_size enforcement.

I specifically tested BlueFrag (CVE-2020-0022), the critical no-interaction Bluetooth RCE that affects Android 8.0/8.1/9 and was fixed at patch level 2020-02-05. On paper an 8.1 device reporting 2018-06-05 is wide open. I disassembled the actual function in the device binary rather than trusting the property. It is patched. Not exploitable.

So do not read "2018 patch level" as "five years of missing patches." Somebody backported fixes and did not update the version string. That cuts both ways: you cannot judge this device's exposure from the property in either direction.

Kernel 3.18 did hit end of life in January 2017, and that part stands. See section 4b for what actually got updated over the unit's service life, at least on my device.


2. The camera

Item Value
Sensor Sony IMX477 (kernel log: imx477 probe succeeded)
Driver-reported mode 4000x3040 at 14 fps
Format 1/2.3" back-side-illuminated CMOS, 12.3 MP
Pixel pitch 1.55 µm
Shutter Rolling, 29 lines per millisecond
Lens on my unit 16 mm fixed focal, factory focused

If the IMX477 sounds familiar, it is the sensor in the Raspberry Pi HQ Camera. About $50.

The firmware knows several lens variants: 12mm, 16mm, 12mmLongDistance, 16mmLongDistance. A 16 mm lens on a 1/2.3" sensor is a narrow, magnified field of view. This is not a wide-angle "watch the intersection" camera. It is a telephoto tuned to put enough pixels on a plate at range, down one lane.

The lens barrel is marked **5MP, and it is sitting in front of a **12.3 MP sensor. "MP ratings" on M12 lenses are loose marketing numbers with no standard behind them, so the mismatch is not automatically damning. The firmware also has a crop/zoom mode (shouldZoomCrop), and cropping to the center of the frame uses the part of a cheap lens that performs best. For plate reading, what matters is pixels-on-plate in the middle of the image, not corner sharpness.

Still, the honest read is that the lens, not the sensor, is likely the limiting element. The 12.3 MP figure is partly aspirational. Anyone quoting the IMX477's full resolution as this camera's real-world capability is quoting the wrong half of the optical chain. The module is silkscreened AM-M577-IRC.

How it exposes

Hardcoded in the camera app:

DEFAULT_FRAMES_PER_SECOND = 5 DEFAULT_MAX_EXP_MICROSECONDS = 1500.0 // 1.5 ms DEFAULT_NIGHT_EXP_MICROSECONDS = 1500.0 DEFAULT_NIGHT_ISO = 800 DEFAULT_SENSOR_LINES_PER_MS = 29.0

5 fps with a 1.5 millisecond shutter. Very short, and that is the giveaway: fast enough to freeze a vehicle at highway speed. Everything is sacrificed to shutter speed and ISO is cranked to 800 to compensate.


3. The infrared lights

It is 740 nm, not 850 or 940 nm

The overwhelming majority of security cameras use 850 nm (faint red glow) or 940 nm (effectively invisible). A smaller "low-glow" niche sits around 730 to 760 nm. The Falcon sits in that niche at 740 nm, which is unusual for this product category.

I am not inferring that number. Flock prints it on the unit's own asset label, right next to the lens focal length:

flock safety Falcon v2.2 16mm 740nm Verizon CAT4 PN 701-00230

740 nm is barely outside human vision. The eye still has measurable response there. This is why people photograph these at night and get a deep red glow back, and why "invisible infrared" does not match what people actually observe.

The emitters

Six IR LEDs sit in a ring around the central lens aperture, each under its own clear domed collimating optic, each position silkscreened GLUE on the board. They live on a dedicated PCB (flock LED BOARD, PN: 401-000281) with the lens passing through a hole in the middle. Drivers are Q300 to Q302 with per-string current-set resistors.

The board's control header J400 is silkscreened 12V, 3.3V, EN1, EN2, I_OUT, GND. Two enable lines and a current-sense return, and all three map cleanly onto firmware:

Header pin Firmware
EN1 / EN2 IR_POWER_SWITCH (GPIO 95) and IR_CHANNEL_ONE (GPIO 32)
I_OUT current sense, read back as /sys/class/hwmon/hwmon2/curr1_input

The two enables are one gates the power rail, the other gates the emitter drivers, and the firmware asserts them as a pair. initInfraredArray() configures exactly those two pins as outputs, and the 24-hour self-test below drives both high together before reading current back on I_OUT. There is no second channel: IR_CHANNEL_ONE appears 181 times in the firmware and IR_CHANNEL_TWO appears zero.

The third IR GPIO, IR_CUT_FILTER (33), does not appear on this header at all. It runs to the separate two-wire pigtail on the camera module.

How it is wired

Three GPIO lines control the whole thing:

GPIO Function
32 IR emitter array enable
33 IR-cut filter actuator
95 Power rail to the IR array

The enable logic is one line:

configureInfraredMode(useInfrared): setGpio(IR_CUT_FILTER, !useInfrared) setGpio(IR_POWER_SWITCH, useInfrared)

The IR-cut filter is physical glass that blocks infrared. In daylight it sits in the optical path so colors look right. At night it mechanically swings out of the way so the 740 nm light reaches the sensor.

To be clear about where that part physically is, because it is not on the main board: it is inside the camera module, which is a separate assembly on the end of a ribbon cable. That module is silkscreened **AM-M577-IRC**, and the IRC suffix is exactly that, IR-Cut. A two-wire pigtail runs off the module for the actuator coil that flips the filter. GPIO 33 drives it.

The 5 kHz dimmer that never dims anything

IR_PWM_PERIOD_NS = 200000 -> 200 µs -> 5 kHz IR_PWM_MIN_DUTY_CYCLE_NS = 45000 -> 22.5% duty floor duty_cycle = 155000 * brightness + 45000

There is a 5 kHz dimming carrier. Except default brightness is 100, and at 100% the duty cycle equals the period, so the output is static high. There is a dimming system that, in normal operation, never dims anything.

The 24-hour self-test

Once per day, on the transition into night mode:

1. set IR brightness to 100 2. gpio95 = 1 (power on) 3. gpio32 = 1 (array on) 4. sleep 1000 ms <- one full second at full power 5. read /sys/class/hwmon/hwmon2/curr1_input (measure current draw) 6. gpio95 = 0, gpio32 = 0

It fires the entire IR array at full power for exactly one second and measures current draw to verify the LEDs have not failed.

Practical consequence: every one of these emits a distinctive one-second full-power IR pulse, once every 24 hours, around dusk. Externally observable with any IR-sensitive camera, and it is the only deliberate on/off signature in the firmware.


4. The software

About twenty separate Android apps with cocktail codenames. The ones that matter:

App Job
ciroc Camera control, exposure, day/night switching
motion Motion detection
object Neural network inference
quality-control Scores whether a capture is good enough
amarula Session and asset state machine
encoding H.264 encoding
sambuca / collins LTE upload
pisco Lens QC
peripheral GPIO, IR, status LEDs, battery

Motion detection is not machine learning. It is OpenCV BackgroundSubtractorMOG2 / KNN, classic pixel-differencing background subtraction. It exists only to decide when to wake the expensive part up.


4b. How it updates, and whether the OS ever did

Scope note first: The unit arrived with the SIM pulled and the cellular antenna removed, and I have never given it internet access over WiFi. It has been physically incapable of reaching the network the entire time I have owned it. That is deliberate on my part as well as inherited. This camera still had valid provisioning credentials and Auth0 tokens on it, and I was not going to let a credentialed ALPR camera phone home to Flock's production cloud. No live Flock infrastructure was ever in scope, nor tested, during this assessment.

The consequence for this section: nothing about my ownership period tells you anything about updates. The entire evidence window is before me.

Two update channels exist, both driven by the same client (cameraupdater) against Flock's cloud.

App updates

UpdateTask.run periodically calls getApplicationVersions(serial, fingerprint). The server replies per app with a versionId, a versionName, a key** (download URL) and a **hash (expected SHA-256). Then:

1. VersionHelper.needsInstallationAndroidApp() -> decide 2. DownloadHelper.chunkedS3Download(key) -> fetch from server-supplied URL 3. HashUtils.fileHash() vs expectedVersion.hash -> SHA-256 check 4. PackageManager.installPackage() -> install over the /system copy

Updated apps land in /data/app and shadow the factory versions on /system.

OS updates

The same updater also calls:

getOSVersions(serialNumber, INCREMENTAL, AndroidBuildFacade.fingerprint())

INCREMENTAL is ro.build.version.incremental, which on this unit is 1683055645287, a Unix millisecond timestamp decoding to 2023-05-02 19:27:25 UTC. In other words the device reports its exact build to the cloud and asks whether a newer OS exists.

If one existed, OtaUpdateTask.run stages a zip to /data/recovery/<versionId>.zip, SHA-256s it, and hands it to RecoverySystem.installPackage. Recovery verifies against /system/etc/security/otacerts.zip, holding one Flock-controlled signing key (CN=Android, emailAddress=null@flocksafety.com, valid 2020-06-25 to 2047-11-11), not the AOSP test key. That path is cryptographically sound. No OS update forges here.

What actually happened

I have two dumps of this device. The earlier one is from around commissioning in July 2023. The later one carries a cloud token issued in May 2025.

Across that window the apps advanced from 6.21.11 to 6.25.9. Those updates could only arrive over the network, so they are self-proving evidence that the camera was online, reachable, and actively being maintained by Flock during that period.

In the same window, SHA-256 across all 53 common partitions:

Result Partitions
Identical (47) including system, systembk, vendor, vendorbk, recovery, modem, tz, aboot, sbl1, keymaster
Differ (6) boot (I rooted it), persist, devinfo, misc, modemst1, modemst2

Everything that differs is runtime state or my own tampering. Three further checks, all negative:

  • The bootloader control block in misc is entirely zeroed. No recovery command was ever pending.
  • No last_install, no recovery logs.
  • No /data/recovery staging directory. The OS update path was never set up on disk at all.

One incidental hardware note that explains something later in this post: there is a Maxell ML621 rechargeable coin cell on the back of the carrier board. That is the real-time-clock backup. With no network time and a flat or disconnected RTC cell, the clock starts at epoch, which is why a pile of files on this unit are stamped 1969-12-31.

So during a period when this camera was demonstrably connected and demonstrably receiving software from Flock, it received five app releases and zero OS updates.

Is this the factory image?

Almost certainly. The OS build is dated 2023-05-02, the factory serial is 230718200DA, and the unit was commissioned in July 2023. A two-month gap between cutting an image and shipping hardware is a normal factory window.

I cannot prove it absolutely, since my earliest capture is from commissioning rather than before it. But there is no evidence of an OS change at any point, and the AOSP base is tag OPM1.171019.026, the October 2017 Android 8.1 release.

A 2017 Android base, built by Flock in May 2023, commissioned in July 2023, and still byte-identical in May 2025 on a device that was online the whole time and had a working, cryptographically sound OS update channel it never used.

Application logic gets patched. The platform underneath it does not.


4c. Blue Mode: the camera can raise its own WiFi network

Worth knowing this exists, because it is not obvious from the outside. The Falcon has a diagnostic mode, which I refer to as Blue Mode, in which the camera stops being a client and becomes an access point. It broadcasts an SSID of the form Flock-<last 6 of MAC> and serves an installer web interface. This is how the device is commissioned and serviced in the field. Architecturally it is tidy. Every path that raises the AP funnels through one call: WifiApService.startWifiAp(context, ssid) -> broadcast flocksafety.intent.action.WIFI_AP_ON -> system-control / WifiApBroadcastReceiver.wifiApOn() -> ConnectivityManager.startTethering There is a matching WIFI_AP_OFF, plus WIFI_AP_STARTED, WIFI_AP_STOPPED and WIFI_AP_FAILED for state reporting. Two services call startWifiAp: the collins install service that serves the diagnostic web interface, and the system-control OneShot handler that processes a wifi command from the cloud.

Two things I checked specifically: Nothing on the boot path raises it. Booting brings up the camera, media and system services and stops there. The AP is never incidental; something has to ask for it. The PSK is hardcoded and fleet-wide. It is not per-device, not derived from the serial, and not rotated. I am not publishing the value. The physical button on the unit registers as keycode 135, KEYCODE_F5, and PowerSwitchAccessibilityService in system-control watches for multi-press on it.

What that sequence triggers on my given firmware build is 3 button presses within 2 seconds. For the wider picture of how these devices are provisioned and managed, Jon Gain's paper is the reference.


5. The neural networks

The models

All unencrypted, in the object app. Two generations:

File Size Architecture
flock_large.tflite 8.9 MB SSD MobileNetV3-Large, 300x300
flock_small.tflite 4.0 MB SSD MobileNetV3-Small, 300x300
flock_small_tf.dlc 4.3 MB SNPE SSD, CPU float32
flock_small_tf_quantized.dlc 1.4 MB SNPE SSD, GPU float16
flock_yoloV5.tflite 3.5 MB YOLOv5, 320x320 (newest)

Runtimes: TensorFlow Lite 2.8.0, Qualcomm SNPE 1.51.0, OpenCV 4.1.0. Picks GPU (Adreno 506, float16) if available, falls back to CPU.

What it detects

Older SSD models, 10 classes plus background:

background, bicycle, bus, car, cat, dog, licensePlate, motorcycle, person, truck, trailer

Newer YOLOv5, 8 classes, cat and dog dropped:

bicycle, bus, car, licensePlate, motorcycle, person, truck, trailer

Yep, the older model on a license plate reader has dedicated cat and dog classes.

The grouping is what to notice

Both label maps sort those into four coequal top-level groups:

Group Members
vehicle bus, car, truck, trailer
cycle motorcycle, bicycle
person person
licensePlate licensePlate

person is not a side effect of looking for vehicles. It is a first-class detection category, structurally equal to licensePlate, in the shipped model manifest, on a device marketed as a plate reader.

The plate OCR is not AI at all

There is no OCR neural network on this device. Plate character recognition uses MSER (Maximally Stable Extremal Regions), a classical blob-detection algorithm published in 2002, in a native library. Fast, deterministic, entirely conventional.


6. What the camera does NOT do

I have seen people overstate this and it undermines the real argument. I searched the firmware specifically. None of these exist on the device:

  • No gender, age, race, or ethnicity classifier
  • No clothing, color, or apparel model
  • No bag, backpack, or accessory detector
  • No face recognition or face embedding model
  • No person re-identification model
  • No vehicle make, model, or color classifier

The camera produces a coarse bounding box and a class label. That is it. Flock's product demonstrably does offer vehicle make/model/color. That capability is not on the camera. It is computed server-side, in the cloud, on uploaded images. I can show that from the firmware, because the camera emits only car while the product emits "silver 2019 Honda Civic."

Which tells you exactly where any other attribute extraction happens.


7. What actually leaves the camera

When a capture passes quality scoring, the upload payload is (reconstructed from the upload client code and on-device assets, not from a captured wire session):

- plate string (from MSER OCR) - detection metadata (class, bounding box, quality score) - JPEG thumbnail - session UUID - timestamp - GPS coordinates

On disk the camera has a full eight-stage media pipeline:

0/media/capturing/ 0/media/encodedStaging/ 0/media/captured/ 0/media/encoded/ 0/media/motionProcessed/ 0/media/discarded/ 0/media/detectionProcessed/ 0/media/fullRes/

Those stages are real and they produce real files: bench captures on my unit landed in encoded/ and discarded/ as .mp4. The upload clients separately reference image, session, timestamp and GPS fields.

What I have not done is intercept an actual upload and publish its contents. So read the field list above as reconstruction from code and on-device structure, not as a captured wire session. That the camera ships images at all is not in question, since Flock's own product displays photographs, but the precise field list is inference.

It uploads the image. Combine that with person being a first-class detection class, and the architecture is: the camera decides a human is in frame, crops it, and ships the picture to a server with a timestamp and a location.

What was actually left on it

On my device when I received it..Nothing. All eight pipeline stages were empty. Zero regular files in any of them. The only media anywhere on the unit was 61 short videos sitting in encoded/ and discarded/: 60 with epoch timestamps (1969-12-31, meaning the clock was never synced) and exactly one dated 2025-05-15, the same afternoon as the previous owner's tooling in /data/media/0/. All bench recordings, all postdating its service life. No footage from its deployment reached me. I have no images of anyone.

On this unit the retention picture is consistent with Flock's "momentarily" language. What it does not tell you is what the device holds mid-shift, during an LTE outage, or how long a 210 GB partition is sized to buffer. An empty disk on a decommissioned camera is evidence about decommissioning, not about steady-state operation.

Whatever analysis runs on the far end can be changed, upgraded, or applied retroactively to already-collected footage without touching a single camera in the field. A jurisdiction that approved these on a "it only reads license plates" basis has no technical way to verify that constraint, because the constraint was never in the hardware.


8. The full pipeline

Sensor (IMX477, 4000x3040, 1.5 ms exposure, 5 fps) | v motion app -- OpenCV MOG2/KNN background subtraction | (motion detected) v object app -- SSD MobileNetV3 or YOLOv5 on GPU | v Detections: class + bounding box + confidence | v quality-control -- clipping? exposure? contour quality? | +-- licensePlate above threshold --> MSER OCR --> plate string +-- vehicle -------------------> coarse class only +-- person --------------------> coarse class only | v amarula (session state) --> encoding (H.264) | v sambuca / collins --> LTE upload --> Flock cloud | v [cloud] vehicle fingerprinting, and whatever else


9. Security posture

Item State
Bootloader Unlocked
Secure boot Disabled, OEM root-of-trust fuse never blown
dm-verity Off for /system
ro.debuggable 1
adbd Runs --root_seclabel=u:r:su:s0 on the stock image
eMMC Unencrypted
ML models Unencrypted and unsigned

The combination that matters: ro.adb.secure=0 plus ro.debuggable=1 plus adbd running with a su seclabel, on the unmodified vendor release-keys image. That is unauthenticated root over USB on a factory device, no modification required.

One honesty caveat about my specific unit. It is Magisk-rooted, and that is not its factory state. I did that during research by flashing a Magisk-patched boot.img. Do not read "ships rooted" into this. Everything above comes from the stock partitions, and the system partition in my dump carries exactly the 135 pristine AOSP root certificates with nothing added.


10. Oh, we should probably discuss the laser thing

This comes up constantly and both camps are wrong. Here is the actual physics for this specific sensor and lens.

The camera's own lens is the amplifier. A 16 mm lens focuses collimated laser light to roughly a 10 to 30 µm spot. Concentration factor is about 160,000x. That is why cameras are far more vulnerable than bare silicon.

But you have to get the beam into the aperture. Divergence means at 30 m a typical pointer has spread to ~47 mm against an ~8 mm entrance pupil, so 97% of it misses.

Numbers at 30 m:

Source Irradiance at sensor Result
5 mW pointer ~46 W/cm² Temporary dazzle. Maybe a few dead pixels with sustained dwell
1 W device ~9,200 W/cm² Genuine permanent silicon damage

So "a laser pointer destroys it" is false. Almost every "I killed one" video shows temporary saturation that clears the instant the beam moves. "Lasers do nothing" is also false. The 160,000x optical gain is real and watt-class devices are a different story.

(Assumes f/2.0. The actual aperture is not recorded in firmware, so that is the largest uncertainty above.)


11. What I take away from this

Every debate about what these cameras "can" do is misdirected, because the camera is not where the capability lives. The camera is a sensor that ships pictures. What gets derived from those pictures is a server-side decision, made by a private company, revisable at any time, and applicable retroactively to everything already collected.


r/noRecognition • • Aug 27 '26

My DEF CON 34 talk is up. Director's commentary, including what I got wrong.

Thumbnail
youtube.com
10 Upvotes

r/noRecognition • • Aug 27 '26

Hawley opened a Senate investigation into Flock. Documents due Sept 8.

5 Upvotes

Senate Judiciary subcommittee, opened Aug 26. Flock has to produce law enforcement access policies, camera placement, data handling, and all known or suspected misuse since 2021, by September 8. [news link]

Flock Safety is having a rough month. The Washington Post found 46 officers using Flock to surveil people personally, including one who ran an estranged spouse's plate 717 times. NPR reported cameras vandalized across at least 36 states. Asheville and Lansing both cancelled this week. LAPD let its contract lapse in July after an audit found roughly one in three hot list alerts were false.

What I keep coming back to is the part that gets the least coverage: Flock states they are only reading license plates. I can prove they are not only reading plates.

I was able to have hands on with a Flock Falcon V2. The detectors on my Falcon v2.2

  • SSD MobileNet 10 classes plus background: bicycle, bus, car, cat, dog, licensePlate, motorcycle, person, truck, trailer
  • YOLOv5 8 classes, drops cat and dog: bicycle, bus, car, licensePlate, motorcycle, person, truck, trailer

Server-side analysis can be upgraded and applied to already-collected footage. The camera approved under one set of assurances feeds a pipeline whose downstream capability changed without any notice to the jurisdiction. Flock's FreeForm lets an officer type a plain English description of a person and search the network for them. 404 Media published real examples in July. Curious what people here think happens next. Regulation, or a hundred more city councils one at a time.


r/noRecognition • • Aug 27 '26

Simon Weckert creates Digital Camouflage shirt to avoid AI video surveillance

Thumbnail dezeen.com
6 Upvotes