Inspiration

San Francisco is loud — but only if you know how to listen. We wanted to build something that could hear the city the way a first responder does: police dispatchers, fire crews, Coast Guard channels, planes overhead, buses crawling through traffic. The idea started with a $25 RTL-SDR dongle and a question — what if we could fuse all of that into one living map? We built it in a single hackathon session with a MacBook Air pointed at the city.
## What it does Monitoring the Situation is a real-time situational awareness dashboard for San Francisco. It decodes P25 trunked radio from SFFD, SFPD, EMS, and mutual aid channels, transcribes them with faster-whisper, tracks every aircraft in 125nm, pulls live Muni positions and traffic events, and feeds it all to Gemini. Gemini synthesizes everything into structured incidents and threats — and when something serious happens, it autonomously fires an alert to a Telegram bot so you know before the news does.
## How we built it The stack is a Python asyncio backend wired to a browser frontend (Vite + Mapbox GL + Deck.gl) over WebSocket. trunk-recorder decodes the P25 control channel and audio off the RTL-SDR; faster-whisper transcribes each call in milliseconds. Aircraft data comes from Airplanes.live and FlightRadar24. Transit and traffic feeds from the 511 SF Bay API are ingested through Nexla dataflows, which handle normalization and routing into the pipeline. Gemini runs on a 5-second synthesis loop, correlating signals across all sources. Alerts go out through a Telegram bot running on a separate DigitalOcean VM.

Challenges we ran into

Getting trunk-recorder to reliably follow SFPD's P25 Phase II trunked system was the first wall — control channel timing is unforgiving. Geocoding raw radio transcripts ("units responding to 16th and Mission") into map coordinates in real time required creative prompting with Gemini. Keeping latency low while running faster-whisper, polling six data sources, and running a DeepMind Gemini synthesis loop concurrently on a laptop took a lot of asyncio tuning. And SFPD encrypts field unit audio — so we had to extract signal from dispatcher-only transmissions.

## Accomplishments that we're proud of We built a working, multi-source intelligence fusion system in one day on consumer hardware. The RTL-SDR pipeline from raw RF to geocoded, Gemini-enriched incident on the map runs end-to-end in under 10 seconds. Gemini autonomously correlated a radio transcript, a FlightRadar24 police helicopter, and a DataSF dispatch call into a single unified incident — without us telling it to. That felt like the moment the system became real.

What we learned

P25 trunked radio is remarkably information-dense even when most traffic is encrypted. Gemini is surprisingly good at geographic reasoning when given structured context — it doesn't just summarize, it infers. And Nexla dataflows made integrating the 511 transit/traffic APIs far less painful than we expected; having a proper transformation layer between raw API responses and our backend was worth every minute of setup.

What's next for Monitoring the Situation

Expanding coverage beyond SF to the full Bay Area. Adding NOAA weather radar as a data layer. Improving Gemini's threat correlation to track incident sequences over time — right now it reasons per-cycle, not longitudinally. We also want to open-source the Nexla dataflow configs so other cities with 511 API access can spin up their own instance. Long term: a public read-only feed so anyone can follow the city in real time.

Built With

Share this project:

Updates