Inspiration
I grew up in Rivers State, in the Niger Delta, where oil spill disputes aren't abstract. When something goes wrong, you get three versions of what happened: what the company says, what the regulator says, and what the community says, and they rarely agree. Most tools built for environmental monitoring assume there's one truth to detect. There isn't. I wanted to build something that treats disagreement itself as the finding, instead of quietly picking a side or averaging it away.
What it does
SpillWitness takes a real environmental incident, the November 2021 Santa Barbara Well 1 blowout in Nembe, Bayelsa State, and reconciles conflicting reports from six real, independently verified sources: Aiteo, NOSDRA/NUPRC, Bayelsa's state government, and news coverage. It shows exactly what's corroborated (the incident happened, where, when), what's contested (cause: sabotage vs. equipment failure, two federal-vs-state findings that flatly disagree), and what's conflicting (volume estimates 400x apart from two named officials). Every claim traces back to its source, excerpt, and URL. Nothing is averaged, nothing is silently resolved.
How we built it
A deterministic Python reconciliation engine decides status, CORROBORATED, CONTESTED, CONFLICTING, UNRESOLVED, no model ever touches that decision. A Next.js/TypeScript frontend renders the engine's output as an investigation console: findings, a spatial evidence graph, a timeline, full provenance. We also built a controlled LLM extraction pipeline (Groq) that can propose new claims from raw text, but it's structurally boxed in: a schema validator rejects any output that tries to assign a status or confidence, and a human must explicitly approve a claim before it ever reaches the reconciliation engine.
Challenges we ran into
The hardest bug wasn't technical, it was epistemic. Our UI was silently showing one source's location wording for a claim another source actually worded differently, implying two people said the same thing when they didn't. We also had to determine, by going back to the original article, whether a news report citing a JIV member was genuinely independent corroboration or just the same finding relayed twice, it was the latter, and the app now says so explicitly instead of double-counting it.
Accomplishments that we're proud of
Every fact in this project is real and checked, not synthetic. 44 automated tests, including ones that lock in the exact source-to-claim traceability chains a judge could ask about. The volume field shows two real, wildly different numbers from two named officials, side by side, on purpose.
What we learned
That building an honest evidence tool is mostly about refusing shortcuts: refusing to let a model decide, refusing to let a UI imply certainty the data doesn't have, refusing to count a derivative source as independent just because it's convenient.
What's next for SpillWitness
Two more verified cases from the Niger Delta, a live extraction UI, and a provenance-aware geographic layer, once we have real coordinates worth showing, not before.
Built With
- llm
- node.js
- pytest
- python
- typescript

Log in or sign up for Devpost to join the conversation.