Skip to content
Sailing Trips

Sailing Trips

Nineteen Pins Are Not a Route

Somewhere between the first glass of wine and the decision to charter a boat, a Croatian sailing holiday exists only as a pile of saved places in Google Maps. Nineteen of them, in my case: beaches, a couple of konobas, a marina, one anchorage, and a pin optimistically labelled “Best viewpoint” with no further explanation.

A pile of pins is not a route. A route needs an order, daily distances a crew can actually sail, and — the part nobody thinks about until the sun is going down — somewhere at the end of each day where you can safely spend the night, that isn’t already full and isn’t exposed to whatever the wind is doing that week.

So I built a planner for it: a repo that takes the favourites in one end and produces a complete, shareable Törnplan out the other.

It’s live at sailing.altbrot.at — an overview of every trip, each one with its itinerary, its located places, its bad-weather fallbacks and its provisioning plan.

What the Planner Actually Does

1. It locates the pins

The first obstacle is delightfully stupid. The Google Takeout export of your saved places contains a URL column, and that URL contains a Google feature ID0x1334a…:0x6f4a2… — and no coordinates whatsoever. You export your favourite bays from a mapping service and receive a list of opaque hex strings.

So step one is locating all nineteen again by name, into places.md. Each one gets an island, a bay, coordinates, and two things that matter far more than the coordinates:

  • Mooring type — marina, buoy field, konoba jetty, anchorage-only, or day-stop-only.
  • Wind shelter, written in terms of the three winds that actually decide your evening: Bora from the NE, Jugo from the SE, Maestral from the NW.

Vague pins get a confidence rating instead of false precision. “Best viewpoint” was resolved to Metlina, the highest point on Kornat, marked medium confidence, with two alternative guesses written down underneath.

2. It clusters them into days

Only once every pin has a mooring rating can the route happen, because the mooring ratings are what constrain it. The house style is refreshingly unambitious and completely non-negotiable:

Leave in the morning → one or two swim bays → overnight on a konoba buoy, a buoy field, or in a marina. Anchoring overnight only in emergencies. Roughly 20–30 nm a day.

That middle clause does the heavy lifting. Ruling out overnight anchoring eliminates perhaps half the prettiest bays in the Kornati and forces the route to hop between a small number of places that have mooring buoys — most of which cannot be reserved, which means arriving early, which caps the daily distance. The route is downstream of the buoys, and getting that dependency the right way round is most of the value.

3. It writes down what it rejected, and why

My favourite feature, and the one I didn’t expect to care about. Every place that didn’t make the route gets a line explaining the reason: too far north-west for this loop, mainland side, too shallow for a keel, poor reviews, replaced by something better on the same day. The two konobas at Lojena on Smokvica Vela were cut with the note that including them would drag a 25 nm day back into the schedule.

Six months later this is the difference between a route you can trust and a route you have to re-derive from scratch. Remember Lojena, though.

4. It produces the boring, essential documents

OutputWhat it’s for
README.mdthe route: day-by-day table plus skipper’s notes on approaches, buoy depths, reservations
places.mdevery favourite located, with mooring type and wind shelter
toernplan.htmlthe shareable itinerary — self-contained, opens on a phone
schlechtwetter-plan.mda named fallback harbour for every single leg
einkaufsplan.mdthe provisioning plan

The provisioning plan is where the constraints stop being nautical:

Crew of eight. Two children, one vegan, one pescetarian, four adults who eat meat occasionally — two of whom don’t eat fish. One shop on the entire route, a small Konzum in Sali. The resulting document instructs the cook to finish every dish vegan first, remove a portion, then add the cheese or the fish. One pot, eight people, no negotiations at sea.

5. It ships

A small Flask app scans trips/ at runtime — each folder is a trip, an optional trip.json supplies the metadata for the overview page. Three routes, a health check, and a Markdown dependency; the app deliberately knows almost nothing. Azure Pipelines bakes the app and the trips and the favourites into a Docker image on every push to main, so the host only ever needs the one docker-compose.yml and a docker compose pull.

This is an unreasonable amount of infrastructure for one week of sailing and I regret nothing.

The Route It Drew

Six legs out of Biograd na Moru, 121 nm, up the sheltered inside of Dugi Otok to the island’s north-western tip and back down through the Kornati:

The planned route: 121 nm in six legs out of Biograd, up the inside of Dugi Otok to Veli Rat and back down through the Kornati national park
The planner's proposal — five nights on a buoy or a konoba jetty, two in a marina

