Web app
DuoCart
A household shopping list synced in real time, plus the daily deals from Kaufland, Lidl, Auchan, Mega Image and Penny, compared across stores.

DuoCart is a PWA for a household that shares one shopping list. Add an item on one phone and it shows up on the other straight away, grouped by store, with a subtotal and what the discounts save you.
Every morning at 07:00 a GitHub Actions cron pulls the deals from Kaufland, Lidl, Auchan, Mega Image and Penny. Where a retailer has an API (VTEX or GraphQL) the scraper uses it; where it does not, it reads the HTML. Each store was reverse-engineered from its own website. For Auchan and Mega Image, search runs live against the whole catalog, roughly 60,000 products in stock. Penny, Kaufland and Lidl only publish their weekly leaflet, and the app says so plainly.
In the app you can:
- compare the same product across chains, matched on name and unit, cheapest first
- see the price per kg or litre, parsed from the title, and filter by store, category, price or discount
- create several households and invite members with a single link
- see by avatar who added and who checked off each item
- close a shop into a dated session with the total spent and who took part
Deals are read from the persistent cache and refreshed at most once a day per user, and the scraper only writes to Firestore what changed. That keeps thousands of offers inside the free quota. Tapping the same deal several times increments one document inside a Firestore transaction, so you never get duplicate rows. The app installs on iOS and Android, works offline, and serves the Firebase auth handler from its own domain.
Stack: React 19, TypeScript, Vite, Tailwind CSS v4, shadcn/ui, Firebase Auth and Firestore, Vercel serverless functions, GitHub Actions and Vitest for the scraper.
Screenshots
4 imagesWant something like this?
Start a project