← apostolos-peiniris.vercel.app
Case Study

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.

Solo project PWA + Android Full-stack In production
Open the live app ↗
Καλαθάκι recipes tab — recipe of the day and cards with calories and macros
Καλαθάκι home dashboard — AI meal planner, deals and daily price drops
Καλαθάκι welcome screen
8
Supermarket chains
Live
Scraped prices
AI
Meal planning
Free
No paywall
The problem

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.


What it does
01Live price comparison across 8 chains
07Real-time shared carts with friends
02Smart shopping list with budget tracking
08Optimal store route on a map (OSRM)
03AI weekly meal planner, body & budget aware
09Current leaflets & offers per chain
04Meal Macros — photo → calories & macros
10Light/dark theming, offline-first PWA
05Barcode scanner with Nutri-Score
11Native Android build via Capacitor
06Recipes with ingredients straight to list
12Free for everyone, no paywall
Live deals feed — real discounted products with chain badges and price drops
Real data, every day

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.

AI & nutrition

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.

Recipes grid with food photography, cook time, calories and protein per recipe
Architecture

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.

Hard problems

The parts that were actually hard

Scraping 8 different storefronts, reliably.

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.

Matching the same product across chains.

"Γάλα 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.

Real-time collaboration that survives mobile networks.

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.

Keeping the free tier free.

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.

Stack
React 19ViteCapacitorWorkbox PWAFramer MotionExpress 5MongoDBPuppeteerSocket.IOLeafletOSRMClaude AI