Methodology
This page documents the rules behind every number on the dashboard so the data is reproducible and the caveats are explicit. Each metric links to the code path that produces it.
Zone boundaries
- Strait narrows: lat
25.8–26.8°N, lon56.0–56.8°E. Vessels inside this rectangle are either transiting or anchored in the inshore channel. - Persian Gulf side: lon
< 56.0°E. Includes Ras Tanura, Jubail, Kharg, Bandar Abbas, Jebel Ali. - Gulf of Oman side: lon
> 56.8°Eor (lat< 25.8°Nand lon ≥56.0°E). Includes Fujairah, Khor Fakkan, Sohar.
Motion classification
A vessel is "in transit" only if we observe sustained motion, not a single fast ping:
- Latest AIS speed-over-ground ≥ 3 knots, AND
- Either (a) ≥ 2 narrows observations in the last 30 min all at ≥ 3 kn, (b) longitude travel > 0.03° (~3 km) between oldest and newest narrows pings, or (c) a single ping at ≥ 6 kn.
Vessels physically inside the narrows but below the motion gate are bucketed as anchored in narrows and attributed to the side they arrived from. This filters tugs, pilot boats, and circling support craft.
Transit counts (exited / entered)
A crossing is recorded when a single MMSI has an observation in the Persian Gulf and, later, an observation in the Gulf of Oman (or reverse) within our 72-hour scan window. The event is persisted tovessel_transit with from_zone andto_zone. Counts shown on the dashboard are crossings whose destination-side timestamp falls in the last 24 hours.
Caveat: satellite AIS polling occurs every 8 hours (every 2 during crisis). Vessels that broadcast only intermittently can cross without both before-and-after observations being captured. Such transits are undercounted. Terrestrial AIS coverage near the narrows mitigates this.
Petroleum-carrier classification
A vessel is counted as a petroleum carrier when any of the following is true — a union of signals, permissive by design:
vessel_static.cargo_typeiscrude_oilorlng(from the Data Docked enrichment API).vessel_static.ship_type_specificcontains "tanker", "crude", "lng", or "oil" (case-insensitive).- AIS numeric vessel type in
80–89(AIS spec: tankers). - Fallback: vessel is inside an oil or LNG port's radius (Ras Tanura, Kharg, Jubail, Mina al-Ahmadi, Basra, Ras Laffan, Fujairah) and has no enrichment yet — most vessels physically berthed at oil terminals are oil tankers.
The stricter "Crude only" filter requires cargo_type == "crude_oil", AIS numeric type 84, or the word "crude" in the ship-type text — no port-proximity fallback.
Average wait time
For each vessel currently in a waiting zone (Persian Gulf or Gulf of Oman), we compute hours = now − earliest observation in current zone within the 72h window. The dashboard card averages these across the fleet. This is a lower bound: vessels that entered their zone before our 72h window are clipped to 72h; real waits can be longer.
Strait status tiers
Computed from throughput_pct = actual_transits / baseline_daily × 100 and a crisis-oil flag (Brent > $90/bbl):
- CLOSED— zero transits observed, or throughput < 5% while crisis oil.
- SEVERELY RESTRICTED— throughput < 25% (or < 40% with crisis oil).
- RESTRICTED— throughput < 75%.
- OPEN — otherwise.
Baseline: 60 large-vessel transits per day through the TSS (UNCTAD/EIA reference). Configurable via normal_daily_transits.
War-risk premium multiplier
Computed as max(war_risk_pct) / 0.1% across the most recent quote from every insurer in the insurance_premium table. The baseline of 0.1% of hull value is the pre-June 2024 norm for VLCCs transiting Hormuz. Quotes are curated — not automated.
News relevance
RSS feeds (BBC Middle East, Al Jazeera, NYT, Reuters, CNBC) and NewsAPI queries are passed through a keyword gate: an article is kept only if its title or summary contains at least one of — Hormuz, Iran, Tehran, Khamenei, IRGC, Bandar Abbas, Kharg, Persian Gulf, Gulf of Oman, tanker, OPEC, sanctions, 5th Fleet, CENTCOM, Houthi, Red Sea, Bab el-Mandeb. Off-topic articles are not stored.
Data sources
- Terrestrial AIS — aisstream.io (continuous WebSocket stream)
- Satellite AIS — Data Docked (8 h cadence, 2 h during crisis)
- Oil prices — Yahoo Finance (minute-level) and EIA (daily)
- Strategic reserves — U.S. EIA weekly stocks
- News — Google News, BBC, Al Jazeera, NYT, Reuters, CNBC, NewsAPI
- Truth Social — filtered for Hormuz / Iran / oil keywords
- Carriers, insurance, pipelines — manually curated admin entries
See the sources page for per-entity URLs and freshness timestamps.
Caching
Nginx serves cached responses with stale-while-revalidate for most endpoints: live metrics 30 s, summaries 5 min, historical series 60 min, Next.js static assets 1 day (immutable). Authenticated requests and admin writes bypass the cache. The X-Cache-Status header is exposed on every response.