footnote4a

Mass surveillance, government contracts, and other bedtime reading.

Data update: Cathedral City CA PD (Jan–Feb and Jul–Aug 2026)

922,758 network audit records from Cathedral City CA PD covering Jan 18 – Feb 17 and Jul 27 – Aug 26, 2026.

by HaveIBeenFlocked Team
10 min read
logs
california

Cathedral City is a city of about 51,000 people in Riverside County, California, in the Coachella Valley. This update adds two Flock network audit logs from Cathedral City CA PD. The first covers Jan 18 – Feb 17, 2026. The second covers Jul 27 – Aug 26, 2026. Together they list 922,758 searches by 323 agencies that included Cathedral City’s cameras. The logs have no records for Feb 18 – Jul 26, 2026. Thanks to DHS Concerned Citizen for obtaining and sharing these records.

All dates below use Pacific time.

#Network audit

  • Type: Network audit
  • Timespan: Jan 18 – Feb 17, 2026 (31 days) and Jul 27 – Aug 26, 2026 (31 days)
  • Records: 922,758 (Jan–Feb: 475,671; Jul–Aug: 447,087)
  • Organizations (network): 323
  • Search types: lookup (660,912), lookup - Mobile (141,318), search (99,455), search - Mobile (16,916), convoy (3,884), searchSummary (90), freeform (72), searchSummary - Mobile (62), multiGeo (21), visual (19), freeform - Mobile (8), visual - Mobile (1)
  • Operator name: redacted on all 922,758 records
  • License plate: redacted on 868,310 records; blank on 54,448
  • Case #: redacted on 656,412 records; blank on 265,982; present on 364

The two windows are 159 days apart. The logs contain no records for Feb 18 – Jul 26, 2026.

The City redacted the plate on all 475,671 Jan–Feb records. In the Jul–Aug log, the City redacted the plate on 392,639 records and left it blank on 54,448.

Cathedral City CA PD ran 1,424 of the searches: 562 in Jan–Feb and 862 in Jul–Aug. It ranks 119th of the 323 agencies by search count. In the Jan–Feb log, the City left its own case numbers unredacted on 364 records and its own search filters unredacted on 312. It redacted those fields for other agencies.

Weeks start on Monday. The first and last week of each window are partial.

#Search types

TypeCount%
lookup660,91271.6%
lookup - Mobile141,31815.3%
search99,45510.8%
search - Mobile16,9161.8%
convoy3,8840.4%
searchSummary90<0.1%
freeform72<0.1%
searchSummary - Mobile62<0.1%
multiGeo21<0.1%
visual19<0.1%
freeform - Mobile8<0.1%
visual - Mobile1<0.1%

All 158,305 “- Mobile” records come from the Jul–Aug log. The Jan–Feb log has no “- Mobile” search types.

#Top agencies

Three agencies ran 24.9% of the searches: California Highway Patrol, the Riverside County Sheriff’s Office, and San Francisco CA PD. Every agency in the logs is in California.

OrganizationCount%
California Highway Patrol87,1339.4%
Riverside County CA SO77,8208.4%
San Francisco CA PD65,0167.0%
Orange County SO CA33,0683.6%
Los Angeles County CA SD32,4623.5%
San Bernardino County CA SO27,4513.0%
San Jose CA PD17,9491.9%
City of Riverside CA PD17,5241.9%
Los Angeles CA PD16,4711.8%
Sonoma County CA SO13,5731.5%
NCRIC12,8001.4%
Ontario CA PD12,6811.4%
Fontana CA PD11,9221.3%
Santa Clara CA PD11,7761.3%
Alameda County CA SO10,6041.1%
Other (308 organizations)474,50851.4%

#Reasons

The logs hold 36,212 distinct reason values. Most start with a category, often followed by a dash and free text. The table groups reasons by the text before the first " - ". The most common full value is “Motor Vehicle Theft/Stolen,” with 39,474 records. The reason is blank on four records.

Reason categoryCount%
Motor Vehicle Theft/Stolen170,99518.5%
Drugs/Narcotics89,1509.7%
Larceny/Theft Offenses86,3489.4%
Wanted Person (Arrest Warrant/Fugitive)66,8307.2%
Burglary/Breaking & Entering62,1106.7%
Assault/Battery Offenses51,3555.6%
Robbery43,9014.8%
Weapons Offense (Guns/Shots Fired)38,9544.2%
Hit and Run/Car Accident33,9303.7%
Stolen Property Offenses33,6893.7%
Criminal Motor Vehicle Offense (incl. Road Rage/Reckless)25,7782.8%
Other24,6372.7%
Traffic Infraction23,4822.5%
Assault/Battery Offenses (Domestic)23,2912.5%
Homicide/Death Investigation15,3221.7%
All other categories (681)132,98614.4%

Cathedral City’s own 1,424 searches most often cite Larceny/Theft Offenses (267), Assault/Battery Offenses (222), and Motor Vehicle Theft/Stolen (191).

#Report highlights

#First Amendment

Irvine CA PD ran 19 searches on Feb 7, 2026, between 12:40 and 3:00 PM. Eighteen give the reason “Other - veh seen at protest.” One gives “Destruction/Damage/Vandalism of Property - veh seen at protest.” Fourteen were searches and five were lookups.

