Skip to content
@sailingnaturali

Sailing Naturali

All-electric catamaran charter operation in the Pacific Northwest — Gulf Islands and San Juan Islands.

Sailing Naturali

A tech exec uses AI to build the kind of business AI can't deliver.

All-electric catamaran charter operation in the Pacific Northwest — Gulf Islands and San Juan Islands. AI runs the operations. Humans deliver the experience.

📺 @sailingnaturali on YouTube · sailingnaturali on Substack · sailingnaturali.com · @sailingnaturali on Instagram · @sailingnaturali on TikTok


Boat Agent Stack

On-boat AI agent system — Navigator, Engineer, Logbook — wired to the vessel through SignalK and MCP servers. The agents are the product; the runtime underneath is replaceable and has already been replaced once.

MCP Servers

Repo What it does
signalk-mcp Read live vessel data from SignalK — wind, depth, position, battery, route — with path discovery and under-keel clearance
weather-mcp Marine wind, swell, and buoy observations — Open-Meteo + Stormglass + NDBC
currents-mcp Tidal-gate slack windows for PNW passages — CHS (BC) + NOAA (US) current predictions
pilotbook-mcp Rank the most comfortable overnight anchorage by joining pilot-book exposure against the forecast — and search anchorages in plain language ("quiet spot to wait out a southerly with a beach") via on-device hybrid retrieval
colregs-mcp Navigation rules of the road — resolve the regime by GPS, look up rules, and check lights/shapes compliance
logbook-mcp The ship's log as agent tools — voice-marked moments and day reads over the signalk-logbook plugin, with USCG/TC sea-time export on the roadmap
vessel-knowledge-mcp Turn equipment manuals into alarm zones and equipment lookups — ingests PDFs into a card vault, pushes zone bands into SignalK so it raises notifications autonomously, then explains them in plain language
club-moorage-mcp Find and overnight-rank yacht-club outstations — RVYC member moorage with size, rafting, and booking rules, ranked against the forecast by reusing pilotbook-mcp's anchorage scorer

Vaults

Knowledge bases the MCP servers read from.

Repo What it holds
colregs-vault Navigation-rules content for colregs-mcp — rule prose, a curated requirements decision table, and PNW regime polygons. Public because the sources are reproducible public-domain law
currents-vault Tidal-gate reference for currents-mcp — one file per PNW pass with CHS/NOAA station identity plus flood/ebb hazard notes (whirlpools, holes, sets), and a destination routing table. Public: station data is open government, hazards are paraphrased
pilotbook-vault (private) Anchorage knowledge for pilotbook-mcp — 673 anchorages across 7 SalishSeaPilot books, with exposed-sector data and source page back-links. Kept private: the source pilot books are copyrighted
vessel-knowledge-vault (private) Equipment cards for vessel-knowledge-mcp — per-make/model spec cards extracted from manuals (propulsion drives, Victron Cerbo, watermaker), with zone bands in SignalK canonical SI units. Kept private: the source manuals are copyrighted

SignalK Plugins

Run inside the SignalK server itself — alarms and data feeds that don't wait for an agent. Published on npm under @sailingnaturali.

Repo npm What it does
signalk-notification-router @sailingnaturali/signalk-notification-router Route SignalK notifications to MQTT, a Telegram siren, and an agent webhook — two push lanes with independent failure modes, edge-triggered, severity-aware
signalk-currents @sailingnaturali/signalk-currents Publish CHS/NOAA tidal-current predictions to SignalK — interpolated environment.current at the vessel plus a /currents slack/flood/ebb event series, for a configured station list
signalk-depth-offsets @sailingnaturali/signalk-depth-offsets Derive environment.depth.belowKeel and belowSurface from a DBT-only sounder using measured transducer offsets — zero dependencies
signalk-dsc @sailingnaturali/signalk-dsc Receive, log, and alert on DSC (VHF digital selective calling) calls — distress, urgency, safety, routine — from NMEA 0183 ($CDDSC/$CDDSE) and NMEA 2000 (PGN 129808)
signalk-ais-distress @sailingnaturali/signalk-ais-distress Alert on AIS distress beacons — SART, MOB, and EPIRB survival devices (MMSI 970/972/974) — with emergency notifications, chart markers, a forensic log, and a ship's-log entry
signalk-journey-replay @sailingnaturali/signalk-journey-replay Replay published voyage data (journey-data archives) on any SignalK server — download a trip, press play, timestamps rebased to now
signalk-equipment-registry @sailingnaturali/signalk-equipment-registry Serve a vessel equipment registry — manufacturer/model/serial per installed instance, plus the SignalK paths each owns — at resources/equipment, the identity slot SignalK's schema lacks

