Skip to content

Cruises

Cruises are one of TravStats’ three live domains, beside flights and lodging. A cruise lives in the same database, on the same map, and in the same statistics — a trip can mix all of them. This page covers the data model, the ways to add a cruise, the editable sea route, and what cruises add to the maps, stats and achievements.

A cruise is a voyage with an ordered list of stops:

  • Voyage — ship, cruise line, departure port, arrival port, start/end date, cabin number, cabin type (inside · oceanview · balcony · suite), deck, booking reference, price with its currency, status (scheduled · completed · cancelled · historical), the trip it belongs to, plus tags and companions.
  • Stops — each stop is either a port call (a real port, with optional arrival/departure times and an excursion note) or a sea day (a day at sea, no port). Day numbers stay consecutive (1, 2, 3 …).

Scheduled cruises whose end date passed more than 48 hours ago flip to completed automatically; cancelled and historical entries are never touched.

Click + Add cruise (on the Cruises page or the dashboard’s cruise tab) and pick a method — the same chooser style as the flight add flow:

Drop in a booking confirmation as an .eml/.msg/.txt email or a PDF — the file format is auto-detected, and so is the kind of document: you do not have to tell the dialog it is a cruise. A local LLM (Ollama, e.g. gemma3:12b) extracts the whole booking:

  • ship, cruise line, start/end dates, cabin (number, type, deck), booking reference and price;
  • the complete itinerary — every port call and every sea day, in order;
  • any fly & cruise flights bundled with the booking (see below).

AIDA and TUI Cruises / Mein Schiff confirmations are handled directly; other lines (MSC, Costa, Cunard, NCL, Royal Caribbean, …) go through a generic LLM path. Because LLM extraction is never perfect, you always land on an editable review screen before anything saves:

  • every field is editable inline — ship (matched to the catalogue by name, or flagged if unknown), dates, cabin, price, booking reference;
  • the itinerary opens in a stops editor where you can fix ports, toggle sea days, reorder and renumber;
  • ports the parser couldn’t match to the catalogue are flagged so you can pick the right one;
  • mis-read values are obvious and quick to correct.

The parser fills in only what the document says: a confirmation without flight numbers no longer arrives with an invented one, and the price is the total actually charged after discounts, not one guest’s pre-discount fare.

Cruise bookings are often “fly & cruise” packages that also list flights. The importer pulls those out too and offers them as opt-in flight cards in the same review screen:

  • flight number, airline, cabin class and a date are pre-filled from the booking (exact times are usually only released ~4 months out, so the flights save as scheduled);
  • airports are pre-filled — your home airport on the home side, and the nearest airport to the embarkation/disembarkation port on the cruise side — and are fully editable;
  • a single tick groups the cruise and its flights into one trip, so the journey map draws the whole fly → cruise → fly route.

The form for older voyages nobody has a confirmation for any more. A ship picker matches the catalogue (or lets you add a custom ship), and the stops editor builds the itinerary port by port.

TravStats ships with seeded ship and port catalogues. Both are extendable — when a picker can’t find a ship or port, add it inline with its details (a port needs a name and coordinates). User-added entries are preserved across catalogue re-seeds.

When resolving ports from an imported booking, the matcher is forgiving about spelling and language: it strips accents, understands German exonyms and local endonyms — so Rom and Roma both resolve to the cruise port of Civitavecchia, and Florenz to Livorno — and falls back to fuzzy matching for close spellings.

Cruise routes are drawn as sea routes, not straight lines. An in-house router traces real shipping lanes — the vendored Eurostat marnet network, walked with A* — between consecutive ports, and the map renders a smooth spline through those waypoints. When a leg has no navigable path (a truly disconnected sea), it falls back to a direct line so nothing ever looks broken.

Cruises share the same 2D map and 3D globe as flights. The dashboard’s Cruises tab offers four views:

  • Sea routes — the default; every voyage drawn along its shipping lanes.
  • Itinerary — each port call marked and numbered in visiting order.
  • Port frequency — ports sized by how often you’ve called there.
  • Globe — the same cruise routes wrapped onto the 3D globe.

In the Cruises tab each voyage gets its own distinct colour so you can tell overlapping itineraries apart — auto-assigned from the cruise, with an optional custom colour you can set per cruise. Colouring is an explicit mode in the map settings and the legend follows it. The distance unit setting governs cruise distances too.

The router is good, not perfect. On the cruise detail page, Edit route opens the editor full-screen — a leg in the small preview card was a hairline nobody could hit. Tap a leg and drag its waypoints; insert new ones on the guide line, remove them on hover; undo and redo the whole gesture chain. Clicking a different leg switches to it. Right-clicking offers what fits under the cursor — edit that leg, delete this waypoint, delete the selection, simplify, close — and a Select tool turns the drag into a box so several waypoints go at once, the ports never among them. One undo takes a box-delete back whole.

The corrected line is stored with the cruise and its distance replaces the routed one; “back to automatic” returns the leg to the router at any time. A leg arriving with dozens of raw router points presents at most 25 handles — the ones that carry the shape.

Cruise figures have a tab of their own on the statistics page and feed the cross-domain overview: distance at sea (measured along the sea route, the same distance the badges use), ports, sea days, ships, cruise lines, regions, the sea-day share (which cannot exceed the days sailed), loyalty streaks. Only a voyage that has ended counts; a booked cruise is reported beside the total, not inside it.

Cruise money is reported per currency and never summed. A cruise carries its price in the currency it was paid in and no exchange-rate snapshot, so the page lists “3 cruises in EUR, 1 in USD” with a total for each rather than inventing one number. See Money & currencies.

Cruises bring their own achievement set, unlocking automatically as you log voyages — for example:

  • Counts — Leinen los (first cruise) → Sea Explorer (5) → Cruise Enthusiast (10) → Seven Seas (25) → Neptune’s Favorite (50).
  • Ports — Port Hopper (5 unique ports) → Harbor Tour (25) → Harbor Master (50), plus Mega Cruise (10+ ports on one voyage).
  • Ships & lines — Captain’s Log (first ship) → Fleet Sampler (5) → Naval Curator (15); Loyal Sailor, Line Hopper, and the hidden Carnival Collector (sail all eight Carnival-group brands).
  • Distance — Coastal Runner (5 000 km) → Open Water (20 000) → Bluewater Captain (50 000) → Circumnavigator (100 000 km, ≈ 2.5× around the Earth).
  • Sea days — starting with Sea Legs (your first day at sea).

Cruise badges unlock only for voyages that have happened, and the distance ladder measures the sea route, not straight lines across land. Flight achievements are untouched — the domains unlock independently.

A trip groups flights, cruises and stays into one journey with its own page and cross-domain map. Fly & cruise imports create the trip for you; the cruise form has a Trip selector for attaching a cruise to an existing trip by hand, and on the trip’s timeline a cruise expands in place to show its itinerary day by day.

A port call proves a country the way a landing does: a call spanning a night counts as slept, a same-day call as visited. So a country reached only by ship appears in your country count and on the passport — see Countries & passport.