How the map thinks
Turning global events into live pressure signals. The system ingests incidents, computes country pressure scores, and serves a snapshot-first map boot path via same-origin API routes with caching and boundary fallbacks.
- Critical renderer stays eager - core map canvas is not lazy-gated at boot
- Boundary fallback order - bundled local GeoJSON, then API proxy, then external URL fallback
- Property normalization - GeoJSON variants (for example ADM0_A3/NAME) map to internal ISO/name fields
- ISO guardrails - sentinel placeholders (for example -99) are excluded from hover/select matching
Trend is calculated as latest score - earliest score across the displayed history window. Direction labels (Rising, Falling, Stable) and badges are derived from shared helper logic.
- Modal header and trend chart now use the same delta source
- Trend deltas are displayed as whole numbers for UI consistency
- Chart plot area is inset to avoid edge clipping in rounded containers
raw = sum(type_impact_i) normalized = tanh(log1p(raw) / 3.0) score = normalized * 100
- type_impact_i - Event severity ร source quality ร event-type weight
- absolute scale - `3.0` keeps war zones in Severe while limiting global-noise inflation
- banding - Stable 0-29, Moderate 30-59, Unstable 60-84, Severe 85-100
- continuity - Increases immediate, decreases capped at โ8/day
Scores use asymmetric smoothing to balance responsiveness with stability:
- Increases: unlimited โ a war breaking out shows immediately
- Decreases: capped at โ8/day โ peace returns gradually
- Conflict events decay much slower than other types
- Cyber events decay 50% faster than baseline
- No-event days decay by ~2 points
This prevents sudden drops when a war ends but small incidents (riots, unrest) continue. Recovery takes days, not hours.
| Type | Weight | Rationale |
|---|---|---|
| Conflict | 5.0x | Primary disruption signal for war/armed violence |
| Disaster | 0.9x | Acute infrastructure and safety disruption |
| Protest | 0.8x | Civil unrest baseline |
| Crime | 0.55x | Organized violence and criminal instability |
| Cyber | 0.5x | Critical digital infrastructure disruption |
| Economic | 0.45x | Structural financial and sanctions pressure |
| Health | 0.6x | Public-health shock and outbreak risk |
| Climate | 0.55x | Persistent climate-driven disruption |
| Other | 0.35x | Residual unclassified disruption signals |
The same event from multiple sources is counted once. The system uses:
- URL matching - Exact canonical URL comparison
- Content hashing - SHA-256 of normalized title + date + country
- SimHash fingerprinting - Semantic similarity for near-duplicates
- Bucketing - Per-day buckets by country + event type
Back to the live map
See the current pressure bands after recent updates.