Trip plans that hold up
on the day.
Most AI trip planners invent restaurants, quote hours that changed years ago, and schedule walks that aren’t physically possible. Independent testing in 2026 found 9 in 10 AI itineraries fail basic fact-checking.
GraphTravel doesn’t write itineraries. It solves them — over a verified graph of real places, real opening hours, and real street-routed travel times. Every day is mathematically checked before you see it.
Watch the constraint solver work.
Unlike LLMs that hallucinate prose, GraphTravel runs a 5-stage deterministic solver over precomputed street matrices and verified opening hours.
Solve multi-day trips across Rome, Lisbon, and Kyoto with customized taste weights.
Open in Full Planner →Why 9 in 10 AI travel itineraries fail.
Large Language Models are probabilistic text generators — they have no concept of space, time, opening hours, or street topology. Here is what happens when you compare a real AI itinerary against a GraphTravel constraint solution.
Generic AI Travel Planner (ChatGPT / Layla)
FATAL: Vatican Museums are strictly closed on Sundays (except last Sunday of month with 4h queues).
IMPOSSIBLE: Distance is 4.8 km through city center. Requires 62 min walk or 30 min metro, not 20 min.
HALLUCINATION: Historic café permanently shut down in 2016. AI hallucinated it from stale training data.
SILENT DROP: Both require advance timed entry tickets. Arriving at 3pm with no ticket results in rejection.
GraphTravel Deterministic Solver
VERIFIED: Open 09:00–19:15. Explicit provenance warning: 'Timed ticket booking required'.
ROUTED: 12 min walk (750 m) via Valhalla street network. Combined archaeological ticket window synced.
VERIFIED: Real OpenStreetMap node with active 2026 verification timestamp and confirmed operating hours.
CLUSTERED: 15 min walk (950 m). Sights grouped in geographic sector to prevent backtracking.
Built like a compiler, not a chatbot.
GraphTravel treats trip planning as a constrained graph optimization problem. Every itinerary is the product of four deterministic pillars.
Opening Hours Truth Engine
We evaluate standard OpenStreetMap opening_hours syntax using a deterministic interval parser. The solver models split days (Italian riposo), holiday closures, day-of-week rules, and minimum dwell times. If opening hours are unrecorded, we flag them explicitly as unverified — we never guess.
// opening_hours evaluation
const intervals = parseOpeningHours("Tu-Su 09:00-19:00; Mo closed");
const isOpen = intervals.isOpenThroughout(visitStart, visitEnd);
if (!isOpen) return Feasibility.conflict("Venue closed at scheduled arrival");Valhalla Street-Level Matrix
Edges in our graph are precomputed travel times routed along real pedestrian street networks, not straight-line haversine approximations. We calibrate walking speeds to a realistic tourist pace (1.25 m/s) with a measured 1.34× urban detour factor so you never miss a connection.
// Packed Uint32Array travel-time matrix const travelSeconds = matrix.lookup(poiA.id, poiB.id); const distanceMeters = matrix.distance(poiA.id, poiB.id); // Scaled by TOURIST_PACE_FACTOR (1.25 m/s)
Cluster & 2-Opt Sequencing
To eliminate absurd cross-town zig-zags, the solver first partitions candidate sights into tight geographic clusters. Within each cluster, a 2-opt TSP heuristic iteratively untangles route crossings — cutting total walking distance in Rome from 20.3 km down to 9.1 km for the same sights.
// 2-opt route crossing untangling
while (improved) {
for (let i = 1; i < tour.length - 1; i++) {
for (let k = i + 1; k < tour.length; k++) {
if (delta(i, k) < 0) { 2optSwap(tour, i, k); improved = true; }
}
}
}ODbL & Wikidata Lineage
Every coordinate, category, and dwell budget traces back to an OpenStreetMap object or Wikidata entity ID (QID). Where data is missing, we report the gap in our Feasibility Bar rather than quietly inventing filler. Our LLM handles taste scoring and prose — never facts.
// Provenance badge schema
export type PoiSource = {
source: "osm" | "wikidata" | "commons";
ref: "way/1029384" | "Q220";
verifiedAt: "2026-08-19T00:00:00Z";
};How many days is a city actually worth?
Every travel blog answers this question with an opinion. GraphTravel answers it by running the solver at increasing trip lengths to find the exact point where an extra day stops earning its place.
In Rome, a 3-day plan fits 14 major sights with 19.5h of sightseeing. Adding a 4th day only yields 2 marginal stops before sights repeat or require distant travel.
Cities solved down to the street.
A city appears here only once its POI graph, opening hours coverage, and travel-time matrix are fully precomputed and verified.
Rome
Valhalla-routed street network · 0 walk gaps
Lisbon
Calibrated hill & street model · Belém & Alfama clusters
Kyoto
Non-Latin naming & Shinto/Buddhist hours model
Scaling to 55 Global Destinations
Ingesting OpenStreetMap bounding boxes, Wikidata QIDs, and Valhalla street matrices.
Solve under real-world constraints.
Other sites answer long-tail queries with curated blog lists. GraphTravel re-runs the mathematical constraint solver under specific operational bounds.
2 days in Your Destination without the crowds
We down-weight the highest-traffic sights and let the solver build the day around quieter places that are still genuinely worth the time — then check the result is walkable and open when you arrive.
Your Destination in 2 days on foot
Walking only. Every leg is a measured walking time on the street network, and the day is clustered so you never cross the city and come back.
A rainy day in Your Destination
Built assuming persistent rain: indoor places are weighted up, exposed ones down, and the walking between them is kept short.
2 days in Your Destination with kids
Shorter days, more slack between stops, and a bias toward parks, markets and hands-on places over long gallery visits.
Pure TypeScript engine. Zero database I/O during solve.
The engine is decoupled from the database and web framework. It accepts a plain CityGraph and PlanRequest, returning an immutable Itinerary in ~600ms.
The market splits two ways. Both fail.
Every existing trip planner either forces you to do all the manual thinking yourself, or hands the job to an AI that invents facts.
Wanderlog / TripHobo
They have real place data, but they make you do all the thinking. Wanderlog does not generate an itinerary from your inputs at all, and paywalls basic route optimization behind a $39.99/year subscription.
Layla / Mindtrip / AI
They do the thinking, but get the facts wrong. Independent 2026 testing found 9 in 10 AI itineraries fail basic fact-checking. Layla literally pays human contractors to “double-check tricky parts” — an admission the AI is unreliable.
GraphTravel
Thinking that is provably correct. POIs are nodes with verified coordinates, hours, and dwell times. Edges are precomputed street travel times. Itineraries come from a constraint solver, not a language model.
Frequently Asked Questions
Everything you need to know about deterministic graph trip planning.
Large Language Models are probabilistic text generators. They predict the most likely next word, not whether the Colosseum is open at 4:30 PM on a Tuesday or whether walking from the Vatican to the Pantheon in 15 minutes violates the laws of physics. Independent testing in 2026 revealed that 9 in 10 AI-generated itineraries fail basic fact-checking. GraphTravel uses a mathematical constraint solver over a verified topological graph — the LLM is only used for prose and taste, never for facts.