all projects

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.

loading 3D scene…

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

01

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.

02

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.

03

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.

04

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.

05

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.

06

Voyage planning tools

Hazard-aware A* routing, EEZ and protected-area geofencing, cyclone alerts and severe-weather alerts, reached through conversation.

07

Offline ML

Harmful algal bloom early warning and fish habitat prediction on a shared marine data fusion layer.

08

Bulk data downloader

34 variables from 14 providers, cadence-reconciled, exported as CSV, JSON or PDF.

// architecture

Howit'sbuilt

  1. 01React 19 + MapLibre GLMap · dashboard · assistant
  2. 02FastAPI backendCached, scheduled, never fetched per request
  3. 03machine_learning/Offline pipelines, not imported by the backend
  1. step 01

    Ingest

    Schedulers warm global caches from public sources. A cold cache reports itself as warming, never as failed.

  2. step 02

    Process

    xarray, NumPy and SciPy turn NetCDF and GRIB into fields, eddies, upwelling and heatwave signals.

  3. step 03

    Forecast

    Rolling-origin models are scored against persistence and rejected, not deleted, when they fall short.

  4. step 04

    Serve

    FastAPI proxies and processes data so credentials never reach the browser.

  5. 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