Why these four hubs? Cushing, Rotterdam, Fujairah, and Singapore sit at the intersection of every major oil pricing region on earth. Cushing (Oklahoma, USA) holds ~91 million barrels of storage — the world's largest tank farm — and is the physical delivery point for the WTI crude futures contract, the most traded commodity benchmark in the world. Rotterdam (Netherlands) anchors Europe's ARA refinery cluster with ~19 million cubic meters of storage and sets Brent-related price benchmarks for Atlantic Basin trade. Fujairah (UAE) is the only major terminal outside the Strait of Hormuz, holding ~42 million barrels and exporting over 1.7 million barrels per day — roughly 1.7% of all global daily oil demand — making it a strategic bypass route for Middle East exports. Singapore is Asia's undisputed oil hub, the world's largest bunkering port, processing over 1.5 million barrels per day through Jurong Island. Together, these four locations physically underpin the WTI, Brent, and Asian benchmark pricing chains. Monitoring their radar signal provides a daily, independent window into global supply and demand balance — with no reliance on self-reported industry data.
Cushing, USA
91M bbl
storage capacity
WTI futures delivery point since 1983. "Pipeline Crossroads of the World."
WTI benchmark
Rotterdam, Netherlands
120M bbl
Europe's largest port
ARA hub anchors Brent pricing for Atlantic Basin crude imports.
Brent / ARA hub
Fujairah, UAE
42M bbl
outside Strait of Hormuz
Only major terminal bypassing Hormuz. Exports ~1.7M bbl/day.
Hormuz bypass
Singapore
94M bbl
Asia's #1 hub
World's largest bunkering port. Processes 1.5M bbl/day.
Asian benchmark
Latest snapshot
Observation date
—
most recent run
Tanks sampled
—
of 13 active
Regions covered
—
all 4 hubs
Anomalies flagged
—
|z-score| > 2.0
How radar signal (dB) maps to fill estimate (%)
Drag the slider to see how different radar return strengths translate into estimated fill levels.
−15.0 dB
Estimated fill
63%
near baseline
Reference scale
−32 dB−21 dB−16 dB−5 dB
empty (0%)low (40%)mid (60%)full (100%)
Key insight: The relationship is relative, not absolute. A single dB reading means little on its own — the fill estimate compares each tank against its own historical baseline. The linear mapping shown here (−32 to −5 dB → 0 to 100%) is an approximation used before enough baseline data accumulates.
Oil price vs. average tank signal
WTI crude (USD/bbl)Avg dBAvg available capacity %
What this shows: WTI crude oil spot price (EIA public data, no weekends/holidays — typically 2–3 business day publication lag) plotted against the daily average radar signal across all 13 monitored tanks. Time series view uses dual y-axes: left = USD/bbl, right = dB. Scatter view plots price on x-axis vs. available capacity % on y-axis to reveal correlation directly. The Pearson coefficient (r) quantifies linear relationship: ±1 = perfect, 0 = none. A positive r between price and capacity would confirm the economic hypothesis that rising prices coincide with inventory draws (more empty space). This analysis becomes more meaningful as observation days accumulate.
Today's signal summary
Loading…
VV backscatter range by region — current day
Full spread from minimum to maximum radar return across each hub. Bar shows the range; dot marks the mean. Wider bar = more variation between tanks.
VV range (min → max)Mean VV
Region average signal
regionsignaldBest.%images
Loading...
Updates daily at 02:00 UTC
How to read this table: Each row summarises the average radar return across all tanks in that hub. The dB value is the mean VV backscatter strength — a less negative number (e.g. −8 dB) means stronger radar return, typically indicating smoother, fuller tank surfaces. The est.% maps this signal onto a 0–100% scale relative to the expected range (−32 to −5 dB). The images column shows how many Sentinel-1 satellite passes were captured in the 7-day window — more images means a more reliable average. Once 3+ days of history accumulate, est.% will switch from signal-range approximation to a baseline-calibrated fill proxy that compares each hub against its own history.
Per-tank radar signal
Loading...
tankregionsignaldBest.%
What does "building" mean? Each tank needs at least 3 observation days before the system can calculate its personal fill estimate. Think of it like a fitness tracker that needs a week of readings before it can tell you if today's heart rate is "high for you." Right now we are collecting baseline data — the fill % estimate will appear automatically once enough days have accumulated.
How to read the bars: The satellite sends radar pulses at the tank and measures how much bounces back. A fuller tank has smooth oil on its surface — like a calm pond — which reflects radar strongly back to the satellite. An emptier tank has exposed metal walls and internal equipment that scatter the radar in all directions, so less bounces back. The dB number is the raw radar strength (more negative = weaker return). The estimated % translates this into an approximate fill level relative to each tank's own history — not an absolute volume measurement.
* relative % from signal range — calibrated fill % appears after 3+ days
Badge guide
Above-average fill (est. >60%)
Near baseline fill (40–60%)
Below-average fill (est. <40%)
Daily trend—select a tank above to see its history
Capacity % (left axis): estimated available (empty) capacity — higher values mean more room to store oil. dB (right axis): raw radar backscatter strength — stronger return (less negative) generally means smoother, fuller surface. Both signals update daily after the satellite overpass is processed.
Pipeline Health
Checking...
How this works: The watchdog checks the API observation date on every page load. If data is older than 3 days, it flags a warning. If older than 7 days, it flags critical. Cloud Schedulers run the pipeline daily at 02:00–04:00 UTC. If all three stages (ingest → signals → runner) succeed, the dashboard updates within minutes. The GitHub Actions watchdog runs daily at 14:00 UTC as a safety net — it auto-triggers recovery and opens an issue if data stays stale.