Lokaler Supermarkt-Preisvergleich mit Bon-Validierung. Beantwortet die Frage: Welcher Markt ist für meinen Standard-Warenkorb aktuell am günstigsten?
- 20-Kategorien Referenz-Warenkorb – normierte Vergleichsgrundlage
- 3 Märkte (Aldi, Lidl, Penny) mit realistischen Seed-Preisen
- Preisvergleich mit optionalen Fahrtkosten (fix oder distanzbasiert)
- Bon-Upload + OCR via Claude Vision API
- Prognose vs. Realität – Validierung mit Qualitätsstatus
| Schicht | Technologie |
|---|---|
| Frontend | Next.js 14 (App Router) + Tailwind CSS |
| Backend/API | Next.js API Routes |
| Datenbank | Supabase (PostgreSQL) |
| Dateispeicher | Supabase Storage |
| OCR | Anthropic Claude Vision API |
| Hosting | Vercel |
- Erstelle ein Projekt auf supabase.com
- Gehe zu SQL Editor und führe diese Dateien der Reihe nach aus:
supabase/migrations/001_initial_schema.sqlsupabase/migrations/002_seed_data.sql
- Gehe zu Storage und erstelle einen Bucket namens
receipts(nicht öffentlich) - Setze eine Storage-Policy für den
receipts-Bucket:- Allow INSERT for
anonrole - Allow SELECT for
anonrole
- Allow INSERT for
Kopiere .env.example nach .env.local:
cp .env.example .env.localFülle aus:
NEXT_PUBLIC_SUPABASE_URL– Supabase Project URLNEXT_PUBLIC_SUPABASE_ANON_KEY– Supabase anon/public keySUPABASE_SERVICE_ROLE_KEY– Supabase service role key (Settings > API)ANTHROPIC_API_KEY– Für OCR via Claude Vision
npm install
npm run devApp öffnen: http://localhost:3000
npx vercelSetze die Umgebungsvariablen in Vercel Dashboard > Settings > Environment Variables.
spar-assistent/
├── src/
│ ├── app/
│ │ ├── page.tsx # Dashboard + Preisvergleich + Ergebnis
│ │ ├── layout.tsx # Navigation
│ │ ├── globals.css # Styling
│ │ ├── admin/preise/page.tsx # Preispflege
│ │ ├── bon/page.tsx # Bon-Upload + OCR-Review
│ │ ├── validierung/page.tsx # Prognose vs. Realität
│ │ └── api/
│ │ ├── markets/ # CRUD Märkte
│ │ ├── categories/ # CRUD Kategorien
│ │ ├── prices/ # CRUD Preise
│ │ ├── calculations/ # Berechnungsläufe
│ │ ├── receipts/ # Upload, OCR, Review
│ │ └── validations/ # Prognose vs. Realität
│ └── lib/
│ ├── types.ts # TypeScript-Definitionen
│ ├── supabase.ts # DB-Client
│ ├── calculations.ts # Preisberechnung + Ranking
│ ├── validation.ts # Validierungslogik
│ └── ocr.ts # Claude Vision OCR
├── supabase/migrations/
│ ├── 001_initial_schema.sql # Datenbankschema
│ └── 002_seed_data.sql # Seed-Daten
├── .env.example
└── README.md
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/markets |
Alle aktiven Märkte |
| POST | /api/markets |
Markt anlegen |
| PUT | /api/markets/:id |
Markt aktualisieren |
| DELETE | /api/markets/:id |
Markt deaktivieren |
| GET | /api/categories |
Alle Referenzkategorien |
| GET | /api/prices?market_id=&date= |
Preise filtern |
| POST | /api/prices |
Preis erfassen |
| POST | /api/calculations |
Berechnung starten |
| GET | /api/calculations/:id |
Berechnung laden |
| POST | /api/receipts |
Bon-Upload (multipart) |
| POST | /api/receipts/:id/process |
OCR starten |
| PUT | /api/receipts/:id/review |
OCR-Korrektur |
| GET | /api/receipts/:id/lines |
OCR-Zeilenkandidaten |
| POST | /api/validations |
Validierung erstellen |
| GET | /api/validations |
Alle Validierungen |
Bereits enthalten (Stand März 2026):
| Markt | Distanz | Warenkorb-Summe |
|---|---|---|
| Aldi Süd | 3,2 km | ~28,60 € |
| Lidl | 5,1 km | ~28,80 € |
| Penny | 1,8 km | ~30,40 € |
| Status | Bedingung |
|---|---|
| Sehr gut | < 5% UND < 2€ |
| Brauchbar | ≤ 8% ODER ≤ 5€ |
| Kritisch | ≤ 12% ODER ≤ 8€ |
| Nicht tragfähig | > 12% |
Privates Projekt.