DayDateLegnmNight
1Sun 19 JulBiograd → Mala Rava30buoy, Trattoria Mala Rava
2Mon 20 JulRava → wreck of the Michelle → Sakarun → Čuna28buoy, Veli Rat
3Tue 21 JulČuna → Sali24marina, dinner at the Maritimo
4Wed 22 JulSali → Telašćica / Uvala Mir → Vrulje13buoy, Konoba Robinson
5Thu 23 JulVrulje → Kameni Žakan9buoy field
6Fri 24 JulKameni Žakan → Murter (diesel) → Biograd16marina

The centrepiece of day 2 is a 76-metre Italian freighter that ran aground in 1983 about a mile north of the Veli Rat lighthouse and now sits in three to five metres of water — a wreck you can snorkel on your way to a beach. Day 4 is deliberately short so there’s time for the salt lake at Uvala Mir. Every leg has a named bad-weather harbour behind it.

It’s a genuinely good plan. Read it now and you can see the reasoning behind every night.

And Here’s the Route We Sailed

The route actually sailed: 115.8 nm, with the planned route shown faint for comparison
115.8 nm sailed against 121 nm planned — the planned route is the faint dotted line

115.8 nm against 121 planned. The rhythm survived exactly as designed — 13 to 27 nm days, morning departures, a buoy by evening, never anchoring overnight. The destinations moved around a fair bit.

NightPlannedWhere we actually slept
1Mala RavaMala Rava
2Čuna, behind the Veli Rat lighthouseUvala Veli vodenjak, Mali Iž
3SaliUvala Veli vodenjak again
4VruljeUvala Modri Bok, 0.7 nm along the coast
5Kameni ŽakanUvala Lojena, Smokvica Vela
6Marina BiogradMarina Biograd

Why it moved

The weather took the northern loop. Monday morning we left Mala Rava and motored north-west up the channel towards Sakarun and the wreck — for about an hour, until a front coming out of the north-west made the rest of that day a bad idea. We turned round off Dragove at 09:29, came back down the same channel, took a long stop off Savar and spent the night on a buoy in Uvala Veli vodenjak instead. The northern third of the route simply didn’t happen, and the wreck of the Michelle is still out there unvisited.

Then we stayed there. The forecast kept us in Vodenjak for a second night, which is what a bad-weather plan is for. That knocked out the Sali overnight — by the time we’d have arrived the marina might well have been full anyway, and there is a strong argument, when you are already lying to a good buoy in a beautiful bay, for simply not moving. It was a much nicer place to be than a marina berth. Sali still happened, just as a Wednesday-morning stop for stores and diesel on the way south.

And some bays were just better. On the Thursday we passed 0.6 nm from Kameni Žakan — the buoy field we were supposed to sleep in — decided we liked the look of further on, rounded Rt Opat and tied up at Lojena instead. Which is, of course, precisely the place the planner had cut for being one leg too far south. It was the right call. It was also the only day of the week that was properly sailed rather than motored: four hours at two and a half to three and a half knots.

The storm, in the end, never really arrived. That’s how it goes.

What Held Up

Part of the planVerdict
The daily distancesHeld perfectly. 13–27 nm days, exactly as designed.
Locating every pin with a mooring type and a wind ratingThe highest-value work in the repo.
A named fallback harbour for every legUsed on day 2, and the reason day 3 was a comfortable decision rather than a scramble.
Writing down why places were cutBest feature. It’s how I know Lojena was a deliberate change of mind and not an accident.
Committing a specific bay to a specific nightOptimistic. Four of six moved — and mostly for good reasons.

The pattern is clear enough, and it’s a useful one for the next trip: the planner should commit hard to distances, shelter and mooring type, and offer the bays as a ranked menu rather than a schedule. Which is roughly what places.md already is — it just needs to be the primary output rather than the supporting one.

A note on the second chart. The phone logbook only recorded three of the seven days, and threw in two days from a completely different trip in May for good measure. The solid lines are GPS; the dashed ones are reconstructed from the skipper’s account, routed with A* over a rasterised OpenStreetMap coastline so the lines at least stay in the water — which is more than can be said for the route-planner tracks, one of which contains a 16 nm straight line directly across the island of Pašman.

Status

Repo: sailing-trips — the planner, the Flask app, the pipeline. Live: sailing.altbrot.at Trips planned: two. A northern loop through the Zadar archipelago to Molat, Olib and Pag is already drawn up — built entirely from the favourites that were too far north-west for this route, because the planning pass produced more good places than one week can hold. Trips sailed: one, and it was excellent.

The wreck is still there. It’ll keep.

Last updated on