Ruoka
Grocery spending tracker
Turns grocery receipts into answers: where the money goes, what got more expensive and what to buy cheaper this week.
Why I built it
I wanted to know where my grocery money actually goes, and whether this week's offer is really cheaper than what I usually pay.
- Type
- Web app, Data, AI
- Status
- In daily use
- Code
- Private
- Revision
- 2026.10
The problem
Food prices keep moving, and a receipt tells you what you paid, but not whether it was a good price, what went up since last month or what the cheaper choice would have been.
What it does
- Downloads your Lidl Plus receipts (the whole history) and shows spending per month, category and product, plus a basket index: what the things you buy cost now compared with a year ago.
- Follows the store’s whole shelf price list, about 37,000 products, every day and keeps only the changes. That gives every product a price history and warns when something you buy regularly gets more expensive.
- Checks each receipt line against the shelf price at the time and flags lines that were charged more.
- Finds cheaper alternatives by price per kilo and per 100 g of protein, using pack sizes and nutrition data from Open Food Facts.
- Matches this week’s Lidl and K-Ruoka offers against what you actually buy, and suggests stocking up on long-life products you use when they are at least 20 % off.
- Coupon autopilot (opt-in): activates your Lidl Plus coupons so none are forgotten at the checkout, keeps a log of what it activated, and shows how far you are from this month’s bonus coupon.
- Understands searches like lactose-free yoghurt under 2 €: code reads the price limit and an AI model turns the rest into filters.
How it’s built
- TypeScript on Node 24 with its built-in SQLite. One core serves both a command-line tool and a phone-first web app (Hono API, React and Vite), in Finnish and English.
- A background refresher keeps the offers and the price lists current and respects each source’s rate limits.
- All the data stays in one database file on your own machine.
Functional block diagram
Inputs
- Lidl Plus receipts
- Lidl shelf price list (daily)
- Lidl and K-Ruoka offers
- Open Food Facts
Core
- Sync and receipt parser
- SQLite, one file
- Price history and receipt check
- Cheaper swaps and offer matching
- Coupon autopilot
- AI search filters
Outputs
- Phone web app (Hono API + React)
- Command-line reports
Specifications
| Platform | Phone-first web app and a command-line tool |
|---|---|
| Data | Lidl Plus receipts, a shelf price list of about 37,000 products (daily), Lidl and K-Ruoka offers, Open Food Facts |
| Storage | One SQLite file on your own machine |
| Languages | Finnish, English |
| Status | In daily use |
| Built | 2026 |
| Stack | TypeScript, Node.js, SQLite, Hono, React, Vite, vitest, Open Food Facts, LLM search |
| Code | Private |
Revision history
| Rev | Date | Change |
|---|---|---|
| F | 2026-10-20 | Lidl's weekly offers and "For you this week" recommendations. |
| E | 2026-10-20 | Shopping list, readable product names and AI search. |
| D | 2026-10-17 | Cheapest protein view, new and gone products, receipt check against shelf prices. |
| C | 2026-10-17 | Shelf price list and price history, cheaper alternatives, categories, Lidl Plus coupons. |
| B | 2026-10-16 | Store offers from K-Ruoka matched against what you buy. |
| A | 2026-10-16 | First version: receipts synced into SQLite, spending report, phone web app. |





