-
-
AquaResilience: open water data turned into flood and drought resilience decisions for cities.
-
Architecture: a full-stack web app in Docker Compose, with nginx, a Vue 3 frontend, a FastAPI backend, PostgreSQL + PostGIS and Redis.
-
Secure sign-in with JWT authentication and role-based access control.
-
Login with another language and Day mode
-
Command Center: one explainable resilience score per city, the risk factors behind it, live data status and station readings.
-
Dashboard, day mode
-
Resilience Map: real monitoring stations and a risk layer, with configurable map style and opacity.
-
Early Warnings: threshold-based alerts with contributing factors and a recommended response.
-
AI Intelligence: a plain-language situation briefing, so non-experts can act. The AI only interprets; it never produces the score.
-
Scenario Simulator: test what-if scenarios such as heavy rain or a rising river, and see the impact before it happens.
-
Data Sources: official open data (Hub'Eau, Open-Meteo, NVE HydAPI) with health monitoring and API keys added without redeploying.
-
Settings: Map tab
-
Settings: tune the weights of the deterministic risk engine and set alert thresholds.
-
One command with Docker Compose starts the database, cache, backend and frontend.
-
Graph example from dashboard
Inspiration
European river cities are increasingly exposed to flash flooding, yet most municipalities still rely on fragmented tools: one dashboard for rainfall, another for river gauges, a third for weather forecasts, and no single place that turns all of it into an actionable picture. For Track 6 - Resilience Informatics, we set out to build what a city's emergency and planning teams actually need: one platform that ingests real environmental data, scores flood risk honestly, warns early, and explains why in plain language - starting with a live deployment for Toulouse Métropole and architected from day one to scale to any city in Europe.
What it does
AquaResilience (OneAquaHealth) is a multi-city flood-resilience monitoring platform built around a Command Center dashboard:
Live environmental signals - water level, precipitation, temperature, humidity, wind, pressure and UV, pulled from real connectors (Open-Meteo for weather, national hydrology APIs such as Norway's NVE HydAPI and Austria's eHYD for river gauges), scoped per city and per river. A deterministic risk engine - a transparent, explainable P2 scoring model (not a black box) that produces a current risk score and a predictive trajectory, with honest "insufficient data" states instead of fabricated numbers for cities that aren't fully live yet. Early warnings that trigger automatically when risk crosses a threshold, independent of and never dependent on the AI layer. An AI Situation Brief - an LLM-generated natural-language summary of the current situation per city, with recommendations, confidence, and language-mismatch detection, generated on a fair round-robin schedule across every live city within a single fixed daily budget (so cost stays predictable no matter how many cities are added). A Scenario Simulator and a Resilience Map for exploring "what-if" flood scenarios geographically. Role-based access, source-health monitoring, and a settings area for admins to manage languages, data sources, and AI configuration - all translated into 9 languages (English, French, Spanish, Portuguese, Norwegian, Greek, German, Italian, Dutch).
How we built it
Backend: FastAPI + SQLAlchemy + Alembic on PostgreSQL/PostGIS, with a connector framework that normalizes readings from heterogeneous national APIs into one schema, a scheduler for ingestion and AI-brief rotation, and Redis for rate-limiting and caching. Frontend: Vue 3 + TypeScript + Vuetify, with Pinia stores for city/auth/UI state and a fully reactive multi-city dashboard. AI layer: a provider-agnostic intelligence service (OpenAI-compatible) that builds a per-city environmental snapshot, prompts for a structured brief, and persists it - deliberately decoupled from the deterministic risk engine so the AI can fail, be disabled, or run out of budget without ever affecting flood warnings. Infrastructure: Docker Compose for dev and production, with a hardened nginx reverse proxy (TLS via Let's Encrypt or self-signed, HSTS, security headers) as the only public entry point, Postgres/Redis kept fully internal, and an HTTP-only deployment path for fast demo-subdomain rollouts before a certificate is ready. Testing: 138+ backend tests (pytest) covering connectors, risk scoring, the AI brief lifecycle, and city-scoping, plus TypeScript type-checking, ESLint, and production builds gating every change.
Challenges we ran into
Real APIs are messy. Norway's NVE HydAPI, for example, doesn't always return the nearest station first - we had to fix station selection to pick the one closest to each city center rather than trusting API order, then turn that fix into a self-healing Alembic migration so it applies automatically on every deployment, dev or prod. Keeping AI costs bounded while being fair across cities. Early on, the AI Situation Brief was hardcoded to one city. Redesigning it to serve every city meant building a round-robin scheduler that always analyzes whichever live city has gone longest without a fresh brief - without changing the platform's fixed daily LLM request budget. Being honest about missing data. Rather than showing fake numbers for cities without a live connector yet, every endpoint was built to degrade gracefully and say so clearly, in the UI and in the AI's own language. Internationalization at scale. Every user-facing string - including dynamically generated ones like "Water Level - Garonne" - needed to work correctly across 9 languages and across cities with entirely different river names, not just a single hardcoded city. Production hardiness without losing demo speed. Balancing a fully hardened HTTPS deployment (Let's Encrypt, HSTS, internal-only databases) against the practical need to stand up a working public demo on a new subdomain in minutes.
Accomplishments that we're proud of
A platform that treats flood risk honestly - deterministic where it must be, AI-assisted where that adds real value, multi-city from the architecture up rather than bolted on, and already production-deployable behind a real reverse proxy with automated certificate renewal.
What we learned
That resilience software lives or dies on its handling of the unhappy path - a missing API key, a city with no connector yet, a budget-exhausted AI provider - and that building those states in from the start, rather than patching them in later, is what makes a monitoring tool trustworthy enough for an emergency team to actually rely on.
What's next for AquaResilience
Expanding real connector coverage to more European cities, white-labeling the platform for individual municipalities and consortium partners, and deepening the AI layer with multi-day forecasting narratives.
Try it
- Live demo: https://aquaresilience.starscake.com (login required)
- Demo video: https://youtu.be/PrntIN5RiJs
- Source code: https://github.com/zikosoft/aquaresilience-oneaquahealth
- Presentation Pitch Deck: https://github.com/zikosoft/aquaresilience-oneaquahealth/blob/main/docs/AquaResilience_Pitch_Deck.pptx
- Architecture layers: https://github.com/zikosoft/aquaresilience-oneaquahealth/blob/main/docs/AquaResilience_Architecture_Stack_Animation.html
Judges: sign-in credentials are provided privately in the "Additional info" section of this submission.
Built With
- alembic
- docker
- docker-compose
- ehyd
- eslint
- fastapi
- jwt
- let's-encrypt
- nginx
- nve-hydapi
- open-meteo-api
- openai-api
- pinia
- postgis
- postgresql
- pytest
- python
- redis
- sqlalchemy
- typescript
- uvicorn
- vite
- vue-i18n
- vue.js
- vuetify


Log in or sign up for Devpost to join the conversation.