First runnable slice: GDELT → PostgreSQL → FastAPI → React/MapLibre map.
db— PostgreSQL 16 (Docker, port 5544 on host)backend/— FastAPI + SQLAlchemy 2.0 + a GDELT ingester (Python 3.12)frontend/— React 18 + Vite + MapLibre GL (no API token, CARTO dark basemap)
docker compose up -dcd backend
python3 -m venv .venv && . .venv/bin/activate
pip install -r requirements.txt
# create tables + pull the latest 15-min GDELT slice (~2k events)
python -m app.ingest.run --once
# serve the API
uvicorn app.main:app --host 0.0.0.0 --port 8000Keep it fed live in another shell:
python -m app.ingest.run --loop 900cd frontend
npm install
npm run dev # http://<server-ip>:5173GET /healthGET /api/events?limit=&quad_class=&country=&actor=&root_code=&bbox=w,s,e,nGET /api/events/geojson?...— FeatureCollection for the mapGET /api/stats— totals, by class, top countriesGET /api/graph?limit=&country=— actor co-occurrence graph (for slice 2)
- Actor co-occurrence graph view (endpoint already live) + ACLED & SIPRI ingesters
- Local LLM layer (ROCm): entity extraction, threat scoring, summaries
- Neo4j graph store, ElasticSearch full-text, Kafka real-time