Earth Observation · Fisheries Intelligence
Stop searching.
Start at the right coordinate.
MarineCast turns open satellite and reanalysis oceanography into a daily forecast of where target species are — and how much you can expect to catch there. Less search time means less fuel burned and fewer hours at sea.
01 — The problem
Fuel is burned looking, not fishing.
Most of the cost of a trip is incurred while searching. The conventional method — returning to the same grounds in the same months, on accumulated experience — degrades as conditions shift between years. Stocks move. The grounds do not.
More sprat per hour in the model's top-ranked cells than its bottom half
Best presence ROC-AUC across six modelled species
Data licensing cost — every source is public and open
02 — Why this works
Trained on where fish were not, as well as where they were.
Commercial catch logs
A vessel does not fish where it expects nothing, and would not log it if it did. A model fitted to that data learns where fishers like to go.
PRESENCE ONLY — ABSENCE UNOBSERVED
Scientific survey data
Research trawls sample a fixed station grid whether or not fish are present. A haul with no record is a true zero — the one thing commercial logs never contain.
PRESENCE + ABSENCE — BOTH LABELLED
This distinction is not a detail. Without absence records, presence/absence classification is mathematically impossible, and abundance models inherit the fleet's own site-selection bias.
03 — Verified performance
Measured on years the model never saw.
TRAIN 2001—2018 · 9,422 hauls
TEST 2019—2026 · 4,414 hauls
| Species | Presence ROC-AUC | CPUE R² | Top quintile | Bottom half | Lift |
|---|---|---|---|---|---|
| Sprat Sprattus sprattus | 0.756 | +0.186 | 2,071 kg/h | 245.9 | 8.4× |
| Atlantic herring Clupea harengus | 0.736 | +0.360 | 2,005 kg/h | 139.0 | 14.4× |
| Atlantic cod Gadus morhua | 0.811 | +0.345 | 410 kg/h | 37.7 | 10.9× |
| European flounder Platichthys flesus | 0.870 | +0.410 | 285 kg/h | 23.0 | 12.4× |
| European plaice Pleuronectes platessa | 0.937 | +0.469 | 146 kg/h | 12.0 | 12.2× |
| Common dab Limanda limanda | 0.988 | +0.798 | 181 kg/h | 0.0 | n/a |
What these numbers are
Top quintile and bottom half are the observed mean catch rates in held-out hauls, ranked by model prediction. Every CPUE R² exceeds the mean-predictor baseline (−0.006 to −0.161 on the same test set).
What they are not
No oceanographic data is used in these figures — seven features only: position, depth, season, day/night. Dab's 0.988 measures a biogeographic boundary, not skill. These are a floor.
04 — How it runs
Four stages, one command each.
Ingest
Labelled haul and catch records stream from ICES DATRAS; ERA5 meteorology is joined on the reanalysis native 0.25° grid for each haul's day.
Assemble
One row per haul and species. Unmatched hauls become true zeros. Shipboard readings are quarantined — they do not exist at forecast time.
Fit
Two gradient-boosted models per species — presence and log catch rate — scored strictly forward in time, never on a random split.
Serve
Gridded inference across the basin, delivered as a heatmap with a per-cell readout and an offline package for the trip. Planned
05 — Data foundation
Every source is public. The method is the moat.
No licensed feeds, no proprietary telemetry, no vendor lock. Reproducible from scratch with the download scripts in the repository.
ICES DATRAS
LIVEStandardised scientific bottom-trawl surveys — haul position, time, swept distance, depth, gear, and catch by species and length class.
20,358 hauls · 116,005 haul-species rows
180 species · 1991—2026 · no authentication
ECMWF ERA5
LIVEGlobal atmospheric reanalysis — air temperature, wind speed and dominant direction, surface pressure, cloud cover, radiation.
0.25° · daily · sampled per haul cell-day
resumable ingest · no authentication
Copernicus Marine
INTEGRATINGBaltic reanalysis — sea temperature, salinity, currents, mixed-layer depth, chlorophyll-a, Secchi depth, nutrients, oxygen.
~1.85 km · daily · 56 depth levels
1993—present · 11 variables selected
EMODnet Bathymetry
PLANNEDSeabed depth at ~115 m resolution, required to produce predictions in cells where no haul was ever taken.
WCS 2.0.1 · European footprint
GEBCO fallback outside coverage
06 — Coverage
Retargeting a basin is a config change.
The pipeline, feature builder and models are parameterised by one study-area object. The same codebase runs the Baltic and the North Sea — basins that differ sharply in salinity and optical regime. That is a test of portability, not a claim about it.
Adding a basin
# one entry, one adapter NORTH_SEA = StudyArea( key="north_sea", name="North Sea", survey="NS-IBTS", lat_min=51.0, lat_max=62.0, lon_min=-4.0, lon_max=12.0, quarters=(1, 3), )
$ python scripts/download_survey_data.py \
--area north_sea
07 — Ecological design
Hiding a species is not protecting it.
Protected and moratorium species are removed from the prediction surface entirely. But species-level filtering alone is inadequate: protected species share habitat with legal targets, so a coordinate shown as productive for one is often productive for the other.
Species exclusion
Red-list and moratorium species never enter the model registry or the map.
Spatial masking
No forecast is produced inside legally closed areas, for any species. Planned
Seasonal closures
Spawning windows blank the surface on a calendar, not a toggle. Planned
Put the next trip on evidence.
Early access is open to commercial operators, research institutes and fisheries authorities in the Baltic and North Sea.
Operators
Per-vessel forecast access, offline trip packages, catch logging.
Research
Model cards, reproducible pipelines, co-authored validation studies.
Authorities
Basin-wide distribution surfaces for stock and effort monitoring.