Inspiration
Grocery prices in Canada have skyrocketed. In 2024, food inflation hit 9.8%, and Canadian families are spending over $15,000 annually on groceries. What's frustrating is that the exact same product can cost 20-40% more depending on which store you visit.
We've all been there standing in the aisle wondering, "Is this cheaper at No Frills?" But manually tracking prices across stores is exhausting, and driving to multiple stores might cost more in gas than you actually save.
We wanted to build a tool that answers a simple question: Where should I shop, and is it worth the trip?
What it does
Savour is a real-time grocery price comparison platform for Canadians that goes beyond simple price lookups.
🛒 Compare Prices Instantly Search across 1,000+ products from 5 major Canadian grocery chains (FreshCo, No Frills, Metro, Loblaws, Walmart) and see which store has the best deal.
📊 Smart Basket Analysis Add items to your cart and we calculate:
Best single-store total Optimal multi-store split (buy each item from its cheapest source) Your annual savings projection (52 x weekly savings) 🗺️ Route Optimizer with Cost Analysis This is where Savour gets smart. We calculate whether multi-store shopping is actually worth it by factoring in:
Net Savings = Grocery Savings - (Gas Cost + Time Cost)
Where:
Gas Cost = (Distance in km / 100) * Fuel Efficiency (L/100km) * Price per Liter Time Cost = Trip Time (hours) * Hourly Value If net savings is negative, we recommend sticking to a single store.
✨ Interactive Onboarding We built a guided interactive tour to help new users instantly understand the value proposition. We walk them through searching, comparing, and optimizing their trips so they don't feel overwhelmed by data.
🍳 AI Recipe Generator Turn your basket into a meal! Our Gemini-powered assistant creates recipes using your cart items, highlighting current deals and cost-saving swaps.
How we built it
Frontend:
- React + TypeScript with Vite for fast development
- TailwindCSS for responsive, modern styling
- React Joyride for the interactive user onboarding tour
- Leaflet.js for interactive route maps
- Deployed on Vercel for high-performance edge delivery
Backend:
- FastAPI (Python) for a high-performance REST API
- MongoDB Atlas for storing product catalog, prices, and store data
- OpenRouteService API for real-world driving distance and route calculations
- Google Gemini 2.0 Flash for AI-powered recipe generation
- Deployed on Railway with Docker containerization
- RAG Pipeline for Recipes: Our recipe generator uses a Retrieval-Augmented Generation (RAG) approach:
- When a user requests a recipe, we query MongoDB to retrieve items from their cart using keyword matching on product names and search terms.
- We build a context string containing each item's name, unit, cheapest store, price, and any active deals.
- This context is injected into a structured prompt and sent to Gemini 2.0 Flash.
- The LLM generates a grounded recipe using only the retrieved ingredients, with cost-awareness baked in.
Route Optimization: For multi-store shopping, we implemented a nearest neighbor heuristic to calculate the optimal store visiting order, then call OpenRouteService to get accurate driving distances and times. We built a fallback using haversine distance estimation in case of API failures.
Challenges we ran into
Deployment & Infrastructure Splitting the monorepo into two separate services (FastAPI on Railway, Vite on Vercel) introduced CORS and environment variable challenges. We had to carefully configure the build pipelines to ensure they could communicate securely in production.
Price Data Normalization Different stores list items differently ("Eggs, Large 12ct" vs "Large Grade A Eggs, Dozen"). We had to build a category system to group equivalent products.
Route Optimization Complexity The Traveling Salesman Problem is NP-hard! For our use case (<=5 stores), we implemented a nearest neighbor heuristic which runs in O(n^2) time—fast enough for real-time use.
Balancing Gas Costs vs. Savings Users have different fuel efficiencies and value their time differently. We added customizable settings so users can input their own gas prices, vehicle efficiency, and hourly time value.
Accomplishments that we're proud of
Fully functional end-to-end product in 24 hours. 1,000+ real product prices scraped and normalized. Route optimization that actually factors in the hidden cost of time. AI recipe generation that uses live deals from your cart. Clean, responsive UI that feels like a real consumer app.
What we learned
- Backend optimization matters: Early versions of our basket analyzer were slow caching and proper indexing in MongoDB made a huge difference.
- User-centric design: The "is it worth it?" verdict is more useful than raw numbers. People don't want to do math, they want an answer.
- AI is powerful but needs context: RAG retrieval made Gemini's recipe outputs significantly more relevant and grounded in real prices.
What's next for Savour
🔮 Flyer Integration – Automatically pull weekly deals from store flyers 📱 Mobile App – React Native version for on-the-go shopping 📍 User Location Personalization – Show nearest store locations with inventory 🔔 Price Alerts – Get notified when your favorite products go on sale 🤝 Crowdsourced Prices – Let users submit prices for better coverage
Built With
- atlas
- fastapi
- gemini
- html/css
- javascript
- leaflet.js
- mongodb
- openrouteservice
- pydantic
- python
- react
- reactrouter
- tailwindcss
- typescript
- uvicorn
- vite


Log in or sign up for Devpost to join the conversation.