drive through most american cities today and you'll pass a flock safety camera without noticing it. it's a small, solar-powered box mounted on a pole, quietly photographing every license plate that passes and running ocr on it. no human review, no warrant, no opt-out. just a permanent, searchable record of where your car has been.
after digging into how these actually work, it's hard to see them as anything but infrastructure nobody voted for. here's why.
there's no consent and no real oversight
flock cameras log a plate, a timestamp, gps coordinates, and a "vehicle fingerprint", make, color, damage, bumper stickers, for every car that passes, regardless of whether that car is connected to any crime. you didn't agree to this. neither did anyone else on the road.
data sharing expands past its stated purpose
departments network their flock feeds together, and that network has repeatedly been used well outside its original scope. mountain view, ca pulled its flock contract in 2026 after an audit found federal agencies, including ice, had queried the city's camera data through inter-agency search, despite a local policy that explicitly barred federal access. the vote to end the contract was unanimous, and it triggered similar audits in dozens of other cities.
it normalizes mass tracking as infrastructure
a single camera at an intersection is a curiosity. hundreds of thousands of them, cross-linked into a shared national search index, is a tracking system that was never put to a public vote in most of the places it now operates.
the access controls live in a contract, not in the hardware
none of this requires believing anyone involved has bad intentions. the problem is architectural: a passive, blanket surveillance layer bolted onto ordinary streets, where "we only allow local law enforcement to search this" is a policy that can change with the next city council, not a technical guarantee.
the upside: it's radically documented
ironically, the same openness that makes flock's spread visible is what makes it possible to push back on. a community project called deflock crowdsources camera locations onto openstreetmap, volunteers photograph and geotag cameras in the field, and the resulting dataset is public, queryable, and auditable by anyone. as of 2026 it's the largest open registry of surveillance infrastructure in the world, with over 300,000 mapped cameras.
that means you don't have to take it on faith that a camera exists near you. you can query it directly.
checking for cameras near you
openstreetmap tags alpr cameras with man_made=surveillance, surveillance:type=ALPR, and, when known, manufacturer=Flock Safety. that data is queryable straight from the overpass api, no auth required.
interface OverpassElement {
id: number;
lat: number;
lon: number;
tags: Record<string, string>;
}
interface OverpassResponse {
elements: OverpassElement[];
}
interface FlockCamera {
id: number;
lat: number;
lon: number;
manufacturer?: string;
direction?: string;
}with those types in place, the actual query is just a POST to overpass with an overpass QL string:
async function findNearbyFlockCameras(
lat: number,
lon: number,
radiusMeters = 2000
): Promise<FlockCamera[]> {
const query = `
[out:json][timeout:25];
(
node["man_made"="surveillance"]["surveillance:type"="ALPR"](around:${radiusMeters},${lat},${lon});
);
out body;
`;
const response = await fetch("https://overpass-api.de/api/interpreter", {
method: "POST",
body: query,
});
if (!response.ok) {
throw new Error(`overpass query failed: ${response.status}`);
}
const data: OverpassResponse = await response.json();
return data.elements.map((el) => ({
id: el.id,
lat: el.lat,
lon: el.lon,
manufacturer: el.tags["manufacturer"],
direction: el.tags["camera:direction"],
}));
}and calling it is one line:
const cameras = await findNearbyFlockCameras(33.749, -84.388);
console.log(`found ${cameras.length} alpr cameras nearby`);because FlockCamera and OverpassResponse are defined interfaces, typescript catches you immediately if you try to read a field that isn't there, or forget that manufacturer and direction are optional since not every camera in the dataset has been fully tagged yet. compare that to a loose any from a raw fetch().json(), where a typo like el.tags.manufaturer silently returns undefined and you don't notice until the results look wrong.
a few notes if you build on this:
- coverage is only as good as volunteer mapping in your area, a blank result doesn't mean no cameras, it means none have been logged yet.
- be a good citizen of the overpass api: it's a shared public resource, so cache results and don't hammer it in a tight loop.
- if you want a maintained ui instead of rolling your own, deflock's own map and the deflock-app mobile client both sit on top of the same osm data.
conclusion
mapping this stuff doesn't make the cameras go away. but it turns "trust us" into something you can actually verify, and that's usually the first step toward a city council vote instead of a permanent surveillance layer nobody agreed to.
if you actually want them gone, the map alone won't do it. flock contracts get approved and renewed at the city or county level, so call or email your city council, your county commissioners, or your state rep, and ask who approved the contract, what the retention policy is, and who gets access to the data. mountain view's contract only ended because people showed up and pushed for that audit.
