World Chaos Map Docs
Loading...
Open map

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.

โฑ 6-hour ingestion cycle ๐Ÿ“Š 0-100 pressure score ๐Ÿ—บ Snapshot + boundary fallback boot โœ“ 4 pressure bands
System snapshot
Signal types
Conflict, protest, crime, cyber, economic, health, disaster
Decay window
30 days
Confidence inputs
Coverage depth + source reliability + recency
Score model
Absolute tanh normalization + asymmetric smoothing (โ†‘ unlimited, โ†“ max โˆ’8/day)
Delivery path
Vercel API proxy + edge-cached live snapshot
Pipeline walkthrough
GitHub Actions
6h ingestion trigger
Pipeline + Scoring
Aggregation, normalization, continuity
Supabase DB
Persisted country scores + incidents
Map Snapshot API
Live compact boot payload from score rows
Vercel API + CDN
Cached /api/* proxy responses
Browser
Snapshot -> boundary fallback -> map render
v2.1.1 map stability guardrails
  • 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 semantics (v2.1.1)

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
Scoring formula
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
Asymmetric smoothing

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.

Event type weights
TypeWeightRationale
Conflict5.0xPrimary disruption signal for war/armed violence
Disaster0.9xAcute infrastructure and safety disruption
Protest0.8xCivil unrest baseline
Crime0.55xOrganized violence and criminal instability
Cyber0.5xCritical digital infrastructure disruption
Economic0.45xStructural financial and sanctions pressure
Health0.6xPublic-health shock and outbreak risk
Climate0.55xPersistent climate-driven disruption
Other0.35xResidual unclassified disruption signals
Deduplication

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.