Interactive geospatial dashboard monitoring 34,681 ACLED conflict events across the Sahel (Mali, Burkina Faso, Niger), 1997-present — FastAPI + PostgreSQL/PostGIS, Mapbox GL JS, automated ACLED ingestion, Kubernetes. Anonymized portfolio copy of an MA research project.
# Conflict Trends Dashboard — Sahel Information Environment Monitor
An interactive **geospatial dashboard** that monitors **34,681 ACLED conflict events** across the Alliance of Sahel States — **Mali, Burkina Faso, and Niger** — from **1997 to present**. It pairs a Mapbox GL JS map and time-series analytics with an automated ACLED ingestion pipeline, a FastAPI backend, and a PostgreSQL/PostGIS spatial datastore, deployed on Kubernetes.
> **About this repository.** This is an **anonymized portfolio copy** of a system I designed and built as part of my **MA research (Geopolitical Studies, Charles University)**. Live infrastructure details (hosts, domains, namespaces, credentials) have been removed, and no ACLED datasets are included — the data is licensed separately by ACLED and lives in the database, not in this repo.
---
## Highlights
- **Geospatial visualization** — an interactive Mapbox GL JS map of 34k+ georeferenced conflict events, backed by **PostGIS** spatial queries and bounding-box / attribute filtering.
- **Automated data engineering** — an **ACLED ingestion pipeline** (OAuth API) with a one-off **bulk historical load** and a **daily incremental CronJob**, normalizing raw events into a typed PostgreSQL schema.
- **Analytical API** — a FastAPI REST service exposing event, metadata, and filtering endpoints with **JWT authentication** (bcrypt-hashed credentials) and pooled database connections.
- **Conflict-trends analytics** — event frequency, lethality, and actor-composition explored over configurable time windows.
- **Production deployment** — fully **Dockerized** and shipped to **Kubernetes**: a PostgreSQL + PostGIS StatefulSet, the API as a Deployment behind an Ingress/TLS, and ingestion as scheduled Jobs/CronJobs.
- **Single-page frontend** — a static SPA served by the API, with the Mapbox token injected server-side (never committed to the client).
## Architecture
```
ACLED OAuth API
│ bulk load (one-off) + daily incremental CronJob …