The Routing Engine
Weather routing that shows its work
The incumbents popularized routing as a service you trust on faith. OpenSail's bet is the opposite: a Rust isochrone solver fast enough to be interactive, honest enough to explain every route it refuses, and careful enough to check every segment against real bathymetry and real coastlines.
What makes a route trustworthy
Real depth, your draft
GEBCO 15 arc-second bathymetry (~460 m cells) enforces your keel to roughly a mile from shore. Where the data is not trusted, the segment says so: depth confidence is per leg, not a vibe.
Land-proof segments
Every leg of every returned route is checked against high-resolution land polygons. Not the grid cells, the actual segment geometry. A route that clips a cay is a bug, not a shortcut.
Gust-aware safety
Real forecast gusts (GFS GUST, ECMWF 10fg) gate the route against your crew's wind ceiling, not a guessed multiplier on sustained wind.
Four modes, one physics
Fastest, balanced, family, and comfort plus score every leg for heel, slamming, and motion comfort. Same storm, same boat: family mode trades a little VMG for a watch schedule your crew will keep.
Bounded compute
A hard 45-second solver budget, run as an async job. Half a million candidate states pruned by admissible dominance filtering, no garbage collector in the hot loop.
Structured refusals
When no safe route exists you get the reason, enumerated and mapped: shallow rejections, land rejections, exhausted wavefront. Never a silent failure.
Provenance on every route
Every returned route carries per-segment provenance: which solver, which weather run, whether depth was verified. If a claim on this page were false, the product itself would contradict us, which is the point. You can also drive the same solver from the public API, something neither incumbent offers.
Weather inputs come from the models on the data page, and every route can be re-checked against a second model with model agreement.
segment 14/38 solver=rust source=zarr(gfs 06z) depth_verified=true min_depth=8.2m wind 14 kt @ 112° gust 19 kt comfort 84 heel 11° verification: PASS 0 land crossings · draft 1.8 m enforced
What it does not do
Honest limitations
- A route is a plan, not navigation. Depth gating uses the best open bathymetry there is; it still cannot see last winter's shoaling. Your chart and your eyes remain the authority within a mile of anything hard.
- Routing quality is bounded by polar accuracy. If your polar says the boat does 7 knots upwind and it does 5, the ETA is fiction, whichever app computed it.
- The solver optimizes sailing; motoring assumptions in light air are explicit settings, not silent magic.
Frequently asked questions
What is isochrone routing?
An isochrone is the set of every position your boat could reach in a fixed time. The solver expands these reachability fans hour by hour: from each frontier position it tries headings, looks up your boat speed for the forecast wind from your polar table, applies currents, and keeps only the positions that are not dominated by a better one. Chain the fans together and the fastest (or most comfortable) path to the destination falls out. It is the same family of technique Volvo Ocean Race navigators use, computed in native Rust so it stays interactive.
Why is the solver written in Rust?
A global route can prune half a million candidate states. Doing that in a garbage-collected language means unpredictable pauses in the hot loop; doing it in Rust means the 45-second compute budget is spent on physics, not memory management. Rust also makes the safety-critical parts (land checks, depth gates) easier to test exhaustively.
How does depth gating work? Will it run me aground?
Coastal legs are checked against GEBCO 15 arc-second bathymetry, roughly 460 meter cells, enforced against the draft you set on your vessel. Where the bathymetry is not trusted, the route says 'check your chart here' per segment instead of guessing. It is a planning aid with disclosed confidence, not a substitute for your chart or your eyes; no routing product should claim otherwise.
What polars does it use?
Each vessel gets a polar table: defaults by vessel type that you can adjust. The routing result is only as honest as the polar, which is why comfort modes matter; they derate the same polar differently rather than pretending your family cruises at race trim.
Why did it refuse my route?
Because refusing loudly beats failing silently. When no safe route exists within the compute budget you get an enumerable reason: shallow rejections clustered on the chart, land rejections, or an exhausted wavefront. You can see exactly where the solver gave up and why, and usually fix it by adjusting draft, departure, or destination.
How long does a route take to compute?
Interactive routes typically return in seconds; the hard ceiling is a 45-second solver budget with the work running as an async job so the app never hangs. If the budget is exhausted you get the structured refusal above, never a spinner that gives up silently.
Keep exploring
Put a real route on a real chart
Coastal routes up to 200 nm are free with the full safety stack. No card required.
Plan a passage