-
-
Centinela: an autonomous agent that scores multi-hazard risk per city, alerts residents in their language, and self-heals its own data.
-
The alert a resident actually sees: agent-written, translated to Spanish, read aloud, and pinned to the place on the map.
-
One screen watching dozens of places at once, with live flood and earthquake risk per location plus a worldwide seismic feed.
-
Why the score is what it is: river, rainfall, soil, and seismic activity fused into one compound risk number.
-
The live conditions behind the score, each value tagged with where it came from. Freshness is first-class here.
-
The agent watching its own pipelines. When a feed goes stale it detects the outage and recovers on its own.
-
Risk over time for one place, so a resident can see whether things are getting worse or easing off.
-
The worldwide seismic feed the agent folds into earthquake risk, ranked by recent magnitude.
Inspiration
Disaster warnings tend to fail at the last mile. The data is out there (river gauges, flood models, seismic feeds), but it sits in analyst dashboards, in one language, and it goes stale the second a pipeline breaks. We wanted the opposite of that: a watcher that keeps its own data fresh, reasons about combined risk the way someone who lives there would, and talks to a resident in their language on whatever phone they already own.
What it does
Centinela is an autonomous agent that watches flood and earthquake risk across dozens of places worldwide. It pulls live hazard feeds and rolls rainfall, soil saturation, river discharge, and seismic activity into a single compound risk score, and when that score crosses a threshold it writes a plain incident summary, translates it, reads it aloud, and pushes it to the people in that place. The frontend shows current risk per location on a map and works offline as an installable app.
How we built it
We built the agent on the Google Agent Development Kit, running Gemini through Vertex AI. Gemini Flash does the cheap routing and extraction, while the stronger Gemini model writes the narration that actually goes out. Data ingestion runs through Fivetran connectors (orchestrated over its MCP server) alongside custom Python connectors for the live hazard feeds. Everything lands in BigQuery, where SQL computes the compound flood and seismic risk, and Firestore holds agent memory and per-place state so the system survives restarts on a stateless host. The backend exposes risk, conditions, alert, incident, and push endpoints.
When a threshold is crossed, the agent narrates the incident, translates it with Cloud Translate, renders speech with Cloud Text-to-Speech, and fans it out as a per-place topic over Firebase Cloud Messaging. The frontend is a lightweight Vite app with a Google Maps view, installable as a PWA with an offline shell, and the whole thing deploys on Cloud Run via the managed source build.
Challenges we ran into
Cloud Run broke our first design, because in-memory state and background threads do not survive a stateless host, so we moved persistence to Firestore and rethought how the self-heal loop runs when there is no continuous traffic to ride on. Getting a reliable "is this feed actually current" signal, with a recovery path that does not loop forever, took several passes. Early versions spammed duplicate push notifications, which is how we ended up with async narration caching and dedup. And we did all of it on a Gemini-only, quota-limited workflow, which forced real discipline about when to spend the expensive model instead of the cheap one.
Accomplishments that we're proud of
The detect-to-heal loop works, since the agent notices stale or degraded data and recovers on its own. The compound score actually fuses multiple hazards instead of reporting one number in isolation, and alerts reach a resident as translated text, spoken audio, and a targeted push, not just a line on a dashboard. The resident app is also a real installable PWA that still loads on a bad connection.
What we learned
Compound risk is the real story, since a single river level or one tremor rarely tells you much on its own. We also learned that an agent is only as trustworthy as its data freshness, so most of the value lives in the self-healing loop rather than the model prompt. And reaching people mid-emergency means translation plus voice plus push, because nobody refreshes a website when the ground is shaking.
What's next for Centinela
Next up is wider coverage, with more places and more hazard types beyond flood and seismic. We want to use local feedback to tune the alerting thresholds, so each place can set its own sensitivity, and add a short history and trend view so residents can see whether risk is rising or easing. We also want to harden the autonomous scheduler so it keeps the data fresh on a fixed cadence without anyone nudging it.
Built With
- bigquery
- cloud-run
- firebase-cloud-messaging
- firestore
- fivetran
- gemini
- google-adk
- google-air-quality-api
- google-cloud-text-to-speech
- google-cloud-translation
- google-maps
- google-weather-api
- javascript
- mcp
- open-meteo
- pwa
- python
- service-worker
- usgs
- vertex-ai
- vite
Log in or sign up for Devpost to join the conversation.