Global Chokepoints Alerts

Methodology

Global Chokepoints Alerts is a public maritime intelligence platform monitoring strategic chokepoints, shipping corridor disruptions, and geopolitical incidents in near real-time. Every number on the page is computed from a documented source on a documented cadence. This page explains how.

1. What we measure

The headline output is the Strait State: OPEN, DISRUPTED, or CLOSED. Alongside the state we publish a Tension Level (NORMAL / ELEVATED / CRITICAL) and a Threat Score (0–100) that fuses timeline event severity with market volatility. An analyst confidence value in [0, 1] grows with source diversity and event density.

The map shows live vessel positions from AISStream.io when available, plus representative vessel dots animated along the IMO shipping lanes β€” proportional to the day's IMF PortWatch transit count by vessel type (tanker Β· cargo Β· container Β· dry bulk).

2. Data sources

SourceUsed forRefreshLicense / notes
EIA (US Energy Information Admin)Brent crude spot price, WTI crude5 minPublic domain; official US government data.
FRED (St. Louis Fed)Henry Hub natural gas front-month (NG=F fallback)5 minPublic domain; Federal Reserve Economic Data.
Yahoo FinanceBrent (BZ=F), WTI (CL=F), Henry Hub (NG=F) β€” fallback when EIA/FRED unavailable5 minUnofficial endpoint; rate-limited. Used only as fallback.
IMF PortWatchDaily vessel transit counts at Strait of Hormuz (chokepoint6) by type6 h (data updates weekly)IMF Open Data. Chokepoint ID: chokepoint6.
GDELT v2 Doc APIGlobal news article discovery β€” Hormuz/Iran/shipping keywords5 minFree; attribution requested.
CNN RSSWorld + Middle East headlines60 sPublic RSS; headlines + links only.
BBC RSSWorld + Middle East headlines60 sPublic RSS; headlines + links only.
Al Jazeera RSSHeadlines + summaries60 sPublic RSS.
Reuters (via Google News mirror)Headlines + links60 sReuters direct RSS is paid; mirror is fair-use headline aggregation.
Open-MeteoWind speed/direction, visibility, wave height at 26.5Β°N 56.4Β°E15 minCC-BY-4.0; no API key required.
AISStream.ioReal-time AIS vessel positions in the strait (when key configured)Real-time WebSocketFree tier; MMSI-level vessel positions.

3. Status computation

Status is derived in app/lib/api.ts β†’ deriveStatus(). Runs client-side on every data refresh using the latest timeline events and Brent price change.

Step 1 β€” Keyword state detection

# Scan events from the past 72 hours
CLOSURE_PATTERNS = /closed|closure|shut down|blocked|blockade|suspended|halt/
PARTIAL_PATTERNS = /diverted|rerouted|delayed|evacuated|traffic disrupt/

if any recent event matches CLOSURE_PATTERNS β†’ state = CLOSED
elif any recent event matches PARTIAL_PATTERNS β†’ state = DISRUPTED
else β†’ state = OPEN

Step 2 β€” Multi-signal Threat Score (0–100)

# Timeline Severity Score (last 24 h)
weight = { low: 1, medium: 2, high: 4, critical: 7 }
raw_timeline = sum(weight[e.severity] for e in last24)
timeline_score = min(100, raw_timeline Γ— (100 / 35))   # normalised 0–100

# Market Volatility Score
# Brent spike > 2% starts triggering; 5% spike β†’ score 100
if brent_change_pct > 2:
    market_score = min(100, (brent_change_pct - 2) Γ— 33.3)
else:
    market_score = 0

# Final 50/50 blend
threat_score = round(timeline_score Γ— 0.5 + market_score Γ— 0.5)

# Tension level thresholds
if threat_score β‰₯ 80 or state == CLOSED   β†’ CRITICAL
elif threat_score β‰₯ 40 or state != OPEN   β†’ ELEVATED
else                                        β†’ NORMAL

# State override β€” timeline events required to escalate
# (pure Brent spike without events never closes the strait)
if state == OPEN and last24 not empty and threat_score > 85:
    state = DISRUPTED

Step 3 β€” Confidence

sources    = unique source names contributing to last24 events
confidence = min(0.99,
  0.55
  + 0.06 Γ— |sources|
  + 0.02 Γ— min(|last24|, 6)
)

4. Vessel transit map

