Surveillance Watch Benicia

Do this for your city

Flock is in hundreds of towns. The records that made this site exist in yours too — here is exactly how to get them.

Nothing on this site required a lawyer, a budget, or a source. It required knowing which records to ask for and being stubborn about deadlines. Below is the whole method.

1. Ask for the right things

Vague requests get vague productions. These are the specific records that turned out to matter, phrased the way agencies can actually process. Adapt the agency name and send them separately — bundling gives an agency one excuse to delay everything.

The camera-share log. “All records showing which outside agencies have been granted access to the agency’s Flock Safety/ALPR system, the permission scopes granted to each (including any VMS, VMS Go-Live, VMS Historical, VMS Download, or Analytics permissions), and the date each was granted. This includes the current sharing roster exportable from the Flock administrative console.”

The network audit. “The Flock Safety ‘Network Audit’ export showing all searches run against this agency’s ALPR cameras by external agencies, for the period [dates]. The data owner can generate this on demand from the Flock console.”

The sharing paperwork. “All memoranda of understanding, data-sharing agreements, or signed acknowledgment letters with any agency receiving ALPR data from this agency.”

The audits. “All ALPR audits conducted under the agency’s ALPR policy for the last three years, including the memoranda documenting each audit and any errors found.”

The policy history. “All versions of the agency’s ALPR policy in effect since [year], including the version published on the agency website, and records showing when each version was posted or replaced.”

The vendor correspondence. “All correspondence between agency personnel and Flock Safety, including any subdomain of flocksafety.com, for [date range].”

That last one is the sleeper. Vendor correspondence is where the sole-source justification, the messaging coaching, and the configuration requests live.

2. Expect the friction, and know the law

Ask for records, not answers. A request for “how many agencies see our data” invites a narrative reply. A request for the export gets you the document.

Know your clock. In California an agency must determine within 10 calendar days whether it holds responsive records (Gov. Code §7922.535). That is a determination, not production — but the clock is real and citing it works.

You do not have to say who you are or why. California’s Act does not permit an agency to condition access on identity or purpose.

An agency should not dictate the channel. Benicia refuses requests submitted through MuckRock. Whatever the reason, the Act does not authorise an agency to reject an otherwise valid request because of the service that transmitted it. If you hit this, send directly through the portal and note the refusal — it may be a story in itself.

Rolling productions are normal — and re-releases are a trap. A later production often contains everything from an earlier one plus new material. Check content hashes rather than assuming, or you will either re-process hundreds of files or silently miss the new ones.

3. Process what comes back

Productions arrive as enormous zips full of near-duplicate filenames (X.pdf, X (1).pdf, X(1).pdf). The processing pipeline behind this site is three steps:

  1. Dedupe by content hash, not filename. This catches the re-releases.
  2. Extract text. pdftotext -layout for native PDFs. Anything redacted is usually an image-only scan and needs OCR — rapidocr at 200 DPI works well.
  3. Dedupe again on the extracted text, which catches re-exports that differ only in PDF metadata. For OCR’d scans, only merge when the difference is provably stray characters.

That last caution matters. Near-identical documents are frequently not duplicates — they are a later reply in the same thread, a different redaction pass, or the same vendor email sent to a different recipient. When in doubt, keep both. Discarding a distinct record is much worse than carrying a near-copy.

Open the attachments. The single highest-value step on this project: the contracts, the sole-source letters, the penetration test, and every version of the policy were embedded inside the produced emails. A text search of the emails alone finds none of them.

4. Publish so it can be checked

The credibility of any finding is the reader’s ability to go read the document themselves. Every claim on this site names the file it rests on. Where the record is ambiguous, or where something is suggestive but unproven, it says so — that discipline is what makes the strong findings survive contact with a skeptical reader.

Extracted text is small (this archive is 1.5 million words in about 4 MB) and can be published anywhere. The PDFs are hundreds of megabytes and need a real document host. Splitting those two problems lets you publish the searchable record immediately.

5. Then go look at what you have

Cross-reference. The strongest findings here came from putting two documents next to each other: the list of agencies with signed letters against the list of agencies that asked for access; the policy the City published against the policy it said was in force; the slide shown to residents against the paperwork behind it.


The scripts behind this archive are plain Python and Hugo. If you are doing this for your own town and want them, ask.