Inspiration Grocery shopping is deceptively painful. You write a list on your phone, in a notes app, maybe copy-paste from a recipe — and then spend 20 minutes zigzagging through the store because eggs are at the back and you grabbed milk first. The list is never in aisle order. You always forget something and have to backtrack.

We wanted to build the thing that should have existed already: paste any list, in any format, and get back a turn-by-turn route through your actual store.

What it does Bazaar turns a messy shopping list into an optimized, aisle-sorted route at your nearest store.

Paste anything — a recipe, a rambling voice note, a screenshot text — Bazaar understands it Real inventory — items are resolved to actual products at your nearest Kroger, Ralphs, or Vons with live prices and images Aisle-by-aisle route — a pathfinding algorithm orders your stops to eliminate backtracking Voice navigation — start a hands-free voice session and navigate the store without looking at your phone Learns your preferences — remembers which brands you've bought before and selects them automatically next time How we built it Parsing: Claude (Anthropic) handles natural language extraction — turning "2 oat milks, the Oatly kind" or a pasted recipe into structured { name, quantity, unit } objects.

Product resolution: Kroger chains are covered via their official REST API (OAuth2 + product search with aisle/planogram data). Vons has no public API, so we reverse-engineered their web app — using Playwright over a TinyFish stealth Chromium session to intercept live XHR responses from their internal search endpoint.

Routing: A custom pathfinding algorithm in @bazaar/shared groups resolved products by aisle location and sorts stops to minimize total traversal distance.

Voice: Vapi handles the voice session and streams tool calls back to our server, letting the assistant look up items, mark them found, and suggest substitutions mid-trip.

Stack: TypeScript monorepo (pnpm workspaces), Vue 3 + Vite frontend, Express backend, deployed on Vercel (frontend) with a persistent Node server for Vons scraping (Akash). We pull the Chromium image required in the Vons scraping from Chaingaurd images to prevent any CVE's.

Challenges we ran into No Vons API. Vons is one of the largest grocery chains in Southern California and has zero public developer API. We had to instrument a headless browser to navigate their website, avoid bot detection, and intercept the exact network responses that carry product + aisle data — then map that into our shared schema.

Serverless can't run browsers. Vercel's serverless functions have a 50MB limit and no persistent process — Playwright needs neither. We had to architect a split: Kroger runs serverless, Vons requires a long-lived container. This forced us to think carefully about provider routing early.

Aisle data is messy. Planogram data from Kroger's API is inconsistent — some products have precise aisle locations, others just say "Grocery." Building a routing algorithm that degrades gracefully when location data is partial took iteration.

Quantity and normalization. "A dozen eggs," "12 eggs," "eggs x12" all mean the same thing. Getting Claude to reliably normalize these while preserving user intent (organic vs. not, specific brands) required careful prompt engineering.

Accomplishments that we're proud of A working end-to-end pipeline — from free-text input to a sorted, visual store route — in under 5 seconds Multi-chain support from a single UI: Kroger, Ralphs, and Vons all work with the same interface despite completely different underlying APIs Live voice navigation that can handle "add peanut butter" mid-trip without losing your place in the route Learned brand preferences that improve automatically as you use it — no settings panel needed What we learned LLMs are remarkably good at structured extraction from noisy text — better than any regex or NLP pipeline we would have written ourselves. The hard part isn't parsing; it's that the real world (store APIs, planogram data, product naming) is deeply inconsistent and requires a lot of defensive handling.

We also learned that "no public API" doesn't mean impossible — it means more engineering. Browser automation as a data layer is powerful but brittle, and designing around that brittleness (retries, fallbacks, clear error surfaces) is as important as the feature itself.

What's next for Bazaar XR Mobile App - Get a 3D highlight and path traced out via XR More chains — Whole Foods, Trader Joe's, Safeway, Target grocery Shared carts — collaborative lists for households, real-time sync Richer routing — actual store floor plans where available, entrance/exit optimization Receipt import — snap a photo of a past receipt to rebuild a cart instantly

Built With

Share this project:

Updates