Inspiration

Early warning in the Horn of Africa does not fail at the forecast. It fails at the last mile.

ICPAC and CEWARN already produce genuinely good analysis. The gap is what happens after: a bulletin lands in a PDF, in English, on a website, and the pastoralist in a border settlement — the person whose herd, water point, and family are actually on the line — never sees it. Weeks later, the incident happens anyway.

We did not want to build another dashboard that predicts a crisis for an audience that was already going to know. We wanted to build technology that is useful in the physical world: something that ends with a phone ringing in a village, in a language the person speaks, days before the thing happens. If a system can move one community off a contested water point a week early, that is a life. That was the entire design constraint.

What it does

Dira is a causal situation room for the IGAD region. It scores 22 zones across seven countries for conflict pressure over the next ~30 days, and carries that signal all the way to a verified human voice call.

The prediction engine fuses three fundamentally different kinds of knowledge:

Machines — a gradient-boosted model trained on 12+ years of structured history: CHIRPS rainfall, MODIS vegetation, ACLED conflict incidents, with neighbouring-zone spillover terms so no zone is scored in isolation.

Language — an LLM layer continuously reading live unstructured reporting (ReliefWeb, GDELT-class news monitoring, humanitarian bulletins) and converting prose into typed, structured evidence the system can weigh.

People — verified field reports from named IGAD-designated observers, which adjust the assessment directly and are written back to the database so every human correction becomes evidence for the next cycle.

The two evidence streams are never silently blended. The model forecast and human corroboration are kept mathematically separate and combined by one written, auditable rule. An unverified report contributes exactly zero until a named person signs it.

The output is not a vague warning — it is a place, a number, and a window: Gambella Lowlands, Ethiopia — 47/100 conflict pressure, 31 Jul – 30 Aug, 412K people exposed.

Then Dira acts. A named human reviews and signs a plain-language drafted alert, and it dispatches as a real outbound voice call in Swahili to named community focal points and peace committees — no smartphone, no app, no data plan required — with keypad acknowledgement tracked on a delivery board so dispatchers can see who was reached and who still needs a second attempt.

How we built it

React 19 + TypeScript + MapLibre on the front end. FastAPI (Python) on the back. LightGBM + SHAP for prediction and attribution. PostgreSQL 16 with PostGIS and pgvector. OpenAI for signal extraction and alert drafting. Twilio + ElevenLabs for voice dispatch.

The architecture is a hexagonal monorepo with an enforced dependency-inversion boundary between domain logic and I/O adapters — the prediction core has no knowledge of the database, the network, or the phone system, so it can be tested and audited on its own.

Ingestion runs on a worker architecture that parallelises fetching across many independent sources, each with its own cadence, so a slow or failing feed never blocks the assessment cycle.

Challenges we ran into

Bitemporal training was the hardest problem in the project. Every observation has two timestamps: the period it describes, and the moment it actually became available to a system in the field. Rainfall data lands days late. Conflict reporting lands weeks late. If you train on the value as it looks today, the model quietly learns from information that did not exist at prediction time — and you produce a model with beautiful backtest metrics that would have been useless in production. We had to enforce availability-aware feature construction throughout, so that hindsight can never leak into a forecast. It cost us accuracy on paper. It is the reason the numbers are real.

Source timing was the second. Fifteen feeds, all on different clocks — dekadal climate composites, weekly conflict releases, continuous news, event-driven hazard alerts, annual exposure baselines. Aligning heterogeneous cadences into a single coherent assessment cycle, without either stalling on the slowest source or silently scoring a zone on stale inputs, required treating freshness as first-class data rather than an implementation detail.

Parallelising the workers without corrupting that temporal discipline was the third. Concurrent ingestion is easy; concurrent ingestion where every row still carries a correct availability stamp, and partial failures degrade visibly instead of silently, is not.

Honesty in the UI. We chose to label seeded illustrative sources as not live directly in the interface rather than hide them. In an early warning system, a confident number from an unverifiable source is worse than no number.

Accomplishments that we're proud of

Building a model that is benchmarked openly against climatology and persistence baselines — and that must actually beat them to stay in production, with a transparent fallback index taking over if it degrades. The system fails visibly, never silently.

Getting bitemporal correctness right instead of optimising for a demo-friendly score.

Shipping the full path end-to-end: from a decade of raw climate history to a real phone call in Swahili with acknowledgement tracked — not a mockup of the last mile, but the actual last mile.

Making every single number in the interface traceable back to a named, licensed, timestamped source document.

What we learned

That the interesting problem in applied ML for humanitarian work is almost never the model. It is the data discipline around it — temporal integrity, source provenance, and the honesty of what you show a human who is about to make a decision with real consequences.

We also learned that human-in-the-loop is not a safety disclaimer bolted on at the end. Designed properly — verification gates, named signatures, a written combination rule — it becomes the thing that makes the system resistant to rumour and propaganda, which is a real threat model in this region and not a hypothetical one.

What's next for Dira. The Next Horizon

Integrating IGAD's private operational data. Everything Dira runs on today is public. CEWARN's internal field monitor network, national DRM incident records, and IGAD's own operational reporting would sharpen the model substantially — particularly in border zones where public reporting is thinnest and risk is highest.

Deepening the human channel. Expanding the verified reporter network, adding more regional languages beyond Swahili, and supporting two-way reporting so a focal point can send information back through the same call that warned them.

Wider coverage. Moving from 22 zones to full CEWARN cluster coverage, with per-cluster model tuning rather than one regional model.

Operational hardening. Production Twilio provisioning for guaranteed multi-channel delivery, and a formal evaluation cycle with ICPAC analysts to validate forecasts against outcomes over successive dekads.

The goal is unchanged: shorten the distance between a forecast being correct and a person being safe.

Share this project:

Updates