Skip to main content

chartplotter

Not for navigation

This project is coded almost entirely with AI (Claude). It is an experiment in building a large, complex specification (IHO S-101) with AI, and a personal learning tool — not a certified or tested product. Do not rely on it for real-world navigation.

chartplotter is a marine chart engine written in Go. It turns official NOAA nautical charts into fast, offline map tiles that you can view in a web browser.

The chart below is live — official NOAA charts of Annapolis, Maryland, running right here in your browser. Pan, zoom from the whole Chesapeake to the docks, and switch Day / Dusk / Night. It is the read-only widget build: static, embeddable, no server.

Loading live chart…

It reads S-57 electronic navigational chart (ENC) cells, draws them with the S-101 Portrayal Catalogue — the modern IHO standard for how charts look — and writes the result to a single PMTiles archive of vector tiles. A small web component built on MapLibre GL JS draws the chart.

Goal

Implement the IHO chart standards — S-57 (ENC data), S-101 portrayal (the successor to S-52), and the wider S-100 / S-102 family — in pure Go, with minimal dependencies and no CGO, so the whole thing cross-compiles to a single static binary for any platform with just GOOS/GOARCH.

What it does

  • Turns charts into tiles. Give it one or more S-57 cells. It produces a .pmtiles archive you can serve or copy to another machine.
  • Works offline. Once you generate a region, you do not need a tile server or an internet connection to view it.
  • Switches Day, Dusk, and Night instantly. The engine stores colors as S-101 color names, not fixed RGB values. The browser looks up the right palette and restyles the map. You never regenerate the tiles to change the lighting mode.
  • Applies chart settings in the browser. Depth shading, soundings, depth contours, and danger highlights all come from data baked into the tiles. You generate the tiles once and adjust these settings live.
  • Ships as one binary. The S-101 catalogue is built into the program. You do not install extra data files.
  • Shows live position and AIS (early). Point a NMEA 0183 feed at the server over TCP and it draws your own ship and basic AIS targets on the chart; a simulate command generates traffic for testing.
  • Draws the whole symbol set. It renders the complete S-52 Presentation Library ECDIS Chart 1 reference sheet — every symbol, line style, area fill, and colour — drawn by the same pipeline that bakes real NOAA charts and diffed against the spec's own plots.

Beyond the chart

The chart is the foundation, not the whole app. The frontend is a <chart-plotter> base plus small plugins — own-ship and AIS already work this way — and the goal is a stable plugin API for building other things on top of the chart: instrument gauges, custom overlays, routes, and more, without forking the core. The NMEA 0183 own-ship and AIS support is the first slice of that, so expect the plugin surface to grow and change.

Who it is for

Use chartplotter if you want to:

  • Build a web app that shows NOAA ENC charts.
  • Serve nautical charts that work without a network connection.
  • Generate vector tiles from S-57 data in a backend pipeline.

How to read these docs

  1. Install the program.
  2. Follow the Getting Started guide to bake your first chart and view it.
  3. Look up any command in the CLI Reference.
  4. Learn how the pipeline works in Architecture.
  5. See the exact tile layers and fields in the Tile Schema.

A note on terms

TermWhat it means
S-57The international file format for electronic navigational charts. NOAA distributes U.S. charts as S-57 cells.
ENC cellOne S-57 chart file, named like US4MD81M.000.
S-101The IHO standard that defines how to draw an ENC: colors, symbols, and line styles. Its Portrayal Catalogue holds those rules.
MVTMapbox Vector Tile. A compact binary format for map data.
PMTilesA single-file archive that holds many vector tiles. You can serve it with simple byte-range requests.