Back to blog

I built an iOS chartplotter for my 1996 catamaran while crossing 400nm of open ocean

My boat is a Prout Snowgoose 37 Elite, built in 1996. The Raymarine ST60+ instruments and ST8000 autopilot on board are over 20 years old. A full replacement with modern gear would run about $40,000. The Mediterranean chart pack alone is around $400.

I built my own chartplotter instead. iPhone and Apple Watch front end, talking to the original 20-year-old hardware. Total new hardware cost: $120, for a galvanically-isolated SeaTalk1↔USB bridge (gadgetpool.eu) plugged into a Raspberry Pi 3+ I had lying around. The Pi runs SignalK, an open marine data bus.

Raspberry Pi 3+ and white SEATALK-LINK USB bridge from gadgetPool.de, held next to a tangle of boat wiring
The whole brain: a Raspberry Pi, a SeaTalk1↔USB bridge, and a lot of 30-year-old wiring.

I call it vibe sailing. You vibe code while you sail. Sometimes the boat steers itself in the wrong direction.

Depth graph showing seabed profile across 60 minutes: peaks shallow to 21.3m, drops to 76.7m, currently 42.3m
Live depth, 60-minute history. The shallow spike is a seamount I sailed over.

The moment it almost went wrong

I wrote most of this during a 400nm singlehanded crossing from Malta to Greece, in international waters, over Starlink.

First time I tried to send a course command, I tapped "1° to port."

The boat turned 10° to starboard — aggressively enough to stall the sails. Not a confidence-builder.

SeaTalk1 is an oddball: 4800 baud, 9-bit framing, half-duplex. It's a proprietary bus, and somewhere between the docs floating around the internet and Claude's interpretation of them, the command bytes came out wrong. So I stopped relying on documentation and let the boat teach the protocol — Claude listened to the bus while I pressed buttons on the physical autopilot head, captured the real frames the ST8000 emits, and replayed them. After that, the protocol layer just worked.

iOS chartplotter autopilot screen — compass, SOG 4.9kts, course adjustment buttons, Pi connected
Autopilot view once the bytes were right: tap ±1° or ±10° to nudge course, STBY disengages.

The lesson: on proprietary buses, the hardware is the spec. Everything else is a guess.

The EU gave me the charts for free

Commercial vector charts for the Mediterranean cost hundreds of dollars and are locked to specific chartplotter brands.

Then I found that the EU publishes open bathymetric data for European waters. It's raster — fine for a heatmap, useless for a chartplotter that needs depth contours. So I wrote Python scripts (GDAL + rasterio + contour extraction) to vectorize it into proper depth lines, the way commercial charts render. As far as I can tell from sailing on it, the result is on par with what people are paying $400 for.

Chart view with vectorized depth contours, anchor circle, and AIS targets around the boat
Chart view rendered from my own vectorized contours — boat with anchor circle, nearby AIS targets.

If there's interest, I'd happily share the vectorized depth dataset I generated — let me know in the comments.

The wrist moment

The feature I didn't know I wanted:

I'm leaving a Greek harbor singlehanded. The boat needs steering; the fenders need stowing, lines coiling, deck clearing. Normally this is a two-person job — one at the helm, one on deck. Solo, it's a sequence of dashes back to the helm between every task.

Now I walk the foredeck, stowing fenders, and steer from my Apple Watch. The old fishermen on the pier did a proper double-take.

Apple Watch autopilot view in AUTO mode — wind rose, heading 000°, AUTO button
Apple Watch autopilot view in STBY mode — heading 024°, course nudge buttons
AUTO mode (the watch is steering) on the left. STBY with ±course buttons on the right.

The thing that quietly changed how I sail

Rolling history graphs — 5, 30, and 60 minutes — for SOG, wind speed, wind angle, and heading.

Singlehanded, you trim the sails, then you forget. You're doing six other things. Half an hour later you have no idea if the trim helped. With the history view, I trim, do my other things, then look back: yes, SOG went up 0.4 knots after I eased the genoa. Or: no, the traveler adjustment did nothing, the wind just shifted.

Wind instruments grid at 16.3kts true wind speed, 30-minute history
Wind instruments grid at 6.0kts true wind speed, 60-minute history
Same view, two passages: 16kts of breeze on the left, 6kts on the right.

