Smart Grocery Hub Καλαθάκι
A full-stack PWA and Android app that compares live prices across 8 Greek supermarket chains — with an AI meal planner, barcode scanning, and real-time shared carts. Free for everyone.
Open the live app ↗


Eight websites for one shopping list
Grocery prices in Greece vary noticeably between chains, but shoppers have no practical way to compare them. Each supermarket publishes prices only inside its own site or leaflet, in a different format, with a different name for the same product. Checking even a 10-item list across Lidl, ΑΒ, Σκλαβενίτης, MyMarket, Μασούτης, Κρητικός, Γαλαξίας and Market In means opening eight tabs.
Καλαθάκι turns that into one search box — type a product, see the live price everywhere, build a list, and let the app tell you where your basket is cheapest.

A live deals engine, not a demo
Puppeteer scrapers refresh prices and offers per chain, so the home feed surfaces the biggest real price drops of the day — each tagged with the exact store and discount. The same pipeline powers search, the basket total, and the barcode lookup.
Recipes, meal plans and macros
A library of recipes drops ingredients straight into your list. The AI meal planner builds a week of meals around your body and budget in two minutes, and Meal Macros turns a photo of a plate into calories and macros — the features behind the Premium tier.

How it fits together
Frontend
React 19 + Vite SPA with code splitting, a Workbox service worker for offline caching and auto-update, Framer Motion micro-interactions, packaged for Android with Capacitor.
Backend
Express + MongoDB API. Puppeteer scrapers keep prices fresh per chain with anti-bot countermeasures; AI providers power the meal planner and photo macro analysis.
Real-time
Socket.IO channels for shared carts and chat — edits from any member appear instantly on everyone's list, and reconcile on reconnect over flaky mobile networks.
Maps & payments
Leaflet + OSRM + Overpass for nearby stores and optimal routes with zero Google fees.
The parts that were actually hard
Every chain has its own markup, pagination and bot detection. The scrapers run on Puppeteer with anti-bot countermeasures and are monitored so that a silent HTML change in one store doesn't quietly corrupt prices.
"Γάλα 3.5% 1L" is spelled eight different ways. Matching combines normalized names, package sizes and barcodes so the comparison is honest — a wrong match is worse than no match.
Shared carts must reconcile edits from multiple phones on flaky connections; Socket.IO events are idempotent and the list state re-syncs on every reconnect.
Maps use OSRM/Overpass instead of paid APIs, hosting fits Vercel + Render free plans, and AI calls are cached and rate-limited so the whole app stays free.