-
-
CrisisWatch AI landing page for turning global disaster feeds into actionable intelligence.
-
Global crisis analytics dashboard showing events over time, severity distribution, and affected countries.
-
JKUAT Conduit station historical rainfall replay and inspection threshold workflow.
-
Real-time alert feed tracking critical and catastrophic crisis events globally.
Inspiration A campus facilities team gets a rainfall reading and asks a very practical question: should we check the drainage? Weather data is everywhere, but it rarely connects to an operational decision anyone can act on. We wanted to close that gap — turn station observations into a documented, reviewable inspection decision instead of another dashboard people glance at and ignore. What it does CrisisWatch AI replays a JKUAT Conduit weather export, estimates trailing 24-hour rainfall from the cumulative rainfall counter, and compares it against an adjustable inspection threshold. When a reading crosses the line, a proposed facilities user can save a historical drainage-inspection drill — with the source fingerprint, observation, threshold, and calculation evidence attached. Outcomes and follow-up notes append to history, and the whole thing exports as an evidence brief. A separate dashboard aggregates external crisis reports (GDACS, USGS, NASA FIRMS, ReliefWeb, WHO, ACLED, Open-Meteo) with a provider-health panel. It's a deterministic workflow — not a hype-driven flood predictor. How we built it
- Backend: Python 3.12, FastAPI, SQLAlchemy + SQLite, pandas for the rainfall calculations, httpx for provider ingestion.
- Frontend: Next.js, React, TypeScript, Tailwind, React-Leaflet for maps, Recharts for charts, TanStack Query for data fetching.
- Data: The 2,943-observation Conduit export (Apr–May 2026) plus seven external crisis feeds with background refresh, dedup, and bad-row isolation.
- ML: Experimental severity/text classifiers, forecasting and clustering — with fallbacks so the core workflow never depends on model availability.
- Tests & CI: Unit suites for counter resets, gaps, window boundaries, dedup and source-hash validation; GitHub Actions CI. Challenges we ran into
- Counter semantics: rainfall is inferred from increases in a cumulative counter — resets, invalid values, and long gaps all had to be detected or the estimate would silently mislead. Missing history intentionally withholds an assessment.
- Provenance honesty: the CSV has no station ID, coordinates, or embedded proof of origin. We built source-hash fingerprinting and refused to claim organizer-approved eligibility or live API access we don't have.
- Seven flaky external feeds: every provider behaves differently; we built per-adapter health reporting so failures are visible instead of silent. Accomplishments that we're proud of
- A defensible, transparent rainfall calculation with an adjustable threshold and full evidence trail.
- A complete drill workflow: assign owner + location, save evidence, append outcomes, export a brief.
- Clean separation between deterministic station evidence and experimental ML — no overclaiming.
- Engineering hygiene: XSS escaping, source-hash validation, duplicate prevention, and a passing test suite. What we learned
- Honesty is a feature: stating what a system does not prove builds credibility with judges and users.
- The hard part of climate-tech isn't modeling — it's messy, unverified field data and turning observations into decisions people can document and trust. What's next for CrisisWatchAI
- Validate thresholds and response procedures with real facilities staff and run a pilot.
- Verify CSV provenance and negotiate data rights with JKUAT Conduit.
- Add user-level authorization, migrations, and durable scheduling for shared deployment.
- Connect inspection outcomes back into the dashboard as feedback.
Built With
- docker
- fastapi
- github-actions
- httpx
- next.js
- pandas
- pydantic
- python
- react
- react-leaflet
- recharts
- sqlalchemy
- sqlite
- tailwind-css
- tanstack-query
- typescript
Log in or sign up for Devpost to join the conversation.