Event-driven climate hazard monitoring pipeline for Tunisia's 24 governorates. AWS medallion architecture (Bronze/Silver/Gold) emulated locally with LocalStack. Detects heatwaves, dust storms, heavy rain and wind hazards from 5 years of Open-Meteo data. Built with Python, PostgreSQL, Streamlit.
# 🛡️ Aero-Shield Tunisia
### Climate Hazard Monitoring & Early Warning System
> An event-driven data pipeline that monitors multi-dimensional climate hazards across all 24 Tunisian governorates — built on a real AWS medallion architecture, emulated locally for $0.
---
## 🌍 What Is This?
Tunisia faces real climate threats — extreme heat, Saharan dust storms, flash floods, dangerous winds. This project builds a complete data engineering system that:
- **Ingests** daily weather + air quality data for all 24 governorates from Open-Meteo
- **Transforms** raw data through a Bronze → Silver → Gold medallion pipeline
- **Detects** climate hazards using season-aware thresholds (35°C in Kebili in July ≠ 35°C in Bizerte in January)
- **Alerts** authorities 24 hours in advance when forecasts exceed danger thresholds
- **Visualizes** everything on an interactive Tunisia choropleth heatmap
---
## 🏗️ Architecture
```
Open-Meteo API (Historical + Forecast)
│
▼
ingestion/daily_ingest.py
│ uploads raw JSON
▼
🥉 S3 tunisia-bronze ──── S3 event ────► ⚡ Lambda (handler.py)
/YYYY/MM/DD/weather.json │
┌──────────────┼──────────────┐
▼ ▼ ▼
transform.py threshold_ notification
(validate + detector.py .py
clean) (hazards) (alerts)
│ │
▼ ▼
🥈 S3 tunisia-silver 🥇 PostgreSQL (Gold Layer)
/governorate=X/ ├── weather_observations
year=YYYY/month=MM/ ├── weather_forecasts
day=DD/data.parquet ├── hazard_alerts
├── alert_thresholds
└── pipeline_runs
│
▼
Streamlit Dashboard
├── Tunisia choropleth map
├── Metric selector (temp/rain/wind/dust)
├── Historical (5 years) + Forecast (7 days)
└── Real-time warnings table
```
### Why LocalStack?
LocalStack emulates AWS S3 and Lambda on your laptop — the code is **identical** to a real AWS deployment. Remove two lines (the LocalStack endpoint config) and this runs in production AW …