Loading...
Loading...
AI travel planning, ETL-first: the dataset is computed before the question is asked.
I built this AI travel-planning platform ETL-first: a Python pipeline pre-computes the travel dataset into Postgres, then fans out to Elasticsearch, Neo4j, and Qdrant. Answers return sub-second and AI costs stay predictable, instead of a 6-to-60-second LLM call per query. In production on Railway and Vercel.
The naive way to build AI travel planning is to call an LLM for every question. That means 6 to 60 seconds per answer, costs that scale with curiosity, and a product that gets worse exactly when it gets popular. I wanted sub-second answers, predictable spend, and data I could actually test, which meant treating AI as a layer over a computed dataset rather than a substitute for one.
I built the platform ETL-first inside a pnpm monorepo. A Python scraper with a hard $50 budget cap collects and normalizes the raw travel data into Postgres: 84 entities, over 400k rows of travel content, managed through 159 additive-only migrations that a lint hook enforces, so nothing gets deleted, ever. From Postgres the dataset fans out to three query stores: Elasticsearch for search, Neo4j for relationships, Qdrant for semantic similarity. The NestJS 11 + MikroORM backend serves it through 4,862 tests, the Next.js 15 front end through 72 Playwright specs, and the AI layer passes a promptfoo eval suite at 97.8%. Every one of the 117 tables is RLS default-deny.
Travlist is in production on Railway and Vercel. Answers that would have taken an LLM call per query return in sub-second time from the stores, and the AI budget is a known monthly number instead of a surprise. The eval suite catches prompt regressions before deploys, and the no-deletes migration rule means the 400k-entity dataset only ever grows.
Have a project like this in mind?
START YOUR PROJECT