Marine intelligence platform
Never substitute a number for missing data.
A marine intelligence platform with live ocean and atmospheric data, an interactive 3D map, forecasting, offline ML, an analytics dashboard, a bulk downloader and a grounded conversational assistant, all built on real, publicly documented sources. The whole product follows one rule: if data is missing, say so instead of inventing a value.
WebGL · move your cursor
0
Ocean variables to download
0
Data providers
0
Eddy detections tracked
+0.000
Median skill vs persistence, 30 days
// highlights
Whatmakesittick
Honest by design
Every panel, KPI and map layer carries an availability flag and a reason when data is absent. A fabricated 0.00 is a false ocean reading, not a neutral placeholder.
Live layers on a 3D globe
SST, wind, currents, Stokes drift, bathymetry and vessel density, with vector fields drawn by a GPU particle engine in WebGL2.
Eddy detection and tracking
Okubo-Weiss detection with frame-to-frame tracking using the Hungarian algorithm, verified at 100% continuity on 2,177 real detections.
A forecasting engine with a shipping bar
One config-driven framework for every variable, validated rolling-origin with an embargo. A horizon only ships if it beats persistence.
An assistant that checks itself
A bounded tool-calling loop over four specialists, with every figure in an answer verified against what the tools returned.
Voyage planning tools
Hazard-aware A* routing, EEZ and protected-area geofencing, cyclone alerts and severe-weather alerts, reached through conversation.
Offline ML
Harmful algal bloom early warning and fish habitat prediction on a shared marine data fusion layer.
Bulk data downloader
34 variables from 14 providers, cadence-reconciled, exported as CSV, JSON or PDF.
// architecture
Howit'sbuilt
- 01React 19 + MapLibre GLMap · dashboard · assistant
- 02FastAPI backendCached, scheduled, never fetched per request
- 03machine_learning/Offline pipelines, not imported by the backend
step 01
Ingest
Schedulers warm global caches from public sources. A cold cache reports itself as warming, never as failed.
step 02
Process
xarray, NumPy and SciPy turn NetCDF and GRIB into fields, eddies, upwelling and heatwave signals.
step 03
Forecast
Rolling-origin models are scored against persistence and rejected, not deleted, when they fall short.
step 04
Serve
FastAPI proxies and processes data so credentials never reach the browser.
step 05
Explain
The assistant answers using tools and shows only figures those tools returned.
Research finding
- ◆The paper "Rising Skill, Falling Skill" argues persistence alone is an insufficient baseline for statistical ocean forecasting (13 variables × 4 horizons, 1,248 held-out fits).
- ◆Median skill against persistence is +0.273 at 30 days, but −0.023 against a day-of-year climatology.
- ◆An earlier conclusion was retracted after an ablation showed the models kept their skill without calendar features. The retraction is recorded in the repo.
// stack
Builtwith
- React 19
- TypeScript
- Vite
- MapLibre GL JS
- Zustand
- FastAPI
- xarray
- NumPy
- SciPy
- LightGBM
- SHAP
- scikit-learn
- MLflow
- PostgreSQL
- Docker