Measured now · Copernicus Marine / CLS · observed · · ·
The last · · · km to the sand is below the resolution of every public ocean model.
The masses are measured. The drift is modelled. Between the last modelled grid cell and the beach there is a strip of sea that no public model resolves, and it is the only strip that decides whether a crew is called out. That strip is what the daily drone flight measures instead of predicting.
The surface field the patches are pushed through, over
· · · provider samples.
basis · · ·
· · ·
The nearest any measured patch gets to the Bávaro sand over the whole · · · h horizon, reached at t+· · · h. It is still closing when the horizon ends — the model runs out of time, not out of sargassum. modelled
Segments where a patch comes inside the · · · km capture radius within the horizon. The capture radius is a number we chose. assumed
Plus · · · patches refused at release, of · · · given: the model has no field at their own coordinate. GLO12 is 1/12°, about 9 km at this latitude, and its land mask swallows the cells nearest a coast — so the nearer a trajectory gets to the beach, the more likely it is to end against nothing at all. modelled
The last · · · km is a single model cell wide.
The ocean model cell is about 9 km across. The nearest measured sargassum sits · · · km off the sand. The entire approach that matters to a hotel is therefore one grid cell — there is no public model, ours included, that can resolve it, and no amount of tuning makes a 9 km cell answer a 300 m question.
That is the argument for flying the beach. The drone measures the last leg at centimetre ground sample, three flights a day, instead of predicting it. The satellite says the sargassum is coming; the drone says it arrived, where, and how much.
Reported so it can be checked, not so it reads well: · · ·. There is no arrival probability on this page — see the layer table below.
Measured now
Floating mass flagged by the validated third-party product, read straight from our own store. The two approach boxes are the ingest windows in sargazo/cmems.py, not corridors drawn for this page.
The same water at 20 m
The 20 m MSI product over the same window reports · · · km² across · · · masses, observed · · ·.
The two are not comparable as tonnage. Both report flagged-cell area, and a 278 m cell flags a whole cell for a raft that fills a fraction of it. Read the OLCI figure as extent and the MSI figure as detail on the same water, never as two estimates of one quantity. measured
What the store holds · /health
Last run per source, straight from the API. A source that has stopped running shows its real age here rather than disappearing.
The horizon is not the warning
OLCI is a daily product. By the time an observation is in our store it is most of two days old, and the model horizon is measured from when the satellite looked — not from now. Quoting the horizon alone overstates the warning by the age of the data.
The two sites, right now
Per-segment arrival for the coastline under management, from /arrivals. Segment geometry is measured; arrival is a single-particle advection and is not calibrated against any observed landfall.
Bávaro
· · ·
Open the segment console → LRM · sector La RomanaLa Romana
· · ·
Open the segment console →The La Romana box is an inference of ours: VBK-SAR-01 gives no coordinates for “sector La Romana”. Segment identifiers are frozen — renumbering them would invalidate every observation already recorded against them.
What each layer actually is
The figures above mix four different kinds of thing. Mixing them is fine; not saying which is which is not. Every row below names its basis at the point it is read.
The full method, the validation ledger and every failed control are in the . Nothing in the live view is a summary of a figure that is not printed there.
Sargassum arrival forecasting · Dominican Republic east coast
Sargassum landfall,
resolved to a 300-metre beach segment.
Public products report the Atlantic belt at basin scale. VBK-SAR resolves the arrival to the individual segment of sand a hotel actually cleans — 44 of them, cut from surveyed coastline, at Bahía Príncipe Bávaro and sector La Romana.
Every quantity on this page carries one of those four marks. Nothing is unlabelled. Where our own work failed a control, the failure is printed with the number that shows it.
The resolution argument
Four orders of magnitude, drawn to scale. Each frame contains the next one. Two of the three nestings are smaller than a pixel at this print size — that is the point, and the pixel arithmetic is printed rather than fudged.
What competitors resolve
Basin and regional bulletins answer “is there sargassum off this coast this week.” That is the correct answer to a shipping question and the wrong answer to an operations question. A resort does not clean a coast; it schedules crews and closes loungers on a named stretch of sand.
The distinction that matters, stated precisely
The moat is the resolution of the answer, not of the pixel. The finest validated cell in our chain is 20 m (Sentinel-2 MSI) — already finer than a segment. What no public product delivers is a per-segment landfall statement with a time, an amount and an auditable provenance chain behind it. Building that unit is the work; the pixel is an input to it.
The stack, stage by stage
Five stages. Two are operational today, three are not. The three that are not are marked as such here, in the console, and in the repository’s own documentation.
-
S1
Satellite detection
Operational · third-party validatedCopernicus Marine MULTIOBS_GLO_BGC_SURFACE_NRT_015_016, “Floating Sargassum algae detection index from satellite observations”, produced by CLS. Two datasets are read: MSI/Sentinel-2 Caribbean at 20 m and OLCI/Sentinel-3 at 278 m, one file per day each.
Access route measured today: direct HTTP range reads against the public Copernicus object store answered 206 Partial Content with no account. Credentialed ARCO access is the documented fallback for OLCI; MSI publishes no ARCO store at all, so range reads are also the cheapest route.
-
S2
Drift and stranding
Planned · does not existOpenDrift particle transport, VBK-SAR-01 §4/§5. Not built. The module present in the repository is single-trajectory advection with a constant 1 % windage on a current that already carries Stokes drift: no stranding, no ensemble — therefore no arrival probability.
Consequence, and the reason this is stated rather than hidden: the API serves /forecast as an observation (basis:"observed", eta_hours:null) instead of dressing a measurement as a prediction. Until S2 exists, no verification metric of VBK-SAR-01 §6 — Brier, ROC-AUC, ETA error — can be evaluated, so none is quoted.
-
S3
Segment landfall
Geometry operational · probability planned44 segments of 200–500 m exist and are addressable today, with length, orientation, centroid and a measured shore-normal depth profile. The value they will carry — arrival probability and time per segment — depends entirely on S2 and is not populated.
Segment identifiers are treated as permanent. Renumbering or reshaping a segment invalidates every observation ever filed against it, so the La Romana extent question (§05) is escalated rather than silently corrected.
-
S4
Drone verification
Planned · one synthetic flight on recordFour flights per day over the 44 segments, closing the loop between a forecast and the sand. The ingest path, observation schema and scoring regression exist; the flights do not. The only flight in the repository is synthetic (DJI / FC-TEST) and is labelled so everywhere it appears.
The current segmenter is an explainable colour index, BROWN = (R − B) / (R + B) with a per-image Otsu threshold. It measures a brown-object class, not a trained sargassum class — it will also fire on wet dark rock, palm shadow and non-sargassum weed. Its purpose is consistent numbers and a labelled training set. A trained segmentation net replaces it behind the same interface.
-
S5
On-premise advisory
PlannedA 24–32 B model running on the customer’s own hardware: the daily bulletin, operator question-answering over the PostGIS record, and reporting. No data leaves the property.
Explicitly out of scope for this component: it does not predict drift and must never be sold as doing so. Physical transport is S2’s job. The imagery work is a small segmentation network, not the language model.
Validation ledger
Every data layer in the system with its source, licence, resolution, cadence, state — and the specific measurement that earns that state. Failures and open defects are rows in the same table, not an appendix.
The known-positive control
A detector that cannot find the Great Atlantic Sargassum Belt is not a detector. Both the CLS product and our own index were run over the same two windows on OLCI, 2026-09-08, with no credentials.
- Atlantic belt · 8–14 N, 50–40 W
- 0.5298 %
- Clean gyre · 26–29 N, 55–45 W
- 0.0022 %
- Contrast
- 241 ×
- Land (Hispaniola, Puerto Rico)
- 0 observed px · 0 algae
- Our own FAI detector, same control
- 0 detections in the belt
Percentages are of observed pixels, i.e. after cloud and land are removed by the producer’s own flag. Reproducible with python -m sargazo.cmems --selftest.
Satellite sargassum index
OLCI 278 m
Measurement Known-positive control, OLCI 2026-09-08, no credentials: Atlantic belt 0.5298 % of observed pixels flagged algae against clean gyre 0.0022 % — a 241× contrast. Land returns 0 observed pixels. Grid definitions read from the files themselves: MSI 175 001 × 111 112 at 0.00018° (20.0 m N–S, 19.3 m E–W at 18.5 N); OLCI 45 201 × 14 001 at 0.0025°.
Our own FAI detector
GOES 2 km
Measurement Failed the same known-positive control outright: zero detections in the Great Atlantic Sargassum Belt, with detections appearing only where a coast was nearby. Four rounds of fixes produced four distinct artefact populations rather than a working instrument — land mask rasterised in the wrong CRS, NDVI computed on wrongly-offset reflectance, haze and sun glint, and shallow-water seabed reflectance. A fixed FAI cut fires on anything lifting NIR against a red/SWIR baseline; that is the wrong instrument, not an untuned threshold. It is retained only as a cross-check and is never the answer.
Product flag semantics
Measurement flag_nfai publishes its meanings against values that include 32767, which is also the array’s _FillValue — a pairing that must not be trusted on sight. Read twice on the 2026-09-01 MSI file: flag=1 → 86 882 605 px, index at fill (no observation / cloud / land); flag=0 → 12 298 467 px carrying the −0.5 algae-free sentinel; flag=32767 → 39 365 px with index 0.0015–0.5795, i.e. algae — of which 12 501 px were themselves fill and are dropped. The reader re-derives and re-checks this on every file it opens and skips the window loudly if a control fails, because a silently reordered pairing would report the entire ocean as sargassum.
Nearshore bathymetry
Measurement Shore-normal profiles at 200–1 000 m for every segment, reproduced 2026-09-09. Depth 1 km offshore: Bávaro 7.3–12.2 m, median 11.1 m, 0 of 11 segments reach 30 m; La Romana 6.7–42.6 m, median 22.1 m, 5 of 25 reach 30 m. Eight segments are refused rather than estimated — the routine will not answer finer than its grid cell.
Bathymetry cross-check
Measurement Along the BPB-002 shore normal at 100 m steps, 100–1400 m, GEBCO reads 5, 5, 5, 5, 21, 21, 21, 21, 35, 35, 35, 35, 35, 8 m — four identical readings, a step, four more, then a 27 m drop while still heading offshore. A sea floor does not do that; the profile is an artefact of a cell wider than the question. Arbitrated independently by the imagery: green (560 nm) bottom reflectance on S2B_19QEA_20251230 stays 2–4× background out to ~900 m, which through GEBCO’s claimed 35 m would be attenuated to ~0.7 % and is impossible — consistent with GMRT. The two grids nonetheless correlate at r = 0.9975 across the EEZ window and disagree about the 30 m isobath on only 1.7 % of points, so the basin-scale mask does not depend on which is used.
Coastline & segment geometry
Measurement 44 segments, 13 146.9 m total. Bávaro: 12 × 301.2 m = 3 614.4 m, normals bearing 26.4°–81.5°. La Romana: 32 segments 295.8–313.6 m = 9 532.5 m, normals 90.5°–246.3°. Every length and bearing is computed from the geometry, not asserted.
Beach catalogue
Measurement 136 Dominican beaches. Every field is an OSM tag, a count of OSM features within 400 m, or a point-in-polygon result — nothing is written from knowledge. Coverage is therefore uneven and is published as such: province 100 %, surface 43 %, parking 32 %, access type 18 %, lifeguard 4 %, entrance fee 1 %. Fields that do not exist in OSM — activities, wildlife, water conditions, best season — are left empty rather than reconstructed, because writing them would mean publishing 136 unsurveyed claims.
Site observation coverage
Measurement Over ten days the Bávaro box was observed on 1 of 10 MSI days and 0 of 10 OLCI days; the La Romana box on 0 of 10 and 0 of 10. Worse, the La Romana box as specified (18.396–18.410 N, −68.944–−68.900 W) is 100 % land in the producer’s own mask: along −68.92 W the water CLS will report stops at 18.361 N, roughly 4 km south of the box. That box can only ever return 0 km², and 0 km² on a map reads as a clean beach. The boxes are not silently moved — the La Romana extent is an assumption inherited from the specification, and renumbering a segment invalidates every observation filed against it. The ingest logs an error naming each unobserved box instead.
Coastline positional slop
Measurement 147 of 393 detections in one stored run, and 96 of 293 in another, sat at positive elevation on both DEMs. They are not scattered inland: every one is within 1.1 km of the Natural Earth coastline, median 0.0 km, p90 0.32 km. A 1:10 000 000 coastline carries roughly a kilometre of positional slop — about 17 Sentinel-2 pixels at 60 m — so surf, wet sand and shoreline vegetation stay inside the water class. A depth cut removes them as a side effect; the underlying fault is the coastline dataset and is recorded as its own defect rather than absorbed.
Area comparability
Measurement The same corridors on the same day returned 3.91 km² (MSI) and 556 km² (OLCI) — a factor of about 40, all of it resolution. Reported area is flagged-cell area, not raft area: at 278 m a single 50 m windrow flags a whole 0.077 km² cell. Runs are stored per source so one cannot displace the other, and the legacy risk bands (0.3 / 3 / 12 km²), tuned on 60 m Sentinel-2 patches, are not applied to OLCI.
Drift model & forecast skill
Status The particle model now exists. An OpenDrift ensemble with GSHHS stranding and windage sampled across 1–3 % runs 4 800 particles over a 72 h horizon in under 20 s, and it passes a known-positive control: 400 particles released at 17–20 N, 58–55 W travel −96 km east in 72 h, 100 % westward at 0.375 m/s — the North Equatorial current, out of measured forcing. So prob_llegada is computable, and /arrivals?engine=opendrift returns it. It is not what this page serves. The default engine is unchanged, because a probability that exists is not a probability that is right: no arrival from either engine has been checked against an observed landfall, so calibrated stays false and the acceptance criteria of VBK-SAR-01 §6 — Brier, ROC-AUC, ETA error — remain unevaluated. That needs the drone, which has not flown.
Drone ground truth
Status The measurement today is an explainable colour index with a per-image Otsu threshold, and what it emits is coverage of a brown-object class. It is not a trained sargassum classifier and is described that way to the customer. The only flight on record is synthetic. Four flights per day over the 44 segments is the plan that turns this row into a measurement, and it has not started.
Why generic open-ocean detection cannot serve this coast
This is the engineering fact underneath the commercial one. It is measured, and it is the reason a beach-scale product is a separate instrument rather than a zoom level on an existing one.
Every index built for floating algae has the same failure mode inshore: seagrass and reef macroalgae on the sea floor carry the same red-edge signature as sargassum on the surface. Spectrally there is nothing to separate, so the only discriminator left is geometry — sargassum floats on water deep enough that nothing grows on the bottom of it. Turbidity is the same problem twice over: wave-stirred sediment lifts NIR and not SWIR, exactly the signature a haze gate is built to accept. Both processes are confined to the shelf.
The standard remedy is a depth cut. Ours sits at 30 m, and three independent arguments land there: direct seabed reflectance is long gone (bottom contribution falls as e−2Kdz; red 665 nm is below 1 % by ~6 m); dense Caribbean benthic vegetation is confined to the photic bottom above roughly 30 m; and wave base for typical Caribbean swell at T ≈ 7 s is about 25 m, below which the column is not stirred from beneath.
Applied to a beach-scale product that cut deletes the arrivals the customer is paying to be warned about. The measurement, over the 36 segments whose shore normal is reliable:
Measured from GMRT ~58 m tiles, reproduced 2026-09-09. At Bávaro not one segment reaches 30 m of water within a kilometre of the beach, so the mask that makes open-ocean detection trustworthy removes essentially the entire operating band. Depth is therefore carried as an attribute and surfaced to the consumer, never used to silently drop nearshore patches and call the result cleaner.
Shore-normal depth profile · 36 segments · GMRT ~58 m
Why the source grid matters · BPB-002 normal, same transect
Coverage
Two sites, real geometry, cut from surveyed coastline. Drawn to scale from data/tramos.geojson — this is the deliverable unit, not an illustration of one.
Open item carried to the investor, not buried
“Sector La Romana” carries no coordinates in VBK-SAR-01. The frontage used here — Playa Minitas / Casa de Campo — is inferred, and the specified bounding box is 100 % land in the satellite producer’s own mask. Both facts are recorded against the project as open gaps. Confirming the extent is a customer decision with a hard constraint attached: segment identifiers are permanent, and renumbering them invalidates every observation ever filed against them.
What a segment carries today
- tramo_idmeasured
- geometry · LineStringmeasured
- longitud_mmeasured
- orientacion_degmeasured
- centro_lat / centro_lonmeasured
- prof_200 / 500 / 1000 mmeasured · 36/44
- prob_llegadaplanned
- eta_horasplanned
- severidadplanned
- verificacion · droneplanned