The hero map renders two independent vessel layers:

  • β†’AIS live dots β€” real MMSI positions streamed from AISStream.io, refreshed every 15 s. Colour-coded by type. Shown only when the collector is active.
  • β†’PortWatch representative vessels β€” animated dots distributed along IMO TSS lanes, proportional to the latest daily transit count by type: tanker (amber), cargo (sky), container (purple), dry bulk (slate). These are illustrative β€” not real GPS positions.

IMF PortWatch updates weekly (~Tuesdays 09:00 ET, 2–3 day lag). Chokepoint ID: chokepoint6. Historical baseline: ~34 transits/day.

5. Refresh cadence

  • β€”Timeline / RSS aggregator60 s
  • β€”News (GDELT)5 min
  • β€”Brent Β· WTI Β· Henry Hub5 min
  • β€”IMF PortWatch transit counts6 h
  • β€”Weather (Open-Meteo)15 min
  • β€”AIS vessel positions15 s
  • β€”Feed health30 s

All routes run on Cloudflare Pages Functions (Edge Runtime) with Cloudflare KV caching.

6. Public API

A read-only JSON API is available for embeds and partner integrations. CORS is allow-all; responses are cached at the edge.

GET /v1/status              # strait state, tension level, confidence, reason
GET /v1/events?limit=30     # latest aggregated timeline events
GET /v1/events?since=ISO    # incremental fetch since ISO timestamp
GET /v1/metrics             # markets (Brent/WTI/NG), weather, event counts
GET /feed.xml               # RSS 2.0 for journalists and aggregators

License: CC-BY-4.0. Attribution: β€œGlobal Chokepoints Alerts” with a link to global-chokepoints.pages.dev. Full interactive reference at /docs.

7. Known limitations

  • Keyword matching
    Closure/disruption detection is regex-based. Ironic, quoted, or context-heavy headlines can produce false positives. Treat as directional signal only.
  • AIS coverage gaps
    AISStream.io free tier covers only vessels transmitting within range of terrestrial receivers. Military vessels, tankers in radio-quiet mode, and vessels in Iranian waters may be invisible.
  • PortWatch lag
    IMF data is 2–3 days lagged and updates weekly. Map vessels reflect the latest complete day, not today. They are illustrative, not real-time positions.
  • Yahoo Finance rate limits
    Unofficial endpoint; may return 429 under load. EIA is the primary crude source; FRED for Henry Hub. Yahoo is fallback only.
  • RSS deduplication
    URL-based. Near-duplicate stories from different outlets may appear separately.

8. Change log

  • v0.6.0 Β· 2026-05-27
    Full rebrand to Global Chokepoints Alerts β€” multi-chokepoint intelligence platform (Hormuz, Red Sea, Suez, Panama, Taiwan Strait). Added TickerBar, ChokepointsPanel card grid, HeroStatus CTAs, region inference in Timeline. System-wide flat UI (no rounded corners). Feed health row, relative timestamps in NewsFeed, vessel count in header.
  • v0.5.0 Β· 2026-05-14
    Migrated to Cloudflare Pages (global-chokepoints.pages.dev). Added PortWatch animated vessels on map. KV caching on /api/timeline and /api/weather. Fixed confirmation email token bug. Tightened threat-score false-positive rule.
  • v0.4.0 Β· 2026-05-13
    Replaced Three.js 3D scene with live Leaflet map (CartoDB dark tiles, shipping lanes). Header z-index fix (z-1100 over Leaflet). News feed skeleton loading. Decoupled GDELT fetch from dashboard Promise.all.
  • v0.3.0 Β· 2026-05-12
    IMF PortWatch integration β€” real daily transit counts. FRED API for Henry Hub (permanent fix for Yahoo 429s). KV-persisted Yahoo cache. AIS binary Blob frame decoder.
  • v0.2.0 Β· 2026-05-11
    Live data architecture: API routes, RSS aggregator, multi-signal status derivation, public /v1 API, RSS feed, methodology page, Cloudflare KV + D1 bindings.
  • v0.1.0 Β· 2026-05-10
    Initial Next.js dashboard; visual design + i18n (EN/PT-BR) only.

9. Disclaimer

This site provides information for situational awareness only. It is not navigational, financial, military, or operational advice. Always verify with official authorities (IMO, NAVCENT, UKMTO, port authorities, your insurer's war-risk cell) before making decisions. Threat scores are probabilistic outputs of an automated algorithm and do not represent a forecast of imminent events.