Skip to content

Releases: openwatersio/seascape

2026-08-17

Choose a tag to compare

@bkeepers bkeepers released this 17 Aug 16:47
a38cef0

Unknown-depth water no longer shows gaps at tile seams or along shorelines, and the depth-area geometry underneath is now valid by construction.

Chart fixes

  • No more hairline seams across unknown-depth water. Inside large lakes with no depth data (Great Salt Lake, Lake Peipus), tile boundaries showed through as a thin line of background across the water. Unknown-depth polygons now overlap their neighbours at every boundary they were cut on instead of abutting them, so the fills draw seamlessly.
  • Unknown-depth water now reaches the shoreline. The same change closes the background-coloured slivers that appeared between the water fill and the land fill along shores: the water extent overlaps slightly under land, and land draws on top.
  • Deep contours no longer trace a pixel lattice. Contours below 250 m were cut from a block-coarsened grid whose right-angle treads were plainly visible where steep coasts put the 300 m curve near shore (Manu'a). They now come from the full-resolution surface — measured smaller in shipped tile bytes, since smooth curves simplify better than staircases.

Pipeline

  • Depth-area rows are snapped to the write grid with validity guaranteed by GEOS, replacing after-the-fact repair; the rare arrangements snap-rounding refuses take gated fallbacks under the same area-conservation checks, and a row no repair can save fails the build naming its geometry. The previous pipeline quietly shipped a handful of invalid polygons per build; this one ships none.
  • Dependency refresh across the toolchain, GDAL 3.13.2 among them, now tracked by Dependabot.

Seascape is not an official Electronic Navigational Chart and is never a replacement for one. Not for navigational use.

2026-08-16

Choose a tag to compare

@bkeepers bkeepers released this 16 Aug 22:38
719739e

Six new high-resolution bathymetry sources across four countries, restored drying-area rendering on macro-tidal coasts, and a hardened data pipeline behind them.

New coverage

  • Norway, Svalbard and the Barents Sea — Kartverket's declassified 50 m sea terrain model, chart datum inshore (~z11).
  • Brittany, France — SHOM's Litto3D coastal lidar at 5 m, the chart's first French source. Depths are corrected onto French chart datum per pixel by a new reference surface built from SHOM's own BATHYELLI model, validated against their per-port tables (median residual 0.00 m).
  • England & Wales nearshore — three complementary sources: the Channel Coastal Observatory's multibeam surveys (0.25–4 m, the south and southwest coasts' first high-resolution coverage), the Environment Agency's multibeam archive (0.5 m, mostly east coast), and the DORIS seabed survey of the Dorset coast (1 m).
  • German tidal estuaries — WSV's DGM-W river terrain models for the Elbe, Weser and Jade at 2 m, on the German chart datum.
  • 25 large lakes gain real depths — Ladoga, Onega, Winnipeg, Great Bear, Great Slave, Vänern, Balkhash, Biwa, Champlain and more, from the Global Lake Database. These previously rendered as flat unknown-depth water, including a corrupt GEBCO patch across southern Lake Ladoga now replaced by digitised bathymetry.

Every source is licence-vetted per grid before it ships, and each carries its attribution and provenance in the tile metadata.

Chart fixes

  • Drying areas no longer vanish on big-tide coasts. Large connected foreshores (Brittany, and any coast where high-resolution data meets a large tidal range) could be silently dropped from the vector chart during writing; 232 km² was missing around Saint-Malo alone. Fixed, with guards that make any recurrence a loud failure instead of a quiet hole.
  • Tideless coasts no longer show phantom green foreshore. Drying-area tint is now gated on water that can actually dry, so lake and low-tide-range shorelines render as plain water.
  • Style: the safety contour gets its own color and stronger emphasis, depth labels drop their units, hillshade is now a viewer option, and relief band edges align exactly with contour lines. These ship in the style package as @openwaters/seascape 0.3.0 on npm.

Pipeline

  • Depth-area artifacts self-heal: corrupt or mistyped files on the build store are detected and repaired or refetched automatically.
  • Raw source downloads are no longer retained after processing — the staged data is the durable record, cutting storage while keeping every build reproducible from mirrors.
  • Build memory reservations refit from measured usage; planet builds should run roughly twice as fast.
  • Weekly garbage collection re-rooted on the published mosaic, and the tile contract now carries a declared schema version.

Seascape is not an official Electronic Navigational Chart and is never a replacement for one. Not for navigational use.

2026-08-10

Choose a tag to compare

@bkeepers bkeepers released this 10 Aug 12:04
92375fa

Try it: demo viewer · openwaters.io/charts/seascape

