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
On-boat AI agent system — Navigator, Engineer, Logbook — built on the Claude API, wired to SignalK via 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 |
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 |
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 |
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-ntfy-relay | @sailingnaturali/signalk-ntfy-relay |
Push SignalK notifications (alarms) straight to your phone via ntfy — zero dependencies, 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-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 |
| Repo | What it does |
|---|---|
| naturali-agents | Hermes Agent skills for Navigator, Engineer, and Logbook — prompts, bridge scripts, and HA voice integration |
| 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 |
| 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 |
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 |
| ntfy | Push notifications to phones — the far end of signalk-ntfy-relay |
| 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.
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 Hermes Agent (Mac Studio)
Claude API (Sonnet) — local model deferred
│
┌──────────┬──────────┼──────────┬──────────┬─────────┬──────────────┬───────────────┐
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, VESSEL_KNOWLEDGE_VAULT_PATH).
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.
Start at naturali-agents — it wires the MCP servers into a working agent and ships a mock SignalK server, so the whole 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
hermes chat -s naturali/navigator # ask the Navigator anythingEach 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).