Agents & tooling

Repo What it does
naturali-agents Agent skills for Navigator, Engineer, and Logbook — shared persona, prompts, the Poseidon daemon, and HA voice integration
journey-data Real voyage data from S/V Naturali as SignalK delta archives — capture, scrub, and publish CLI; the archives signalk-journey-replay plays back
claude-skills Claude Code skills from this build — /plugin marketplace add sailingnaturali/claude-skills

Shared libraries

Extracted so several consumers reuse one implementation instead of duplicating it. Libraries, not installable plugins — the SignalK plugins above and the MCP servers import them.

Repo What it does
vault-search Local-first hybrid search over the Markdown vaults — BM25 + on-device embeddings (fastembed/ONNX) in one SQLite file, RRF-fused. The retrieval engine behind pilotbook-mcp's plain-language anchorage search
marine-forecast Shared Open-Meteo marine + wind forecast fetch, extracted from weather-mcp so it and pilotbook-mcp compose one forecast implementation instead of duplicating it
signalk-distress-core Shared distress plumbing (@sailingnaturali/signalk-distress-core) — event store, chart-marker builder, spoken/logbook rendering, and notifications — extracted from signalk-dsc so it and signalk-ais-distress share one implementation
naturali-mcp-netutil Tiny shared network helpers for the MCP fleet — resolves .local mDNS hosts to IPv4 at the URL boundary so SignalK reads don't hang on macOS Happy-Eyeballs

What the boat runs on (adopted, not built)

The rule here is adopt before build — the repos above exist only because nothing else filled the gap. Most of what makes this boat work is other people's open source:

Project Role aboard
Signal K The open marine data bus — every sensor, plugin, and agent reads and writes here
Home Assistant Voice in/out, dashboards, and automations — the crew-facing surface
signalk-logbook The ship's log itself — logbook-mcp and signalk-dsc write to it rather than reinventing it
signalk-tides Tide extremes at the vessel — we send patches upstream instead of forking
openmeteo-provider-plugin Free Open-Meteo forecasts into SignalK's weather API — we contributed the marine waves & swell (water.*) the point forecast was missing
signalk-restricted-areas ProtectedSeas marine-protected-area layers and geofence alerts — MPAs, rockfish conservation areas, whale slowdown zones
Eclipse Mosquitto The MQTT spine — alarms, intents, and voice events between boat, agent host, and Home Assistant
Whisper / Piper Speech-to-text and text-to-speech for the voice pipeline, both running locally
Ollama Local inference for small structured tasks — e.g. repairing model output into strict JSON
Tailscale Remote access to boat and shore hosts — WireGuard without the key ceremony

When one of these falls short we file an issue or send a patch before writing a replacement. A new repo in the tables above is the last resort.

Travel storytelling

Off the boat — the trip-content side. Standalone and useful on their own.

Repo What it does
flight-animator Animate multi-stop flight routes on a dark MapLibre map — great-circle arcs, animated trail, no server or sign-in. Built to screen-record and narrate for the Amsterdam boat-build trip videos · flights.sailingnaturali.com
flighty-mcp Read-only MCP server exposing personal Flighty flight history as geo-ready legs (departure/arrival coordinates) — query by date, year, or flight number, and browse aggregate stats

Tides & currents

Open, standalone — usable in any app or agent. Most of this line now lives in Open Waters, the collaboration org where the shared marine data work is maintained.

Repo What it does
slackwater-engine Pure-Swift offline harmonic tide & current engine — heights and the high/low turns for any minute, years ahead, with zero network. Faithful port of neaps, validated against NOAA's own published predictions to a few minutes and centimetres. MIT
slackwater-web Archived, unmaintained. Offline tide predictions for the Salish Sea as an installable web app — no account, no network needed once loaded. Still served at slackwater.sailingnaturali.com; Slackwater continues as a native iOS app
chs-constituents Fit tidal-current harmonic constituents for Canadian (CHS) stations from IWLS predictions (@sailingnaturali/chs-constituents) — out-of-sample validation, confidence tiering, per-gate training-window selection. A pipeline instead of a dataset: the CHS licence forbids redistributing derived data, so you run it yourself and offline prediction follows. MIT
noaa-current-stations NOAA CO-OPS tidal-current station data (@openwaters/noaa-current-stations) — fetcher, extractor, schema, and the API's undocumented behaviour. The public-domain constituent source behind signalk-currents' offline fallback
station-metadata Provider-neutral station identity for tide and current apps (@openwaters/station-metadata) — stable keys and slugs, readable names and context, search aliases, positions corrected off dry land, and current-gate / tide-port relationships. A corrections overlay enriches provider records; the registry defines stations with no upstream identity to correct. Corrections are one-line pull requests. MIT

