Boats that exist, numbers that are real
The engine used to invent transportation when geography got wet: a Honolulu–Maui ferry (dead since 2009), trains from Finland to Tallinn straight across the Gulf of Finland, and one 40 km/h formula pricing every boat on Earth. v0.7.0 replaces all of that with real data — still zero keys.
Ferries are now a real mode
- 85 researched passenger-ferry corridors ship with the app (
data/ferries.json): actual terminals, operators, crossing times, sailings per day, and fare bands checked against operator/aggregator pages. Every entry cites its source and date. - A ferry leg only exists where a corridor does. Helsinki–Tallinn is Tallink/Viking from $14; Dar es Salaam–Zanzibar is the real Azam boat (and yes, that split gets recommended — it clears the $200 rule); Maui simply gets no ferry, because there isn't one.
- A land/water grid (Natural Earth, 0.25°) plus a sea-gap detector stops land legs from crossing open sea. Calibrated against a 29-pair corpus so the Channel Tunnel keeps its trains and Barcelona–Valencia keeps its coastal rail while Turku–Tallinn loses its imaginary one.
Real numbers, keyless
- Real ground timetables via Transitous — real operators, departures, and door-to-door times on train/bus/ferry legs, in the server and the static browser build. Fares on those legs stay labeled estimates; schedules are open data, ticket prices aren't.
- US fares anchored to reality: a bundled extract of the BTS Consumer Airfare Report (public domain) with real average fares for ~4,100 US city-pair markets. The model gets clamped into each route's real band — thin expensive routes (Aspen, Jackson Hole) stop being underpriced — and the itinerary shows the real market numbers next to the estimate.
- Place search and weather now work with no keys: Photon and Open-Meteo replace key-gated Geoapify/OpenWeather defaults (Geoapify stays as the keyed upgrade). Live FX for non-USD fares comes from frankfurter.dev with the old table as offline fallback.
One-command trips
hopandhaul go JFK "Tallinn" --date 2026-08-15
The full pipeline — direct vs splits, real ferries, anchored fares, live schedules, the $200 rule, leg-by-leg itinerary with provenance — in a terminal, zero keys.
Removed
- The Amadeus flight fallback. Amadeus decommissions its entire self-service API portal on 2026-07-17; better removed deliberately than broken silently next week. Duffel remains the (optional) live-fare provider.
Gates
ruff clean · 12 module selftests · 57/57 Python↔JS parity cases (8 new: ferries, sea gaps, anchors) · both UIs verified in a headless browser · cold-verified end to end.
Data sources and licenses are listed in the README's new attribution section.