Chart quality

  • US coastal depths are referenced to chart datum (#117). CUDEM ships on NAVD88, a land survey datum sitting anywhere from half a metre below MLLW in the Columbia River estuary to more than 1.7 m above it in New England and Alaska, so uncorrected Atlantic depths read about a metre too deep and drying flats classified as navigable water. Depths are now corrected per pixel against NOAA's VDatum separation grids, the Columbia River against the datum NOAA actually charts it with, and the Pacific territories against per-island separations. The build refuses to publish a surface that misses the published CO-OPS separations at 17 tide stations.
  • Drying flats and inland lakes portray correctly (#113): drying is no longer emitted in water with no chart datum to dry against, and tidal flats stop shattering into sub-legible confetti.
  • Shorelines are smooth again at high zoom (#118). Coasts in places like Nassau Sound rendered as a hard staircase in both the depth shading and the depth areas.
  • The Great Lakes stop charting land as deep water (#114): the NCEI grids carry land topography across their full rectangular extents, which put downtown Hamilton at −72 m.
  • Below-sea-level land renders as land at low zoom (#112), so the Caspian Depression is no longer opaque unknown-depth water when you zoom out.
  • Swimming pools are not charted (#111). The water mask kept all 25.8M polygonal non-ocean features, and every one of them became an unknown-depth water polygon.

Under the hood

  • The inland water mask gates itself before publishing: a feature the filter admits cannot be silently lost, and a set of known lakes must still be present. Both checks caught real defects in this release.
  • The mask's source data is downloaded and verified before it is read, rather than streamed over thousands of ranged requests that cannot distinguish a torn page from a short one.
  • Build logs are one line per job (#119), where a recent build spent 1,852 of 2,103 lines on scaffolding.
  • The hillshade style layer is renamed to avoid colliding with land hillshade (#115).

⚠ Not for navigational use
US coastal depths are referenced to MLLW; elsewhere the vertical datum varies by source and depths are not reduced to a chart datum. Nothing here accounts for tides or water level. Use official nautical charts for navigation.


Note on versioning: releases of the tiles move to a date, starting here. The @openwaters/seascape npm package keeps semantic versioning on its own cadence, because it has an API that consumers actually pin.

Seascape v0.3.0

Choose a tag to compare

@bkeepers bkeepers released this 03 Aug 02:15
c52dbf4

Try it: demo viewer · openwaters.io/charts/seascape

Chart quality

  • Every source now renders at its native resolution (#83). Tiles build as variable-depth pyramids: regions with high-resolution surveys carry their full detail down to deep zooms, while coarse open ocean stops early — no more planet-wide resolution ceiling.
  • Depth areas are back (#97): vector depth-band shading returns, seam-correct across tile boundaries and fast enough to build shallow, fragmented marsh coasts at full zoom.
  • The DEM publishes depth below water (#93): land is a sentinel, 0 is unambiguous, deep ocean is clamped.
  • Coarse sources are clipped by a land mask (#101, #104), so low-resolution global data no longer shades over land, while harbors and lagoons stay water.

Sources

  • NZ Coastal LiDAR joins the mosaic (#98).
  • Declarative source ingestion (#100): a new source is a config entry, not a bespoke pipeline.

Demo & serving

  • Bounding-box and tile-grid overlays in the demo viewer.
  • The preview worker returns 404 for an unstaged build instead of an unhandled 500 (#102).

Under the hood

  • The whole pipeline, source ingestion included, is one Snakemake DAG (#92).
  • Publishing skips re-hashing unchanged tiles (a 40-minute saving on planet builds), and a release promotes the mosaic pointer so raster and vector always ship from the same build.

⚠ Not for navigational use
Depths are not reduced to a chart datum and do not account for tides or water level, so they are not charted depths. Use official nautical charts for navigation.

Seascape v0.2.0

Choose a tag to compare

@bkeepers bkeepers released this 21 Jul 13:12
a504fcb

Try it: demo viewer · openwaters.io/charts/seascape

Chart quality

  • Deep water is generalized like a chart, not a survey. Depth shading and contours below 200 m are aggressively smoothed and contour intervals now follow zoom-tiered ladders, so open-ocean zooms show clean, readable isobaths instead of survey noise. Detail from 0–30 m — the water you navigate — is untouched.
  • Shallow detail survives above a region's native zoom (#15): overzoomed areas keep their bank and channel definition.
  • Inland waters (#63): lakes now shade from their own surface levels rather than sea level.
  • Rebuilt drying geometry (#65).

Sources & coverage

  • NOAA S-102 and CUDEM now cover US territories (Puerto Rico, USVI, Pacific territories) (#81).
  • Volatile upstream sources (S-102, CUDEM) are mirrored before builds, so upstream churn can't break reproducibility (#84).
  • A source-coverage layer (coverage.pmtiles) shows each source's footprint — toggle it in the demo (#60).

Demo & serving

  • Mapterhorn land relief in the demo viewer (#89), OSM base-map toggle, mobile fixes.
  • Fixed an out-of-memory on overzoomed raster decode (#67); CORS headers on error responses; worker logging.
  • MapLibre 5.6–5.11 compatibility (#56).

Under the hood

The entire build is now a Snakemake-driven incremental engine (#90, #91): the planet mosaic persists between builds, and every artifact rebuilds exactly when its inputs, parameters, or scope change and never otherwise.

⚠ Not for navigational use
Depths are not reduced to a chart datum and do not account for tides or water level, so they are not charted depths. Use official nautical charts for navigation.

Seascape v0.1.0

Choose a tag to compare

@bkeepers bkeepers released this 05 Jul 19:01
6d7df37

First public release of Seascape: free bathymetry tiles for MapLibre and Mapbox GL, built from 23 global and regional sources.

Try it: demo viewer · openwaters.io/charts/seascape

Two tile sets come off the same merged depth model. The raster set is a Terrarium-encoded DEM for depth shading, hillshade, and 3D terrain. The vector set carries depth contours, spot soundings, and drying areas.

new maplibregl.Map({
  container: "map",
  style: "https://tiles.openwaters.io/seascape/style.json",
});

What's included

  • /style.json is a complete nautical style: depth shading in chart colors, isobaths with labels, spot soundings, and drying areas. ?unit=m|ft|fm picks the depth unit, and ?safety=<metres> shades water shallower than your safety depth as a hazard.
  • The endpoint at https://tiles.openwaters.io/seascape serves raster (raster.json) and vector (vector.json) TileJSON. No API key, no signup.
  • The vector tiles carry four layers. contours has metric and feet/fathom isobath sets at the usual chart intervals. soundings has the shoalest depth per cell, so a printed depth is never deeper than the data behind it. drying has the foreshore that dries at low water, and coverage has each source's footprint.
  • The style is generated by the @openwaters/seascape npm package, which also exports the sources and layer groups for composing into your own style, plus runtime controls for units and safety depth.

Coverage

GEBCO 2026 covers the whole planet at about 450 m (through z8). Where finer open data exists it takes over, down to z14 in the best-surveyed areas. Where sources overlap, the ones already on a chart datum win first, then the finer resolution. The 23 sources:

  • Global: GEBCO 2026 Grid
  • United States: NOAA S-102, CUDEM 1/9″ and 1/3″, NOS estuarine DEMs, Great Lakes, Lake Tahoe
  • Europe: EMODnet 2024, Danmarks Dybdemodel, Vaklodingen (NL), INFOMAR 10 m and 25 m (IE), UK SurfZone, Lac Léman, Lac de Neuchâtel, Bodensee
  • Canada: GSC Atlantic 100 m, GSC Pacific 10 m
  • Australia: AusBathyTopo 250 m, Great Barrier Reef 30 m
  • Elsewhere: BATNAS (Indonesia), SW Indian Ocean Bathymetric Compilation, African Great Lakes

Producers and licenses for each:
openwaters.io/charts/seascape#sources

Not for navigational use

Depths are not reduced to a chart datum and do not account for tides or water level, so they are not charted depths. The data is interpolated and merged from surveys of different ages, resolutions, and datums, and a gridded model omits the rocks, wrecks, and obstructions an official chart shows. Use official nautical charts for navigation.

License

The tiles are CC BY 4.0. MapLibre's attribution control displays the credit carried in the TileJSON, which covers both the tile license and each underlying source's own terms. The code is BSD-3-Clause.

Updates

Tiles rebuild as the sources update: GEBCO once a year, the regional sources on their own schedules. Each data release is tagged here, so watch the repo if you want a ping. The hosted endpoint is best-effort with no SLA. If you need offline data or guaranteed availability, build the archives yourself with this pipeline.

What's next

The aim is bathymetry good enough for a nautical chart. What stands between here and there:

  1. Chart datums. Depths need referencing to a conservative low-water datum (LAT/MLLW) rather than mean sea level, applied as a spatially varying correction.
  2. Provenance. Carry each source's identity and a confidence grade into the tiles, so you can tell surveyed 3 m data from interpolated GEBCO, and validate depths against official soundings.
  3. More sources and more coverage. The next release will look at adding more open sources to the pipeline. Open an issue if you know of a source that should be included.

The full plan is in ROADMAP.md.