Inspiration
I'm Palestinian, and war is part of the world I grew up in. I have seen how much it destroys, and how little of that damage is ever counted. The climate cost of war is one of those uncounted things: military emissions reporting to the UN climate convention is voluntary, and the fires of war appear in almost no climate report.
Wildfires have the same problem. In summer 2021, fires burned through the Manavgat area of Antalya, the province now hosting COP31, and wildfire emissions like these are often left out of national totals as "natural". When someone does publish a number, nobody can check it, and numbers about wars are always disputed.
I wanted a tool that measures this damage in a way no single side controls: open data, open code, and a record that nobody can quietly change.
What it does
Uncounted turns free NASA satellite data into emission estimates for wildfires and wars, and anchors every estimate on a blockchain.
- Satellite data. NASA FIRMS fire detections (VIIRS, 375 m), with fire radiative power for each fire. The exact data used is frozen as a snapshot and hashed.
- AI conflict attribution. A gradient-boosted classifier learns what peacetime fires look like (where, when, day or night, how intense) and measures how much conflict-year fire fits no peacetime pattern. The same test on every peacetime year shows what it flags by chance, and that noise is subtracted.
- Honest uncertainty. Emissions are reported as a 5th to 95th percentile range from 20,000 Monte Carlo draws, never one falsely precise number.
- On chain. The report's SHA-256 hash and the emissions range go into a smart contract that is append only and blocks double counting: one active record per region and period, and the same satellite data cannot back two records.
- Independent verification. Verifiers re-run the open pipeline on the published data. They can only attest when inputs are identical and results match, and a publisher cannot verify itself.
- Dashboard. Hotspot map, ranges, peacetime checks, and an in-browser hash check. Change one number in a report and the hash breaks.
Track: Climate Data & Environmental Monitoring. Uncounted is a climate data verification platform for the emissions that current systems leave out.
Results
| Record | Estimate (t CO2e, 90% range) | Status |
|---|---|---|
| Manavgat wildfires, Antalya, 2021 | 0.99 to 2.74 million (median 1.82 million) | Verified |
| Kherson Oblast, Ukraine, Mar to Oct 2022 | 112,000 to 756,000 (median 358,000) | Verified |
- Manavgat: an independent method (56,663 ha of mapped burned area x IPCC fuel consumption) gives 1.83 to 2.55 million t. The two methods agree.
- Kherson: about 14,400 MW of the 44,600 MW of fire power observed fits no peacetime pattern, and the hotspots line up with the 2022 front line. A simpler independent method gives a similar 11,400 MW. This is a lower bound: fuel use, munitions and reconstruction are not counted.
How I built it
For each fire, emissions follow the fire radiative power method:
$$E_{CO_2e} = \sum_i FRP_i \cdot \Delta t \cdot \beta \cdot \sum_g EF_g \cdot GWP_g$$
where \( \beta = 0.368 \) kg/MJ (Wooster et al. 2005), \( EF_g \) are IPCC emission factors for CO2, CH4 and N2O, and \( GWP_g \) are IPCC AR6 100-year values.
- AI: scikit-learn gradient-boosted classifier, spatially cross-fitted density-ratio estimation, leave-one-year-out peacetime calibration.
- Blockchain: Solidity 0.8.24, OpenZeppelin AccessControl, Hardhat.
- Front end: HTML, ethers.js, Leaflet, in-browser SHA-256.
- Tests: 16 smart contract tests and 13 pipeline tests, including recovery of known conflict fires on synthetic data.
Challenges
My first conflict method compared total fire activity with peacetime years, and on real data it said zero. Two things hid the war: peacetime fire activity in Kherson varies threefold between years, and in 2022 normal farm burning dropped while front-line fires rose, so they cancelled out. I replaced it with an AI classifier that looks at the pattern of each fire instead of the total. Testing it on synthetic data with a known answer exposed a cross-fitting flaw that recovered only 18% of the known conflict fires; after fixing it, the method recovers about 82% and finds almost nothing in peacetime.
Verification across computers was the second challenge: machine-learning results differ very slightly between Windows and Linux, so verifiers now need identical inputs plus results within 5%, instead of a bit-exact match.
What I learned
A method that works on clean test data can fail silently on real data, so every claim needs a check against a known answer. Being honest about uncertainty, and stating what is not counted, makes a number more trustworthy, not less.
What's next
Weather data in the peacetime model, Sentinel-2 burned-area mapping for conflicts, emission factors for non-vegetation fuels, a public testnet deployment, and inviting research groups to act as verifiers.
Built With
- blockchain
- ethereum
- ethers.js
- hardhat
- html
- javascript
- leaflet.js
- machine-learning
- nasa-firms
- numpy
- openzeppelin
- pandas
- python
- scikit-learn
- solidity
Log in or sign up for Devpost to join the conversation.