Every passage is now a slow experiment on my own boat. I also log every byte off the bus so I can eventually compute a real polar diagram for this specific boat — not a generic one from a 1990s brochure. AIS doesn't ride on SeaTalk1, so for now I pull public AIS feeds for collision awareness. Plugging my onboard Raymarine AIS650 directly into the Pi over USB is the obvious next step — held up, embarrassingly, by a USB mini-B cable that turns out to be weirdly hard to find in the Aegean.

Detailed True Wind Speed graph, 60-minute view, min 3.9 / avg 12.3 / max 21.2 knots
Tap any tile to zoom in. Min / avg / max over the window — the part that tells me if a trim change actually mattered.

Anchor watch from a café

The Pi stays on the boat; I reach it over Tailscale (zero-config private network) from anywhere with internet. From a café in town I see wind, position, and motion. An alarm daemon on the Pi triggers thresholds I set from the iOS app — anchor drag, wind over X knots, position outside a circle.

Anchor watch view, status HOLDING (green): boat sitting at 36m from anchor, depth 4.4m, wind 13kt
Anchor watch view, status WARNING (orange): wind has built to 15kt, boat sitting to one side, watch for drag
HOLDING on the left. Wind builds, the boat swings to one side — WARNING on the right.

Traditional anchor watch is a crew member sitting up to make sure the boat hasn't dragged. Mine doesn't sleep.

I can spend a full day ashore now without the low-grade dread of not seeing the boat.

I outran a crew of three by 27 hours

PredictWind has the best small-boat weather routing I know of. It's what teams use in the Vendée Globe and The Ocean Race — high-resolution wind models plus a router that finds the fastest path between two points given the forecast and a boat's polar. Every cruiser I know who passage-plans seriously subscribes.

What PredictWind doesn't have: an API. I asked. We had a friendly phone call, and they politely declined.

So I reverse-engineered the web app. This is the kind of project that used to take a week of squinting at network traffic; with Claude doing most of the squinting, it took an evening. The result is a small Python client running headless on the Pi. I set a destination in the iOS app, the Pi pulls the latest PredictWind routing GPX every few hours as the forecast updates, and the chartplotter steers the autopilot toward the next routing waypoint. The reverse-engineered client is still a bit buggy and will need some hardening.

Then I sailed Malta → Greece with friends on a comparable cruising boat — almost the same length, similar vintage, same PredictWind subscription. Three of them on board, I was solo. We were headed to the same Greek anchorage.

I left 15 hours after them. I arrived 12 hours before them.

A 27-hour delta on a 400nm crossing — about a quarter faster, on the same forecasts, in comparable boats. The difference: they were consulting the routing on a phone now and then. My boat was executing it continuously while I slept.

A distant catamaran on a calm blue sea, sailing on the Aegean
Sunset over the Aegean from the deck of the catamaran, sail and rigging silhouetted against an orange sky
Underway, Malta → Greece. A friend's boat in the distance; night watch coming on.

The takeaway isn't that AI is smarter than a sailor. It's that one person with well-integrated AI can now outperform three. The same data, in the same kind of boat — but in the loop, not on a phone.

Safety

The autopilot has its own physical engage/disengage. Standby is one button on the original head. The iOS app is a nicer remote, not an unattended captain — I'm always at the helm or seconds from it when the pilot is steering. The Pi runs on a dedicated 12V circuit I can pull. If everything I built fails, the boat is what it was, which has worked fine for 30 years.

The honest AI part

Claude was great at SignalK plumbing, SwiftUI, the watchOS target, and turning captured byte streams into a working SeaTalk1 decoder. It was useless at deciding what data I actually needed at 3am on night watch. Sailor's judgment plus the model's typing speed is what made this possible in the time I had.

The point

For 20 years, sailing this boat the way I now sail it would have meant $40,000 of new electronics, or three crew, or both. I did neither. Solo plus AI — AI in the loop, not on a phone — is what's new. One person doing the work of three. That shape isn't unique to boats; it's just where I happened to test it.

I haven't put the code on GitHub yet, but if anyone wants to look at it — especially anyone who's been deeper into SeaTalk1, NMEA2000, or SignalK than I have — I'm happy to share it. Drop me a line.

— Written between night watches, somewhere between Malta and Greece.