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
| Source | Used for | Refresh | License / notes |
|---|---|---|---|
| EIA (US Energy Information Admin) | Brent crude spot price, WTI crude | 5 min | Public domain; official US government data. |
| FRED (St. Louis Fed) | Henry Hub natural gas front-month (NG=F fallback) | 5 min | Public domain; Federal Reserve Economic Data. |
| Yahoo Finance | Brent (BZ=F), WTI (CL=F), Henry Hub (NG=F) β fallback when EIA/FRED unavailable | 5 min | Unofficial endpoint; rate-limited. Used only as fallback. |
| IMF PortWatch | Daily vessel transit counts at Strait of Hormuz (chokepoint6) by type | 6 h (data updates weekly) | IMF Open Data. Chokepoint ID: chokepoint6. |
| GDELT v2 Doc API | Global news article discovery β Hormuz/Iran/shipping keywords | 5 min | Free; attribution requested. |
| CNN RSS | World + Middle East headlines | 60 s | Public RSS; headlines + links only. |
| BBC RSS | World + Middle East headlines | 60 s | Public RSS; headlines + links only. |
| Al Jazeera RSS | Headlines + summaries | 60 s | Public RSS. |
| Reuters (via Google News mirror) | Headlines + links | 60 s | Reuters direct RSS is paid; mirror is fair-use headline aggregation. |
| Open-Meteo | Wind speed/direction, visibility, wave height at 26.5Β°N 56.4Β°E | 15 min | CC-BY-4.0; no API key required. |
| AISStream.io | Real-time AIS vessel positions in the strait (when key configured) | Real-time WebSocket | Free 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 = DISRUPTEDStep 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 matchingClosure/disruption detection is regex-based. Ironic, quoted, or context-heavy headlines can produce false positives. Treat as directional signal only.
- AIS coverage gapsAISStream.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 lagIMF 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 limitsUnofficial endpoint; may return 429 under load. EIA is the primary crude source; FRED for Henry Hub. Yahoo is fallback only.
- RSS deduplicationURL-based. Near-duplicate stories from different outlets may appear separately.
8. Change log
- v0.6.0 Β· 2026-05-27Full 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-14Migrated 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-13Replaced 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-12IMF 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-11Live 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-10Initial 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.