How it fits together

Three replaceable layers. An agent reads vessel + environment data through MCP servers, reasons over it, and speaks back through Home Assistant.

  Interaction        Home Assistant
                       voice in ──MQTT──▶  │   ◀──MQTT── Piper TTS out
                                           ▼
  Agent runtime      Poseidon daemon (Mac Studio)
                       Claude today — local model when the boat can power it
                                           │
                     ┌──────────┬──────────┼──────────┬──────────┬─────────┬──────────────┬───────────────┐
  Tool surface       ▼          ▼          ▼          ▼          ▼         ▼              ▼               ▼
                  signalk    weather   currents   pilotbook   colregs   logbook   vessel-knowledge   outstations
                   -mcp       -mcp       -mcp       -mcp       -mcp      -mcp           -mcp            -mcp
                     │          │          │          │          │         │              │               │
  Data / vaults   SignalK  Open-Meteo    CHS +   pilotbook-  colregs-  signalk-   vessel-knowledge-   RVYC data
                    bus       NDBC       NOAA       vault      vault    logbook         vault         (bundled)
                                                                       (on boat)

Each MCP server runs standalone and is independently useful — point your own agent at any one of them. The vaults are plain Markdown/GeoJSON the servers read at startup (PILOTBOOK_VAULT_PATH, COLREGS_VAULT_PATH, CURRENTS_VAULT_PATH, VESSEL_KNOWLEDGE_VAULT_PATH). currents-mcp reads live currents from CHS/NOAA via signalk-currents and gate/hazard reference from currents-vault. vessel-knowledge-mcp also runs the loop in reverse: its build-time CLI pushes alarm-zone metadata into SignalK, so the bus raises notifications on its own and the agent only explains them.

Getting started

Start at naturali-agents — the agent skills, shared persona, and daemon that wire the MCP servers into a working crew. It ships a mock SignalK server, so the loop runs on a laptop with no boat:

git clone https://github.com/sailingnaturali/naturali-agents
cd naturali-agents
python dev/mock-signalk.py            # serves a Boundary Pass scenario on :8765
export SIGNALK_URL=http://localhost:8765
uv run scripts/briefing.py --dry-run  # real tides + mock vessel → the Navigator's morning prompt

Each repo's README carries its own install, env vars, and tool surface. Every MCP server is a uv-runnable Python package with its own test suite.


Built in public. MIT licensed. Show the receipts. The build log lives on the engineering blog (source), and the main site at sailingnaturali.com (source).

Popular repositories Loading

  1. claude-skills claude-skills Public

    Claude Code skills from the Sailing Naturali marine-AI build. Install: /plugin marketplace add sailingnaturali/claude-skills

    JavaScript 2 1

  2. signalk-mcp signalk-mcp Public

    MCP server exposing SignalK marine data as agent tools

    Python 1

  3. naturali-agents naturali-agents Public

    Agent skills, the Poseidon daemon, daily briefing, and SOUL.md for the Naturali boat agent system

    Python 1

  4. signalk-dsc signalk-dsc Public

    SignalK plugin: receive, log, and alert on DSC (VHF digital selective calling) calls — NMEA 0183 $CDDSC/$CDDSE and NMEA 2000 PGN 129808

    JavaScript 1

  5. signalk-equipment-registry signalk-equipment-registry Public

    Serve a vessel equipment registry — manufacturer/model/serial per installed instance — as a SignalK resources/equipment resource, and optionally surface that identity on the data model.

    TypeScript 1

  6. signalk-ais-distress signalk-ais-distress Public

    Consume AIS distress beacons (SART/MOB/EPIRB, MMSI 970/972/974) into SignalK notifications, chart markers, and the ship's log.

    JavaScript 1

Repositories

Showing 10 of 30 repositories

People

This organization has no public members. You must be a member to see who’s a part of this organization.

Top languages

Loading…

Most used topics

Loading…