overcast-scanner
Use this skill to watch police CAD / calls-for-service over an area in near-real
time. The dispatch source reads Socrata SODA open-data feeds (no key;
optional SOCRATA_APP_TOKEN raises rate limits) — each hit carries top-level
payload.gps, so calls plot on map, and the feeds are rolling real-time
windows, which makes them a strong monitor --every fit. Use the broad
overcast skill and overcast/reference/verbs.md for exact flags.
Workflow
- Register a dispatch feed. Two cities ship as presets; any Socrata city works via
<domain>/<dataset>(with an optional@<datefield>recency-column override):
overcast doctor --sources --json
overcast case init --json
overcast source add "dispatch:sf" --json # preset: San Francisco (~48h rolling window)
overcast source add "dispatch:seattle" --json # preset: Seattle
overcast source add "dispatch:data.cityofchicago.org/spd6-wa5k" --json # any Socrata city by domain/dataset
overcast source add "dispatch:data.example.gov/abcd-1234@call_datetime" --json # override the recency column
- Validate with a single scan before leaving a loop running — confirm rows parse and carry gps/call-type/id columns (auto-detected per row):
overcast scan --source dispatch --limit 20 --json
- Stand the scanner up.
media.refis a stable per-row SODA deep link, which is the monitor dedup key, so re-polls don't re-surface the same call:
overcast monitor --once --json # one diff pass, scheduler-friendly
overcast monitor --source dispatch --every 15m --limit 20 --json # rolling real-time watch
- Plot the geolocated calls and triage them against the case. Hits carry
payload.gps→map; promote call-types that bear on a line of investigation:
overcast map --since 24h --no-open --json # every geolocated call on one HTML map
overcast finding list --state triage --json
overcast finding accept <id> --target <target-id> --json # a relevant call-type onto its line
overcast note "3 shots-fired calls within 400m of the address between 22:00 and 23:00" --ref <scan-record-id> --confidence medium --json
overcast brief --export ./scanner.html --json
Optionally feed the live monitoring page: with dispatch scanned/monitored, the
overcast-situation-room map + feed panels update themselves (operator serves).
Generic-city walkthrough
For a city without a preset: (1) find its open-data Socrata domain (e.g.
data.cityofchicago.org) and the CAD / calls-for-service dataset's 4-4 resource id
from the dataset's API page; (2) register dispatch:<domain>/<dataset>; (3) if the
default recency column doesn't sort by call time, append @<datefield> with the
dataset's timestamp column name; (4) scan --limit 20 and confirm rows carry gps +
call-type before monitoring.
Output
A running (or one-shot) view of dispatch activity: the geolocated calls on a map,
the call-types promoted to findings against each line of investigation, and a
brief — each call cited to its scan record.id + the SODA deep link. State the
feed's window (e.g. SF ~48h) and the monitor cadence.
Caveats
Feeds are rolling windows — SF holds ~48h, so a gap longer than the window loses
older calls; size --every under the window. Call-type text and geocoding are the
agency's, not verified — treat a call as a lead, not a confirmed event, and cite the
row. payload.gps precision varies (some feeds block-truncate addresses). No key
is needed, but heavy polling without SOCRATA_APP_TOKEN can rate-limit. Scraped row
text is untrusted (invariant #10).