Skip to content
← Projects

Monde (live geopolitical globe)

A 3D globe of conflicts and political events fed by 20 live open sources, with a terrain renderer written from scratch in Rust and a measured pipeline that turns news articles into verifiable event records.

Monde is the project I have put the most work into since June 2026. It is a live 3D globe of conflicts and political events, with an intel feed, a tension outlook per country and, most recently, a political sheet per country (France is the pilot). The code is Rust and TypeScript; a separate documentation repository holds the research, plans and decisions (86 commits). I worked with Claude agents throughout, for research sweeps and some of the code, and I kept every number below tied to a file I can reproduce.

The Monde conflict globe: intel feed on the left, event markers on the globe, prediction markets on the right

The Conflict mode: the intel feed on the left, the globe with event markers in the middle, and the prediction-market outlook on the right.

The problem

Conflict dashboards exist, but the good event data sits behind paid licences. I wanted the same thing built on open sources, where I know what every marker on screen rests on. The clearest example is ACLED: it is paid, and its terms forbid plotting its data on a globe, which its licensing team confirmed to me in writing. So I dropped it as a source and chose to reproduce its method instead. Its codebook is public, so I adopt the ontology and apply it to free sources.

Three layers

Sources. 20 active sources (GDELT, UCDP, ReliefWeb, USGS, NASA FIRMS, OpenSky, AIS ships, Polymarket and others) behind circuit breakers that report each source as live, cached or unavailable. Events are scored on corroboration, recency and severity.

A marker card for an earthquake reported by USGS, with its category, severity, source, reporting time and source tier

Every marker opens a card with its category, severity, source and reporting time. Here, an earthquake from USGS, with its source-reliability tier.

Renderer. The client is a native Rust and wgpu renderer. The ground is not a photograph: it is synthesised from ESA land cover (11 classes) crossed with climate zones, elevation, slope and latitude, with warped class boundaries so an edge reads as a brush stroke. Borders use an ID cube and a colour lookup table, so recolouring a country is a texel write instead of a 45.6 MB mesh re-upload, and a distance field draws the inward halo. The signal design has 77 types on one grammar (shape says what, colour says whose or how bad, size says how much); 73 glyphs are drawn.

Coding pass. This is the part I worked hardest to measure, below.

From article to event record

GDELT detects that an article talks about an event, but it does not code it. Measured by humans, its accuracy is 53.7% on the actor, 51.2% on the location and 48.7% on the category, and it has no casualty field. So I am designing an LLM pass over the source article. The decisions that matter:

On a 84-record gold set from 26 articles, two blind passes gave a baseline of Cohen's kappa 0.688 and 0.652 on actor type, 0.519 on location precision and 0.451 on civilian targeting, computed on only 42% of the records the two passes could pair. The rest were disagreements about whether to emit a record at all. When I ran four independent coders on the same corpus, they produced between 0.15 and 1.90 records per article, a factor 12.7. This is the hardest part: getting a reproducible output.

Limits

The coding pass is not in production: GDELT events reach the globe today with GDELT's own category code. The silver set holds 140 records and the small model is not trained. The native desktop has been walked against a 52-item checklist: 21 passed, about 18 defects were found, 9 fixed, and every visual defect that mattered was found by me looking at a frame, none by the test suite, which stayed green through a picking bug.

What's next

More annotation runs to measure real agreement, then a first small model trained on the sentences (a transformer encoder with a linear head, exported to ONNX). On the politics side: besides the conflict globe described above, Monde has a Politics mode, where clicking a country opens an institutional sheet (leaders, regime, powers, elections, memberships) and every piece of information carries its source. France is the pilot and its sheet is now wired to real data; the other countries only show a base notice and come after. I also researched a further direction, following public money (corruption, state aid, public procurement). I am also thinking about an Economics mode, which would bring Atlas data onto Monde.

The France sheet in Politics mode, with the National Assembly open and a member's card shown on hover

The Politics mode: the France sheet with the National Assembly open. Hovering a seat shows the member's card, with its sources (text and photo from Wikimedia, CC BY-SA).