Inside FlockNova’s Device Location Signals
FlockNova, Flock Safety's person-search tool, can turn an email address into the starting point for device records that carry coordinates and time. The same path can begin with an advertising identifier, a registration identifier, or an internet address, and end in a map, a timeline, a heat pattern, or a spreadsheet. A location history that revealing is worth testing against its source, its legal authority, its accuracy, its purpose, and how it is deleted.
FlockNova's device-signal workflow can begin with an identifier that looks nothing like a location. In the captured client, an email, a hashed email, a registration ID, an advertising ID, or an IP address can enter a device or signal request path. The bulk records that come back can carry time, persistent identifiers, and coordinates into a browser map and a portable CSV.
When enough observations pile up, that combination becomes pattern-of-life capability, supporting inferences about routines, places, co-presence, and repeated movement. This client can build and handle exactly that.
This piece is limited to device-location signals. License-plate surveillance is covered separately.
Five ways into the signal workflow
The readable Advanced Signal component presents five selector modes. Its switch sends email to a locations-from-email endpoint, hashed email to a device lookup, registration ID to a locations-from-registration-IDs endpoint, advertising ID to a locations-from-AID endpoint, and IP address to a signals-by-IP endpoint. Several payloads send a null or optional investigation identifier.
Five identifiers, none of them a location, each route to a signal endpoint. Figure 2. The selector switch routes email, hash, registration ID, advertising ID, and IP address into device or signal endpoints.
The branches differ in a way that matters. The hashed-email branch requests a device record; the others request signals or locations.
The selector design reveals the intended pivot structure. An investigator does not need to start with a latitude and longitude. A contact identifier, a pseudonymous advertising identifier, a device registration identifier, or a network address will serve as the lookup key.
What the browser receives and maps
The bulk-signal handler reads five especially consequential fields: TIMESTAMP, REGISTRATION_ID, IP_ADDRESS, LATITUDE, and LONGITUDE. It computes unique registration IDs and IP addresses, then passes longitude and latitude into a deck.gl scatterplot position function.
Each field is useful alone. Together they reveal far more. Timestamp plus coordinates makes an observation. Repeated registration IDs create continuity. IP addresses add another grouping or correlation key. A scatterplot turns rows into a spatial pattern that can be selected and compared.
This is where accuracy and provenance become load-bearing. A point can be precise without being correct. A registration identifier can persist while a device changes hands. An IP address can represent a gateway, a carrier, a shared network, or a proxy rather than one person. Without source, precision, age, and uncertainty on screen, a visual cluster gets treated as a verified narrative.
Browser scale and portable copies
The handler sets a CHUNK_SIZE of 500,000 rows for bulk processing. A separate function requests the same bulk-signal proxy with a download flag, receives a blob, creates a browser object URL, and triggers a file named for the bulk-signal object.
A blob download turns governed data into a portable local copy. Figure 4. The client supports direct CSV download and uses a 500,000-row processing chunk.
The client was built for large coordinate-bearing datasets. Scale changes the privacy analysis, because reviewing a handful of points by hand is nothing like routinely reconstructing movement across hundreds of thousands of rows.
CSV export changes the governance problem again. Data that was mediated by application permissions and interface controls becomes a portable local copy. The download action carries no watermark, recipient record, purpose recheck, expiration, or deletion mechanism.
A time-filter gap
The bulk helper accepts a timeRange, and the two branches treat it differently. When raw data already sits in the module-level cache, the helper filters each item's TIMESTAMP between the requested start and end. On a cache miss, it posts the S3 key, limit, and offset to the proxy, caches the returned array, and returns it without applying that client-side time filter in the shown branch.
Date scope is a core minimization control for location analysis, and this difference deserves testing. An interface can display a narrow range while the browser holds a broader file. Even if the map later filters correctly, the extra records can linger in memory or become available to other client functions.
Why this capability is sensitive
The joined shape, not any single field, creates pattern-of-life capability.
The privacy concern is not any one of these fields. It is what happens when they combine. A selector can resolve or request observations, and those observations can carry a timestamp and exact coordinates. Persistent IDs make repeated points linkable, the browser can render them as a large spatial pattern, and a CSV can move the whole set outside the application view. Any single step looks ordinary. Joined together, they are enough to reconstruct where someone has been.