Hybrid AI / live production / family travel

SproutRoute

A hybrid AI travel planner that separates what AI should generate from what must be verified, deterministic, or cached. I defined the product, designed the system architecture, and operate the web app in production.

Stack
Railway + Supabase
AI
Gemini + Places
Quality
350+ tests
Core choice
Facts before prose
Complexity01 / boundaries

The hard parts were in the boundaries.

Users type fuzzy travel intent. The system has to extract constraints, route across external APIs, separate factual data from generative text, keep family-safety information reliable, and avoid turning every trip plan into a slow serial dependency chain.

Fuzzy input

Free text has to become destination, dates, children, pets, travel mode, and planning constraints.

API failure modes

Weather, geocoding, places, policy, AI, and persistence layers all fail differently.

Factual vs generative

Weather, safety, places, and packing must not be hallucinated by itinerary prose.

Latency

Moving from 8-12 seconds required parallelization, caching, and hot-path discipline.

Screens02 / shipped flow

The artifacts should show the shipped flow, not a decorative mockup.

SproutRoute destination search screen
Natural-language destination setup
SproutRoute date picker screen
Date range drives weather and packing
SproutRoute traveler setup screen
Family composition changes constraints
SproutRoute itinerary screen
Verified itinerary surface
SproutRoute packing list screen
Deterministic packing list
SproutRoute safety screen
Safety from verified sources
Architecture03 / evolution

Three architectural stages, each driven by a production problem.

V1: AI-heavy generation

Fast to ship, but slow, expensive, and unreliable for packing and safety.

V2: deterministic packing

Moved packing to rules and routed models by task to improve reliability.

V3: attraction memory

Stored verified attractions with freshness scoring so one trip improves the next.

Current state

Verified data feeds the AI planner; AI writes connective tissue, not facts.

SproutRoute runtime architecture
Runtime architecture
SproutRoute trust architecture
Trust architecture
SproutRoute request lifecycle
Request lifecycle
SproutRoute latency comparison
Latency before and after
Decisions04 / judgment

The page should make the tradeoffs inspectable.

Deterministic packing over AI packing.

Family travel packing is constraint-based. Reliability beats novelty.

Per-task model routing over one global model.

Different steps need different cost, latency, and reasoning profiles.

Cached attraction shortlist over open-ended discovery.

Freshness scoring narrows the search space and improves repeat plans.

Factual APIs separated from generative output.

Weather, places, and safety data need provenance before prose.

Privacy Terms