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
Share this project:

Updates