#Immigration

No reason mentions immigration, deportation, ICE, ERO, CBP, Border Patrol, or undocumented people. Thirty-nine reasons from eight agencies mention HSI (Homeland Security Investigations). Thirty-one of those fall under the Drugs/Narcotics category. Eight more reasons from two agencies contain “DHS.” The reasons do not say what DHS stands for.

#Low-level offenses

The Traffic Infraction category covers 23,482 searches (2.5%). The Illegal Dumping/Littering category covers 1,696 searches from 53 agencies.

#How we processed the files

This section lets anyone with the released files rebuild our staged CSVs byte for byte. We used Python 3.12.15 and its standard library. Sizes and SHA-256 hashes below are for the CSV files as extracted from their zip archives.

#Released files

Released nameBytesSHA-256
Cathedral City CA PD-Network-Audit_09-25_02-26.csv110,894,514a7b0ff176bc3b6a2a6952be4044cc2b10e1ac932fdc556fe3dfac21a8adf3c69
7_27_2026-8_26_2026-Cathedral City CA PD-Network-Audit.csv102,723,05258860e344d24f4c66db38336a92e42b7bba47c98284949fef707508e965cf90a

The Jul–Aug audit file ends each record with LF. It quotes every field except Total Networks Searched, and leaves the header unquoted. Its header has a space after each comma. We staged it as a byte copy.

The Jan–Feb audit file ends each record with CRLF and quotes fields only where needed. The Time Frame field holds an LF inside its quotes. The file has no byte-order mark and no NUL bytes. Its header reads:

ID,Name, Org Name, Total Networks Searched, Time Frame,Column1, Reason, Case #, Filters, Search Time, Search Type, Text Prompt, Moderation

The sixth column is named Column1 where the Flock export uses License Plate. The file holds 1,048,575 rows after the header. Rows 1 through 475,671 are records. Rows 475,672 through 1,048,575 (572,904 rows) are each the 18 bytes ,***,,,,***,,,,,,, followed by CRLF. They have no ID and no Search Time. The only values in them are *** in the Name and sixth columns.

#Changes

We made two changes to the Jan–Feb file, in one pass.

  1. Header. We replaced the header line with the same line, with ,Column1, changed to , License Plate,. Without this change the importer would not read the sixth column as the plate column.
  2. Filler rows. Starting at the end of the file, we removed each trailing copy of ,***,,,,***,,,,,,,\r\n until the preceding bytes differed. This removed 572,904 rows and kept the first 99,436,434 bytes of the file. Without this change the importer would load one record with no ID and no Search Time.

We kept every other byte, including CRLF line endings and the original quoting. The script:

import sys
src, dst = sys.argv[1], sys.argv[2]
b = open(src, "rb").read()
old_header = b"ID,Name, Org Name, Total Networks Searched, Time Frame,Column1, Reason, Case #, Filters, Search Time, Search Type, Text Prompt, Moderation\r\n"
new_header = b"ID,Name, Org Name, Total Networks Searched, Time Frame, License Plate, Reason, Case #, Filters, Search Time, Search Type, Text Prompt, Moderation\r\n"
assert b.startswith(old_header)
filler = b",***,,,,***,,,,,,,\r\n"
pos = len(b)
while b[pos - len(filler):pos] == filler:
    pos -= len(filler)
open(dst, "wb").write(new_header + b[len(old_header):pos])

#Staged files

Staged fileSourceRowsSHA-256Change
Cathedral City CA PD-Network-Audit_09-25_02-26.csvsame name, released475,6719af683d66a1aad1c18e4a2d9943d9211191716d112c58c27bda6c36f07ab51c82 changes
7_27_2026-8_26_2026-Cathedral City CA PD-Network-Audit.csvsame name, released447,08758860e344d24f4c66db38336a92e42b7bba47c98284949fef707508e965cf90abyte copy

Row counts exclude the header. The staged Jan–Feb file is 99,436,441 bytes.

#Checks that changed nothing

  • No ID repeats within a file or across the two files.
  • Search Time parses as %m/%d/%Y, %I:%M:%S %p UTC on every record in both files. We left the values in UTC as released.
  • The Name column reads *** on every record in both files. We kept the marker.
  • Four Jan–Feb records have a blank reason. We kept them.
  • Some Org Name values end with a space, such as "City of Riverside CA PD ". We left them as released.

#Anomalies

#Excel row limit

The released Jan–Feb file holds 1,048,576 rows, counting the header. That is the most rows an Excel sheet can hold. Only the first 475,671 rows are records. The other 572,904 rows hold only redaction markers, as described above. The records end well before the limit, so the limit did not cut off records.

#File name and dates

The Jan–Feb file is named for September 2025 through February 2026. Its records run from Jan 18 to Feb 17, 2026.

#Test records

205 records from 40 agencies have “test,” “tests,” “testing,” or “tested” in the reason: 84 in Jan–Feb and 121 in Jul–Aug. The most common values are “Other - test” (23, ignoring case) and “Wanted Person (Arrest Warrant/Fugitive) - test” (21, ignoring case).