Building GeoPrizm: Turning Global News Events into a Bilateral Relations Index

Published: (June 10, 2026 at 05:17 AM EDT)
2 min read
Source: Dev.to

Source: Dev.to

I recently built GeoPrizm, a free and open-source dashboard for tracking bilateral relations through global news event signals.

GeoPrizm is my attempt at that. Website: https://www.geoprizm.com/en

GitHub: https://github.com/Haullk/relationship-temperature International relations are usually discussed through headlines, speeches, official statements, and expert commentary. That is valuable, but it creates a few practical problems: It is hard to compare country pairs on the same scale. A single headline can feel more important than it really is. Readers often see conclusions before they see the underlying signals. Most non-specialists do not have time to follow every event in detail. I wanted a lightweight way to answer one question: Based on public news event signals, is this bilateral relationship trending more cooperative, neutral, or tense? GeoPrizm uses the GDELT global news event database. GDELT monitors global news coverage and converts news reports into structured event records. These records include fields such as: actor countries event date CAMEO event category GoldsteinScale value number of mentions number of articles source information For GeoPrizm, the key idea is to focus on events where two countries appear as actors, then aggregate the cooperation or conflict signals over time. Each bilateral pair is converted into a 0-100 relationship index. The midpoint is 50. Above 50 means the recent signal is more cooperative or favorable. Around 50 means the signal is relatively neutral or mixed. Below 50 means the recent signal is more tense or conflict-heavy. The rough process is: Select recent GDELT events for a country pair. Keep events where both actors are present and the GoldsteinScale value is available. Weight each event by coverage intensity. Smooth the daily signal with a rolling window. Map the result onto a 0-100 index. The current version uses a 14-day rolling average to reduce single-day noise. A small event mentioned once should not have the same impact as a major event covered across many outlets. At the same time, one highly covered event should not completely dominate the entire index. So GeoPrizm uses a log-style coverage weight:

text weight = log1p(max(num_mentions, num_articles, 1))

0 views
Back to Blog

Related posts

Read more »