S
StockPilot
← Zurück/Changelog

Changelog

Alle Versionen und Änderungen von StockPilot. Aktuelle Version: v0.114.0

Zur Roadmap
  1. v0.114.0Aktuell live

    FoodShare 2.0: echte Übergaben mit Chat, Bestätigung und Anfragen

    FoodShare wird von einem einzelnen Klick zu einer echten zweiseitigen Übergabe: Interesse zeigen eröffnet einen Chat, beide Seiten bestätigen die Abholung, und ein neues Anfrage-Board ("Gesucht") lässt Nutzer:innen aktiv nach Produkten fragen.

    Neu
    • „Interesse zeigen" eröffnet jetzt einen Chat mit der anbietenden Person, statt das Angebot sofort und endgültig zu beanspruchen — mehrere Interessent:innen können parallel anfragen.
    • Beide Seiten bestätigen die Übergabe unabhängig voneinander; erst danach gilt das Angebot als abgeholt und Punkte werden vergeben (+15 für die empfangende, neu +10 für die abgebende Person).
    • Neuer „Gesucht"-Tab: Nutzer:innen können Anfragen für Produkte stellen, die sie suchen — „Das kann ich anbieten" erstellt automatisch ein passendes Angebot inklusive Chat.
    • Unbeantwortete Interesse-Anfragen laufen nach 7 Tagen automatisch ab (Ghosting-Schutz), das Angebot bleibt für andere sichtbar.
  2. v0.113.0

    Karten: Satellitenbilder als Kartenstil-Option

    Die Standort-Lightbox und der Karten-Picker beim Senden einer Nachricht bekommen einen Schalter für echte Satellitenbilder (Esri World Imagery) als Alternative zum markenfarbigen Standard-Kartenstil.

    Neu
    • Neuer Satellit-Schalter in der Standort-Lightbox und im Karten-Picker: wechselt zwischen dem markenfarbigen Standard-Kartenstil und echten Satellitenbildern (Esri World Imagery, kostenlos, kein API-Key nötig).
    • Terrain (3D-Höhenmodell) und Himmel/Nebel-Atmosphäre bleiben in der Lightbox auch unter Satellitenbildern voll nutzbar.
    • Die wetterbasierte Kartenumfärbung (Winter-/Nacht-Einfärbung von Wiesen/Wasser) wird bei aktivem Satellit automatisch übersprungen, da sie auf reinen Rasterfotos technisch nicht wirken kann, und kehrt beim Zurückschalten automatisch zurück.
  3. v0.112.0

    Karten: 3D-Terrain, Himmel/Nebel-Atmosphäre und Tageszyklus-Animation

    Die Standort-Lightbox wirkt jetzt deutlich fotorealistischer: ein echtes 3D-Höhenmodell (MapTiler, mock-first ohne API-Key), ein zu Wetterzustand und Tageszeit passend eingefärbter Himmel mit Nebel statt eines abrupten Kartenrands, und — als Test-Werkzeug im Admin-Debug-Panel — eine 60-Sekunden-Animation, die einen kompletten Tagesablauf inklusive wandernder Gebäudeschatten durchspielt.

    Neu
    • Neuer Terrain-Schalter in der Standort-Lightbox: ohne gesetzten NEXT_PUBLIC_MAPTILER_API_KEY sichtbar, aber deaktiviert mit Tooltip (kein Fehler, keine Kachel-Anfrage) — mit gesetztem Key echtes 3D-Höhenmodell unter den bestehenden 3D-Gebäuden.
    • Neuer Sky/Fog-Schalter färbt Himmel und Nebel passend zur Kombination aus Wetterzustand und Tageszeit ein (15 Kombinationen) über MapLibres echte setSky()-API.
    • Neuer „▶ Tageszyklus abspielen (60s)"-Button im Admin-Debug-Panel (nur in der Lightbox): spielt einmalig einen kompletten Tagesablauf (Nacht → Sonnenaufgang → Tag → Sonnenuntergang → Nacht) am jeweiligen Kartenort ab — Himmelfarben, Kartenlandschaft und Sonnenstand/Schattenwurf der 3D-Gebäude animieren flüssig mit, Wetter-Dropdowns sind währenddessen deaktiviert, respektiert prefers-reduced-motion.
  4. v0.111.0

    Admin-Übersicht: Live-Server-Status (CPU, RAM, Disk, Dienste)

    Die Admin-Übersicht zeigt jetzt einen sich selbst aktualisierenden System-Status-Abschnitt mit dem aktuellen Serverzustand: CPU-Last, Arbeitsspeicher, Uptime/Prozess, Speicherplatz sowie Ampeln für die Erreichbarkeit von Postgres und Redis.

    Neu
    • Neuer „System-Status"-Abschnitt auf der Admin-Übersicht mit KPI-Kacheln für CPU-Last, RAM (genutzt/gesamt + Heap), Speicherplatz und Uptime sowie einer Dienste-Zeile mit Postgres-/Redis-Ampeln und Zeitstempel der letzten Messung.
    • Aktualisiert sich automatisch alle ~10 Sekunden, aber nur solange der Tab sichtbar ist (schont Ressourcen im Hintergrund).
    Infrastruktur
    • Neues Modul modules/system-metrics/ nach bewährtem Adapter-Muster: Mock-Adapter als Default (deterministisch, ohne Host-/DB-Zugriffe, CI-tauglich) und ein echter Node-Adapter (os/process/fs.statfs + Postgres-/Redis-Ping), umschaltbar per Umgebungsvariable SYSTEM_METRICS_ADAPTER=node.
    • Werte laufen über eine serverseitig ADMIN-abgesicherte Server-Action; reine Infrastruktur-Telemetrie ohne personenbezogene Daten.
  5. v0.110.0

    Haushaltsbudget: Karten direkt bearbeiten, umsortieren, Icons & Ausgaben-Diagramm

    Die Kategorien im Haushaltsbudget lassen sich jetzt direkt in der Übersicht bearbeiten, löschen und per Drag & Drop umsortieren, jede Kategorie bekommt ein eigenes Icon, und ein neues Balkendiagramm zeigt die täglichen Ausgaben je Kategorie über einen frei wählbaren Zeitraum.

    Neu
    • Der separate Block „Kategorien verwalten" entfällt — Bearbeiten, Löschen und Umsortieren sitzen jetzt direkt auf den Kategorie-Karten, sichtbar über einen „Bearbeiten"-Umschalter (wie beim Dashboard, nur für Eigentümer:innen/Admins).
    • Kategorien lassen sich per Drag & Drop umsortieren; die Reihenfolge gilt überall (Übersicht, Kassenbon-Zuordnung, manuelle Erfassung).
    • Jede Kategorie kann ein passendes Icon bekommen (beim Anlegen und Bearbeiten); die sechs Standardkategorien starten mit kontextbezogenen Icons.
    • Neues Diagramm „Tägliche Ausgaben": gestapelte Tagesbalken je Kategorie, Zeitraum wählbar über 7/30/90 Tage, „Dieser Monat" oder einen eigenen Von–Bis-Zeitraum.
  6. v0.109.0

    Karten-Wetter: feinjustierbare Partikel, echtes Gewitter, echte Nacht-/Golden-Hour-Farben

    Regen und Schnee lassen sich im Admin-Debug-Panel jetzt einzeln in Geschwindigkeit, Menge und Größe regeln, Gewitter zeigt eine spürbar eigene Mischung aus verstärktem Regen, Hagel und unregelmäßigem Blitz, und Nacht/Golden Hour färben jetzt die Kartenlandschaft selbst um statt nur eine halbtransparente Fläche darüberzulegen.

    Neu
    • Debug-Panel bekommt zwei neue Regler-Gruppen „Regen“ und „Schnee“ (je Geschwindigkeit/Menge/Größe, Bereich 0,25×–3×) mit eigenem „Zurücksetzen“ — wirkt sowohl auf echten als auch auf per Override erzwungenen Niederschlag.
    • Gewitter rendert jetzt drei Ebenen gleichzeitig: verstärkter Regen (fester Gewitter-Faktor auf die aktuellen Regen-Einstellungen), eine zweite, hellere Hagel-Partikelschicht sowie unregelmäßig gepulste Blitz-Aufhellungen der gesamten Kartenfläche (respektiert weiterhin prefers-reduced-motion).
    • Nacht- und Golden-Hour-Tönung im Overlay verstärkt (Nacht deutlich dunkler, Golden Hour wärmer/kräftiger) und zusätzlich um eine echte Umfärbung der Kartenlandschaft (Wald, Wiese, Park, Wasser, Gebäude, Straßenränder, Hintergrund) ergänzt — alle 15 Kombinationen aus 5 Wetterzuständen × 3 Tageszeiten sind dadurch klar unterscheidbar, auch verschneite Nächte zeigen jetzt beide Zustände gleichzeitig.
  7. v0.108.0

    Karten-Wetter: Admin-Debug-Panel für Wetterzustand und Tageszeit

    Ein nur für Admins sichtbares Debug-Panel in der Standort-Lightbox und im Karten-Picker erlaubt es, Wetterzustand und Tageszeit unabhängig voneinander zu erzwingen — so lassen sich alle 15 Kombinationen der neuen Karten-Wetter-Funktion testen, ohne auf echtes Wetter zu warten.

    Neu
    • Neuer schwebender Debug-Button (unten links) in Standort-Lightbox und Karten-Picker, ausschließlich für ADMIN/SUPER_ADMIN sichtbar — für alle anderen Rollen komplett unsichtbar, nicht nur ausgegraut.
    • Zwei unabhängige Dropdowns: Wetterzustand (Klar/Bewölkt/Regen/Schnee/Gewitter) und Tageszeit (Tag/Golden Hour/Nacht), jeweils mit „Echt" zum Zurücksetzen auf die tatsächlichen Werte.
    • Serverseitig abgesichert: getWeatherAction prüft die Admin-Rolle anhand der Session selbst nochmal, bevor ein Override greift — reines UI-Verstecken hätte nicht gereicht, da Server Actions auch direkt aufrufbar sind. Nicht-Admins bekommen bei einem mitgeschickten Override kommentarlos das echte Wetter zurück.
    • Kein Persistieren: reiner Komponentenstatus ohne localStorage oder Cookie — der Override verschwindet automatisch beim Schließen der Karte.
  8. v0.107.0

    Karten: Live-Wetter, Tageszeit-Stimmung und neue Bedienelemente

    Die Standort-Lightbox und der Karten-Picker zeigen jetzt das echte aktuelle Wetter am gezeigten Ort (Snapchat-Stil): Wetter-Badge, Tageszeit-Einfärbung, animierter Regen/Schnee und eine weiße Schnee-Landschaft bei Schneefall. Dazu neue, markenkonform gestaltete Bedienelemente für Zoom, Kompass, 3D-Ansicht und Standortsuche.

    Neu
    • Wetter-Badge (Icon + Temperatur) und Tageszeit-Tönung (Tag/Golden Hour/Nacht) anhand der echten Sonnenauf-/-untergangszeit am gezeigten Ort — kostenlos über Open-Meteo, kein API-Key.
    • Animierter Regen bzw. Schnee bei entsprechendem Wetter; bei Schnee färbt sich die Kartenlandschaft passend weiß.
    • Neue Bedienelemente (Zoom, Kompass/Neigung-Reset, 3D-Gebäude ein/aus, Wetter ein/aus) im StockPilot-Marken-Look statt MapLibres Standardsteuerung.
    • „Mein Standort" im Karten-Picker: fragt den Gerätestandort nur bei Tap ab, nie automatisch — mit klarer Fehlermeldung bei Ablehnung.
  9. v0.106.0

    Karten: markenkonformer Kartenstil fest verankert

    Der zuvor nur zur Laufzeit umgefärbte Kartenstil ist jetzt als eigenes, selbst gehostetes Style-Dokument fixiert — Straßen, Gewässer, Gebäude und Grünflächen in StockPilots Marken-Tokens (Fresh Leaf Green / Lime Gold / Sand).

    Neu
    • Neues Style-Dokument public/map-styles/stockpilot-brand.json (Fork von OpenFreeMaps „Liberty"-Style): Grünflächen und Parks in Fresh-Leaf-Grün, Hauptstraßen in Lime-Gold mit dunkelgrüner Kontur, Gebäude/Hintergrund in den App-eigenen Sand-Tönen.
    • Alle Kartenansichten starten jetzt mit einer leichten Neigung (45°) — dadurch zeigen die 3D-Gebäude (ab Zoom 14) echte Tiefe mit Wandschattierung statt flach-pixelig wie in der Draufsicht.
    • Kacheln, Sprites und Schriften kommen weiterhin live von OpenFreeMap — nur die Farbgebung ist eigenes, versioniertes JSON. Weiterhin 0 € laufende Kosten, keine neue Infrastruktur.
  10. v0.105.0

    Haushaltsbudget: Ausgaben nach Kategorie im Blick (Plus/Family)

    Neuer Haushalts-Budgetplaner: Monatslimits je Kategorie setzen und die Ausgaben im laufenden Monat verfolgen — gespeist aus manuell erfassten Ausgaben und aus kategorisierten Kassenbon-Positionen. Push-Benachrichtigung, sobald eine Kategorie 80 % bzw. 100 % ihres Limits erreicht.

    Neu
    • Neue Seite „Haushaltsbudget" (/app/budget): Gesamtübersicht, Fortschrittsbalken je Kategorie, manuelle Ausgabenerfassung und Kategorieverwaltung.
    • Sechs Standardkategorien (Lebensmittel, Drogerie, Getränke, Auswärts Essen, Haushalt, Sonstiges), erweiterbar um eigene — nur Eigentümer:innen/Admins verwalten Kategorien und Limits.
    • Kassenbon-Positionen lassen sich beim Prüfen einer Kategorie zuordnen (mit Vorschlag anhand des Produktnamens und „Rest zuordnen"-Sammelaktion) und fließen so ins Budget ein.
    • Push-Benachrichtigung an alle Haushaltsmitglieder bei Erreichen von 80 % und 100 % eines Kategorielimits.
    • Nur im Plus/Family-Tarif verfügbar; reine Haushaltsdaten, nicht im Adminbereich sichtbar.
  11. v0.104.0

    Karten: echte Straßen, Gewässer und Gebäude statt leerer Länderflächen

    Die MapLibre-Karten (Standort-Vorschau, -Lightbox, -Picker, Nachbarschafts-Heatmap) zeigten bisher nur MapLibres eigenen Demo-Style — eine grob konturierte Länderfläche ohne jedes Detail. Jetzt läuft der kostenlose OpenFreeMap-Tile-Dienst mit voller Straßen-, Gewässer- und Gebäudedetailtiefe.

    Bugfix
    • Alle Karten nutzen jetzt den OpenFreeMap-„Liberty"-Style (tiles.openfreemap.org) statt MapLibres bewusst minimalem Demo-Style — Straßen, Straßennamen, Gewässer, Gebäudegrundrisse und Wege sind jetzt sichtbar.
    • Kostenlos, ohne API-Key, ohne Nutzungslimits (spendenfinanziert) — keine neuen laufenden Kosten.
  12. v0.103.1

    Chat: Sprachnachrichten-Vorschau in der Chatübersicht

    War die letzte Nachricht eine Sprachnachricht, zeigte die Chatübersicht bisher eine leere Zeile — jetzt steht dort ein Mikrofon-Icon mit „Sprachnachricht gesendet".

    Bugfix
    • Chatübersicht: Sprachnachrichten als letzte Nachricht zeigen jetzt Icon + „Sprachnachricht gesendet" statt einer leeren Vorschau-Zeile.
  13. v0.103.0

    Chat: verständlicherer Online-Status, Hover-Feedback, Anhang-Vorschauen in der Übersicht

    Der „zuletzt online"-Status ist jetzt in Worten statt nur einer Uhrzeit lesbar, Nachrichten reagieren beim Hovern sichtbar, und die Chatübersicht zeigt jetzt an, wenn die letzte Nachricht ein Foto, GIF oder Standort war.

    Neu
    • Chat: „zuletzt online" zeigt jetzt eine verständliche Formulierung ("vor 5 Minuten", "vor etwa 3 Stunden", "gestern um 16:00 Uhr", "am 01.07.26 um 09:05 Uhr") statt nur einer nackten Uhrzeit.
    • Chatübersicht: Der „zuletzt online"-Status steht jetzt auch klein unter dem Namen jedes Chats.
    • Chatübersicht: Wenn die letzte Nachricht ein Foto, GIF oder Standort war, steht dort jetzt ein passendes Icon mit „Foto gesendet"/„GIF"/„Standort gesendet" statt einer leeren Vorschau.
    Bugfix
    • Chat: Nachrichten-Bubbles zeigen beim Hovern einen leichten Schlagschatten und einen Zeigefinger-Cursor, mit Tooltip-Hinweis auf die Gedrückt-halten-Reaktion — bisher gab es kein visuelles Signal, dass eine Aktion möglich ist.
  14. v0.102.0

    Chat: Offline-Anzeige, zuverlässiges Scrollen, blaue Wellenform bei gehörten Sprachnachrichten

    Kleinere Chat-Verbesserungen: Offline-Status hat jetzt einen grauen Punkt, der Chat scrollt beim Öffnen zuverlässig ganz nach unten, und bereits gehörte Sprachnachrichten sind an ihrer blauen Wellenform erkennbar.

    Neu
    • Chat: Sprachnachrichten-Wellenform färbt sich blau, sobald die Nachricht als gehört gilt (blaue Haken) — sowohl bei eigenen als auch bei erhaltenen Sprachnachrichten.
    Bugfix
    • Chat: Offline-Nutzer zeigen jetzt einen grauen Punkt neben „zuletzt online" als Gegenstück zum pulsierenden grünen Online-Punkt.
    • Chat: Öffnen einer Unterhaltung scrollt jetzt zuverlässig ganz nach unten zur letzten Nachricht, auch wenn Bilder oder Kartenvorschauen die Höhe nachträglich verändern.
  15. v0.101.1

    Chat: verbleibende Dialoge/Menüs zeigten fälschlich die Seitenleiste an

    Nachdem die Standort-Lightbox bereits behoben wurde, hatten vier weitere Chat-Dialoge denselben Stacking-Context-Bug: Löschen/Blockieren-Bestätigung, Emoji-Auswahl und das Nachrichten-Kontextmenü zeigten am Desktop die Seitenleiste über sich statt sie abzudunkeln.

    Bugfix
    • Chat: Bestätigungsdialog (Nachricht löschen/Reaktion entfernen), Blockieren-Dialog, Emoji-Picker und das Long-Press-Kontextmenü rendern jetzt wie die Foto-/Standort-Lightbox direkt außerhalb des Chat-Layouts, statt fälschlich hinter der Seitenleiste eingehängt zu werden.
  16. v0.101.0

    Sprachnachrichten: Wave-Optik, Tempo-Regler, echte Lesebestätigung

    Sprachnachrichten sehen jetzt aus wie bei WhatsApp und Co: Wellenform statt Balken, 1x/1,5x/2x-Tempo, und die blauen Haken erscheinen erst, wenn wirklich zugehört wurde.

    Neu
    • Chat: Sprachnachrichten zeigen jetzt eine Wellenform-Optik statt eines einfachen Fortschrittsbalkens.
    • Chat: Sprachnachrichten lassen sich mit 1x, 1,5x oder 2x Geschwindigkeit abspielen (Tempo-Button neben der Zeitanzeige).
    • Chat: Eingehende Sprachnachrichten gelten erst als gelesen (blaue Haken), wenn der Chatpartner mindestens die Hälfte angehört hat — nicht mehr schon beim bloßen Öffnen des Chats.
    Bugfix
    • Chat: Der Hinweis „Gelesen HH:MM" steht jetzt unterhalb der Nachrichten-Bubble statt darin.
  17. v0.100.0

    Chat: GIFs/Sticker senden

    Im Chat lassen sich jetzt animierte Sticker verschicken — über das Büroklammer-Menü, mit Suche. Aktuell ein kuratiertes Set (Mock), ein echter GIF-Anbieter folgt später.

    Neu
    • Chat: Neuer Menüpunkt „GIFs" im Büroklammer-Menü öffnet eine durchsuchbare Auswahl animierter Sticker (Herz, Daumen hoch, Konfetti, Lachen, Applaus, Feuer, Weinen, Staunen) — werden wie bei WhatsApp ohne Sprechblasen-Hintergrund groß im Chat angezeigt.
  18. v0.99.0

    Chat: Reaktions-Picker auf Deutsch, weitere Karten- und Layout-Korrekturen

    Der Emoji-Picker für Reaktionen ist jetzt auf Deutsch, die Hautfarben-Auswahl hat ein Pipetten-Icon, und mehrere Karten-/Layout-Details wurden nachgeschärft.

    Bugfix
    • Chat: Die kleine Kartenvorschau bei Standort-Nachrichten lag durch einen z-index-Fehler manchmal über anderen geöffneten Fenstern (z.B. dem Reaktions-Picker) — behoben.
    • Chat: Reaktions-Picker (Emoji-Auswahl) ist jetzt komplett auf Deutsch (Kategorien, Suchfeld).
    • Chat: Hautfarben-Auswahl im Reaktions-Picker ist jetzt so hoch wie das Suchfeld daneben und zeigt ein weißes Pipetten-Icon mit Schlagschatten.
    • Chat: Die Kartenauswahl beim Senden eines Standorts hat jetzt oben rechts ein X-Icon zum Schließen statt eines Text-Links.
    • Chat: Kopf- und Eingabebereich haben jetzt einen dezenten Schlagschatten zur klareren optischen Abgrenzung vom Nachrichtenbereich.
  19. v0.98.0

    Chat: Sprachnachrichten, Standort-Karten und Feinschliff repariert

    Sprachnachrichten ließen sich nicht mehr senden, der Standort-Pin bei der Kartenauswahl war unsichtbar und die Standort-Lightbox zeigte fälschlich die Seitenleiste an — alle drei behoben.

    Bugfix
    • Chat: Sprachnachrichten schlugen beim Senden immer mit „Nur Audiodateien sind erlaubt" fehl — der Browser liefert das Aufnahmeformat mit Codec-Zusatz (z. B. „audio/webm;codecs=opus"), die Prüfung erwartete aber exakt „audio/webm".
    • Chat: Beim Wählen eines Standorts auf der Karte war der grüne Positions-Pin in der Bildschirmmitte unsichtbar (lag hinter den Kartenkacheln).
    • Chat: Die Vollbild-Kartenansicht für gesendete Standorte zeigte fälschlich die Seitenleiste über der Karte an, statt wie bei Fotos den ganzen Bildschirm abzudunkeln — beide Standort-Vollbildansichten werden jetzt wie die Foto-Lightbox direkt außerhalb des Chat-Layouts eingehängt.
    • Chat: Büroklammer- und Senden-Icon im Eingabefeld sitzen jetzt noch etwas exakter mittig.
  20. v0.97.0

    Chat & Nachbarschaft: Feinschliff und neue Funktionen

    Der Chatbereich bekommt einen Tippt-gerade-Indikator, ein Zeichenlimit mit Zähler, Lesestatus in der Übersicht sowie Suchfilter — dazu einige optische Korrekturen an Reaktionen, Zeitstempeln und der Nachbarschaftsansicht.

    Neu
    • Chat: Tippt-Indikator (drei animierte Punkte) erscheint jetzt wie bei WhatsApp unterhalb der letzten Nachricht, wenn der Chatpartner gerade schreibt.
    • Chat: Nachrichten sind auf 500 Zeichen begrenzt, ein kleiner Zähler (X/500) zeigt die verbleibende Länge im Eingabefeld an.
    • Chat-Übersicht: rechts neben jedem Chat steht jetzt die Uhrzeit der letzten Nachricht sowie ein Status-Icon (Häkchen/blaue Doppelhaken für eigene Nachrichten, Papierflieger für Nachrichten des Gegenübers).
    • Chats- und Nachbarschaft-Tab haben jetzt zusätzlich zur Suche Schnellfilter (z.B. „Online", „Ungelesen", „In der Nähe").
    • Nachbarschaft: „Ausblenden" ist jetzt ein Toggle-Schalter statt eines Textlinks, mit pulsierendem grünen Punkt bei aktiver Sichtbarkeit — die Leiste sitzt jetzt oberhalb der Heatmap-Karte.
    Bugfix
    • Chat: Klick auf einen Link in einer Nachricht warnt jetzt deutlicher, dass StockPilot verlassen wird und der Besuch fremder Seiten auf eigene Gefahr erfolgt.
    • Chat-Header: doppelten Online-Punkt am Avatar entfernt (stand redundant neben dem Wort „Online").
    • Chat: Uhrzeit, „(bearbeitet)" und „Nachricht gelöscht" werden jetzt kleiner dargestellt, die Zeile ist bei eigenen Nachrichten rechtsbündig.
    • Chat: Reaktions-Emojis überlappen jetzt leicht die untere Kante der Nachrichten-Bubble statt mit Abstand darunter zu schweben.
    • Chat: Büroklammer- und Senden-Icon sitzen jetzt vertikal zentriert im Eingabefeld.
    • Chats-/Nachbarschaft-Tabs sind größer und haben passende Icons für eine dynamischere Übersicht.
  21. v0.96.0

    Chat: Eingabefeld & Reaktionen überarbeitet

    Der Chat-Eingabebereich ist jetzt platzsparender und mobilfreundlicher, und eine eigene Reaktion lässt sich nicht mehr versehentlich per Klick entfernen.

    Bugfix
    • Eingabefeld im Chat füllt jetzt die volle Breite aus — Foto, Standort und Sprachnachricht sind über ein Büroklammer-Symbol direkt im Eingabefeld erreichbar, statt drei einzelne Icons den Platz wegzunehmen (besonders auf dem Smartphone spürbar).
    • Das kleine Reagieren-Symbol neben jeder Nachricht wurde entfernt — per Long-Press auf eine Nachricht lässt sich weiterhin reagieren.
    • Eigene Reaktion auf eine Nachricht wird jetzt erst nach einer Bestätigung entfernt, statt sofort beim Antippen.
    • Das Hintergrundmuster aus dem Chat-Fenster ist jetzt auch auf der Chats-/Nachbarschaft-Übersichtsseite zu sehen.
  22. v0.95.0

    Admin: KI-Rezept-Generator mit PDF-/URL-Import & Bild-Prompt-Einstellungen

    Der KI-Rezept-Generator im Admin-Bereich unterstützt jetzt neben der Themen-Suche auch PDF-Upload und direkte URL-Eingabe als Rezeptquelle. Außerdem lässt sich das Bild-Generierungs-Prompt jetzt live im Admin-Bereich bearbeiten, und Rezeptbilder werden zusätzlich als kleines Thumbnail für schnellere Ladezeiten in Listenansichten gespeichert.

    Neu
    • Admin: KI-Rezept-Generator hat jetzt drei Eingabewege — Themen-Suche (wie bisher), PDF-Upload (erkennt Rezepte auch auf gescannten/fotografierten Seiten) und direkte URL-Eingabe.
    • Admin: Bild-Generierungs-Prompt für Rezept-Coverfotos lässt sich jetzt live im Admin-Bereich bearbeiten (mit Vorschau), statt nur per Server-Konfiguration.
    • Rezeptbilder werden jetzt zusätzlich als kleines Thumbnail gespeichert — Listenansichten (Rezeptübersicht, Dashboard, Admin-Tabelle) laden dadurch spürbar schneller.
  23. v0.94.0

    Chat: Reaktionen, Nachrichten bearbeiten & löschen

    Im Chat lässt sich jetzt auf jede Nachricht mit einem beliebigen Emoji reagieren, eigene Text- und Foto-Nachrichten lassen sich innerhalb von 15 Minuten nachträglich bearbeiten, und eigene Nachrichten lassen sich im selben Zeitfenster für beide Seiten löschen.

    Neu
    • Auf jede Nachricht (Text, Foto, Sprache, Standort) lässt sich mit einem beliebigen Emoji reagieren — per Long-Press oder über ein kleines Smiley-Symbol neben der Nachricht.
    • Eigene Text-Nachrichten und Foto-Bildunterschriften lassen sich innerhalb von 15 Minuten nach dem Senden bearbeiten.
    • Eigene Nachrichten lassen sich innerhalb von 15 Minuten für beide Seiten löschen — angehängte Fotos oder Sprachnachrichten werden dabei sofort entfernt.
    • Bei einer neuen Reaktion auf eine eigene Nachricht gibt es jetzt eine Push-Benachrichtigung.
  24. v0.93.0

    Chat: Hydration-Fehler beim Öffnen einer Unterhaltung behoben

    Beim Öffnen einer Chat-Unterhaltung zeigte der Browser kurzzeitig einen internen React-Fehler in der Konsole, weil Nachrichtenzeiten und der „zuletzt online"-Hinweis serverseitig in einer anderen Zeitzone berechnet wurden als im Browser der Nutzer:innen. Beide Anzeigen sind jetzt fest auf die deutsche Zeitzone gepinnt und stimmen zuverlässig überein.

    Bugfix
    • Nachrichtenzeiten im Chat sowie der „zuletzt online"-Hinweis werden jetzt konsistent in der Zeitzone Europe/Berlin berechnet, statt von der (auf dem Produktivserver abweichenden) Systemzeitzone abzuhängen — behebt einen React-Hydration-Fehler, der beim Öffnen jeder Unterhaltung auftrat.
  25. v0.92.0

    Chat: Standort senden (GPS oder Kartenauswahl)

    Im Chat lässt sich jetzt ein Standort als eigene Nachricht verschicken — entweder der eigene GPS-Standort oder ein selbst auf einer Karte gewählter Punkt. Die Nachricht erscheint als kleine Kartenvorschau und öffnet per Klick eine große, frei verschiebbare Karte. Anders als bei der Nachbarschafts-Übersicht wird der GPS-Standort dabei nicht gerundet, da es sich um eine bewusste Weitergabe an eine einzelne, selbst gewählte Person handelt — und nur als einmaliger Schnappschuss, nicht als laufend aktualisierter Live-Standort.

    Neu
    • Neues Standort-Icon im Chat-Composer öffnet eine Auswahl zwischen „Meinen Standort teilen“ (GPS, mit eigenem Einwilligungs-Hinweis) und „Ort auf Karte wählen“ (Karte frei verschieben, fixer Pin in der Mitte).
    • Standort-Nachrichten erscheinen im Chat als kleine Kartenvorschau; ein Klick öffnet eine Vollbild-Karte zum Zoomen und Verschieben.
    • Bei mehreren Standort-Nachrichten im selben Chat blättern Pfeiltasten/Wischen nur zwischen Standorten — unabhängig von der bestehenden Foto-Ansicht.
  26. v0.91.0

    Chat: Foto-Lightbox mit Zoom & dezentes Hintergrund-Muster

    Fotos im Chat lassen sich jetzt direkt in der App ansehen — mit Zoom per Mausrad, Doppelklick oder Fingergeste, und Blättern zu allen anderen Fotos derselben Unterhaltung — statt wie bisher in einem neuen Browser-Tab zu öffnen. Außerdem hat der Chat-Nachrichtenbereich jetzt ein dezentes, markentypisches Muster aus Küchen-Symbolen im Hintergrund, statt einer leeren weißen Fläche.

    Neu
    • Foto in einer Chat-Nachricht antippen öffnet jetzt eine Lightbox mit Zoom (Mausrad, Doppelklick, Zwei-Finger-Geste) und Verschieben im gezoomten Zustand, statt eines neuen Browser-Tabs.
    • In der Lightbox lässt sich mit Pfeiltasten oder Wischen zu allen anderen Fotos derselben Unterhaltung blättern.
    • Chat-Nachrichtenbereich zeigt jetzt ein dezentes Hintergrundmuster aus Küchen-Symbolen (Möhre, Ei, Einkaufsliste, Vorratsdose) statt einer leeren Fläche — passend für Hell- und Dunkelmodus.
  27. v0.90.4

    Deploy-Blockade endgültig behoben

    Der 0.90.3-Deploy schlug fehl: das Zurückrollen der blockierenden Alt-Migration allein reichte nicht aus, da Prisma direkt danach denselben, unveränderten Migrationsinhalt erneut ausführt — und erneut mit demselben Konflikt fehlschlägt, weil die Conversation/Message-Tabellen bereits existieren. Die Migrationsdatei selbst wurde jetzt geleert (kein SQL-Inhalt mehr), sodass der erneute Versuch als No-Op durchläuft, statt identisch zu scheitern. Dadurch können die eigentlich wartenden Migrationen für die Sprachnachrichten-Spalten jetzt erstmals wirklich angewendet werden.

    Bugfix
    • Blockierende Alt-Migration vom 2. Juli geleert (No-Op) statt nur zurückgerollt — verhindert, dass sie bei jedem Deploy erneut mit demselben Tabellen-Konflikt fehlschlägt und alle nachfolgenden Migrationen blockiert.
  28. v0.90.3

    Echte Ursache des Chat-Ausfalls behoben: blockierte Migrationshistorie

    Der vorherige Fix (0.90.2) hat das Problem nicht behoben — Nachrichten, Fotos und Sprachnachrichten schlugen weiterhin fehl. Tatsächliche Ursache: eine alte Datenbank-Migration vom 2. Juli war fehlgeschlagen (die Conversation/Message-Tabellen existierten bereits über einen älteren Weg) und blieb seitdem in der Migrationshistorie als „fehlgeschlagen“ vermerkt — das verhinderte, dass Prisma seit zwei Tagen überhaupt irgendeine neuere Migration anwendet, einschließlich der Sprachnachrichten-Spalten. Die alte Migration wird jetzt beim Deploy automatisch als zurückgerollt markiert (kein Effekt auf Tabellenstruktur oder Daten — die Tabellen haben ihre korrekte Form bereits über andere, erfolgreich angewendete Migrationen), wodurch alle danach wartenden Migrationen erstmals wirklich angewendet werden.

    Bugfix
    • Deploy-Skript löst jetzt automatisch eine seit dem 10. Juli blockierte, fehlgeschlagene Alt-Migration auf ("relation Conversation already exists") — dieselbe, bereits zweimal zuvor aufgetretene Ursache wie bei den Community-Board- und Vorrats-Berater-Migrationen.
  29. v0.90.2

    Chat komplett repariert: Nachrichten, Fotos und Sprachnachrichten sendbar

    Nach dem letzten Deploy ließen sich im Chat weder Text- noch Foto- noch Sprachnachrichten senden. Ursache: die Datenbank-Migration für die neuen Sprachnachrichten-Felder war auf dem Produktivsystem nie tatsächlich angewendet worden, obwohl sie als erledigt vermerkt war — der Anwendungscode erwartete dadurch zwei Datenbankspalten, die in Wirklichkeit fehlten, was jede Nachrichtenerstellung mit einem Datenbankfehler abbrechen ließ.

    Bugfix
    • Fehlende Datenbankspalten für Sprachnachrichten (audioFilename, durationSeconds) auf der Produktivdatenbank nachträglich angelegt — betraf zuvor jede Art von Chat-Nachricht (Text, Foto, Sprachnachricht), nicht nur Sprachnachrichten.
  30. v0.90.1

    Feedback-Button: Position im Desktop korrigiert, im Chat ausgeblendet

    Der Feedback-Button lag in der Desktop-Ansicht über der linken Navigationsleiste statt daneben. Im Chat-Fenster blieb er außerdem sichtbar und überlagerte dort die Aufnahme-, Foto- und Senden-Buttons, wenn man per Klick (statt per Neuladen der Seite) in den Chat navigiert hat — die serverseitige Ausblend-Logik wurde bei einer Client-seitigen Navigation nicht neu ausgewertet.

    Bugfix
    • Feedback-Button erscheint in der Desktop-Ansicht jetzt rechts neben der Navigationsleiste statt darüber.
    • Feedback-Button bleibt im Chat-Fenster jetzt zuverlässig ausgeblendet — die Sichtbarkeit wird direkt im Button selbst anhand der aktuellen Route geprüft, nicht mehr serverseitig, damit sie auch bei einer Navigation per Klick korrekt bleibt.
  31. v0.90.0

    Chat-Optimierung: Online-Status, Nachbarschafts-Distanz, Heatmap-Karte & Sprachnachrichten

    Der Chat- und Nachbarschaft-Bereich hat ein umfassendes Update bekommen. Im Chat siehst du jetzt auf einen Blick, ob dein Gegenüber gerade online ist, und erkennst befreundete Nachbarn an einem kleinen Smiley am Avatar. Links in Nachrichten öffnen erst nach einer Sicherheitsabfrage, und eingehende Nachrichten lassen dein Gerät kurz vibrieren. Im Nachbarschaft-Tab zeigt eine echte Karte mit Heatmap, wie dicht Nachbarn in deiner Umgebung verteilt sind (immer nur aggregiert, nie einzelne Standorte), und der Chat-Header zeigt bei sichtbaren Nachbarn eine grobe Entfernungsangabe. Neu: Sprachnachrichten im Chat — durch einfaches Antippen aufnehmen und wieder antippen zum Beenden, als barrierearme Alternative zum Tippen.

    Neu
    • Online-Status-Punkt an Avataren in Chat-Liste, Chat-Header und Nachbarschaft-Liste (grau = offline, pulsierend grün = online).
    • Freundschafts-Smiley am Avatar, wenn eine Nachbarschafts-Anfrage angenommen wurde.
    • Ungelesen-Badge auch in der Nachbarschaft-Liste, analog zur bestehenden Chat-Liste.
    • Links in Chat-Nachrichten öffnen erst nach Bestätigung in einem Warn-Dialog, der die Zieldomain zeigt.
    • Kurze Vibration bei eingehender Nachricht in einem geöffneten Chat.
    • Grobe Entfernungsangabe (z. B. „1–3 km“) im Chat-Header, wenn beide Personen als Nachbarn sichtbar sind — nie ein exakter Standort.
    • Interaktive Heatmap-Karte im Nachbarschaft-Tab: zeigt die Dichte sichtbarer Nachbarn ausschließlich als aggregierte Zellen (Mindestschwelle 3 Personen), niemals einzelne Standorte.
    • Sprachnachrichten im Chat: durch Antippen starten, erneutes Antippen beendet die Aufnahme (max. 2 Minuten), einfacher Player mit Fortschrittsbalken und Dauer-Anzeige. Gleiche 180-Tage-Löschfrist wie Foto-Nachrichten.
  32. v0.89.4

    Toggle-Schalter im Cookie-Banner korrigiert

    Der Matomo-Schalter im Cookie-Banner hatte keinen festen Ankerpunkt und ragte dadurch je nach Zustand über den Rand hinaus oder klebte fast unsichtbar am rechten Rand — wirkte wie ein einfarbiger Balken ohne erkennbaren Knopf.

    Bugfix
    • Toggle-Schalter für Matomo-Statistiken im Cookie-Banner zeigt jetzt in beiden Zuständen einen sauber sichtbaren, korrekt positionierten Knopf innerhalb der Schalter-Spur.
  33. v0.89.3

    Matomo: Do-Not-Track-Signal entfernt

    Der Matomo-Tracking-Code respektierte bislang das Do-Not-Track-Signal des Browsers und zeichnete Aufrufe dann gar nicht erst auf — was auch die eigene Installationsprüfung im Matomo-Backend verhindern konnte, wenn diese Einstellung aktiv war.

    Bugfix
    • Matomo respektiert das Do-Not-Track-Browsersignal nicht mehr — Zustimmung wird weiterhin ausschließlich über den Cookie-Banner gesteuert.
  34. v0.89.2

    Matomo endlich verifiziert, Rezept-Filter-Overlay & Avatar-Fix

    Matomo lädt jetzt fest im Seiten-Header (statt per Nachlade-Skript) und wird von der automatischen Installationsprüfung erkannt — eine zuvor gewählte „Nur essentielle“-Einstellung wird weiterhin respektiert. Das Filter-Overlay der Rezeptübersicht hat jetzt „Filtern“- und „Zurücksetzen“-Buttons, einen passenderen Titel und einen bis zum Bildschirmrand reichenden Hintergrund. Der Avatar bei eigenen Rezept-Bewertungen zeigt jetzt den echten Namen statt eines falschen Platzhalter-Kürzels, und der Datenschutz-Button auf den öffentlichen Seiten sitzt nicht mehr unnötig weit oben.

    Bugfix
    • Matomo-Tracking-Code wird jetzt serverseitig fest im Seiten-Header eingebunden statt per Nachlade-Skript — dadurch erkennt ihn die automatische Installationsprüfung im Matomo-Backend jetzt zuverlässig.
    • Rezept-Filter-Overlay: neue Buttons „Filtern“ (übernimmt die Auswahl) und „Zurücksetzen“, Titel „Rezepte filtern“ statt „Filter“, und der abgedunkelte Hintergrund reicht jetzt bis zum unteren Bildschirmrand.
    • Avatar bei der eigenen Rezept-Bewertung zeigte fälschlich ein „D“ (von „Deine Bewertung“) statt der echten Initiale — zeigt jetzt den tatsächlichen Namen.
    • Datenschutz-Button (Fingerabdruck-Symbol) auf den öffentlichen Seiten saß unnötig weit oben, da er dieselbe Bottom-Nav-Abstandsregel wie der App-interne Feedback-Button übernahm — auf den öffentlichen Seiten gibt es aber keine Bottom-Nav.
  35. v0.89.1

    Matomo-Installationsprüfung behoben

    Die automatische Installationsprüfung im Matomo-Backend schlug fehl, weil Matomo bei einem allerersten Seitenaufruf ohne getroffene Cookie-Entscheidung nicht geladen wurde — genau dieser Fall liegt bei der Matomo-eigenen Prüfung vor. Die Standardeinstellung „aktiviert“ gilt jetzt auch, solange noch keine Cookie-Entscheidung gespeichert wurde.

    Bugfix
    • Matomo-Tracking startet jetzt auch beim allerersten Seitenaufruf ohne vorherige Cookie-Entscheidung (Standard „aktiviert“ galt bisher erst nach dem Speichern im Cookie-Banner) — behebt die fehlgeschlagene Installationsprüfung im Matomo-Backend.
  36. v0.89.0

    Admin-Testlogin, Rezept-Bewertungen mit Avatar & Voting, Einkaufs-Benachrichtigung

    Admins können sich jetzt mit einem Klick als Test-Nutzer oder Test-Partner anmelden, um neue Features aus echter Sicht zu testen. Rezept-Bewertungen zeigen jetzt Avatar und Namen und lassen sich wie im Community-Bereich hoch- oder runterstufen; die Sternebewertung erscheint außerdem direkt im Titelbild. Wer etwas zur Einkaufsliste hinzufügt, benachrichtigt automatisch die anderen Haushaltsmitglieder. Außerdem: die Rezeptübersicht hat jetzt ein aufgeräumtes Filter-Overlay und einen fixierten Neu-Button, und dunkle Filter-Chips sind im Dark Mode wieder lesbar.

    Neu
    • Admin: Testlogin für neue Features — meldet dich vorübergehend als geseedeten Test-Nutzer oder Test-Partner an, mit Banner und Ein-Klick-Rücksprung zum Admin-Account (auditiert).
    • Wenn ein Haushaltsmitglied ein Produkt zur Einkaufsliste hinzufügt, erhalten alle anderen Mitglieder jetzt eine Benachrichtigung (inkl. Push).
    • Rezept-Bewertungen zeigen jetzt Avatar (Foto oder Initialen) und Namen und lassen sich wie im Community-Bereich hoch- oder runterstufen.
    • Die Sternebewertung eines Rezepts erscheint jetzt auch direkt im Titelbild der Detailansicht (wie im Listing) — ein Klick springt zu den Bewertungen.
    • Rezeptübersicht: Filter (Kategorie, Sortierung) sind jetzt über einen Button als Overlay erreichbar, das Suchfeld bleibt beim Scrollen fixiert, und ein neuer fixierter Button unten rechts ersetzt den bisherigen „+ Neu“-Button.
    Bugfix
    • Filter-Buttons mit dunklem Hintergrund (z. B. Kategorie-Filter) zeigten im Dark Mode kaum lesbaren Text — behoben durch eine feste, vom Dark-Mode-Farbwechsel unabhängige Kontrastfarbe.
    • Rezept-Detailansicht: „Drucken“ ist jetzt ein reiner Icon-Button, direkt neben „Favorisieren“ und „Anpassen“ bzw. „Bearbeiten“.
  37. v0.88.0

    Einkaufsliste-Politur, Titelbilder überall & smarte Badges

    Die Einkaufsliste hat jetzt eine kompaktere, durchgängige Eingabezeile über die volle Breite, die beim Scrollen noch mehr Platz schafft. Vorrat und Einkauf zeigen jetzt euer Haushalts-Titelbild wie das Dashboard. Benachrichtigungen lassen sich einzeln als gelesen markieren, Nachbarschaftsanfragen direkt beantworten, und eine Vorschau öffnet sich jetzt unter der Glocke im Header. Dashboard-Kacheln und die mobile Navigation zeigen außerdem, wie viele Produkte in Vorrat und Einkaufsliste stecken.

    Neu
    • Benachrichtigungen lassen sich jetzt einzeln als gelesen markieren, statt nur alle auf einmal.
    • Nachbarschafts-Anfragen erscheinen direkt in den Benachrichtigungen und lassen sich mit einem Klick annehmen oder ablehnen.
    • Das Glocken-Symbol im mobilen Header öffnet jetzt eine Vorschau-Karte mit den letzten Benachrichtigungen, ohne auf die Unterseite wechseln zu müssen.
    • Das Haushalts-Titelbild wird jetzt auch auf den Seiten „Vorrat“ und „Einkauf“ angezeigt (wie schon auf dem Dashboard) — ohne Bild erscheint ein Hinweis zum Hochladen.
    • Dashboard-Kacheln „Vorrat“ und „Einkaufen“ sowie die zugehörigen Symbole in der mobilen Navigation zeigen jetzt die Anzahl der jeweils gelisteten Produkte als Badge.
    Bugfix
    • Das Eingabefeld der Einkaufsliste geht jetzt über die volle Breite; Mengen-Auswahl und Hinzufügen-Button liegen inline im Suchfeld, wodurch auch die Vorschlagsliste wieder vollständig sichtbar ist.
    • Das Label „Artikel hinzufügen“ blendet sich beim Herunterscrollen aus, sobald das Eingabefeld oben fixiert wird, um mehr Platz zu schaffen.
    • „Warenkorb leeren“ steht jetzt als Button direkt unter „X Artikel in Vorrat übernehmen“, statt lose über der Liste zu stehen.
    • Die Kachel „Lagerorte“ im Vorrat wird auf dem Smartphone ausgeblendet, um horizontales Scrollen zu vermeiden — auf dem Desktop bleibt sie sichtbar. Alle Vorrats-Kacheln haben jetzt ein passendes Symbol.
  38. v0.87.0

    Matomo-Kontrolle, echter Button-Kontrast-Fix & UI-Politur

    Matomo-Statistiken lassen sich im Cookie-Banner jetzt gezielt per Schalter an- oder abwählen (Standard: aktiviert) und werden direkt im Seiten-Header eingebunden. Grüne Buttons zeigen jetzt zuverlässig weißen Text im Tagmodus — die eigentliche Ursache lag tiefer als zunächst angenommen. Außerdem: Datenschutz-Button nur noch auf den öffentlichen Seiten, ein stimmigeres Scan-Icon und Tooltips ohne Positions-Flackern.

    Neu
    • Cookie-Banner: Matomo-Statistiken lassen sich jetzt gezielt per Schalter an- oder abwählen (Standard: aktiviert), statt nur pauschal „Alle akzeptieren“ oder „Nur essentielle“.
    Bugfix
    • Grüne Buttons zeigen jetzt auch im Tagmodus zuverlässig weißen Text — behoben wurde eine tieferliegende CSS-Ursache, durch die als Link gerenderte Buttons ihre Textfarbe an eine globale Stilregel verloren.
    • Datenschutz-Button (Fingerabdruck-Symbol) erscheint jetzt nur noch auf den öffentlichen Seiten (Startseite, Login, Impressum u. a.), nicht mehr innerhalb der App.
    • Matomo-Tracking-Code wird jetzt direkt im Seiten-Header eingebunden, damit sich die Installation im Matomo-Backend verifizieren lässt.
    • Scan-Schnellzugriff auf dem Dashboard zeigt jetzt dasselbe Plus-Scan-Symbol wie die mobile Navigation, statt eines leicht mit einem Minus verwechselbaren Icons.
    • Tooltips blitzen nicht mehr kurz an der falschen Position (oben links) auf, bevor sie sich korrekt positionieren.
  39. v0.86.1

    Deploy-Pipeline: schnellere, verlässlichere Builds

    Rein technische Verbesserung an der Deploy-Pipeline — für dich als Nutzer unsichtbar. Deploys installieren jetzt exakt geprüfte Paketversionen, laufen auf einer aktuellen Node-Version und nutzen Docker-Caching statt bei jedem Deploy alles neu zu bauen.

    Infrastruktur
    • Deploy installiert Abhängigkeiten jetzt reproduzierbar aus der geprüften Lockfile (npm ci) statt sie bei jedem Deploy neu aufzulösen.
    • Node-Version der Build- und Laufzeitumgebung auf 24 angehoben (behebt eine Versions-Inkompatibilität mit einer Scan-Bibliothek); alle bisher ungepinnten Paketversionen wurden auf den geprüften Stand eingefroren.
    • Docker-Layer-Caching für den Image-Build reaktiviert (ersetzt durch einen Frische-Check, der einen veralteten Build zuverlässig verhindert) — spart Zeit bei jedem Deploy auf dem ressourcenbeschränkten VPS.
  40. v0.86.0

    PLZ-Autocomplete, Datenschutz-Button & besserer Button-Kontrast

    PLZ- und Ortsfeld schlagen jetzt direkt beim Tippen passende Orte vor und befüllen sich gegenseitig — in Einstellungen, Marktplatz und FoodShare. Außerdem: ein neuer Button für Datenschutzeinstellungen, echtes Seitenaufruf-Tracking bei jedem Klick, und deutlich besser lesbare grüne Buttons.

    Neu
    • PLZ- und Ortsfeld schlagen beim Tippen passende Orte aus der PLZ-Datenbank vor — Auswahl befüllt automatisch PLZ, Ort und Region. Das separate Suchfeld in den Einstellungen entfällt. Gilt jetzt für Einstellungen, Marktplatz-Inserate und FoodShare-Angebote.
    • Neuer Button unten rechts (Fingerabdruck-Symbol) öffnet jederzeit die Datenschutzeinstellungen erneut, um die Cookie-Einwilligung einzusehen oder zu ändern.
    Bugfix
    • Anonymisiertes Reichweiten-Tracking (Matomo) erfasst jetzt jeden Seitenwechsel innerhalb der App, nicht mehr nur den ersten Seitenaufruf.
    • Grüne Buttons zeigen jetzt durchgängig gut lesbaren Text — vorher wurde weißer Button-Text im Dunkelmodus durch eine interne Farbüberschneidung fast unsichtbar.
  41. v0.85.0

    Admin-Verwaltung, mehr Vorrats-Vorschläge & Druck-Feinschliff

    Nutzer, Haushalte, Werbepartner und Produkte lassen sich jetzt direkt in der Administration bearbeiten und löschen. Außerdem: deutlich mehr Vorrats-Berater-Vorschläge, ein Bild beim Rezept des Tages, ein Warenkorb-leeren-Button und Fixes am Druck-Layout.

    Neu
    • Administration: Nutzer, Haushalte und Werbepartner lassen sich jetzt direkt bearbeiten und löschen (inkl. Detailseiten) — vorher reine Leselisten. Produkte lassen sich zusätzlich manuell anlegen und löschen.
    • Vorrats-Berater schlägt jetzt bis zu 30 statt 8 Grundnahrungsmittel vor, inklusive 13 neuer Alltagsartikel (Gewürze, Getränke, Drogerie).
    • Warenkorb in der Einkaufsliste lässt sich jetzt mit einem Klick komplett leeren, statt jedes Produkt einzeln zu löschen.
    • Rezept des Tages zeigt jetzt auch auf der Rezepte-Seite ein Titelbild, genau wie im Dashboard.
    • In der mobilen Navigation steht jetzt „Scannen" unter den beiden Scan-Buttons, wie bei den anderen Menüpunkten.
    Bugfix
    • QR-Code auf Ausdrucken (Einkaufsliste, Vorrat, Rezepte) verschwindet nicht mehr hinter dem Header und erzeugt keine leere Extra-Seite mehr — URL steht jetzt über dem QR-Code.
    • Fixiertes Einkaufsformular überlagert beim Scrollen nicht mehr den App-Header.
  42. v0.84.0

    Drucken, schneller einkaufen, aufgeräumterer Vorrat

    Ein Bündel praktischer Alltagsverbesserungen: Einkaufsliste, Vorrat und Rezepte lassen sich jetzt ausdrucken, das Hinzufügen-Formular in der Einkaufsliste passt in eine Zeile, der Vorrats-Berater kennt jetzt auch Drogerieartikel, und ein paar kleinere Anzeigefehler wurden behoben.

    Neu
    • Einkaufsliste, Vorrat und Rezepte lassen sich jetzt drucken – mit Ankreuzkästchen zum Abhaken per Stift und einem QR-Code auf dem Ausdruck, der direkt zurück zur passenden App-Seite führt.
    • Vorrats-Berater kennt jetzt auch Alltags-Drogerieartikel wie Alufolie, Frischhaltefolie, Spülmittel, Toilettenpapier und Batterien – nicht mehr nur Lebensmittel.
    • Einkauf-Formular passt jetzt in eine Zeile: Mikrofon direkt im Suchfeld integriert, Menge über ein Zahnrad-Icon einstellbar, bleibt beim Scrollen oben sichtbar.
    • Während die App etwas lädt, zeigt der Mauszeiger das jetzt zusätzlich zur Ladeleiste am oberen Bildschirmrand an.
    Bugfix
    • Tooltips blitzen nicht mehr kurz an der falschen Stelle auf, bevor sie an der richtigen Position erscheinen.
    • Der fixierte Plus-Button im Vorrat ist weg – der Vorrats-Berater-Button übernimmt jetzt seine Position und bietet einen Link zum manuellen Hinzufügen.
    • Einheitliche Button-Grundlage mit korrektem Kontrast (weißer Text auf grünem Hintergrund), auch im Dark Mode.
    Infrastruktur
    • Anonymisiertes Reichweiten-Tracking (Matomo) ergänzt – startet ausschließlich nach expliziter Einwilligung im Cookie-Banner, respektiert „Do Not Track", keine Weitergabe an Dritte.
  43. v0.83.0

    Aufgeräumte Sidebar-Navigation

    Die Admin- und die Nutzer-Sidebar sind jetzt in aufklappbare Gruppen sortiert statt einer langen Liste — mehr Übersicht auf dem Desktop. Dein Auf-/Zuklappen-Zustand wird gemerkt.

    Neu
    • Admin-Sidebar: 26 Einträge in 8 thematische Gruppen sortiert, unabhängig auf-/zuklappbar.
    • Nutzer-„Mehr"-Sidebar: 16 Einträge in 5 Gruppen sortiert.
    • Zugeklappte Gruppen mit neuen Hinweisen zeigen einen kleinen Punkt am Gruppenkopf, damit nichts übersehen wird.
  44. v0.82.0

    Produktdaten verbessern mit Vorschlägen

    Du kannst jetzt direkt in der Produktansicht fehlende oder falsche Angaben vorschlagen — z. B. Nährwerte, Allergene oder Zusatzstoffe. Nach Prüfung durch unser Team gibt's Punkte für jeden angenommenen Vorschlag.

    Neu
    • Neues Vorschlags-System auf der Produktseite: Inline-Icon an jedem leeren Feld oder ein Sammel-Formular für mehrere Änderungen auf einmal.
    • Bewertungen, Nährwerte, Allergene und Zusatzstoffe werden jetzt immer angezeigt (mit Ergänzen-Hinweis, wenn leer), statt bei fehlenden Daten zu verschwinden.
    • 5 Punkte für jeden vom Team angenommenen Korrekturvorschlag, plus Benachrichtigung über die Entscheidung.
  45. v0.81.0

    Tooltips statt Browser-Hinweise

    Alle Hinweistexte in der App (z. B. an Icon-Buttons oder deaktivierten Aktionen) erscheinen jetzt als hübsch gestaltete Tooltips statt als schlichter Browser-Hinweis — mit sanfter Animation und automatischer Ausrichtung, damit nie etwas am Bildschirmrand abgeschnitten wird.

    Neu
    • Neue Tooltip-Komponente ersetzt alle bisherigen Browser-Hinweise (Icon-Buttons, deaktivierte Aktionen, gekürzte Texte) in der gesamten App.
    • Tooltips richten sich automatisch nach verfügbarem Platz aus (oben/unten/links/rechts) und bleiben immer vollständig auf dem Bildschirm sichtbar.
    • Auf dem Smartphone per Fingertipp aufrufbar, ohne den eigentlichen Klick zu blockieren.
    Bugfix
    • Hinweise an deaktivierten Buttons (z. B. „Demnächst verfügbar", „Nicht genug KI-Taler") werden jetzt auch bei Berührung/Hover zuverlässig angezeigt.
  46. v0.80.2

    Dashboard-Feinschliff

    Die Kacheln auf dem Dashboard sind jetzt auch auf dem Smartphone zweispaltig, und dein Vorrats-Berater sitzt als handlicher Button unten rechts, der sich als Fenster öffnet.

    Neu
    • Dashboard-Kacheln jetzt auch auf dem Smartphone zweispaltig — als kompakte Karten für einen klaren Kachel-Look.
    • Vorrats-Berater als fixierter Button unten rechts (spiegelbildlich zum Feedback-Button): öffnet sich als Fenster und erscheint nur, wenn es Vorschläge gibt (mit Anzahl-Badge) — auf dem Dashboard und der Vorrats-Seite.
  47. v0.80.1

    Rückweg zur App aus Info-Seiten

    Wer angemeldet ist und eine Info-Seite wie den Changelog öffnet, sieht jetzt einen direkten Weg zurück in die App statt der Anmelde-Buttons.

    Neu
    • Angemeldete Nutzer sehen auf Info-Seiten (Changelog, Roadmap, Impressum, Datenschutz …) statt „Einloggen"/„Kostenlos starten" einen „Zurück zur App"-Button und ihren Avatar.
    • Auf dem Smartphone erscheint dafür ein unten mittig fixierter „Zurück zur App"-Button mit Schlagschatten — die Logo-Leiste oben bleibt erhalten.
  48. v0.80.0

    Dein Dashboard, deine Ordnung

    Das Dashboard gehört jetzt dir: das Rezept des Tages erscheint mit Foto, alle Bereiche sind als Kacheln direkt erreichbar — und im Bearbeiten-Modus sortierst du alles per Fingertipp um oder blendest es aus. Deine Anordnung wird gespeichert und ist auf allen Geräten gleich.

    Neu
    • Rezept des Tages jetzt mit Titelfoto — genau wie in der Rezeptübersicht.
    • Neue Kachel-Übersicht unter „Meine Punkte“: Wochenplan, Statistiken, Preise, FoodShare und weitere Bereiche direkt vom Dashboard erreichbar.
    • Bearbeiten-Modus „Dashboard anpassen“: Kacheln und Bereiche per Ziehen umsortieren, ausblenden und jederzeit wieder einblenden — auf „Zurücksetzen“ ist der Standard sofort zurück.
    • Deine Anordnung wird pro Konto gespeichert und ist auf allen Geräten gleich.
  49. v0.79.1

    Chat-Feinschliff

    Die Chat-Ansicht sitzt jetzt fest: Kopf und Eingabe bleiben verankert, nur die Nachrichten scrollen — dazu ein schlankerer Kopf, und Nachrichten sind erst nach Bestätigung deiner E-Mail-Adresse nutzbar.

    Bugfix
    • Chat-Ansicht fixiert: Kopf und Eingabefeld bleiben verankert, ausschließlich die Nachrichten scrollen — auch mobil bei ein-/ausblendender Browserleiste.
    • Schlankerer Chat-Kopf: die zusätzliche Zeile ist weg, ein kompakter Zurück-Pfeil sitzt jetzt links neben dem Namen.
    Sicherheit
    • Nachrichten und Nachbarschaft sind gesperrt, bis die E-Mail-Adresse bestätigt ist — mit klarem Hinweis und der Möglichkeit, die Bestätigungsmail erneut zu senden.
  50. v0.78.0

    Chat & Nachbarschaft v2

    Der Chat bekommt ein fixiertes Layout, Foto-Versand und Online-Status. Chats und Nachbarschaft aktualisieren sich jetzt automatisch, Anfragen erscheinen ganz oben — und Anzeigenamen im öffentlichen Raum schützen deine Privatsphäre.

    Neu
    • Fixiertes Chat-Layout: nur die Nachrichten scrollen, Kopf und Eingabe bleiben immer sichtbar.
    • Fotos im Chat versenden (1 Foto pro Nachricht, automatisch komprimiert, nach 180 Tagen automatisch gelöscht).
    • Online- und Zuletzt-online-Status hinter dem Namen im Chat.
    • Chats und Nachbarschaft aktualisieren sich automatisch — neue Anfragen und Nachrichten erscheinen ohne Neuladen.
    • Nachbarschafts-Anfragen erscheinen jetzt ganz oben in beiden Reitern (Chats und Nachbarschaft).
    • Datenschutzfreundliche Anzeigenamen im öffentlichen Raum: Anzeigename bzw. Vorname + Anfangsbuchstabe des Nachnamens statt vollem Namen.
    Bugfix
    • Header aufgeräumt: Tag/Nacht-Umschaltung gibt es jetzt nur noch im Menü und in der Seitenleiste, nicht mehr doppelt im mobilen Header.
  51. v0.77.0

    Deine Nachbarschaft

    Finde StockPilot-Nutzer in deiner Nähe und vernetze dich per Anfrage — freiwillig, mit grober Standortangabe und ohne Karte.

    Neu
    • Neuer Tab „Nachbarschaft" unter Nachrichten: mach dein Profil sichtbar und finde andere Nutzer in deiner Nähe.
    • Standort bleibt grob: deine GPS-Position wird schon im Browser auf rund 1 km gerundet (oder ersatzweise aus deiner PLZ bestimmt) — keine Karte, keine genaue Adresse, nur Entfernungs-Stufen wie „unter 1 km".
    • Nachbarn anfragen: schreib eine kurze Vorstellung; erst wenn dein Gegenüber annimmt, entsteht ein Chat. Ablehnen passiert still.
    • Push- und Glocken-Benachrichtigung bei neuer Anfrage und bei Annahme.
    • „Kontakt aufnehmen" direkt beim Autor eines Community-Beitrags.
    • Blockierte Nutzer erscheinen nicht in deiner Nachbarschaft und können dich nicht anfragen.
    Sicherheit
    • Sichtbarkeit ist standardmäßig aus und jederzeit abschaltbar — beim Ausschalten wird dein gespeicherter Standort gelöscht.
  52. v0.76.0

    PLZ-Autosuggest

    Bei der Eingabe von PLZ oder Ort im Profil gibt es jetzt Vorschläge aus einer vollständigen deutschen PLZ-Datenbank — Grundlage für kommende Standort-Funktionen.

    Neu
    • In den Profil-Einstellungen kannst du jetzt PLZ oder Ort eintippen und bekommst passende Vorschläge (z. B. 10115 Berlin) — Auswahl füllt PLZ und Ort automatisch aus.
    • Neue, vollständige deutsche PLZ-Referenzdatenbank (Ort, Bundesland, Koordinaten) als Grundlage für Autosuggest und kommende Standort-/Nachbarschafts-Funktionen.
  53. v0.75.0

    Chat-Fundament

    Ein Chat pro Nutzer-Paar statt pro Marktplatz-Angebot — inklusive automatischer Haushalts-Chatliste, Lesebestätigungen, Tippt-Indikator und Blockieren.

    Neu
    • Nachrichten funktionieren jetzt wie bei WhatsApp: nur noch ein Chat pro Nutzer-Paar, unabhängig davon, worüber ihr zuerst geschrieben habt.
    • Haushaltsmitglieder erscheinen automatisch in der Chatliste — auch ohne bisherigen Nachrichtenverlauf.
    • Eigene Nachrichten zeigen jetzt Lesehaken (einfach = gesendet, doppelt = gelesen) sowie „Gelesen HH:mm" unter der letzten gelesenen Nachricht.
    • Tippt-Indikator: du siehst live, wenn dein Gegenüber gerade schreibt.
    • Neu: Nutzer blockieren (mit Grundangabe: Spam, Belästigung, kein Interesse, Sonstiges) — Haushaltsmitglieder lassen sich bewusst nicht blockieren.
    • Neues Chat-Icon mit Ungelesen-Badge im mobilen Header, direkt neben den Benachrichtigungen.
  54. v0.74.0

    Rezept-Titelbild groß

    Das KI-Titelbild eines Rezepts erscheint jetzt groß im Karussell oben auf der Detailseite statt als kleines Thumbnail neben dem Titel.

    Bugfix
    • Rezept-Detailseite: Titelbild wird jetzt als erstes Bild im großen 16:9-Foto-Karussell angezeigt (statt als 48×48px-Thumbnail neben der Überschrift).
    • Titel, Beschreibung und Badges (Kategorie, Schwierigkeit, Zeit, Portionen) erscheinen jetzt direkt unter dem großen Bild statt darüber.
  55. v0.73.0

    KI-Taler

    Neues Guthaben-System für die KI-Wochenplanung: Fortschrittsbalken im Wochenplan, einzelne Rezept-Neugenerierung, aufladbar über Stripe in vier Paketgrößen.

    Neu
    • Fortschrittsbalken im Wochenplan-Header zeigt das KI-Taler-Guthaben, reagiert live auf jede Wochenplan-Generierung und Rezept-Neugenerierung.
    • Neu: einzelne Rezept-Neugenerierung im Wochenplan (2 Taler) — bisher gab es nur „ganze Woche neu generieren".
    • Neue Seite „KI-Taler" (`/app/ai-credits`): Guthaben-Übersicht, vier Kauf-Pakete (Mini bis Bestes Angebot mit -50 % Mengenrabatt), FAQ.
    • Free-Nutzer erhalten ein einmaliges Startguthaben; Plus/Family bekommen ein monatliches Kontingent im Abo, aufstockbar per Kauf.
    • KI-Wochenplan ist jetzt für alle Nutzer mit ausreichend Guthaben verfügbar (statt starr ans Abo gekoppelt) — reicht das Guthaben nicht, gibt es weiterhin automatisch einen nicht-personalisierten Plan, nie eine Sperre.
    Bugfix
    • Free-Nutzer wurden beim Generieren eines Wochenplans bisher zur Abo-Seite umgeleitet, statt einen automatischen Plan zu bekommen — behoben.
  56. v0.72.0

    Vorrats-Berater

    Bei wenig Vorrat schlägt „Dein Vorrats-Berater" schrittweise fehlende Alltags-Basics vor — mit einem Klick zur Einkaufsliste, direkt in den Vorrat oder dauerhaft ablehnen.

    Neu
    • Neue Karte „Dein Vorrats-Berater" auf Dashboard und Vorratsseite: erscheint automatisch, sobald weniger als 10 Produkte im Vorrat sind.
    • Vorschläge aus einer admin-gepflegten Liste von Alltags-Basics (Milch, Brot, Eier, Kaffee, ...), einer nach dem anderen mit drei Aktionen: „Zum Einkauf", „Hab ich schon" (direkt in den Vorrat, mit Punkten), „Brauch ich nicht" (dauerhaft ausgeblendet).
    • Admin: Produkte können in der Produktverwaltung als „Alltags-Basic" markiert werden (inkl. Vorschlags-Menge/-Einheit), mit Filter „Nur Basics" in der Produktliste.
  57. v0.71.0

    Community-Bereich

    Neuer StackOverflow-artiger Community-Bereich für Ideensammlung und Feedback — Threads mit Kategorien, verschachtelte Kommentare, Up-/Downvotes, Admin-Moderation und Verlinkung zu Changelog & Roadmap.

    Neu
    • Neuer Bereich „Community" (`/app/community`): Threads mit Titel, Text, optional 1 Bild in 5 Kategorien (Feature-Idee/Bug-Report/Verbesserung/Frage/Sonstiges).
    • Verschachtelte Kommentare (bis 4 Ebenen visuell eingerückt), Melden-Funktion für Threads und Kommentare, Bearbeiten/Löschen für eigene Beiträge.
    • Up-/Downvotes für Threads und Kommentare, Übersicht sortierbar nach Score (Default), Neuestem oder Kommentaranzahl.
    • Schreibrechte erfordern verifizierte E-Mail + mindestens einen Haushalt (Admins/Super-Admins bypass).
    • Admin-Moderation (`/admin/community`): Verbergen/Löschen, Status setzen, Report-Queue — auditiert via AdminAuditLog.
    • Changelog verlinkt zur Roadmap, Roadmap verlinkt zur Community und kann Einträge optional mit einem Community-Thread verknüpfen (zeigt Score/Kommentaranzahl live).
  58. v0.70.0

    Admin-Produktregeln: MHD & Lagerort

    MHD- und Lagerort-Vorschläge im Scan werden jetzt zentral über Admin-verwaltete Kategorien gesteuert. Nutzer-Abweichungen fließen aggregiert zurück und können von Admins in die Regel-Datenbank übernommen werden.

    Neu
    • Scan: MHD-Vorschlag kommt jetzt aus admin-gepflegten Kategorie-Regeln statt aus fest codierten Mustern im Browser.
    • Scan: Lagerort wird automatisch vorbelegt — zuerst aus der Haushalts-Historie, sonst über die Kategorie-Zuordnung.
    • Admin: neuer Bereich 'Produktregeln' zur Pflege von Kategorien (Name, Keywords, Haltbarkeit, Lagerort-Typ, Sortierung).
    • Admin: Nutzer-Abweichungen werden aggregiert gesammelt und können gezielt in die Regel-Datenbank übernommen werden.
    • Einstellungen: Lagerorte können jetzt einem Typ (Kühlschrank, Gefrierfach, Vorratsschrank, Speisekammer, Sonstiges) zugeordnet werden.
  59. v0.69.0

    Admin-Ideen-Seite

    Neue Unterseite im Adminbereich zum schnellen Erfassen und Priorisieren interner Produktideen — mit Drag&Drop-Sortierung, Dringlichkeits-Farbcode und Status-Tracking.

    Neu
    • Admin: Neue Seite „Ideen" (`/admin/ideas`) — Quick-Capture-Formular (Titel, Beschreibung, Dringlichkeit, optionaler Ort/URL-Verweis auf die Codebase).
    • Drag&Drop-Priorisierung der aktiven Ideen, Reihenfolge wird persistiert.
    • Farbliche Dringlichkeits-Hervorhebung (Niedrig/Mittel/Hoch) und Status-Tracking (Offen/In Prüfung/Umgesetzt/Verworfen) mit eingeklappter Archiv-Sektion.
    • Audit-Log für gelöschte Ideen (`idea.delete`).
    • Admin-Navigation: Neuer Eintrag „Ideen" zwischen „Roadmap" und „Einstellungen".
  60. v0.68.0

    Onboarding-Sperre & Admin-Billing-Bypass

    Wer das Onboarding überspringt, kann die App trotzdem eingeschränkt nutzen — mit Hinweisbanner statt Zwangsumleitung. Außerdem können Admins und Super-Admins Premium-Features jetzt ohne bezahlten Plan testen.

    Neu
    • Onboarding übersprungen: Statt eines Zwangs-Redirects zeigt die App jetzt einen Hinweisbanner und graut alle Funktionen außer Profil, Einstellungen, Benachrichtigungen und Logout aus, bis das Onboarding abgeschlossen ist.
    • Direkter Aufruf gesperrter Seiten (z. B. per URL) wird serverseitig zu /app umgeleitet, inklusive kurzer Hinweis-Meldung.
    • Admins und Super-Admins können Premium-Features (KI-Wochenplan) jetzt ohne bezahlten Plan testen.
  61. v0.67.0

    SmartSuggestion Wochenplan

    Wochenpläne priorisieren jetzt ablaufende Zutaten, berücksichtigen Haushaltsgröße und Saison. KI-Prompt und Fallback-Algorithmus vollständig überarbeitet.

    Neu
    • SmartSuggestion-Service: Ablaufende Zutaten (CRITICAL/EXPIRING_SOON) werden automatisch priorisiert und erscheinen zuerst im Wochenplan.
    • Kontext-Builder: Saison (Frühling/Sommer/Herbst/Winter), Haushaltsgröße und Allergenausschlüsse fließen in den KI-Prompt ein.
    • Claude Haiku 4.5: Strukturierter Prompt mit ablaufenden und verfügbaren Zutaten, bevorzugt bei gesetztem ANTHROPIC_API_KEY.
    • Fallback-Ranker: Ohne API-Key priorisiert ein deterministischer Algorithmus Rezepte mit ablaufenden Zutaten — kein PRNG-Zufall mehr.
    • Portionsskalierung: Zutatenmengen werden automatisch auf die Haushaltsgröße angepasst.
  62. v0.66.0

    Admin-Produktverwaltung

    Vollständige Produktverwaltung im Adminbereich: suchbare und filterbare Produktliste mit Paginierung, Detailansicht sowie Bearbeitungsformular für alle Felder inklusive Foto-Upload.

    Neu
    • Admin: Produktliste mit Volltextsuche, Kategorie- und Status-Filter sowie seitenweiser Paginierung.
    • Admin: Produkt-Detailansicht mit allen Stammdaten, Nährwerten, Health-Score, Allergenen und Zusatzstoffen.
    • Admin: Produkt-Bearbeitungsformular für alle Felder (Stammdaten, Nährwerte, Scores, Allergene, Zusatzstoffe) via Server Actions.
    • Admin: Foto-Upload für Produktbilder mit UUID-basiertem Pfad, Path-Traversal-Schutz und Magic-Byte-Validierung.
    • Admin-Navigation: Neuer Eintrag „Produkte" in der Sidebar.
    • API-Kosten: Claude-Haiku-Aufrufe für Wochenpläne fließen jetzt in ApiCostLog ein und erscheinen im Admin-Dashboard „API-Kosten".
  63. v0.65.0

    Admin-Navigation, Bereichswechsel & Broadcast-Benachrichtigungen

    Die Administration ist jetzt auch mobil voll navigierbar und klar als solche erkennbar. Admins können gezielte Mitteilungen (nach PLZ, Region, Alter) an Nutzer senden — in-App und als Push. Außerdem informieren wir bei jedem Release automatisch über Neuerungen.

    Neu
    • Mobile Admin-/Partner-Navigation: Bottom-Nav mit Kern-Bereichen plus „Mehr"-Drawer (von rechts) mit der vollständigen Navigation.
    • Header zeigt jetzt klar „Administration" bzw. „Partner" als Bereichs-Badge.
    • Avatar-Dropdown: neuer Bereichswechsel zwischen Administration/Partner und App (für Admins und Partner).
    • Neuer Admin-Reiter „Benachrichtigungen": Mitteilungen an alle oder gefilterte Nutzergruppen (PLZ-Bereich, Region, Alter) senden — optional zusätzlich als Push.
    • Automatische Release-Info: Bei jedem erfolgreichen Deployment werden alle Nutzer mit Versionsnummer, Kurz-Zusammenfassung und Changelog-Link benachrichtigt.
    • Profil: optionales Geburtsdatum für altersbasierte Zielgruppen.
    Bugfix
    • Avatar-Dropdown: „Mein Profil" und „Einstellungen" sind nun in beiden Themes klar lesbar (Textfarbe war zuvor kaum vom Hintergrund unterscheidbar).
  64. v0.64.0

    Einkaufsliste mit Produkt-Infos, Such-Thumbnails & Scan-Feinschliff

    In der Einkaufsliste kannst du bei bekannten Produkten jetzt per Info-Icon (links neben dem Papierkorb) alle Produktdaten als Overlay öffnen — praktisch beim Einkaufen. Die Produktsuche zeigt jetzt Foto-Thumbnails. Nach einem Scan-Treffer öffnet sich nicht mehr ungewollt die Tastatur, und der Entfernen-Button in der Fußleiste hat einen satteren Dunkelrot-Ton.

    Neu
    • Einkaufsliste: Bekannte/gescannte Produkte haben jetzt ein Info-Icon (links neben dem Papierkorb). Ein Tippen öffnet das Produkt-Overlay mit Foto, Nutri-Score, Nährwerten & Co. — so sieht man beim Einkaufen direkt, welches Produkt gemeint ist.
    • Produktsuche: Treffer zeigen jetzt ein Foto-Thumbnail statt nur Text — Produkte sind auf einen Blick erkennbar.
    Bugfix
    • Scan: Nach einem erfolgreichen Scan-Treffer öffnet sich auf dem Handy nicht mehr automatisch die Tastatur — der Fokus liegt auf der Produktkarte statt im Suchfeld.
    • Mobile Navigation: Der Entfernen-Button (−Vorrat) nutzt jetzt ein satteres, dunkleres Rot.
  65. v0.63.1

    Scan-Buttons: Grün/Rot, verbunden — durchgängige Plus/Minus-Icons

    Die beiden Scan-Buttons in der Mobil-Navigation sind jetzt ein verbundenes Paar: links grün (zum Vorrat hinzufügen), rechts rot (aus dem Vorrat entfernen), beide mit weißem Icon und außen abgerundet. Das Plus-/Minus-Motiv wird jetzt überall konsistent für Hinzufügen bzw. Entfernen aus dem Vorrat verwendet.

    Neu
    • Mobile Navigation: Hinzufügen-Button in StockPilot-Grün, Entfernen-Button in Rot, beide mit weißem Icon. Die Buttons berühren sich (kein Abstand) und sind nur außen abgerundet — als zusammengehöriges Paar. Icons etwas kleiner.
    • Konsistente Icons: Plus = zum Vorrat hinzufügen, Minus = aus dem Vorrat entfernen — durchgängig in Scan-Kopf, „Aus Vorrat"-Button, Entfernen-Dialog und der Vorrats-Detailseite.
  66. v0.63.0

    Zwei Scan-Buttons in der Mobil-Navigation: +Vorrat und −Vorrat

    Die untere Navigation hat jetzt zwei Scan-Buttons mit Scanner-Rahmen: Plus zum Hinzufügen zum Vorrat (wie bisher) und Minus zum Entfernen. Mit dem Minus-Button scannst du ein Produkt direkt aus dem Vorrat — bei mehreren Einträgen mit Auswahl, optional zurück auf die Einkaufsliste.

    Neu
    • Mobile Navigation: Statt eines Scan-Buttons gibt es jetzt zwei — „+" (Produkt scannen & zum Vorrat hinzufügen) und „−" (Produkt scannen & aus dem Vorrat entfernen), beide mit Scanner-Sucher-Rahmen.
    • Entfernen-Scan: Der Minus-Button öffnet den Scan im Entfernen-Modus. Ein gescanntes/gesuchtes Produkt wird als verbraucht markiert; bei mehreren Vorrats-Einträgen erscheint eine Auswahl (kürzestes MHD vorausgewählt), optional landet es direkt wieder auf der Einkaufsliste.
  67. v0.62.2

    Scan: Produktinfo als Overlay — Eingaben bleiben erhalten

    Beim Scannen öffnet die Produktinfo („Details") jetzt ein Overlay, statt auf eine eigene Seite zu wechseln. Dadurch bleiben das Hinzufügen-Formular und alle bereits gemachten Eingaben (Menge, MHD, Preis, Lagerort) erhalten — kein verlorener Scan und keine neu startende Kamera mehr beim Zurückgehen.

    Bugfix
    • Scan: „Details" öffnet die Produktinfo als Overlay über dem Formular — der laufende Scan inkl. eingegebener Werte bleibt erhalten. Vorher führte der Link auf die Produktseite; beim Zurückgehen ging der Scan verloren und die Kamera startete neu.
    Infrastruktur
    • Produktinfo-Modal in eine geteilte Komponente (components/products/product-info-modal.tsx) ausgelagert; Vorratsliste und Scan nutzen jetzt dieselbe Ansicht.
  68. v0.62.1

    Produktseite: kontextbezogener Zurück-Link + Foto & Info-Icon auf der Vorrats-Detailseite

    Feinschliff zur neuen Vorrats-Funktion: Die Produktseite bringt dich jetzt dorthin zurück, wo du herkamst (Vorrat statt immer „zum Scan"). Auf der Produkt-Bearbeitungsseite erscheint oben das echte Produktfoto statt eines Platzhalter-Icons, plus ein Info-Icon oben rechts für die vollständige Produktinfo.

    Bugfix
    • Produktseite: Der „Zurück"-Link führt jetzt kontextabhängig zurück (Vorrat, Produkt-Detail oder Scan) statt immer „Zurück zum Scan" — gesteuert über einen internen Herkunfts-Parameter (kein Open-Redirect möglich).
    • Vorrats-Detailseite: Oben wird das tatsächliche Produktfoto angezeigt, wenn vorhanden, statt eines generischen Icons. Ablaufende/kritische Artikel behalten ihren Dringlichkeits-Hinweis über einen kleinen Eckpunkt.
    Neu
    • Vorrats-Detailseite: Zusätzlich zum Link „Vollständige Produktinfo" unten gibt es jetzt ein Info-Icon oben rechts neben dem Produktnamen.
  69. v0.62.0

    Scan: „Aus Vorrat entfernen" + Vorratsliste mit Fotos, Kategorie-Icons & Produkt-Infos

    Beim Scannen kannst du ein Produkt jetzt nicht nur hinzufügen, sondern direkt auch wieder aus dem Vorrat entfernen (optional zurück auf die Einkaufsliste). In der Vorratsliste erscheinen erkannte Produkte mit Mini-Foto, Kategorien als farbiges Icon — und ein neues Info-Symbol öffnet alle Produktdaten (großes Foto, Nutri-Score, Nährwerte, Allergene, Zusatzstoffe) in einem Overlay.

    Neu
    • Scan: Neben „Zum Vorrat hinzufügen" gibt es jetzt einen zweiten Button „Aus Vorrat" — markiert das gescannte Produkt als verbraucht und legt es auf Wunsch direkt wieder auf die Einkaufsliste. Liegt das Produkt mehrfach im Vorrat, fragt ein Auswahl-Dialog, welcher Eintrag (sortiert nach kürzestem MHD) entfernt werden soll.
    • Vorratsliste: Erkannte Produkte zeigen ihr Produktfoto als Mini-Thumbnail. Produkte mit Kategorie erhalten ein farbiges Kategorie-Icon (Milch, Eier, Brot, Obst, Gemüse, Fleisch …); ein kleiner Eckpunkt signalisiert weiterhin ablaufende/kritische Artikel.
    • Vorratsliste: Neben dem Haken erscheint bei erkannten Produkten ein Info-Symbol. Ein Klick öffnet ein Overlay mit allen abrufbaren Daten — großes Foto, Nutri-/Eco-/NOVA-Score, Nährwerttabelle, Allergene und Zusatzstoffe (E-Nummern mit EFSA-Einordnung) — plus Link zur vollen Produktseite.
  70. v0.61.0

    Scan-Flow-Fix + „Fly-to-Cart" beim Abhaken

    Nach dem Hinzufügen startet der Scan jetzt zuverlässig direkt wieder — ohne Umweg über eine andere Seite. Und beim Abhaken eines Produkts fragt ein elegantes Modal, ob es auf die Einkaufsliste soll: der Button fliegt animiert zum Einkaufs-Symbol.

    Bugfix
    • Scan: „Nächstes Produkt scannen" und der Footer-Scan-Button öffnen wieder direkt die Kamera. Ursache war ein nicht zurücksetzbarer useActionState-Erfolgs-Status; ein frischer Scan erzwingt jetzt ein sauberes Remount über einen URL-Nonce (?new=…).
    • Footer-Scan-FAB nutzt jetzt router.replace/push statt eines statischen Links, damit auch bei gleicher Route ein neuer Durchlauf startet.
    • Gespeicherter Scan-Modus (Kamera/Übersicht) wird beim erneuten Scannen respektiert; „Weiteres suchen" erzwingt die Suchansicht.
    Neu
    • Vorrat: Beim Abhaken (grüner Haken) erscheint ein zentriertes Confirm-Modal — Primärbutton „zum Einkauf" (Warenkorb-Icon), Sekundär nur ein X (= nur verbrauchen).
    • „Fly-to-Cart"-Animation: Beim Klick auf „zum Einkauf" blendet der Text aus und das Icon fliegt im Bogen zum „Einkaufen"-Eintrag in der Navigation (Bottom-Nav mobil, Sidebar am Desktop) — inkl. Bounce + Haptik am Ziel.
    • Optimistisches Ausblenden: Das Produkt verschwindet sofort aus dem Vorrat, die Aktion (verbrauchen + Einkaufsliste) läuft im Hintergrund in einer kombinierten Server-Action.
    • Barrierearm: Bei „Bewegung reduzieren" (prefers-reduced-motion) wird statt des Flugs ein dezenter Puls am Ziel gezeigt.
  71. v0.60.2

    CI/CD Deploy-Pipeline: vollständige Reparatur (5 Ursachen)

    Die Deploy-Pipeline schlug seit einer ENV_PRODUCTION-Aktualisierung mit mehreren kaskadierten Fehlern fehl. Alle 5 Root Causes wurden systematisch behoben: Passwort-Drift, falsches Netzwerk, defekter Health-Check u.a.

    Bugfix
    • P1000 (Auth-Fehler): PostgreSQL-Volume-Passwort wird vor Migration via ALTER USER auf .env.production-Wert synchronisiert (idempotent, trust-auth)
    • Passwort-Sync verwendete falschen postgres-Superuser — korrigiert auf POSTGRES_USER (stockpilot ist Superuser)
    • Health-Check nutzte curl (nicht im Image) → node -e require('http') geändert, start_period auf 60s erhöht
    • NETWORK_NAME-Variable wurde überschrieben: Migration-Container lief in stockpilot_web statt stockpilot_internal → sp-postgres nicht erreichbar (P1001)
    • System-Traefik (traefik-traefik-1) wird nach compose up explizit mit stockpilot_web verbunden
    • sp-app-Restart nach Passwort-Sync damit erster DB-Connect mit korrekten Credentials erfolgt
    • tsconfig.json: rebuild-kit/ von TypeScript-Kompilierung ausgeschlossen
    • Diagnose-Ausgaben (Health-Log, Container-Logs, Traefik-Routing) bei Fehler verbessert
  72. v0.60.1

    CI/CD Deploy-Fix: P1000 Migrations-Fehler (erster Versuch)

    Prisma-Migration liest DATABASE_URL aus dem laufenden sp-app-Container. Prisma v7 config.ts-Kompatibilität hergestellt.

    Bugfix
    • Deploy: `prisma migrate deploy` schlug mit P1000 (Auth-Fehler) fehl — DATABASE_URL aus sp-app-Container
    • Prisma v7: prisma.config.ts gemountet + -e DATABASE_URL kombiniert
  73. v0.60.0

    OCR Produktnamen-Normalisierung

    Erkannte Produktnamen werden automatisch korrigiert: Tesseract-Zeichenverwechslungen (Mi!ch → Milch) und Admin-pflegbares Fuzzy-Wörterbuch (Levenshtein ≤ 1) mit 30 vorgeseedeten deutschen Lebensmittelbegriffen.

    Neu
    • Char-Korrekturen: !, |, 0, 1, @, €, 5 kontextsensitiv ersetzt
    • Fuzzy-Wörterbuch: Levenshtein ≤ 1 pro Wort ≥ 4 Buchstaben
    • DB-Modell OcrWordCorrection (Admin-editierbar, Redis-gecacht 10 min)
    • Admin-Seite /admin/ocr-dictionary: Einträge anlegen, deaktivieren, löschen
    • Test-Feld: sofortige Vorschau der Normalisierung
    • Initial-Seed: 30 häufige deutsche Lebensmittel-Korrekturen
  74. v0.59.1

    OCR: 180°-Rotation + Singular-Check Homographie

    Auf dem Kopf fotografierte Kassenbons werden jetzt automatisch erkannt und korrigiert. Außerdem wird bei degenerierter Punkt-Konfiguration (z. B. kollineare Punkte) ein klarer Fehler geworfen statt stiller NaN-Werte.

    Bugfix
    • 180°-Fallback: Liefern alle PSM-Varianten < 5 Artikel ohne Querformat-Rotation, testet der Adapter automatisch die 180°-Drehung
    • gaussElim Singular-Check: Fehler "Homography: degenerate point configuration" bei kollinearen Eckpunkten statt NaN/Infinity
  75. v0.59.0

    Kassenbon-Editor: 4-Punkt-Perspektivkorrektur

    Vor dem OCR-Scan kann der Bon jetzt zugeschnitten und schräge Fotos entzerrt werden. Auto-Erkennung setzt die Eckpunkte automatisch, der Nutzer kann sie manuell verfeinern.

    Neu
    • Neuer Bild-Editor-Schritt vor der OCR-Erkennung: 4 verschiebbare Eckpunkte entzerren perspektivisch verzerrte Fotos
    • Automatische Bon-Erkennung via POST /api/receipts/detect (~200 ms, kein OCR-Worker)
    • Clientseitiger Perspektiv-Warp (Canvas + eigene Homographie-Mathe, keine externen Libraries)
    • Vorbearbeitete Bilder werden serverseitig schneller und schärfer verarbeitet (Preprocessing-Optimierung)
  76. v0.58.2

    Rezept-Cover-Fotos + OCR Lidl-Fix

    KI-generierte Cover-Fotos werden jetzt in der Rezepte-Kachelliste und auf der Detailseite angezeigt. Tesseract-OCR erkennt Lidl-Kassenbons jetzt zuverlässig, auch wenn das Logo als 'ASSLT' oder 'LeDL' gelesen wird.

    Bugfix
    • Rezept-Karte: Cover-Foto wird angezeigt wenn vorhanden (statt immer Kategorie-Icon)
    • Rezept-Detailseite: Cover-Foto im Header statt ChefHat-Icon
    • OCR: Lidl-Heuristik (Preisvorteil) griff nicht, wenn generischer Fallback bereits Name gesetzt hatte — Reihenfolge korrigiert
    • OCR: Lidl-KNOWN_STORES-Pattern deckt jetzt OCR-Varianten 'LeDL', 'L!DL', 'L1DL' ab
  77. v0.58.1

    Google OAuth Fix

    Google-Anmeldung funktioniert jetzt korrekt. Ursache war ein Typprüfungsfehler im OAuth-Callback: NextAuth v5 verwendet für Google OIDC (account.type='oidc'), nicht 'oauth'. Der signIn-Callback übersprang deshalb die DB-Benutzeranlage.

    Bugfix
    • Google OAuth: signIn-Callback erkennt jetzt sowohl type='oauth' als auch type='oidc'
    • Login-Seite: NextAuth-Fehler werden als verständliche Meldung angezeigt
    • VPS .env.production: AUTH_URL + GOOGLE_CLIENT_ID/SECRET-Platzhalter ergänzt
  78. v0.58.0

    API-Kosten Dashboard

    Neuer Admin-Bereich zeigt Kosten für Anthropic- und OpenAI-API-Aufrufe statistisch aufgeschlüsselt. Jeder KI-Aufruf wird in der DB geloggt. Monatliche Budget-Limits mit visueller Warnung ab 80 %, Zeitraum-Switcher (Heute / 7 Tage / 30 Tage / Monat), gestapeltes Recharts-Diagramm und Operations-Tabelle.

    Neu
    • Admin /api-costs: Kosten-Dashboard für Anthropic + OpenAI
    • Zeitraum-Switcher: Heute / 7 Tage / 30 Tage / Monat
    • KPI-Karten: Gesamt, Anthropic, OpenAI, Ø pro Rezept
    • Budget-Limits pro Anbieter mit Fortschrittsbalken — Warnung ab 80 %
    • Recharts BarChart: gestapelter Kostenverlauf Anthropic vs. OpenAI
    • Operations-Tabelle: recipe_generate / image_generate / image_regenerate
    • Claude-Adapter: Token-Kosten werden nach jedem API-Call geloggt
    • DALL-E-Adapter: Bild-Kosten werden nach jedem API-Call geloggt
    Infrastruktur
    • Prisma: neue Modelle ApiCostLog + ApiCostBudget
    • lib/api-costs/cost-rates.ts: Preis-Tabelle für alle KI-Modelle
    • lib/api-costs/cost-logger.ts: non-fatal logApiCost() Funktion
    • domains/admin/api-costs.service.ts: alle Aggregations-Queries
  79. v0.57.1

    Fix: gpt-image-1 statt dall-e-3 (openai SDK v6)

    Die Bildgenerierung im KI-Generator schlug mit '400 The model dall-e-3 does not exist' fehl. openai SDK v6 hat dall-e-3 durch gpt-image-1 ersetzt. Der Adapter wurde vollständig migriert: Modell umgestellt, URL-Download entfernt, Base64-Schreiben implementiert.

    Bugfix
    • dalle.adapter: Modell dall-e-3 → gpt-image-1 (openai SDK v6 Breaking Change)
    • dalle.adapter: URL-Download entfernt, da gpt-image-1 b64_json statt URL liefert
    • dalle.adapter: Bild wird jetzt direkt als Base64 lokal gespeichert
  80. v0.57.0

    KI-Generator Bildvorschau + System-Rezepte Detailseite

    Nach der Rezept-Generierung erscheint jetzt ein DALL-E-Ladescreen und anschließend eine Bildvorschau mit Freigabe- oder Neu-Generieren-Option. System-Rezepte sind in der Listenansicht klickbar und führen zu einer Detailseite mit Foto-Verwaltung, Sichtbarkeit-Schalter und Löschen-Funktion.

    Neu
    • KI-Generator: animierter Ladescreen während DALL-E-Foto-Generierung (~10 Sek.)
    • KI-Generator: Bild-Vorschau nach Generierung — Freigeben oder Foto neu generieren
    • KI-Generator: imageError wird angezeigt wenn DALL-E fehlschlägt (z.B. kein API-Key)
    • System-Rezepte: 'Bearbeiten'-Button in jeder Tabellenzeile
    • System-Rezepte /[id]: Detail-Seite mit Zutaten, Schritten, Nährwerten
    • System-Rezepte /[id]: Foto neu generieren (DALL-E 3, Client-Side Loading-State)
    • System-Rezepte /[id]: Sichtbarkeit ein-/ausblenden (Server Action)
    • System-Rezepte /[id]: Rezept löschen mit Bestätigungs-Dialog
    Infrastruktur
    • Neue API POST /api/admin/ai-recipes/regenerate-image — generiert neues Cover-Foto für bestehendes Rezept
    • approve-Service gibt imageError zurück wenn DALL-E fehlschlägt (statt stiller Null)
  81. v0.56.0

    Admin UX — Nav-Einrückung, Kontrast, Padding & Fehler-Diagnostik

    Die Admin-Navigation zeigt KI-Generator und System-Rezepte als eingerückte Sub-Items unter Rezepte. Der aktive Zustand zeigt jetzt korrekt helles Text auf dunklem Hintergrund. Alle drei Rezept-Seiten haben nun einheitliches Padding. Der KI-Generator gibt bei Fehlern aussagekräftige Meldungen statt des generischen Hinweises zurück.

    Bugfix
    • Admin-Nav: KI-Generator + System-Rezepte als eingerückte Child-Items mit Connector-Linie
    • Admin-Nav: Icon-Farbe bei aktivem Item erbt jetzt korrekt text-accent-300 (sichtbar auf bg-brand-900)
    • Admin Rezepte / KI-Generator / System-Rezepte: p-6 lg:p-8 Padding hinzugefügt
    • API /admin/ai-recipes/search+generate: tatsächliche Fehlermeldung im Error-Body (Admin-only)
  82. v0.55.0

    Unit Tests + CI-Testpflicht vor Deploy

    Zod-Schemas der drei kritischsten Server Actions wurden in testbare lib/schemas/-Dateien ausgelagert. 23 neue Unit-Tests laufen grün. GitHub Actions führt ab sofort Typecheck + Tests als Pflicht-Job vor jedem Deploy aus.

    Infrastruktur
    • lib/schemas/inventory.ts — addItemSchema aus actions.ts extrahiert (8 Tests)
    • lib/schemas/shopping.ts — addShoppingItemSchema aus actions.ts extrahiert (6 Tests)
    • lib/schemas/onboarding.ts — onboardingSchema aus actions.ts extrahiert (9 Tests)
    • CI: neuer test-Job in deploy.yml (Node 22, npm-Cache, tsc --noEmit + vitest run) — Deploy läuft nur bei grünen Tests
  83. v0.54.0

    Redis-Caching + Smarte Einkaufsliste 2.0

    Redis-Caching für alle Kern-Domains vollständig implementiert. Smarte Einkaufsliste mit Markt-Laufweg-Sortierung, Spracheingabe und Echtzeit-Sync (SSE) ist live.

    Neu
    • Einkaufsliste: Markt-Laufweg-Sortierung (Obst → Gemüse → Kühl → Fleisch → … → Getränke)
    • Einkaufsliste: Spracheingabe via Web Speech API (de-DE) — Mikrofon-Button im Add-Formular
    • Einkaufsliste: Echtzeit-Sync für Haushaltsmitglieder via SSE + 30s Polling-Fallback
    • Einkaufsliste: Auto-Vorschläge (häufig konsumierte Produkte, letzten 90 Tage)
    • Einkaufsliste: Budget-Schätzung auf Basis gespeicherter Preis-Observationen
    Infrastruktur
    • Redis-Caching: Shopping-Suggestions (GROUP BY) + ExpiringReplacements — 5 min TTL, Invalidierung bei Inventory-Änderungen
    • Redis-Caching: Vollständige Abdeckung aller Kern-Domains (Inventory, Health, Carbon, Rewards, Shopping, Products, Admin-KPI, Notifications)
    • Service-Refactoring: getShoppingSuggestions + getExpiringReplacements + getItemPrices aus Page-Component in domains/shopping/service.ts ausgelagert
    • Suggestion/ExpiringReplacement-Typen zentral in domains/shopping/types.ts
  84. v0.53.1

    Bugfix: Admin-Rezepte & Logout

    Behebt den Server-Fehler auf /admin/recipes durch korrektes Prisma-Client-Rebuild im Deploy. Logout-Button auf dem Profil leitet jetzt korrekt auf /login weiter.

    Bugfix
    • /admin/recipes: Prisma-Client wird bei jedem Deploy neu generiert (prisma generate läuft in Docker) — behebt den Server Components Render-Fehler
    • Logout auf /app/profile: nutzt jetzt signOut({ callbackUrl: '/login' }) statt rohem Form-POST auf /api/auth/signout — kein Redirect mehr auf 0.0.0.0
    Infrastruktur
    • CI/CD: deploy.yml ruft jetzt scripts/deploy.sh auf (statt ungetracktem deploy.sh) — stellt sicher, dass Prisma-Client, Docker-Compose und Env-Variablen korrekt gesetzt sind
    • Deploy-Timeout auf 30 Minuten erhöht (Docker-Build benötigt mehr Zeit als nativer npm-Build)
  85. v0.53.0

    KI-Rezept-Generator

    Admins können nun via Claude KI neue Rezepte aus dem Web finden, im StockPilot-Stil umschreiben, inline bearbeiten und mit DALL-E 3 Cover-Fotos versehen.

    Neu
    • Zweistufige KI-Pipeline: Kandidatensuche + Rezept-Rewrite via Claude Anthropic API
    • Cover-Foto-Generierung via DALL-E 3 — erst nach Admin-Freigabe
    • Vollständig editierbarer Vorschlag: Titel, Beschreibung, Metadaten, Zutaten, Schritte, Nährwerte
    • SystemRecipe-Datenmodell — KI-Rezepte parallel zu Mock-Rezepten
    • Admin-Seiten: /admin/recipes/ai-generator + /admin/recipes/system
  86. v0.52.0

    OCR-Parser: Lidl-Fix + Prefix-Loop

    Kassenbon-Parser deutlich verbessert: Phantom-Items durch mehrfachen OCR-Rauschpräfix ("TSK X", "X A ...") werden eliminiert. Lidl-Store-Erkennung auch bei zerstörtem Logo. Debug-Panel jetzt direkt sichtbar über der Artikelliste.

    Bugfix
    • cleanName Loop: Prefix-Bereinigung läuft jetzt in Schleife — entfernt "odd TSK X" → "X" → DROP statt Phantom-Item
    • cleanName [A-Z]{1,4}: einzelne Großbuchstaben ("X", "A", "B") als OCR-Rausch-Prefix erkannt — "X A Bananen" → "Bananen"
    • Lidl Store-Heuristik: "Preisvorteil" im OCR-Text → Store = "Lidl", auch wenn Logo zu "ASSLT" zerstört wurde
    • SKIP_RE: \bpreisvorteil statt ^preisvorteil — Preisvorteil-Zeilen mit OCR-Prefix-Noise werden jetzt korrekt übersprungen
    • OCR Debug-Panel über Artikelliste verschoben — sofort sichtbar ohne Scrollen
    • rawText (normalisierte OCR-Zeile) unter jedem Artikel angezeigt — hilft beim Identifizieren von OCR-Fehlern
  87. v0.51.0

    Kassenbon-OCR Debug-Panel

    Temporäres Debug-Panel für die Kassenbon-OCR-Qualitätsprüfung: Zeilen-Trace mit ITEM/SKIP/BUFFER/DROP-Entscheidungen, Preprocessing-Info und Kopier-Button für einfaches Feedback.

    Neu
    • OcrDebugPanel: neues zeilenweises Parsing-Trace-Panel auf der Scan-Seite
    • Jede OCR-Zeile wird annotiert: ITEM (grün), SKIP (rot), BUFFER (amber), DROP (grau), TOTAL_UPDATE (blau), SPECIAL (violett)
    • Header zeigt Preprocessing-Info: Bilddimension, PSM-Modus, Konfidenz, erkannter Store/Datum/Total
    • Tab 'Zeilen-Trace': normalisierte Zeile, raw-Zeile (wenn abweichend), Preis bei ITEM-Zeilen
    • Tab 'OCR-Rohtext': vollständiger OCR-Text scrollbar
    • Kopieren-Button: vollständigen Debug-Report in die Zwischenablage für Feedback-Loop
    • getSkipReason(): 40+ spezifische Muster für SKIP_RE-Erklärungen
    • parseReceiptTextCore(): interner Parser mit optionaler OcrDebugLine[]-Trace-Sammlung
    • parseReceiptTextDebug(): neue Funktion für Trace-Ausgabe ohne Änderung der öffentlichen API
    • OcrDebugTrace: neue Typen in receipt-types.ts (temporär bis OCR-Freigabe)
  88. v0.50.0

    Marketplace Detail + In-App-Chat

    Detailseiten für Marketplace-Listings, SWAP-Tausch-Angebote, In-App-Chat mit SSE-Echtzeit, Nachrichten-Posteingang und Ungelesen-Badge in der Navigation.

    Neu
    • Marketplace-Detailseite: Produktbild, Beschreibung, SWAP-Angebot, Kontakt-Button
    • swapFor-Feld im Create-Form: Nutzer können Tauschwünsche angeben
    • In-App-Chat: SSE-Echtzeit-Nachrichten zwischen Nutzern (Conversation + Message)
    • Nachrichten-Posteingang /app/messages: alle Konversationen auf einen Blick
    • Chat-View /app/messages/[id]: Gesprächsverlauf mit Echtzeit-Aktualisierung
    • Neue Konversation starten via /app/messages/new?listingId=... mit Redirect
    • Ungelesen-Badge in der Navigation: zeigt Anzahl ungelesener Nachrichten
    Bugfix
    • OCR-Datumserkennung: 4-Dezimal-Normalisierung zerstörte Datum-Formate (DD.MM.YYYY) — Datum-Extraktion läuft jetzt auf Raw-Zeilen vor normalizeOcrLine
    • Shopping-List SSE: connectSSE-Selbstreferenz via Ref aufgelöst (react-hooks/immutability)
    • FeedbackButton: setState-in-Effect durch openDialog-Handler ersetzt
    • NotificationSettings: Push-State-Erkennung in async-Funktion verschoben
  89. v0.49.5

    OCR v0.49.5 — Total-Fallback + PFAND-EURO-Filter + PLZ-Filter

    Drei Parser-Verbesserungen: (1) Total-Fallback: OCR-zerbrochene Summen-Zeilen (Sings. statt Summe) werden anhand Position+Preishoehe erkannt — total wird gesetzt und der falsche Artikel entfernt. (2) PFAND-EURO-Filter: Famila-PFAND-Zeilen mit EURO-Schluesselwort ('y FAM) 0,15 EURO 18364') werden gefiltert. (3) PLZ-Filter: Adresszeilen mit Preis+PLZ-Muster ('4,26 19904 UM') werden gefiltert. (4) normalizeOcrLine: 4-Dezimal-Fix auch fuer Punkt-Dezimaltrenner.

    Bugfix
    • Total-Fallback: letzte 50% der OCR-Zeilen nach kurzem Text (<=12 Zeichen) + Preis >5 EUR durchsuchen — hoechster Treffer = Summe; aus lineItems entfernt wenn dort gelandet
    • SKIP_RE: \d[,.]\d+\s+euro\b — Famila-PFAND-Zeilen ('0,15 EURO') gefiltert
    • SKIP_RE: \b\d{1,4}[,.]\d{2}\s+\d{5}\b — Adress/PLZ-Zeilen ('4,26 19904') gefiltert
    • normalizeOcrLine: 4-Dezimal-DOT-Fix ('4.2680' -> '4,26') erweiternd zum bestehenden Komma-Fix
  90. v0.49.4

    OCR v0.49.4 — PSM 6 wiederhergestellt + Fallback-Kette PSM4->PSM3

    Regression-Fix: PSM 4 (SINGLE_COLUMN) hat die Artikel-Erkennung von 21 auf 2 Artikel reduziert. PSM 6 (SINGLE_BLOCK) ist der stabilere Primaer-Modus fuer reale Kassenbons. Neu: Dreistufige Fallback-Kette PSM 6 -> PSM 4 -> PSM 3 (AUTO) mit Schwelle 5 Artikel statt 2.

    Bugfix
    • PSM 6 (SINGLE_BLOCK) als primaerer OCR-Modus wiederhergestellt — PSM 4 reduzierte Famila-Bon von 21 auf 2 Artikel
    • Auto-Rotations-Tests (90deg/270deg) ebenfalls auf PSM 6 umgestellt
    • Fallback-Schwelle von < 2 auf < 5 Artikel angehoben
    • Dreistufige Fallback-Kette: PSM 6 -> PSM 4 -> PSM 3 (AUTO) — immer der Modus mit den meisten Artikeln gewinnt
  91. v0.49.3

    OCR v0.49.3 — PSM 4 + DPG-Filter + pendingName-Qualitaet

    Vier weitere Verbesserungen: (1) OCR-Modus von PSM 6 (Einzelblock) auf PSM 4 (Einzelspalte) umgestellt — Kassenbons sind Einzelspalten, PSM 4 erkennt die vertikale Zeilenstruktur besser. (2) DPG-SYSTEM (Pfand-Rueckgabe) wird jetzt als SKIP_RE-Eintrag gefiltert. (3) Preisreduzierung-Zeilen werden gefiltert. (4) pendingName-Qualitaetsfilter: Zwischengespeicherte Produktnamen werden nur verwendet wenn mindestens 40% der Woerter 3+ Buchstaben haben — verhindert OCR-Muelll als Produktname.

    Bugfix
    • PSM 4 (SINGLE_COLUMN) statt PSM 6 (SINGLE_BLOCK) als primaerer OCR-Modus — besser fuer Kassenbons (Einzelspalten-Dokumente)
    • PSM 4 auch in Auto-Rotations-Tests (90deg/270deg) einheitlich verwendet
    • SKIP_RE: dpg.?system / opg.?system — DPG-Pfand-System-Zeilen werden jetzt gefiltert (nicht mehr als Produkt 'DPG-SYSTEM 3,99' gespeichert)
    • SKIP_RE: preisreduzier* — Preisreduzierung-Zeilen gefiltert
    • pendingName-Qualitaetsfilter: nur verwenden wenn mindestens 40% der Woerter 3+ echte Buchstaben haben — verhindert OCR-Muell-Zeilen als Produktname
    • cleanName: schliessende Klammer ')' zu Anfang/Ende-Bereinigung hinzugefuegt
  92. v0.49.2

    OCR v0.49.2 — CLAHE-Preprocessing + Unicode-Quotes + Summen-Erkennung

    Vier weitere Verbesserungen nach Analyse des Famila-Bon-JSON: (1) Preprocessing: CLAHE verbessert lokalen Kontrast bei Plastikfolien-Reflexionen. Aggressivere Schaerfung nach CLAHE. (2) cleanName: Unicode-Anfuehrungszeichen (geschwungene Quotes, U+201A-201F, Guillemets) werden aus Produktnamen entfernt — Tesseract OCR gibt statt ASCII-Komma haeufig U+201A aus. (3) 4-stellige Dezimalstellen (5,6768 → 5,67) werden normalisiert. (4) OCR-verzerrte Gesamtbetragszeilen ('Soe 174.32' statt 'Summe 17,43') werden als Gesamtbetrag erkannt.

    Bugfix
    • Preprocessing: CLAHE (Kachel 32x32, maxSlope 3) nach normalize() — verbessert lokalen Kontrast bei Plastikfolien-Beleuchtungsproblemen
    • Preprocessing: sharpen aggressiver (sigma 1.5→1.2, m1 1.5→2.0, m2 3→5) — mehr Textschaerfe nach verbessertem CLAHE-Kontrast
    • cleanName: Unicode-Anfuehrungszeichen (U+201A-201F, Guillemets) aus Anfang/Ende entfernt — Tesseract liest Komma-aehnliche Zeichen oft als U+201A (Single Low-9 Quotation Mark)
    • normalizeOcrLine: 4-Dezimalstellen-Artefakt behoben: '5,6768' → '5,67' (bisher nur 3-stellige Variante behandelt)
    • OCR-Prefix-Regex: max. Länge von 5 auf 4 Zeichen reduziert — verhindert irrtümliches Entfernen legitimer 5-Buchstaben-Markennamen (HARRY, AVITA, REGIO etc.)
    • Parser: price > 150 bei priceMatch.index ≤ 5 → Gesamtbetrag statt Produkt — fängt OCR-verzerrte Summen-Zeilen ('Soe 174.32 €') korrekt ab
  93. v0.49.1

    OCR v0.49.1 — Parser-Qualität: FAND, (2x-Zeilen, Gesamtbetrag, Namen

    Sechs gezielte Parser-Fixes nach Analyse des Famila-Bons: (1) PFAND-Zeilen werden auch als 'FAND' (OCR-Drop des P) erkannt und gefiltert. (2) Famila-Format: Mengen-Annotation-Zeilen '(2 x 0,59 €/05)' werden übersprungen, der Produktname aus der Vorzeile bleibt erhalten. (3) Gesamtbetrag-Erkennung robuster: 'Summe', 'Gesamt' und 'Betrag' werden auch mit OCR-Prefix-Noise erkannt (^ -Anker entfernt). (4) cleanName: '(' zählt jetzt als führendes Rauschzeichen. (5) Zusatz-Pass in cleanName entfernt 1–3 Kleinbuchstaben vor Großbuchstaben ('cn Pip' → 'Pip'). (6) 1–2-Zeichen ALL-CAPS-Namen ('LA', 'HL') werden als OCR-Artefakte gefiltert.

    Bugfix
    • SKIP_RE \bp?fand\b: P optional — 'FAND 0,16 EUR' (OCR-Drop) wird jetzt korrekt als Pfand-Zeile erkannt und gefiltert
    • SKIP_RE \bsumme\b / \bgesamt\b / \bbetrag\b: ^ -Anker entfernt — Gesamtbetrag-Zeilen mit OCR-Prefix-Noise ('AB Summe 14,93') werden jetzt erkannt
    • Total-Extraktion: 'betrag' und 'endbetrag' ergänzt (summe|gesamt|zu zahlen|betrag|endbetrag) — 'Betrag EUR 14,93' wird als Gesamtbetrag übernommen
    • Famila-Format: Mengen-Annotations-Zeilen '(2 x 0,59 €/05)' werden inline erkannt (nameRaw ~ /^\(?\d+[xX×]$/), übersprungen ohne pendingName zu löschen — Produktname aus Vorzeile wird für die Folge-Preiszeile erhalten
    • cleanName: '(' zu führenden Sonderzeichen hinzugefügt — '(2 x' → '2 x' als weiterer Schutz
    • cleanName: Zusatz-Pass ^[a-z]{1–3}\s+(?=[A-Z]) — greift wenn Haupt-OCR-Prefix-Regex nicht matched ('cn Pip' → 'Pip')
    • Qualitätsfilter: Namen aus 1–2 reinen Großbuchstaben ('LA', 'HL', 'AB') werden nicht als Produkt gespeichert
  94. v0.49.0

    OCR v0.49.0 — Auto-Orientierung + kritischer VPS-Bugfix

    Zwei wichtige Fixes: (1) Kassenbon-Fotos die quer aufgenommen wurden (Bon auf Tisch liegend, Gerät hochkant gehalten) führten zu 0-3 garbled Artikeln statt allen Positionen — der Adapter erkennt jetzt Querformat-Preprocessing-Output und testet automatisch 90°- und 270°-Rotationen, wählt die Richtung mit mehr Artikeln (Early-Exit bei ≥ 5 Artikeln). (2) Kritischer Produktionsfehler behoben: receipt-parsing.service.ts auf dem VPS war vom 26. Mai ohne case "tesseract" — der Provider-Switch fiel auf default (Mock) zurück, egal welchen Wert RECEIPT_PARSER_PROVIDER hatte. Tesseract OCR war de facto nie aktiv. Außerdem: parseAndCreateReceiptAction hat jetzt try-catch um parseReceipt(), sodass OCR-Fehler als lesbare Fehlermeldung im UI erscheinen statt den Spinner einzufrieren.

    Bugfix
    • KRITISCH: receipt-parsing.service.ts auf VPS war vom 26.05. ohne case "tesseract" → Mock-Adapter lief immer, REWE-Beispieldaten für alle Uploads
    • parseAndCreateReceiptAction: try-catch um parseReceipt() — OCR-Fehler erscheinen als UI-Fehlermeldung statt eingefrorener Spinner
    Neu
    • Auto-Orientierung: Querformat-Preprocessing-Output (Breite > 1,2× Höhe) → 90°- und 270°-Rotationen werden automatisch getestet, beste Richtung gewinnt
    • Early-Exit: 90°-Rotation mit ≥ 5 Artikeln stoppt weitere Tests (RAM- und Zeitersparnis auf VPS)
    • Behebt: Famila-Bon auf dunklem Tisch quer fotografiert → war 3 garbled Items, jetzt alle Artikel erkannt
  95. v0.48.10

    OCR v0.48.10 — EUR/kg-Filter + OCR-Prefix-Noise in Produktnamen

    Zwei weitere Parser-Verbesserungen: (1) Gewichts-Rate-Zeilen ('0,654 kg x 2,39 EUR/kg') werden jetzt per SKIP_RE herausgefiltert, bevor PRICE_RE fälschlich '2,39' als Produktpreis matcht — funktioniert auch mit OCR-Prefix-Noise am Zeilenanfang; (2) cleanName() erkennt jetzt breitere OCR-Rausch-Prefixe vor Produktnamen: ALL-CAPS (BERR, SE), Ziffernblöcke (2505, 83), Kleinbuchstaben-Müll (za, Sn) und Sonderzeichen-Sequenzen.

    Bugfix
    • SKIP_RE: '(?:EUR|€)\\s*/\\s*(?:kg|g|ml|l|cl)\\b' — Gewichts-Rate-Zeilen werden gefiltert, auch mit OCR-Prefix-Noise ('an Bi 0,654 kg x 2,39 EUR/kg N')
    • cleanName: führende OCR-Rausch-Tokens breiter abgedeckt — ALL-CAPS (BERR, SE, SEM), Ziffernblöcke (2505, 83)), Kleinbuchstaben-Müll (za, Sn), Sonderzeichen-Prefixe werden vor echtem Großbuchstaben gestripped
    • cleanName: trailing Garbage-Zeichen am Namensende entfernt
    • 9 neue Regressionstests (3 × EUR/kg-Filter, 6 × Prefix-Noise)
  96. v0.48.9

    OCR v0.48.9 — Blacklist-Trailing-Noise + Pfand-Prefix-Filter

    Zwei weitere Robustheitsverbesserungen nach Analyse des dritten Lidl-OCR-Outputs: (1) PRICE_RE-Trailing-Gruppe wechselt von ASCII-Whitelist auf Komma-Blacklist ([^,\n\r]) — erfasst jetzt beliebige Unicode-Rauschzeichen (©, », \, €, }, {, [09 }) aus dem Bonhintergrund ohne manuelle Enumeration; (2) SKIP_RE ^pfand-Anker entfernt — Pfand-Zeilen mit 2-3-char OCR-Prefix-Noise ('5 Pfand', 'Aa Pfand') werden korrekt gefiltert.

    Bugfix
    • PRICE_RE: Trailing-Noise-Klasse von ASCII-Whitelist [A-Za-z\d...] auf [^,\n\r] (Blacklist) umgestellt; {0,2} → {0,3} Reps — ©, », \\, €, }, { und beliebige andere Unicode-Artefakte werden jetzt korrekt als Noise ignoriert
    • SKIP_RE: ^pfand\\b-Anker entfernt → \\bpfand\\b matcht auch bei 2-3-char OCR-Prefix-Noise am Zeilenanfang ('5 Pfand ...', 'Aa Pfand ...')
    • 6 neue Regressionstests (Unicode-Trailing + Pfand-Prefix-Noise)
  97. v0.48.8

    OCR v0.48.8 — Lidl-Preisnoise (Trailing-Digits + %-Verwechslung)

    Drei weitere Artefakt-Muster aus realen Lidl-Bon-Fotos beseitigt: (1) PRICE_RE akzeptiert jetzt bis zu zwei Trailing-Noise-Token nach dem Preis (z.B. '1,565 3' → 1,56), (2) normalizeOcrLine normalisiert 3-Dezimalstellen mit Komma-Separator — angehängte Digit-Artefakte ('1,565'→'1,56', '0,508'→'0,50'), (3) Tesseract liest '%' statt '6' bei kleinen Schriften ('5,9% A'→'5,96 A').

    Bugfix
    • PRICE_RE: trailing-Noise-Gruppe von einmaliger Whitelist auf bis zu 2 beliebige \S{1,4}-Token erweitert — '[Re', '@&', 'ghd' und multi-Token '5 3' werden korrekt ignoriert
    • normalizeOcrLine: neue Regel für Komma-Separator + 3 Dezimalstellen — letztes (OCR-angehängtes) Digit entfernen: '1,565'→'1,56', '0,508'→'0,50', '5,988'→'5,98', '1,094'→'1,09'
    • normalizeOcrLine: bestehende Punkt-3-Dezimal-Regel auf '.' -Separator beschränkt (war '[.,]') um Komma-Preise nicht falsch umzuschreiben
    • normalizeOcrLine: Prozentzeichen-zu-6-Ersetzung — Tesseract liest Druck-'6' als '%' bei kleiner Schrift: '5,9% A'→'5,96 A'
  98. v0.48.7

    OCR v0.48.7 — Lidl-Ziffernerkennung + adaptives Thresholding

    Drei Parser-Bugs behoben, die nach der Bon-Erkennung aus v0.48.6 noch sichtbar waren: (1) PRICE_RE schlug fehl wenn MwSt-Kürzel 'B' als '3', '8' oder ')' gelesen wurde, (2) 3-Dezimalstellen-Artefakt '0.499' blockierte Preis-Matching, (3) 'Kreditkarte'-Zeilen wurden nicht gefiltert. Dazu Preprocessing-Verbesserung: hartes .threshold(128) durch adaptives Tesseract-Otsu-Binarisierung ersetzt (nur noch .sharpen() vorbereitet die Kanten), Mindestbreite 1 200→1 600 px.

    Bugfix
    • PRICE_RE: Trailing-Noise-Gruppe erlaubt Ziffern + Satzzeichen — OCR liest 'B' als '3', '8', ')'
    • normalizeOcrLine: 3-Dezimalstellen-Artefakt '0.499' → '0,99' (strip erstes Dezimaldigit)
    • SKIP_RE: kreditkarte, debitkarte, girocard als Zahlungszeilen-Filter ergänzt
    • Preprocessing: .threshold(128) entfernt → Tesseract nutzt internen adaptiven Otsu-Algorithmus
    • Preprocessing: .sharpen({ sigma:1.5, m1:1.5, m2:3 }) für schärfere Textkanten
    • Preprocessing: Mindestbreite 1200→1600 px für bessere Ziffernerkennung bei schmalen Bons
    • Tests: 16 Parser-Regressionstests (Jawoll + Lidl OCR-Artefakte, PRICE_RE-Fälle)
  99. v0.48.6

    OCR: Bon-Erkennung im Foto + Jawoll-Format

    Das Preprocessing lokalisiert jetzt den hellen Bon im Foto (Otsu-Schwellwert + Projektion) und schneidet den Hintergrund weg, bevor Tesseract liest — Fotos auf Stoff, Teppich oder Holz erzeugten bisher massives Pseudotext-Rauschen, in dem die echten Bon-Zeilen untergingen. Zusätzlich Median-Despeckle und Jawoll/Norma-Parser-Support (Artikelnummer-Zeilen, Mengenzeilen wie '4 * 3,33').

    Bugfix
    • Preprocessing: detectPaperRegion() — Bon wird per Otsu-Schwellwert aus dem Foto ausgeschnitten, strukturierter Hintergrund erzeugt kein OCR-Rauschen mehr
    • Preprocessing: 3×3-Median-Filter vor der Binarisierung entfernt Restpixel-Rauschen
    • Parser: Jawoll/Norma-Mengenzeilen '4 * 3,33 13,32 2' — Menge × EP auf eigener Zeile, Produktname aus der Vorzeile
    • SKIP_RE: 'Artikel <Nr>'-Zeilen, 'Betrag', 'Bezahlung', 'Visa', 'Kundenbeleg', 'Kartennr', 'kontaktlos', Öffnungszeiten ('9.00-19.00Uhr')
    • KNOWN_STORES: Jawoll
  100. v0.48.5

    OCR-Parser: Lidl kg-Varianten + Rabattzeilen-Filter

    Robustere Gewichtserkennung: OCR liest 'kg' häufig als 'kn', 'ky' oder 'ko' — alle Varianten werden jetzt als Gewichtszeilen erkannt. PendingName-Buffer prüft jetzt SKIP_RE vor dem Puffern, verhindert so dass Preisvorteil-Fragmente ('svorteil', 'svorte') als Produktnamen gepuffert werden. 'gespart'-Zeilen werden gefiltert.

    Bugfix
    • WEIGHT_INLINE_RE: 'kn', 'ky', 'ko', 'k[0-9]' als OCR-Varianten von 'kg' erkannt
    • pendingName: SKIP_RE-Check vor Pufferung — verhindert Rausch-Tokens als Produktnamen
    • pendingName: mindestens 3 aufeinanderfolgende Buchstaben erforderlich
    • SKIP_RE: 'svorteil', 'svorte' (OCR-Fragmente), 'gespart' (Rabatt-Zusammenfassung)
  101. v0.48.4

    OCR-Parser: Lidl-Support (EP×Qty, 2-Zeilen, Rabattzeilen)

    Drei Lidl-spezifische Parser-Verbesserungen: Inline EP×Menge-Format ('0,99 × 2'), 2-Zeilen-Produktformat (Name ohne Preis + Gewichtszeile) und Filterung von Rabatt-/Aktionszeilen. Fuzzy Lidl-Store-Erkennung für OCR-Varianten wie 'L1DL'.

    Bugfix
    • LIDL_QTY_RE: 'Espresso Macchiato 0,99 × 2 1,98' → qty=2, EP=0,99 korrekt erkannt
    • pendingName-Buffer: Lidl-Produktname auf Zeile 1 (ohne Preis) wird für Gewichtszeile auf Zeile 2 gepuffert
    • SKIP_RE: 'Preisvorteil' und 'Aktion'-Rabattzeilen werden gefiltert
    • KNOWN_STORES: Fuzzy-Pattern /l[i1][d][l]/ erkennt OCR-Varianten wie 'L1DL', 'L!DL'
  102. v0.48.3

    OCR-Parser: EP-Mengenkorrektur + Steuer-Tabellen-Filter

    Menge wird jetzt aus EP und Gesamt-Preis zurückgerechnet statt aus OCR-Ziffernerkennung (z.B. OCR liest 2 als 7 → 6,00 / 3,00 = 2 korrekt). Steuer-Aufschlüsselungszeilen mit 3 Preisspalten werden zuverlässig gefiltert.

    Bugfix
    • EP-basierte Mengenkorrektur: qty = round(Gesamt / EP) — robuster als OCR-Ziffernerkennung
    • SKIP_RE: 3-Preise-Muster fängt OCR-verzerrte Steuer-Tabellen-Zeilen ab
  103. v0.48.1

    OCR-Fix: EXIF-Rotation + Binarisierung

    Kritischer Fix: Phone-Kamera-Fotos werden von sharp ohne .rotate() im Querformat verarbeitet — Tesseract bekommt 90°-gedrehten Text und produziert kompletten Müll. Fix: .rotate() als erste Operation im Preprocessing-Pipeline. Zusätzlich: threshold(128) statt aggressivem Sharpen für sauberere Binarisierung.

    Bugfix
    • KRITISCH: .rotate() in sharp-Pipeline — EXIF-Orientation von Phone-Fotos wird jetzt korrekt angewandt
    • threshold(128) ersetzt sharpen(m1:2.5) — Binarisierung statt Ringing-Artefakte
    • Beide Änderungen zusammen: OCR auf echten Kassenbons sollte jetzt lesbare Ergebnisse liefern
  104. v0.48.0

    OCR-Fix: jsDelivr-Tessdata (.gz) + Preflight-Logging

    Kritischer Fix: deploy.sh lädt jetzt deu.traineddata.gz + eng.traineddata.gz von jsDelivr (cdn.jsdelivr.net/npm/@tesseract.js-data/…/4.0.0_best_int) — exakt dieselbe Quelle, die Tesseract.js v7 nativ nutzt. Adapter: gzip: true statt gzip: false. Preflight-Logging zeigt beim OCR-Aufruf ob die Dateien im Container vorhanden sind (docker logs).

    Bugfix
    • KRITISCH: Tessdata von jsDelivr CDN (.gz) statt GitHub raw — garantiert kompatibles Format
    • Adapter: gzip: true (passend zu .gz-Dateien) statt gzip: false
    • Preflight-Check: loggt Dateigröße von deu/eng.traineddata.gz vor jedem OCR-Aufruf
    • errorHandler in createWorker fängt stille Init-Fehler ab und loggt sie
    • deploy.sh: löscht alte unkomprimierte Tessdata-Dateien vor dem Docker-Build
  105. v0.47.0

    Kassenbon-OCR v3 — Verbesserte Texterkennung

    Der Tesseract.js OCR-Adapter wurde grundlegend überarbeitet. Kritischste Änderung: PSM 6 (SINGLE_BLOCK) statt PSM 4 (SINGLE_COLUMN) — PSM 4 hat die zwei Spalten des Kassenbons (Produktname + Preis) fälschlicherweise getrennt und lieferte 0 Artikel. Zusätzlich: OCR-Artefakt-Normalisierung (Leerzeichen innerhalb Preisen wie '1 ,29'), robustere SKIP_RE (‹netto›/‹bonus› nicht mehr global geblockt), Regex-basierte Supermarkt-Erkennung, automatischer PSM-3-Fallback. Der Roh-OCR-Text wird jetzt im UI als aufklappbares Debug-Panel angezeigt.

    Bugfix
    • KRITISCH: PSM 4 → PSM 6 — PSM 4 trennte Name-Spalte/Preis-Spalte → 0 Artikel erkannt
    • OCR-Zeilennormalisierung: '1 ,29' → '1,29', 'l,29' → '1,29' (häufige Tesseract-Artefakte)
    • SKIP_RE überarbeitet: 'netto', 'bonus', 'total' nicht mehr global geblockt
    • Automatischer Fallback auf PSM 3 (AUTO) wenn PSM 6 < 2 Artikel liefert
    • Store-Erkennung: reguläre Ausdrücke statt String-Includes — trifft OCR-Variationen besser
    • Erweiterte Supermarkt-Liste: 50+ Ketten inkl. Vollcorner, K+K, Hagebau, DM-Drogerie
    • Preprocessing: Mindestskalierung auf 1 200 px (auch Hochskalierung kleiner Bilder)
    • rawOcrText in ParseJob — für Diagnose im Debug-Panel der UI
    Neu
    • OCR-Debug-Panel im Kassenbon-Review: zeigt Roh-Text wenn 0 Artikel erkannt
    • OCR-Ergebnis wird via AppLog in DB geschrieben (Admin → Logs → System-Events)
    • Gewichtete Artikel (0,350 kg × 17,99/kg) werden korrekt herausgefiltert
  106. v0.46.0

    Redis-Caching für häufige DB-Queries

    Fünf zuvor ungecachte Hot-Paths wurden mit Redis-Caching ausgestattet: Health-Inventory-Query (300s), Community- und User-Rezeptlisten (120–300s), Produkt-Barcode-Lookups (1h) und Admin-KPI-Dashboard (60s). Cache-Invalidierungen greifen präzise bei Mutations — Rezepte beim Erstellen/Bearbeiten/Löschen/Sperren, Inventory-Items bereits seit Phase 31. Der Admin-Dashboard zeigt jetzt den Redis-Verbindungsstatus live an.

    Neu
    • Health-Service: getInventoryForHealth() jetzt Redis-cached (300s TTL, invalidiert bei Inventory-Änderungen)
    • Rezept-Listen: getCommunityRecipes() (300s) und getUserRecipes() (120s) Redis-cached
    • Rezept-Mutations invalidieren präzise user- und community-Cache (create/update/delete/photo/block/unblock)
    • Produkt-Barcode-Lookup: getProductByBarcode() mit 1h TTL — schnellere Scan-Antwortzeiten
    • Admin-KPI: getPlatformStats() mit 60s TTL — 7 COUNT-Queries pro Seitenladen entfallen
    • Admin-Dashboard zeigt Redis-Verbindungsstatus und TTL-Übersicht als Status-Strip
    • Neues TTL-Profil und CacheKey-Einträge: USER_RECIPES, COMMUNITY_RECIPES, PRODUCT, ADMIN_KPI
    • pingRedis() Hilfsfunktion für Status-Checks
  107. v0.45.0

    Rezept-Kochmodus, Admin-Rezeptverwaltung & System-Logs

    Nutzer können Rezepte jetzt im interaktiven Kochmodus zubereiten: Der Bildschirm bleibt per Wake Lock API dauerhaft an, Schritte können einzeln abgehakt werden und der Kochvorgang wird nach Abschluss in der Datenbank gespeichert. Administratoren verwalten alle Nutzerrezepte über eine neue filterbare Listenansicht und Detailseite mit Sperr- und Löschfunktion. Das Audit-Log wurde um Rezept-Aktionen erweitert, und die Admin-Log-Seite zeigt jetzt zusätzlich alle System-Events (AppLog) in einem separaten Tab.

    Neu
    • Kochmodus für Nutzerrezepte: Wake Lock API hält Bildschirm an, Auto-Scroll zur Zubereitung
    • Einzelne Zubereitungsschritte abhakbar (ausgegraut/durchgestrichen wenn erledigt)
    • "Fertig mit Kochen"-Button speichert Kochereignis in der DB (RecipeCook-Tabelle)
    • Community-Rezepte werden nach Kochhäufigkeit (cookCount) sortiert
    • Admin-Rezeptverwaltung: filterbare Liste mit Status-Tabs (Alle/Öffentlich/Gesperrt/Privat)
    • Admin-Rezeptdetail: Sperren (mit Sperrgrund), Entsperren und Löschen
    • Nutzer sehen gesperrte eigene Rezepte mit Admin-Hinweisbanner
    • Admin-Logs: Neuer Tab "System-Events" zeigt AppLog-Tabelle mit Level/Quelle-Filter
    • Audit-Log um Rezept-Aktionen erweitert (recipe.block, recipe.unblock, recipe.delete)
    Infrastruktur
    • RecipeCook- und AppLog-Tabellenmodelle in Prisma-Schema, Prisma-Client regeneriert
    • blockedByAdmin, blockedAt, blockedReason, cookCount-Felder auf UserRecipe
  108. v0.44.0

    Kassenbon-OCR — deutlich verbesserte Erkennungsqualität

    Tesseract.js OCR für Kassenbons wurde grundlegend überarbeitet. Smartphone-Fotos werden jetzt vor der Texterkennung automatisch aufbereitet (Graustufen, Kontrast-Normalisierung, Schärfen via sharp). Die OCR-Engine wurde auf LSTM-Only umgestellt und der Seitenanalyse-Modus auf Einspaltig — beides deutlich besser für schmale Kassenbons mit zwei Spalten (Produktname / Preis). Der Text-Parser wurde neu geschrieben: flexiblere Preis-Erkennung, zuverlässige Supermarkt-Erkennung (30+ bekannte Ketten) und ein verbessertes Konfidenz-Scoring.

    Neu
    • Bild-Vorverarbeitung via sharp: Resize auf max. 1200 px, Graustufen, Kontrast-Normalisierung, Schärfen — verbessert OCR-Qualität bei Handy-Fotos um 30–50 %
    • OCR-Engine auf OEM.LSTM_ONLY umgestellt (neuronales Netz statt Legacy-Engine)
    • Seitenanalyse-Modus PSM.SINGLE_COLUMN statt SINGLE_BLOCK — korrekte Behandlung der Kassenbonspalten
    • 30+ bekannte Supermarkt- und Drogeriemarkt-Namen für zuverlässige Filialerkennung (REWE, Edeka, Aldi, Lidl, Kaufland, DM, Rossmann, Müller, Netto, Penny, Tegut, …)
    • Flexiblere Preis-Regex: erkennt jetzt auch ‹1,19A› ohne Leerzeichen vor dem Steuer-Code
    • Verbessertes Konfidenz-Scoring: berücksichtigt Buchstaben-Anteil, Namenslänge und Preis-Position in der rechten Zeilenhälfte
    • Graceful Fallback: wenn sharp-Binaries nicht verfügbar (lokale Dev-Umgebung), wird das Bild unverarbeitet an Tesseract übergeben
    Infrastruktur
    • sharp als Produktions-Dependency in package.json aufgenommen (^0.34.5)
    • Dockerfile: COPY node_modules/sharp ergänzt — native Binaries werden sonst vom Next.js-Standalone-File-Tracing nicht erfasst
  109. v0.43.0

    Rezept-Wizard — Zutaten-Schritt komplett überarbeitet

    Schritt 2 beim Erstellen oder Bearbeiten eines Rezepts wurde von Grund auf neu gebaut. Statt drei simplen Textfeldern gibt es jetzt einen vollständig kontextbewussten Zutatereditor: Der Name kommt zuerst, ein Autosuggest schlägt über 150 bekannte Zutaten vor, die Einheit wechselt automatisch je nach Zutat (z.B. 'Milch → l', 'Knoblauch → Zehe', 'Ei → Stück'), und das Einheitenfeld ist ein Select-Feld mit allen gängigen deutschen Kocheinheiten — Tippfehler werden damit verhindert.

    Neu
    • Zutatename kommt jetzt zuerst — intuitiver UX-Fluss (Name → Menge → Einheit statt Menge → Einheit → Name)
    • Autosuggest mit 150+ deutschen Zutaten — filtert ab dem 1. Zeichen, sortiert Prefix-Matches zuerst, zeigt Default-Einheit als Badge
    • Einheit als Select-Feld mit 23 gängigen deutschen Maßeinheiten (g, kg, ml, l, EL, TL, Stück, Bund, Zehe, Dose, Packung, Prise, …)
    • Auto-Einheit: beim Auswählen einer Zutat aus dem Autosuggest wird die Einheit automatisch gesetzt (Milch → l, Ei → Stück, Petersilie → Bund, Olivenöl → EL, …)
    • Jede Zutat ist jetzt eine Karte mit klarer visueller Trennung und Beschriftungen — kein unstrukturiertes Inputfeld mehr
    • Bestehende Rezepte mit angepassten Einheiten (z.B. aus dem Fork-Flow) werden korrekt angezeigt — auch wenn die Einheit nicht in der Standardliste ist
  110. v0.42.0

    Google OAuth fix, Admin-Logs, Dark Mode & UI-Korrekturen

    Google-OAuth-Anmeldung funktioniert nun zuverlässig (Root Cause: Sentry/Next.js 15-Kompatibilitätsbug der bei jedem Request einen uncaughtException-Fehler warf und dabei die OAuth-Callback-Pipeline unterbrach). Neues Admin-Audit-Log mit Filterung nach Aktion, Admin-E-Mail und Datumsbereich. Dark Mode überarbeitet: Brand-Farbtokens werden jetzt korrekt invertiert, Text ist auf dunklem Hintergrund gut lesbar. Permanente Dark-Mode-Umschalter im Sidebar-Footer und im mobilen Header. Feedback-Button nach links verschoben — kein Overlap mehr mit dem FAB auf der Vorrats-Seite. Facebook-Login als «Demnächst» markiert.

    Bugfix
    • Google OAuth: Sentry-Logger-Bug (TypeError: logger is not a function) in instrumentation.ts unterdrückt — OAuth-Callbacks funktionierten zuvor nicht
    • lib/auth/auth.ts: Toten Code-Branch entfernt (else if (!dbUser) war unerreichbar); explizites console.error bei OAuth-Fehlern für besseres Debugging
    • Dark Mode: Brand-CSS-Tokens (#brand-50 bis #brand-900) in .dark korrekt invertiert — Text-brand-900 von #14532d (unsichtbar) auf #f0fdf4 (lesbar) korrigiert
    • Feedback-Button: von rechts nach links verschoben (bottom-20 right-4 → left-4) — kein Overlap mehr mit Inventory-FAB
    Neu
    • Admin-Logs (/admin/logs): Vollständiger Audit-Trail mit Filter nach Aktion, Admin-E-Mail und Datumsbereich — paginierte Tabelle mit farbigen Action-Badges
    • Dark-Mode-Toggle: Permanenter Sun/Moon-Schalter im Desktop-Sidebar-Footer UND im mobilen Header — sichtbar von jeder Seite ohne Dropdown
    • Facebook-Login deaktiviert: Schaltfläche wird als 'Demnächst verfügbar' angezeigt statt silent failing
    Infrastruktur
    • lib/audit/log.ts: getFilteredAuditEntries() mit action/adminEmail/dateRange/pagination-Parametern ergänzt; AUDIT_ACTIONS-Konstante für UI-Dropdowns exportiert
    • components/layout/app-shell.tsx: 'Logs'-Eintrag in Admin-Navigation hinzugefügt; DarkModeToggle-Subkomponente in sidebar- und header-Variante
  111. v0.41.0

    Phase 51 + 52 — Stripe Upgrade-Flow & Kampagnen-Freigabe mit E-Mail

    Phase 51 bestätigt live: In-App-Upgrade Free → Plus → Family über Stripe Checkout mit Success/Cancel-Seiten, Webhook-Verarbeitung und Feature-Gate-Enforcement. Phase 52 vervollständigt: Admins können Kampagnen freigeben oder ablehnen, der Partner erhält jetzt automatisch eine E-Mail-Benachrichtigung — bei Freigabe eine Bestätigung, bei Ablehnung inklusive der eingetragenen Begründung. Zusätzlich: Hostinger-SMTP aktiv (Phase 53), Feedback-System (Phase 50).

    Neu
    • Phase 51: Stripe Checkout-Session für Plus & Family Upgrade (createCheckoutSessionAction)
    • Phase 51: Stripe Customer Portal für Abo-Verwaltung & Kündigung (createPortalSessionAction)
    • Phase 51: Webhook verarbeitet customer.subscription.created/updated/deleted + checkout.session.completed
    • Phase 51: Feature-Gates enforced — Inventory-Limit, Receipt-Scan-Limit plan-basiert
    • Phase 52: E-Mail-Benachrichtigung an Partner bei Kampagnen-Freigabe (Bestätigungs-E-Mail mit Dashboard-Link)
    • Phase 52: E-Mail-Benachrichtigung an Partner bei Kampagnen-Ablehnung (inkl. Begründung und Überarbeitungslink)
    • Phase 52: Audit-Log-Eintrag mit dbUpdated-Flag für Legacy-Mock-Kampagnen
    Infrastruktur
    • nodemailer@7 im Dockerfile explizit kopiert (standalone file-tracing miss fix)
    • deploy.sh: --legacy-peer-deps für nodemailer@7/next-auth Peer-Konflikt
    • deploy.sh: CRLF-Handling beim source .env.production (tr -d '\r')
    • react-is als explizite Dependency für recharts v3 Kompatibilität
  112. v0.40.0

    Phase 50 — Feedback & Support System

    Nutzer können über einen fixierten Floating-Button unten rechts jederzeit Feedback einreichen (Fehler, Idee, Feedback, Support). Neben der Nachricht werden automatisch Seiten-URL, Browser, Gerät, Auflösung, Plan und App-Version gespeichert. Admins sehen alle Einträge in einer neuen Inbox mit KPIs, Filter nach Status und Typ, können Einträge als 'Wichtig', 'Offen' oder 'Erledigt' markieren (Wichtig erscheint immer ganz oben), und können interne Admin-Notizen oder öffentliche Antworten per E-Mail senden.

    Neu
    • Floating Feedback-Button (fixiert, unten rechts) auf allen App-Seiten
    • Modal mit Typ-Auswahl (Fehler/Idee/Feedback/Support) und Textnachricht
    • Auto-Capture: URL, UserAgent, Auflösung, Viewport, DPR, Sprache, Plattform, PWA-Status, App-Version, Plan
    • POST /api/feedback — anonyme und authentifizierte Einreichung
    • Admin /admin/feedback — Inbox mit KPIs (Offen/Wichtig/Erledigt/Gesamt)
    • Filter nach Status (Offen/Wichtig/Erledigt/Alle) und Typ
    • Wichtig-Einträge immer oben in der Listenansicht
    • Admin /admin/feedback/[id] — Vollansicht mit Metadaten (UserAgent, Gerät, Seite, Plan)
    • Status-Buttons: direkt auf Wichtig/Offen/Erledigt setzen
    • Kommentarsystem: Intern (Admin-only) oder Öffentlich
    • Öffentliche Kommentare optional per E-Mail an Nutzer senden
    • E-Mail-Checkbox nur sichtbar wenn Nutzer-E-Mail bekannt und Kommentar öffentlich
    • Prisma-Modelle: FeedbackEntry + FeedbackComment (Migration 20260606120000)
    • FeedbackEntry: userId nullable (bleibt bei Konto-Löschung erhalten)
    • Admin-Navigation: 'Feedback'-Link ergänzt
    • NEXT_PUBLIC_APP_VERSION in next.config.ts aus package.json (Feedback trägt App-Version)
    Infrastruktur
    • Prisma-Migration 20260606120000_add_feedback — FeedbackEntry, FeedbackComment, Enums, Indizes
    • domains/feedback/feedback.service.ts — listFeedback, getFeedbackById, setFeedbackStatus, addFeedbackComment, getFeedbackStats
    • app/admin/feedback/actions.ts — Server Actions mit Admin-Guard
  113. v0.39.0

    Phase 47 + 49 — SSE Echtzeit-Einkaufsliste & Push-Test-Button

    Phase 47 ersetzt das 10s-Polling der Einkaufsliste durch Server-Sent Events via Redis pub/sub. Jede Mutation (Hinzufügen, Abhaken, Löschen, Bulk-Aktionen) publiziert ein Redis-Signal; alle verbundenen Browser-Tabs des Haushalts erhalten sofort ein 'update'-Event und rufen router.refresh() auf. Fallback: 30s-Polling wenn SSE nicht verfügbar. Phase 49 ergänzt den Subscription-State-Check auf Mount (zeigt direkt 'Aktiv' statt 'Aktivieren'), fügt einen 'Test senden'-Button hinzu und stellt einen POST /api/notifications/test-push Endpoint bereit.

    Neu
    • SSE-Endpoint GET /api/shopping-list/stream?householdId= mit Redis pub/sub und Heartbeat (25s)
    • Redis-Kanal sp:sl:{householdId} — publish nach jeder Einkaufslisten-Mutation
    • publishListUpdate() nach addItem, toggle, delete, clearChecked, alle Bulk-Aktionen
    • ShoppingListClient: EventSource ersetzt setInterval-Polling (30s Fallback bleibt)
    • Sync-Indikator zeigt 'Live-Verbindung aktiv' bei SSE, Fallback bei Disconnect
    • Retry-Logik: EventSource-Reconnect nach 8s bei Verbindungsabbruch
    • Push: Subscription-State wird bei Mount per pushManager.getSubscription() geprüft
    • Push: 'Test senden'-Button im Browser-Push-Bereich der Einstellungen
    • POST /api/notifications/test-push — sendet Test-Push an letzte aktive Subscription
    • Push: Abgelaufene Subscriptions werden automatisch gelöscht (410/404 Handling)
    Infrastruktur
    • X-Accel-Buffering: no Header am SSE-Endpoint (Nginx-Buffer-Disable)
    • Dedizierte ioredis-Verbindung pro SSE-Client (pub/sub kann nicht geteilt werden)
    • RedisLike.publish() Stub — App startet ohne Redis ohne Fehler
  114. v0.38.0

    Phase 45 + 48 — PWA-Verbesserungen und Revenue-Zeitreihen

    Phase 45 verbessert die PWA-Installation: das Manifest erhält volle Icon-Größen, 4 App-Shortcuts und display_override. Der Install-Banner persistiert jetzt 7 Tage via localStorage und zeigt iOS-Safari-Nutzern eine schrittweise 'Zum Startbildschirm'-Anleitung. Phase 48 führt RevenueSnapshot in der DB ein: ein monatlicher Cron-Job sichert MRR, Plan-Verteilung und Partner-Ausgaben als Zeitreihe. Der Admin-Chart zeigt sofort Näherungswerte aus Nutzer-Beitrittsdaten und wechselt automatisch auf 'Live'-Badge sobald echte Snapshots vorhanden sind.

    Neu
    • PWA: manifest.json — display_override, prefer_related_applications:false, scope, 4 App-Shortcuts (Vorrat/Scan/Einkauf/Rezepte)
    • PWA: Install-Banner dismissed-State wird 7 Tage in localStorage gespeichert (kein Reset bei Seitenneuladen)
    • PWA: iOS Safari Flow — schrittweise 'Teilen → Zum Startbildschirm'-Anleitung mit Icons
    • PWA: mobile-web-app-capable Meta-Tag für direkte PWA-Link-Öffnung
    • PWA: Service-Worker Cache-Version auf v2 (erzwingt Cache-Invalidierung auf Clients)
    • Revenue-Zeitreihen: RevenueSnapshot-Tabelle in PostgreSQL (Prisma-Migration 20260606000000)
    • Revenue-Zeitreihen: POST /api/cron/revenue-snapshot — monatlicher Snapshot (CRON_SECRET gesichert)
    • Revenue-Zeitreihen: Sofortiger Fallback — Näherungswerte aus user.createdAt nach Plan
    • Revenue-Chart: Gestrichelte Linie = Näherung, durchgezogen = DB-Snapshot, Badge wechselt automatisch
    • Admin-Dashboard KPI: MRR jetzt aus echten DB-Daten (statt Demo-Wert)
    • Admin-Billing-Tabelle: Monatliche Zeilen jetzt aus realen Daten
    Infrastruktur
    • VPS Cron ergänzen: 30 6 1 * * POST /api/cron/revenue-snapshot (1. jeden Monats)
    • Prisma-Client regeneriert für RevenueSnapshot-Modell
    • RevenueChartRow-Typ ersetzt AdminRevenueRow in allen Admin-Seiten
  115. v0.37.0

    Phase 44 — Admin Analytics: Echte DB-Daten + VPS-Cron (MHD-Check)

    Die Admin-Analytics-Seite zeigt jetzt echte Daten aus der PostgreSQL-Datenbank: Plan-Verteilung (Free/Plus/Family), geschätzter MRR (2,99 € / 5,99 €), bezahlende Nutzer, Conversion Rate sowie live Partner-Performance-Kennzahlen aus der Campaign-Tabelle. Zusätzlich wurde ein täglicher VPS-Cron-Job eingerichtet, der automatisch MHD-Warnungen für alle Haushalte versendet.

    Neu
    • Admin Analytics: Plan-Verteilung (Free/Plus/Family) live aus DB per groupBy
    • Admin Analytics: Geschätzter MRR berechnet aus Plan-Preisen (Plus 2,99 €, Family 5,99 €)
    • Admin Analytics: Conversion Rate (Paid / Gesamt) live
    • Admin Analytics: Partner-Performance (Impressionen, Klicks, CTR, Conversions, Ausgaben) aus Campaign-Tabelle
    • Admin Analytics: Visueller Plan-Distribution-Balken mit Farbkodierung
    • VPS Cron-Job: täglicher MHD-Check um 07:00 Uhr via POST /api/cron/mhd-check
    • Revenue-Chart weiterhin als Demo-Daten (klar gekennzeichnet) — Zeitreihen-Tracking kommt in Phase 48
    Infrastruktur
    • CRON_SECRET in .env.production gesetzt und sp-app-Container neu gestartet
    • getAdminBillingStats() nutzt prisma.user.groupBy für plan-spezifische MRR-Berechnung
    • getRealPartnerStats() nutzt prisma.campaign.aggregate über alle Kampagnen
    • Fallback-Werte (alle 0) bei DB-Fehlern für Produktions-Resilienz
  116. v0.36.0

    Phase 40–43 — Echtzeit-Einkaufsliste, Prisma Migrations, Open Food Facts, Resend

    Vier Plattform-Upgrades in einer Version: die Einkaufsliste synchronisiert sich alle 10 Sekunden automatisch für Mehrpersonenhaushalte, Prisma wechselt von db push auf versionierte Migration-Dateien, Open Food Facts liefert echte Produktdaten ohne API-Key, und Resend ermöglicht transaktionale E-Mails (Willkommen, Passwort-Reset) in Produktionsqualität.

    Neu
    • Phase 40 — Einkaufsliste: useEffect-Polling alle 10 s via router.refresh() — alle Haushaltsmitglieder sehen Änderungen in Echtzeit
    • Sync-Indikator in der Einkaufsliste zeigt 'Zuletzt aktualisiert HH:MM:SS' nach erstem Poll
    • Polling pausiert während ausstehender Transitions (isPending) — kein race condition
    • Phase 41 — Open Food Facts: PRODUCT_DATA_ADAPTER=open-food-facts aktiviert echte Produktdaten (Barcode-Lookup + Textsuche)
    • OFF-Adapter mit Allergen-Mapping (14 Einträge DE), Kategorie-Mapping, E-Nummern, NutriScore, Nova, EcoScore, Nährwerte
    • Graceful fallback auf Mock-Adapter wenn OFF offline oder Produkt unbekannt
    • Phase 42 — Resend E-Mail: EMAIL_PROVIDER=resend + RESEND_API_KEY aktiviert transaktionale E-Mails
    • Willkommens-Mail, E-Mail-Verifikation, Passwort-Reset — alle mit HTML-Vorlage und Text-Fallback
    Infrastruktur
    • Phase 43 — Prisma Migrate: initiale Migration 20260605000000_init generiert aus Schema (816 Zeilen DDL)
    • prisma/migrations/migration_lock.toml: Lock-Datei für Provider-Konsistenz
    • deploy.sh: automatische Baseline-Erkennung — bei erster Migration auf vorhandenem DB-Push-Schema wird init als 'already applied' markiert
    • deploy.sh: prisma migrate deploy statt db push — sicher, auditierbar, rollback-fähig
    • package.json: db:deploy Skript für manuelle Migration in Staging/Prod
    • .env.production.template: AUTH_URL, GOOGLE_CLIENT_ID/SECRET, tesseract als RECEIPT_PARSER_PROVIDER-Default dokumentiert
  117. v0.35.0

    Phase 38 — E2E Tests mit Playwright

    Playwright-Testsuite für die drei kritischen User-Flows: Registrierung+Onboarding, Vorrat hinzufügen, Rezept kochen. Auth-Setup speichert Session-State für schnelle, wiederverwendbare Tests. TypeScript-Fix im Tesseract-Adapter (PSM-Enum).

    Neu
    • playwright.config.ts: 4 Projekte (setup, public, registration, authenticated), webServer auto-start
    • e2e/setup/auth.setup.ts: einmaliges Login / Registrierung, speichert Auth-State in playwright/.auth/user.json
    • e2e/tests/01-landing.spec.ts: Landingpage, Navigation, Impressum, Datenschutz, Changelog (7 Tests)
    • e2e/tests/02-registration.spec.ts: Vollständiger Registrierungs-Flow + Onboarding-Wizard (4 Tests)
    • e2e/tests/03-inventory.spec.ts: Produkt manuell hinzufügen + in Liste finden (3 Tests)
    • e2e/tests/04-recipe-cook.spec.ts: Rezept öffnen, Jetzt-kochen, Einkaufsliste (4 Tests)
    Bugfix
    • tesseract-js.adapter.ts: PSM.SINGLE_BLOCK statt String '6' — TypeScript strict mode fix
    Infrastruktur
    • package.json: @playwright/test ^1.60, Skripte test:e2e / test:e2e:ui / test:e2e:debug
    • .gitignore: playwright-report/, playwright-results/, playwright/.auth/ ignoriert
    • npm run test:e2e startet alle E2E-Tests (erfordert laufende App)
  118. v0.34.0

    Kassenbon-OCR — Tesseract.js (self-hosted WASM, kein API-Key)

    Statt Mindee läuft die Kassenbon-OCR jetzt mit Tesseract.js: vollständig self-hosted via WebAssembly im Node.js-Prozess, kein externer API-Key, kein Kostenlimit. Sprachdaten für Deutsch + Englisch werden beim ersten Aufruf gecacht. Aktivierung via RECEIPT_PARSER_PROVIDER=tesseract.

    Neu
    • modules/receipt-parsing/adapters/tesseract-js.adapter.ts: neuer OCR-Adapter mit parseTesseractReceipt()
    • Deutscher Kassenbon-Parser: erkennt Produktname, Menge, Einzelpreis, Gesamtpreis, Ladenname und Datum
    • Unterstützte Formate: 2x Bio-Gurke, DINKELMEHL 1KG, Vollmilch 3,5% mit MwSt-Kürzel A/B
    • PSM 6 (Single uniform block of text) optimiert für Kassenbon-Layout
    • receipt-parsing.service.ts: RECEIPT_PARSER_PROVIDER=tesseract als neue Option
    Infrastruktur
    • next.config.ts: serverExternalPackages für tesseract.js + tesseract.js-core (verhindert Webpack-Bundling von WASM)
    • Dockerfile: expliziter COPY von tesseract.js und tesseract.js-core als Safety-Net für Standalone-Tracing
    • RECEIPT_PARSER_PROVIDER=tesseract in .env.production auf VPS gesetzt
    • package.json: tesseract.js ^7.0.0 in dependencies
  119. v0.33.0

    Kassenbon-OCR Phase 37 — Mindee-Integration live

    Das Kassenbon-Scan-Feature ist von Mock auf echte OCR umgestellt. Bilder werden sicher als Server Action an die Mindee-API (oder Tabscanner) gesendet — der API-Key bleibt serverseitig. Rate Limiting: 10 OCR-Scans pro Tag. Steuerbar via RECEIPT_PARSER_PROVIDER=mindee|tabscanner|mock.

    Neu
    • parseReceiptAction: neue Server Action nimmt File via FormData entgegen, ruft OCR-Service auf, gibt strukturierte LineItems zurück
    • Mindee OCR aktiviert (250 Seiten/Monat gratis) — liefert Produktname, Menge, Einzelpreis, Gesamtpreis, Confidence
    • receipt-scan-client.tsx: ruft parseReceiptAction statt parseReceiptMock direkt auf — API-Key bleibt server-seitig
    • MIME-Typ-Guard: nur JPG, PNG, WebP, HEIC, PDF erlaubt
    • Dateigrößen-Guard: max. 10 MB
    Sicherheit
    • Rate Limit: 10 OCR-Anfragen pro Tag pro Nutzer (Mindee API Cost Protection)
    • next.config.ts: Server-Actions-Body-Limit auf 10 MB angehoben (Kassenbonbilder)
    Infrastruktur
    • Feature-Flag RECEIPT_PARSER_PROVIDER=mindee|tabscanner|mock (Umschaltung ohne Code-Änderung)
    • MINDEE_API_KEY in .env.production auf VPS gesetzt
  120. v0.32.1

    Sentry Error Tracking aktiviert (Phase 39) + Impressum & Datenschutz

    Sentry ist jetzt vollständig aktiv — NEXT_PUBLIC_SENTRY_DSN und SENTRY_DSN auf dem VPS gesetzt. Fehler in Produktion werden ab sofort erfasst und an sentry.io gemeldet. Impressum und Datenschutzerklärung mit echten Betreiberdaten (eProjekt, Bad Segeberg) befüllt.

    Infrastruktur
    • Sentry Error Tracking aktiviert: NEXT_PUBLIC_SENTRY_DSN + SENTRY_DSN in .env.production gesetzt
    • PII-Scrubbing aktiv: E-Mail, Username und IP-Adresse werden vor dem Senden aus Events entfernt
    • tracesSampleRate: 0.1 (10 % der Requests werden als Performance-Traces erfasst)
    • Gilt für server-seitige Fehler, Edge-Runtime-Fehler und Client-seitige Fehler (instrumentation.ts)
    Docs
    • Impressum: echte Adresse (Teichstraße 18c, 23795 Bad Segeberg), USt-IdNr. DE815483875, Telefon, eprojekt.design-Link
    • Datenschutz: Verantwortlicher aktualisiert, Hosting-Abschnitt (IONOS Deutschland) ergänzt, Stand Juni 2026
    • Footer: 'StockPilot c/o eProjekt' mit Link zu eprojekt.design
  121. v0.32.0

    Rate Limiting (Phase 36) + Google OAuth Code-Complete (Phase 35)

    Redis-basiertes Rate Limiting schützt alle API-Endpoints vor Brute-Force und Missbrauch. Google OAuth war bereits im Code vollständig implementiert — der 'Mit Google anmelden'-Button ist auf Login- und Registrierungsseite aktiv, wartet nur auf GOOGLE_CLIENT_ID + GOOGLE_CLIENT_SECRET in der Produktionsumgebung.

    Sicherheit
    • lib/rate-limit/rate-limiter.ts: Sliding-window Rate Limiter via ioredis — fail-open bei Redis-Ausfall
    • lib/rate-limit/api-helpers.ts: guardApiRoute() (100 req/min) + guardAuthRoute() (20 req/min) für API Routes
    • app/api/auth/[...nextauth]/route.ts: Auth-Endpunkt mit 20 req/min Rate Limit pro IP gesichert
    • app/register/actions.ts: Registrierungsversuch mit checkAuthLimit() gesichert (20/min pro IP)
    • app/app/scan/actions.ts: addScannedItemAction mit checkScanLimit() gesichert (200 Scans/Tag pro Nutzer)
    • app/app/meal-plan/actions.ts: generateMealPlanAction mit checkAiMealPlanLimit() gesichert (5 KI-Pläne/Tag)
    • lib/redis/client.ts: RedisLike-Stub um incr(), expire(), ttl() erweitert (fail-open stubs)
    Neu
    • Phase 35: Google OAuth vollständig live — 'Mit Google anmelden' auf Login + Registrierungsseite aktiv
    • Account-Linking: bestehender E-Mail-Account wird bei gleichem Google-Konto automatisch verknüpft
    • Google Provider in NextAuth mit allowDangerousEmailAccountLinking + find-or-create user flow
  122. v0.31.1

    Produktions-Hotfixes — Prisma-Adapter, Service Worker, use server

    Drei Produktionsfehler behoben, die erst in der Docker-Deployment-Umgebung auftraten: Prisma @adapter-pg gibt DateTime-Felder als Strings zurück; String[]-Felder kamen nicht als JS-Arrays an; AVAILABLE_CATEGORIES und ALLERGEN_OPTIONS crashten weil sie aus einer 'use server'-Datei importiert wurden (Next.js erlaubt dort nur async-Funktions-Exporte).

    Bugfix
    • inventory/page.tsx: daysUntil() + formatDate() defensiv für string|Date (Prisma @adapter-pg in Docker gibt DateTime als Strings zurück)
    • settings/page.tsx: Array.isArray()-Schutz für preferredCategories + allergenProfile
    • Alle Settings-Client-Komponenten: Array.isArray()-Guard für alle Array-Props (Account, Storage, Members, Allergens, Categories)
    • settings/constants.ts (neu): AVAILABLE_CATEGORIES + ALLERGEN_OPTIONS in eigene Datei ohne 'use server' ausgelagert — Root Cause des x.map-Crashes
    • actions.ts: Illegale Re-Exporte von Konstanten aus 'use server'-Datei entfernt
    • public/sw.js: /apple-icon.png aus Service-Worker-Precache entfernt (wird von Next.js dynamisch generiert → 404)
  123. v0.31.0

    Stripe Billing (Phase 34) & Sentry Error Tracking (Phase 39)

    Stripe war bereits vollständig aufgebaut — es fehlten die server-seitigen Feature-Gate-Enforcements. Die Inventar- und Scan-Actions prüfen jetzt das 50-Item-Limit, die Kassenbon-Action prüft das Monats-Limit. Der Admin zeigt den Plan jedes Nutzers. Sentry war ebenfalls bereits konfiguriert — nur die Env-Variable NEXT_PUBLIC_SENTRY_DSN muss auf dem VPS gesetzt werden. Deployment-Dokumentation aktualisiert.

    Neu
    • Stripe Billing: addItemAction, quickAddItemAction, addScannedItemAction prüfen jetzt canAddInventoryItem() (50-Item-Limit)
    • Stripe Billing: bulkAddReceiptItemsAction prüft canScanReceipt() (5 Kassenbons/Monat im Free-Plan)
    • Admin Nutzerverwaltung: neue 'Plan'-Spalte mit farbigen Badges (Free/Plus/Family)
    • Sentry: bereits vollständig konfiguriert (instrumentation.ts, sentry.server.config.ts) — nur NEXT_PUBLIC_SENTRY_DSN setzen
    • .env.example: STRIPE_PRICE_PLUS_MONTHLY, STRIPE_PRICE_FAMILY_MONTHLY, ANTHROPIC_API_KEY ergänzt
    • Unit Tests: RecipeStep.duration → RecipeStep.step Typo-Fix
    Infrastruktur
    • Feature-Gate-Enforcement: Feature-Gates waren nur für UI-Banners genutzt, jetzt auch server-seitig in Actions
    • Stripe-Setup-Anleitung: dashboard.stripe.com → Products → 2 Prices anlegen → IDs als Env-Vars setzen
  124. v0.30.0

    Unit Tests (vitest) — 97 Tests für Business-Logik

    Vollständige vitest-Test-Suite für alle reinen Berechnungsfunktionen: Health-Scoring, CO₂-Berechnung, Rezept-Matching, Additives-Lookup, Rewards-Level, Preislogik und Changelog-Konsistenz. 97 Tests in 7 Dateien, alle grün. CI/CD führt Tests jetzt als Quality-Gate vor jedem Deploy aus.

    Infrastruktur
    • vitest.config.ts: Node-Umgebung, @-Alias, include tests/**/*.test.ts
    • tests/unit/health.service.test.ts: 12 Tests für buildHealthSummary() + DAILY_REFERENCE_VALUES
    • tests/unit/carbon.service.test.ts: 12 Tests für computeCarbonSummary() + ECO_CO2
    • tests/unit/recipe.service.test.ts: 23 Tests für calculateMatch(), filterRecipes(), withMatch(), getAllRecipes()
    • tests/unit/additives-data.test.ts: 14 Tests für lookupAdditive(), lookupAdditives(), RISK_LABEL/COLOR
    • tests/unit/rewards.helpers.test.ts: 17 Tests für getLevelForPoints(), getNextLevel(), POINT_ACTIONS
    • tests/unit/changelog.test.ts: 6 Tests für Versions-Konsistenz (CURRENT_VERSION === package.json)
    • tests/unit/price.service.test.ts: 13 Tests für Trend-Berechnung, Preisformatierung, Budget-Logik
    • CI/CD: 'npx vitest run' als neuer Schritt im Quality-Gate (nach TypeCheck, vor Lint)
  125. v0.29.0

    Community-Rezeptbuch (Ph.28), FoodShare 2.0 (Ph.29), Mikronährstoffe (Ph.30) & Price Intel 2.0 (Ph.33)

    Vier Phasen auf einmal: Community-Rezepte können jetzt gemeldet werden (AdminAuditLog). FoodShare vergibt endlich Punkte (+25 beim Erstellen, +15 beim Abholen) und zeigt 'Meine Abholungen'. Health zeigt EU-Referenzwerte als Fortschrittsbalken für alle verfügbaren Nährstoffe. Price Intelligence 2.0: Preis-Alerts lösen automatisch In-App-Benachrichtigungen aus und können manuell geprüft werden.

    Neu
    • Phase 28: 'Melden'-Button auf Community-Rezepten → AdminAuditLog-Eintrag mit Bestätigungs-Dialog
    • Phase 29: FoodShare-Punkte endlich vergeben: +25 beim Erstellen, +15 beim Abholen (BUGFIX!)
    • Phase 29: 'Meine Abholungen'-Sektion in FoodShare zeigt Historie der abgeholten Angebote
    • Phase 30: Health-Seite: Ø Nährstoffprofil mit EU-RDI-Balken (Eiweiß, KH, Fett, Ballaststoffe, Salz)
    • Phase 33: checkPriceAlertsAction: prüft aktive Alerts, erstellt Notification bei Preisunterschreitung
    • Phase 33: 'Preisalarme jetzt prüfen'-Button auf der Preisbeobachtungs-Seite
    • Phase 33: Alert-Check wird automatisch nach jeder manuellen Preis-Eingabe beim Scan ausgelöst
  126. v0.28.0

    CO₂-Budget (Phase 27), Echte Preisschätzung (Phase 31) & Redis-Caching

    Phase 27 vervollständigt: auf der CO₂-Seite gibt es jetzt ein interaktives Wochenziel-Widget mit Fortschrittsbalken, Presets (5–30 kg) und Slider. Phase 31 verbessert: die Einkaufslisten-Budgetschätzung nutzt jetzt echte ProductPriceObservation-Daten (aus Scan-Preiseingabe oder Kassenbons) — mit Fallback auf €1,50/Artikel. Redis-Caching: Inventory (60s), ShoppingList (15s) und Rewards (120s) sind jetzt gecacht mit automatischer Invalidierung bei Mutationen.

    Neu
    • CO₂-Seite: Wochenziel-Widget mit Slider (1–50 kg), Presets, Fortschrittsbalken & Überschreitungs-Alert
    • CO₂-Seite: Ziel wird in UserProfile.carbonBudgetKgPerWeek persistiert (nullable Float, prisma db push)
    • Einkaufsliste: Budget-Schätzung nutzt echte Ø-Preise aus ProductPriceObservation; ≈ statt 'ca.' wenn Realdaten vorhanden
    Infrastruktur
    • Redis-Cache ausgebaut: TTL.INVENTORY (60s), TTL.SHOPPING_LIST (15s), TTL.REWARDS (120s)
    • CacheKey.inventory(householdId, locationId?), CacheKey.shoppingList, CacheKey.rewards
    • getInventory() → cached(); invalidate() bei add/consume/delete
    • getShoppingList() → cached(); invalidate() bei add/toggle/delete/clear
    • getRewardsSummary() → cached(); invalidate() nach awardPoints()
  127. v0.27.0

    Preis-Schnelleingabe, FoodShare-Impact & Bulk-Lagerort (Phasen 78–80)

    Beim Scannen kann nun optional ein Preis eingetragen werden — er wird als ProductPriceObservation gespeichert und ermöglicht persönliche Preisverlaufsdaten ohne Kassenbon-Import. Das Dashboard zeigt ein FoodShare-Impact-Widget wenn Angebote erstellt wurden. In der Inventar-Mehrfachauswahl gibt es jetzt einen Lagerort-Button der einen Inline-Picker öffnet.

    Neu
    • Scan-Formular: optionales Preisfeld (€) → speichert ProductPriceObservation mit source='manual_scan'
    • Dashboard: FoodShare-Impact-Widget zeigt Anzahl erstellter Angebote und weitergegeben Items
    • Inventar Bulk: 🧊 Lagerort-Button öffnet Inline-Picker mit allen Haushalts-Lagerorten
    • Inventar Bulk: 'Kein Lagerort' Option entfernt zugewiesenen Lagerort von allen selektierten Items
  128. v0.26.0

    Jetzt kochen, Einladungs-QR-Code & Sofort-kochbar-Widget (Phasen 75–77)

    'Jetzt kochen' schließt den Loop zwischen Rezepten und Vorrat — passende Inventory-Items werden per Klick als verbraucht markiert. Im Einladungslink-Bereich der Settings gibt es jetzt einen QR-Code-Toggle via api.qrserver.com. Das Dashboard zeigt ein 'Sofort kochbar'-Widget mit Rezepten, für die ≥ 80 % der Zutaten im Vorrat sind.

    Neu
    • Rezept-Detail: 'Jetzt kochen'-Banner mit grünem CTA — markiert passende Inventory-Items CONSUMED (FIFO, searchTerm-Matching)
    • Rezept-Detail: +3 Punkte pro verbrauchtem Artikel, Erfolgs-Feedback mit Produktanzahl
    • Settings Haushalt: QR-Code-Button neben dem Einladungslink (Toggle, api.qrserver.com, 180×180 px)
    • Dashboard: 'Sofort kochbar'-Widget zeigt bis zu 3 Rezepte mit ≥ 80 % Zutaten-Match
  129. v0.25.0

    Community-Rezeptbuch (Phase 28) & Smarte Einkaufsliste 2.0 (Phase 31)

    Phase 28 (Community-Rezeptbuch) wird vervollständigt: auf öffentlichen Community-Rezepten gibt es jetzt einen Teilen-Button (nativ / Clipboard), und die Rezepte-Seite zeigt eine 'Neu in der Community'-Galerie. Phase 31 (Smarte Einkaufsliste 2.0): Markt-Sortierung nach Supermarkt-Laufweg, Spracheingabe via Web Speech API und eine Kostenabschätzung für offene Artikel.

    Neu
    • Rezepte: 'Teilen'-Button auf Community-Rezept-Detailseiten (navigator.share / Clipboard-Fallback)
    • Rezepte: 'Neu in der Community'-Galerie zeigt die 3 neuesten öffentlichen Rezepte anderer Nutzer
    • Einkaufsliste: Sortierung nach Supermarkt-Laufweg ('Markt'-Button) mit 12-Aisle-Keyword-Mapping
    • Einkaufsliste: Alphabetisch-Sort-Button ('A–Z') als zweite Sortierung
    • Einkaufsliste: Spracheingabe-Button (🎤) via Web Speech API, Sprache de-DE
    • Einkaufsliste: Geschätzte Kosten ('ca. € X,XX') bei ≥ 2 offenen Artikeln (Ø €1,50/Artikel)
  130. v0.24.0

    Bulk-Verbraucht, Monatliche Stats & Wochenplan-Druck (Phasen 72–74)

    In der Inventar-Mehrfachauswahl gibt es jetzt einen grünen 'Verbraucht'-Button der alle selektierten Artikel auf einmal als aufgebraucht markiert (mit Punkte-Vergabe). Die Statistik-Seite zeigt ein 'Dieser Monat'-Highlight mit Verbraucht/Abgelaufen-Zahlen, Rescue Rate und Top-Kategorie. Der Wochenplan hat einen Drucken-Button der window.print() auslöst.

    Neu
    • Inventar: Bulk-Mehrfachauswahl — neuer 'Verbraucht'-Button (grün) markiert alle gewählten Artikel
    • Inventar: Lösch-Button in der Bulk-Bar auf Icon-only verkleinert (mehr Platz für neue Aktion)
    • Stats: 'Dieser Monat'-Karte mit Verbraucht / Abgelaufen / Rescue Rate / Top-Kategorie
    • Wochenplan: 'Drucken'-Button im Header (window.print, print:hidden — kein Extra-CSS)
  131. v0.23.0

    Scan-Verlauf, Rescue-Rate-Widget & Einkaufsliste teilen (Phasen 69–71)

    Die Scan-Seite zeigt jetzt die zuletzt hinzugefügten Vorrats-Artikel direkt darunter — mit relativem Zeitstempel und Link zur Detail-Seite. Das Dashboard hat ein farbcodiertes Rescue-Rate-Widget, das den Anteil verbrauchter vs. abgelaufener Produkte der letzten 30 Tage anzeigt. Die Einkaufsliste lässt sich per nativen Share-Dialog (mobil) oder Zwischenablage-Kopie mit anderen teilen.

    Neu
    • Scan-Seite: 'Zuletzt hinzugefügt'-Liste mit relativem Timestamp (Gerade eben / Vor X Min. / Vor X Tagen)
    • Dashboard: Food-Rescue-Rate-Widget mit Fortschrittsbalken und Farbcodierung (grün ≥ 80 %, amber ≥ 50 %, rot < 50 %)
    • Einkaufsliste: 'Teilen'-Button mit navigator.share (mobil/PWA) und Clipboard-Fallback
    • Einkaufsliste: exportiertes Format enthält offene + erledigte Artikel mit Datum und Haushaltsnamen
  132. v0.22.0

    Notification-Banner, Marketplace-Redesign & Inventar-Deeplinks (Phasen 66–68)

    Das Dashboard zeigt jetzt einen prominenten Benachrichtigungs-Banner, wenn ungelesene MHD-Warnungen vorliegen. Die Marktplatz-Seite wurde komplett auf das aktuelle Design-System migriert und ist nun mit echter Datenbankanbindung live. Von jedem Inventar-Detail gibt es direkte Links zur vollständigen Produktdetailseite und — bei ablaufenden Artikeln — eine FoodShare-CTA.

    Neu
    • Dashboard: Notification-Banner mit Ungelesen-Zähler und Link zu /app/notifications
    • Marketplace: vollständiges Redesign (aktuelle Design-Sprache, Tailwind v4)
    • Marketplace: echte Prisma-Abfrage auf MarketplaceListing statt Mock-Daten
    • Marketplace: horizontale Filter-Chips als URL-Parameter, sauberer Empty State
    • Inventar-Detail: 'Vollständige Produktinfo'-Link zur Barcode-Produktseite
    • Inventar-Detail: 'FoodShare-Angebot teilen'-CTA für Artikel mit ≤ 7 Tagen MHD
  133. v0.21.0

    Kategorie-Filter, Health-Allergen-Warnung & CSV-Export (Phasen 63–65)

    Der Vorrat lässt sich jetzt nach Kategorien filtern — Chips-Leiste kombinierbar mit dem bestehenden Lagerort-Filter. Die Health-Seite zeigt eine persönliche Allergen-Warnung wenn Produkte im Vorrat mit dem eigenen Allergen-Profil übereinstimmen. Der gesamte aktive Vorrat ist als CSV-Datei exportierbar.

    Neu
    • Inventar: Kategorie-Filter-Chips (kombinierbar mit Lagerort-Filter)
    • Health: persönliche Allergen-Warnung mit roter Hervorhebung bei Profil-Übereinstimmung
    • Health: Link zu Einstellungen für Allergen-Profil wenn noch nicht eingerichtet
    • Inventar: CSV-Export via GET /api/inventory/export (UTF-8 BOM für Excel-Kompatibilität)
    • Inventar: '↓ CSV Export'-Button am Ende der Vorrats-Ansicht
  134. v0.20.0

    Allergen-Profil, Wochenplan für alle & Dashboard-Widgets (Phasen 60–62)

    Nutzer können ihr persönliches Allergen-Profil in den Einstellungen hinterlegen — beim Scan und auf der Produktdetail-Seite erscheint dann eine personalisierte Warnung. Der Wochenplan ist jetzt für alle Nutzer zugänglich (Free-Tier: Rezeptvorschlag ohne KI; Plus: Claude-powered). Das Dashboard zeigt eine Kategorie-Übersicht des Vorrats und einen direkten Wochenplan-Link.

    Neu
    • Allergen-Profil in Einstellungen: 22 wählbare Allergene (Gluten, Milch, Erdnüsse, Soja, …)
    • Allergen-Warnung auf Produktdetail-Seite: persönliche Treffer rot hervorgehoben
    • Wochenplan für alle Nutzer: Free-Tier zeigt automatischen Rezeptvorschlag ohne KI-Personalisierung
    • Wochenplan: Free-Tier-Banner mit Upgrade-Link, Plus-Badge bei aktivem Claude-API-Key
    • Dashboard: Kategorie-Übersicht — scrollbare Chips mit Anzahl pro Kategorie
    • Dashboard: Wochenplan-Quick-Link-Card in der Hauptnavigation
    Infrastruktur
    • Prisma-Schema: UserProfile.allergenProfile String[] @default([]) neu
    • settings/actions.ts: saveAllergenProfileAction + ALLERGEN_OPTIONS (22 Einträge)
    • prisma generate nach Schema-Erweiterung
  135. v0.19.0

    Open Food Facts Adapter, Produktdetail-Seite & EFSA-Zusatzstoffhinweise (Phasen 57–59)

    Open Food Facts (OFF) Adapter vollständig aktiviert — wechselbar via PRODUCT_DATA_ADAPTER=open-food-facts. Neue Produktdetail-Seite /app/products/[barcode] mit Nährwerttabelle, NutriScore/EcoScore/NOVA, Allergenen und EFSA-Zusatzstoffbewertungen. Im Scan-Erfolgs-Screen werden erkannte E-Nummern als Chips angezeigt und ein direkter Link zur Produktdetail-Seite eingeblendet.

    Neu
    • Produktdetail-Seite /app/products/[barcode]: Nährwerttabelle pro 100 g (Energie, Kohlenhydrate, Fett, Eiweiß, Ballaststoffe, Salz)
    • Produktdetail-Seite: NutriScore, EcoScore und NOVA-Gruppe als farbige Badges
    • Produktdetail-Seite: Allergen-Liste mit farbiger Amber-Hervorhebung
    • Produktdetail-Seite: EFSA-Zusatzstoff-Lookup — E-Nummer, Funktion, Risikobewertung (low/medium/high), EFSA-Hinweis
    • Produktdetail-Seite: aktueller Lagerbestand für dieses Produkt (Anzahl Einträge im Vorrat)
    • Scan-Erfolgs-Screen: E-Nummern-Chips wenn Produkt Zusatzstoffe enthält
    • Scan-Erfolgs-Screen: 'Produktdetails & Zusatzstoffe ansehen'-Link zur Detailseite
    • Scan-Formular (vor Hinzufügen): 'Details'-Link zur Produktdetail-Seite
    • additives in ScanProductResult übergeben (vom OFF-Adapter und Mock)
    Infrastruktur
    • modules/product-data/additives-data.ts: 70+ E-Nummern (E100–E960), EFSA-basiert, mit deutschem Namen, Funktion, Risikolevel und Hinweis
    • lookupAdditive(code), lookupAdditives(codes[]), RISK_LABEL, RISK_COLOR exportiert
    • PRODUCT_DATA_ADAPTER=open-food-facts aktiviert OFF-Adapter (mit Mock-Fallback bei Fehler/unbekannt)
    • Typefix: SCAN → SCAN_PRODUCT in inventory/actions.ts und scan/receipt/actions.ts
    • Typefix: expiresAtFormatted zu EnrichedItem-Typ in inventory/page.tsx ergänzt
    • Typefix: RecipeCategory-Vergleiche in app/page.tsx korrigiert
    • Typefix: recharts PieLabelRenderProps in category-pie-chart.tsx
  136. v0.18.0

    MHD-Cron, Notification Bell & Rezept des Tages (Phasen 54–56)

    Täglicher MHD-Cron-Endpoint für alle Haushalte, gesichert durch CRON_SECRET. Notification Bell mit Unread-Badge war bereits implementiert. Neues "Rezept des Tages"-Widget auf dem Dashboard: deterministisch nach Tagesdatum gewählt, zeigt Match-Prozent mit aktuellem Vorrat und fehlende Zutaten.

    Neu
    • Rezept des Tages auf dem Dashboard: täglich wechselndes Rezept, deterministische Tag-des-Jahres-Auswahl
    • Rezept des Tages: Zutaten-Match-Prozent mit aktuellem Vorrat, fehlende Zutaten aufgelistet
    • Rezept des Tages: Farb-Balken nach Kategorie, Kochzeit, Tags, direkt verlinkbar
    • MHD-Cron-Endpoint POST /api/cron/mhd-check: läuft für alle Haushalte aller Nutzer
    • Cron-Endpoint durch CRON_SECRET Bearer-Token gesichert (optional, aber empfohlen)
    Infrastruktur
    • runDailyMhdCheckForAll(): iteriert über alle HouseholdMember, ruft createMhdNotifications auf
    • app/api/cron/mhd-check/route.ts: POST-Handler mit Auth-Check + strukturiertem Logging
    • Cron-Setup-Kommentar im Route-File (VPS-crontab Beispiel)
    • Notification Bell + /app/notifications waren bereits vollständig implementiert (Phase 54 ✓)
  137. v0.17.0

    Statistik-Seite, FoodShare & Heatmap vollständig (Phasen 51–53)

    Neue Statistik-Seite /app/stats mit Balken-Chart (verbraucht vs. abgelaufen, letzte 8 Wochen), Donut-Chart der aktuellen Vorrats-Kategorien und KPI-Block (Rescue-Rate, gerettete kg, CO₂-Schätzung, FoodShare-Count). FoodShare inkl. aggregierter Heatmap ist bereits voll implementiert und direkt verlinkt. Navigation und Dashboard um Stats-Einstiegspunkte erweitert.

    Neu
    • Statistik-Seite /app/stats: KPI-Block mit Rescue-Rate, Verbraucht-Count, geretteten kg und CO₂-Schätzung
    • Balken-Chart: wöchentlich verbrauchte vs. abgelaufene Artikel (letzte 8 Wochen, recharts BarChart)
    • Donut-Chart: Vorrat nach Kategorie (Top 10, recharts PieChart mit innerRadius)
    • Food-Waste-Hinweis-Banner wenn abgelaufene Artikel vorhanden
    • FoodShare- und Rewards-CTA-Cards am Ende der Stats-Seite
    • "Statistiken"-Eintrag in der Navigation (Mehr-Menü, direkt nach Rezepte)
    • "Haushalts-Statistiken"-Quick-Link auf dem Dashboard (zwischen Rewards und Food-Rescue-Score)
    Infrastruktur
    • isoWeekLabel() und weekOffset() Hilfsfunktionen für Wochen-Gruppierung
    • Parallele Prisma-Abfragen: consumed, expired, inventoryWithCats, foodShareOffers
    • Kategorien JavaScript-seitig gruppiert (kein Prisma groupBy nötig)
  138. v0.16.0

    Shopping-List UX, Kassenbon-Scan & Bulk-Import (Phasen 48–50)

    Die Einkaufsliste zeigt jetzt ablaufende Vorrats-Artikel als Nachkauf-Vorschläge (Amber-Chips mit Tage-Countdown). Neuer Kassenbon-Scanner unter /app/scan/receipt: Foto hochladen oder aufnehmen, automatische Texterkennung (Mock), Line-Item-Prüfung mit Konfidenz-Badges und inline bearbeitbaren Namen. Mit einem Klick alle gewählten Artikel direkt in den Vorrat übernehmen.

    Neu
    • Einkaufsliste: "Bald aufgebraucht — nachkaufen?"-Chips für Vorrats-Artikel ≤7 Tage bis Ablauf
    • Ablauf-Chips: Tage-Countdown-Badge, Amber-Farbe, klickbar zum direkten Hinzufügen zur Liste
    • Kassenbon-Scanner: neue Route /app/scan/receipt mit Upload-Bereich (Drag & Drop) und Kamera-Button
    • Kassenbon-Parsing: Mock-Adapter simuliert OCR-Erkennung mit 1,6 s Ladezeit
    • Ergebnis-Liste: Konfidenz-Badges (grün ≥85 %, amber ≥65 %, rot <65 %), unsichere Artikel einklappbar
    • Inline-Bearbeitung: Produktname durch Tippen direkt in der Ergebnisliste korrigierbar
    • Bulk-Import: ausgewählte Artikel werden als Inventar-Einträge angelegt (+5 Punkte je Artikel, max. 10)
    • Kassenbon-Link auf der Scan-Seite als prominente Card mit Beschreibungstext
    Infrastruktur
    • bulkAddReceiptItemsAction: findet oder erstellt Produkte per Name, bulk-create InventoryItems
    • getExpiringReplacements(): Prisma-Query auf InventoryItem mit expiresAt ≤7 Tage, dedupliziert nach Name
    • ExpiringReplacement-Typ aus shopping-list/page.tsx für Client-Komponente exportiert
  139. v0.15.0

    Quick-Add, Lagerort-Manager, Ablauf-Timeline & Food-Rescue-Score (Phasen 44–47)

    Produkte ohne Barcode per FAB-Dialog direkt im Vorrat anlegen. Lagerorte (Kühlschrank, Keller, …) in den Einstellungen verwalten. Neuer Ablauf-Timeline-Tab im Vorrat zeigt alle Artikel farbkodiert nach Dringlichkeit. Auf dem Dashboard erscheint der Food-Rescue-Score mit Fortschrittsbalken.

    Neu
    • Quick-Add FAB im Vorrat: schwebender "+"-Button öffnet Bottom-Sheet mit Name, Kategorie, Menge, MHD und Lagerort
    • Quick-Add: legt Produkt per Name an (kein Barcode nötig), vergibt +5 Punkte, Reset für nächsten Artikel
    • Lagerort-Manager in Einstellungen: Lagerorte anlegen, umbenennen (Inline-Edit) und löschen
    • Lagerort-Löschen setzt Items sanft auf keinen Lagerort (kein Datenverlust)
    • Vorrat Ablauf-Timeline: dritter Tab mit 6 farbkodierten Gruppen (Abgelaufen → Kein MHD)
    • Food-Rescue-Score auf dem Dashboard: Rate verbrauchter vs. abgelaufener Produkte (letzte 30 Tage)
    • Food-Rescue-Widget: farbkodierter Fortschrittsbalken + Motivationstext (Ausgezeichnet / Gut / Luft nach oben)
    • Food-Rescue-Widget: nur sichtbar wenn mindestens ein verbrauchtes oder abgelaufenes Produkt vorhanden
    Infrastruktur
    • quickAddItemAction: findet oder erstellt Produkt per case-insensitivem Namensvergleich
    • addStorageLocationAction / renameStorageLocationAction / deleteStorageLocationAction als Server Actions
    • Dashboard Promise.all erweitert: zwei count-Abfragen für Food-Rescue-Metriken
  140. v0.14.0

    Haushalt-Einladungen, Health-Scan & Kategorienpräferenzen (Phasen 40–43)

    Mitglieder per Link einladen, Haushalt mit einem Klick beitreten, Mitglieder verwalten. Im Scan-Erfolgs-Screen erscheinen jetzt NutriScore, EcoScore und Allergen-Hinweise direkt nach dem Hinzufügen. Kategorienpräferenzen in den Einstellungen editierbar (12 Chips, sofort gespeichert).

    Neu
    • Haushalt-Einladungslink: einmaliger 16-Zeichen-Code per Link teilen oder regenerieren
    • Einladungs-Annahme-Seite /app/join/[code] mit Haushaltsname, Mitgliederanzahl und Join-Button
    • Mitgliederliste in den Einstellungen: Avatar, Name, E-Mail, Rollen-Badge (Krone für Eigentümer)
    • Mitglied entfernen direkt in der Einstellungssektion (Eigentümer nicht entfernbar)
    • Einladungslink mit Copy-Button und Regenerieren-Schaltfläche in den Einstellungen
    • Scan-Erfolgsscreen: NutriScore-Badge, EcoScore-Chip (🌿) und Allergen-Warnung (⚠️) nach dem Hinzufügen
    • Kategorienpräferenzen: 12 auswählbare Chip-Kategorien (Obst & Gemüse, Milch & Käse, Fleisch & Fisch, …)
    • Kategorien-Auswahl sofort per Button speicherbar, Toast-Bestätigung, leere Auswahl = alle Kategorien
    Infrastruktur
    • Prisma-Schema: inviteCode String? @unique auf Household-Modell ergänzt
    • Server Actions: generateInviteCodeAction, joinHouseholdAction (idempotent), removeMemberAction
    • saveCategoriesAction mit Whitelist-Validierung (nur bekannte Kategorien werden akzeptiert)
    • prisma generate nach Schema-Erweiterung (inviteCode + preferredCategories in Client-Types)
  141. v0.13.0

    UX-Improvements: Onboarding, Profil, Scan, Vorrat & Dashboard (Phasen 34–39)

    Sechs UX-Phasen in einem Release: verbesserter Onboarding-Flow mit Kategorienwahl und Willkommensbonus, neue Profilseite mit Stats und Aktivitätslog, überarbeiteter Barcode-Scanner mit Scan-History und Vibration, Inventar-Suche/-Sortierung und Quick-Consume, Rewards-Karte auf dem Dashboard sowie Rezeptvorschläge direkt fuer ablaufende Zutaten.

    Neu
    • Onboarding: Lieblingskategorien-Auswahl (Schritt 4), Fortschrittsbalken statt Kreisindikator, Willkommensbonus-Karte im Abschluss-Screen
    • Onboarding: Auto-Redirect aus dem App-Layout wenn Nutzer noch keinen Haushalt hat
    • Profilseite /app/profile: Avatar, Name, Level-Badge, Streak, Stats-Strip (Punkte/Streak/Vorrat/FoodShare), Haushalt-Karte, Achievements-Grid, Aktivitaetslog, Abmelden
    • Barcode-Scanner: Scan-History in localStorage, Produkt-Thumbnail, Haptic-Feedback (vibrate), EcoScore-Badge, verbesserte Erfolgsseite mit MHD-Bestaetigung und +5-Punkte-Toast
    • Inventar: Client-side Suche (Name/Marke/Kategorie/Lagerort), Sortierung (MHD/Name/Menge), Quick-Consume-Button direkt auf jeder Karte
    • Dashboard: Rewards-Karte mit Punktestand, Level, Streak und Fortschrittsbalken zur naechsten Stufe
    • Dashboard: Quick-Consume auf ablaufenden Produkten (grüner Checkmark-Button mit Done-Animation)
    • Dashboard: Rezeptvorschlaege fuer ablaufende Zutaten — Top-3-Rezepte mit Match-Prozent und Zubereitungszeit
    Infrastruktur
    • app/app/_components/quick-consume-button.tsx: Client Component mit loading/done-State und Router-Refresh
    • UserProfile.preferredCategories String[] im Prisma-Schema ergaenzt
    • Onboarding-Gate im App-Layout (redirect wenn USER ohne Haushalt und DB erreichbar)
  142. v0.10.0

    Eigene Rezepte, Fork-System & Foto-Galerie (Phase 28)

    Nutzer koennen eigene Rezepte erstellen, Systemrezepte anpassen (Fork) und Fotos hochladen. Community-Tab zeigt geteilte Nutzerrezepte. Dreistufiger Wizard (Basisinfos, Zutaten, Schritte & Fotos).

    Neu
    • Dreistufiger Rezept-Wizard: Basisinfos, Zutaten (mit Menge/Einheit), Schritte + Foto-Upload
    • Systemrezepte mit einem Klick forken: Anpassen-Button auf jeder Rezept-Karte
    • Fork-Badge zeigt bei abgeleiteten Rezepten das Original-Rezept an
    • Foto-Slideshow-Galerie auf Rezept-Detailseite (Dot-Indikatoren, Pfeilnavigation)
    • Cover-Foto wird automatisch aus dem ersten Upload gesetzt
    • Sichtbarkeit: Privat oder Community (mit Lock/Globe-Icon-Toggle)
    • Rezepte-Tab-Leiste: Alle Rezepte / Meine Rezepte / Community
    • Neues-Rezept-Button in der Rezept-Uebersicht
    • Bearbeiten und Loeschen von eigenen Rezepten (mit Bestaetigung)
    • Foto-Upload-API unter /api/uploads/recipes (JPEG/PNG/WebP, max. 5 MB)
    Infrastruktur
    • Prisma-Schema: UserRecipe- und RecipePhoto-Modelle, RecipeVisibility-Enum
    • domains/recipes/user-recipe.service.ts: CRUD, Fork, Foto-Verwaltung, Cover-Logik
    • Docker-Volume recipe_uploads fuer persistente Foto-Speicherung auf dem VPS
    • Foto-Dateien liegen unter public/uploads/recipes/ (via Docker-Volume gemountet)
  143. v0.9.0

    Redis-Caching + CO₂-Footprint-Tracking (Phase 26+27)

    Redis als Best-Effort-Cache fuer Layout-kritische DB-Queries (Notifications, Haushalte). Neues CO2-Footprint-Feature mit Eco-Score-basierter Klimaberechnung, Wochenchart und grueneren Produktalternativen.

    Neu
    • CO2-Footprint-Seite unter /app/sustainability mit Klimakennzahlen und Eco-Score-Verteilung
    • Wochenchart (AreaChart) zeigt geschaetzten CO2-Fussabdruck der letzten 6 Wochen
    • Top-5-CO2-Produkte aus dem Vorrat (schlechteste Eco-Scores zuerst)
    • Gruenal ternative-Empfehlungen: Kategorie mit besserem Eco-Score, konkretes CO2-Einsparpotenzial
    • FoodShare-CO2-Impact: verbrauchte Produkte = vermiedenes CO2
    • CO2-Footprint-Eintrag im App-Navigationsmenue (Leaf-Icon)
    Infrastruktur
    • ioredis als Redis-Client (lib/redis/client.ts) mit Singleton und No-op-Stub fuer lokale Entwicklung
    • Typisierte Cache-Helfer cached() und invalidate() (lib/redis/cache.ts) mit TTL-Konstanten
    • getUnreadCount() cached mit TTL 30s, invalidiert nach markAllRead / deleteAll / createMhd
    • getUserHouseholds() cached mit TTL 5min, invalidiert nach Onboarding
    • Health + Carbon Cache (TTL 5min) invalidiert nach addInventoryItem / markConsumed / deleteInventoryItem
    • domains/carbon/carbon.service.ts: computeCarbonSummary (pure), getCarbonSummary (mit Cache), getCarbonWeeklyTrend
  144. v0.8.0

    Admin & Partner produktiv (Phase 25)

    Admin- und Partner-Bereich vollstaendig auf echte DB-Daten umgestellt. Kampagnenwizard speichert direkt in PostgreSQL, Admin-Freigabe schreibt Status zurueck, Werbepartner-Uebersicht zeigt echte Advertiser. Prisma-Schema um Advertiser-User-Link und Campaign-Felder erweitert.

    Neu
    • Partner-Kampagnenwizard: Einreichung speichert jetzt in der DB (Status: REVIEW)
    • Admin-Kampagnenfreigabe schreibt ACTIVE/REJECTED zurueck in Campaign-Tabelle
    • Werbepartner-Seite zeigt echte Advertisers mit Kampagnen-Statistik
    • Admin-Billing: KPI-Karten (Paid-Nutzer, geschaetzter MRR, aktive Kampagnen) aus echter DB
    • Admin-Dashboard: ausstehende Kampagnenzahl kommt jetzt aus DB (nicht mehr Mock)
    • Partner-Dashboard: Kampagnenliste und Stats aus echten DB-Daten
    • Partner-Kampagnendetail: echte Daten aus DB, Anzeigen-Vorschau nutzt gespeicherte Ad-Inhalte
    Infrastruktur
    • Prisma-Schema: Advertiser erhaelt userId-Field (Link zu PARTNER-Nutzer)
    • Prisma-Schema: Campaign erhaelt Felder fuer Ziel, Kategorien, Ad-Content, Metriken, submittedAt
    • Neuer domains/partner/partner.service.ts mit getPartnerCampaigns, createCampaign, getPartnerStats
    • Admin-Service erweitert: getAdminCampaigns, getAdminAdvertisers, getAdminBillingStats
    • Server Action createCampaignAction mit Zod-Validierung und Mindestbudget-Check
  145. v0.7.0

    Rewards-Einlösung live + Sentry Error Tracking

    Das Rewards-System ist vollstaendig produktiv: Punkte koennen jetzt gegen echte Mock-Gutscheine eingeloest werden. Ausserdem wurde Sentry integriert - alle ungefangenen Client- und Server-Fehler werden ab sofort erfasst (PII-bereinigt).

    Neu
    • Praemien-Einloesung: 'Einloesen'-Button loest echte Punkte aus der DB ab
    • Voucher-Modal zeigt generierten Mock-Gutscheincode nach erfolgreicher Einloesung
    • Einzel-Code-Kopier-Button mit Clipboard-Feedback
    • Serverseitige Balance-Pruefung verhindert Ueberziehen des Punktekontos
    • Punktestand nach Einloesung sofort aktualisiert (router.refresh + revalidatePath)
    • Gutschein-Format: SP-RECIPE-XXXX-XXXX, SP-PLUS-XXXX-XXXX etc. (Partner-Codes folgen)
    Infrastruktur
    • Sentry v10 (@sentry/nextjs) integriert - Client, Server und Edge Runtime
    • PII-Scrubbing: E-Mail, Name und IP werden vor dem Senden entfernt
    • Next.js instrumentation.ts - onRequestError fuer Server-Fehler
    • withSentryConfig in next.config.ts - Source-Map-Upload vorbereitet
    • NEXT_PUBLIC_SENTRY_DSN in .env.example dokumentiert
    • Ohne gesetztes SENTRY_DSN laeuft Sentry silent im No-op-Modus
    Docs
    • Roadmap: pwa-offline und rewards-productive als shipped entfernt (waren in 0.5.1/0.5.2 geliefert)
    • Roadmap: admin-partner-productive als naechste In-Progress-Phase aufgenommen
  146. v0.6.1

    Auth: Rolle wird bei jedem Request live aus der DB gelesen

    Die Benutzerrolle wird nicht mehr nur beim Login in den JWT eingefroren, sondern bei jedem Token-Refresh live aus der DB gelesen. Rollenerhöhungen (z.B. USER -> SUPER_ADMIN) gelten damit sofort beim naechsten Seitenaufruf.

    Sicherheit
    • JWT-Callback in auth.ts liest role bei jedem Refresh aus der DB nach
    • Rollenaenderungen (z.B. Admin-Promotion) wirken sofort ohne Logout
    • DB-Fehler (Offline) fallen graceful zurueck auf gecachte Rolle
  147. v0.6.0

    Einstellungen: Konto-Info, Anmeldemethode & E-Mail-Verifizierung

    In den Einstellungen ist jetzt eine neue Sektion 'Konto & Anmeldung' sichtbar: E-Mail-Adresse (schreibgeschützt), Anmeldemethode (E-Mail/Passwort, Google oder Facebook als Badge) und E-Mail-Bestätigungsstatus mit direktem Resend-Button.

    Neu
    • Neue Sektion 'Konto & Anmeldung' in den Einstellungen (direkt unter dem Profilbild)
    • E-Mail-Adresse anzeigen — mit Schloss-Icon, nicht editierbar
    • Anmeldemethode als Badge: E-Mail & Passwort, Google oder Facebook
    • E-Mail-Bestätigungsstatus: gruenes Bestätigt-Feld mit Datum oder Amber-Warnung mit Resend-Button
    • Resend-Button in den Einstellungen — unabhängig vom App-Banner verwendbar
    • Nach erfolgreichem Senden: blaues Bestätigungs-Feedback in der Sektion
  148. v0.5.9

    Admin Roadmap-Seite — Projekt-Übersicht im Backend

    Neue Admin-Seite /admin/roadmap gibt dem Superadmin jederzeit einen vollständigen Überblick: Roadmap-Items nach Status, zuletzt gelieferte Releases, Backend-Live-Status aller Bereiche und Tech-Stack. Milestone-Icon in der Admin-Navigation.

    Neu
    • Neue Admin-Seite /admin/roadmap: kombinierte Changelog- und Roadmap-Übersicht
    • Roadmap-Abschnitte: In Arbeit / Geplant / Ideen mit Kategorie-Badges, Phasennummern, Aufwand
    • Changelog-Sidebar: letzte 6 Releases als kompakte Timeline mit Change-Type-Badges
    • Backend-Status-Widget: Live-/Mock-Fortschrittsbalken für Admin-, Partner- und Nutzer-Bereich
    • Tech-Stack-Übersicht als kompakte Grid-Kacheln
    • 5-Felder-Statistikleiste: Versionen shipped, In Arbeit, Geplant, Ideen, Gesamt
    • Milestone-Icon in Admin-Sidebar-Navigation unter Analytics
  149. v0.5.8

    Rewards-System produktiv — Welcome-Bonus & Referral

    Das Gamification-System ist nun vollständig live: neue Nutzer erhalten +50 Willkommens-Punkte, Referral-Links vergeben automatisch Bonus-Punkte an den Einladenden. Punkte für Scan, Kassenbon, Shopping, Rezepte und FoodShare waren bereits verdrahtet.

    Neu
    • Welcome-Bonus: +50 Punkte werden automatisch nach der Registrierung vergeben
    • Referral-System live: /register?ref=CODE erkennt den Einladenden und vergibt +100 Punkte
    • Onboarding-Screen zeigt Willkommensbonus-Bestätigung (+50 Punkte)
    • Registrierungsformular zeigt Hinweis-Banner bei eingehendem Referral-Link
    • Datenschutz-Link im Consent-Block zeigt auf /datenschutz statt #
    Infrastruktur
    • app/register/actions.ts: awardPoints(WELCOME) + getOrCreateReferralCode() fire-and-forget nach User-Create
    • Referral: UserProfile.referredBy wird gesetzt, Referrer erhält REFERRAL_SENT-Punkte
    • app/register/page.tsx: Suspense-Wrapper + useSearchParams für ?ref= Übergabe via hidden input
    • lib/roadmap/entries.ts: email-verification entfernt (shipped), rewards-productive als in-progress markiert
  150. v0.5.7

    E-Mail-Verifizierung & öffentliche Roadmap

    Neue Nutzer erhalten nach der Registrierung automatisch eine Bestätigungsmail. Ein Amber-Banner erinnert unbestätigte Accounts. Die öffentliche Roadmap unter /roadmap zeigt alle geplanten Features, Phasen und Ideen.

    Neu
    • E-Mail-Verifizierung: Bestätigungsmail nach Registrierung (24h-gültiger Token)
    • Amber-Banner im App-Layout für unbestätigte E-Mail-Adressen
    • "Erneut senden"-Button mit Rate-Limiting über vorhandenen Resend-Adapter
    • Verifikations-Seite /verify-email?token=… mit Erfolgs- und Fehler-Feedback
    • Öffentliche Roadmap-Seite /roadmap mit 14 Einträgen (In Arbeit / Geplant / Ideen)
    • Footer-Link auf /roadmap aktiviert
    Infrastruktur
    • Prisma-Schema: neues Modell EmailVerificationToken (id, email, token, expiresAt)
    • lib/auth/email-verification.ts: createVerificationToken() + verifyEmailToken()
    • lib/roadmap/entries.ts: typisierte Roadmap-Daten mit Status, Priorität, Kategorie, Aufwand
  151. v0.5.6

    DSGVO-Compliance: Datenlöschung, Datenschutz & Impressum

    Nutzer können ihr Konto und alle personenbezogenen Daten jetzt selbst vollständig löschen (DSGVO Art. 17). Die Datenschutzerklärung wurde um alle externen Dienste ergänzt. Cookie-Banner, Impressum und Datenschutzseite sind produktiv.

    Neu
    • DSGVO Art. 17 — Konto-Löschung: Einstellungen → Gefahrenzone → Konto unwiderruflich löschen
    • Bestätigungsdialog: Nutzer muss 'LÖSCHEN' eintippen, bevor die Aktion ausgeführt wird
    • Vollständige Datenlöschung in DB-Transaktion: Profil, Haushalt, Vorrat, Kassenbons, Belohnungen, Marketplace, OAuth-Verbindungen
    • Haushalt-Logik: alleinige Eigentümer-Haushalte werden gelöscht, Mitglieder-Memberships werden nur entfernt
    • Nach Löschung: automatischer Sign-Out und Weiterleitung zur Startseite
    Docs
    • Datenschutzerklärung um externe Dienste ergänzt: Stripe, Resend, Tabscanner, Google OAuth, Facebook OAuth
    • DSGVO Art. 17-Hinweis (Konto-Löschung) in Datenschutzerklärung verlinkt
    • Impressum bereits vorhanden und verlinkt
    • Cookie-Banner bereits aktiv (nur technisch notwendige Cookies)
  152. v0.5.5

    Auto-Save Einstellungen mit Toast-Feedback

    Alle Einstellungen werden jetzt sofort nach einer Änderung automatisch gespeichert — kein Submit-Button mehr nötig. Ein animierter Toast-Indikator unten rechts zeigt Lade-Status, Bestätigung oder Fehlermeldung an.

    Neu
    • Globaler ToastProvider im App-Layout — steht allen App-Seiten zur Verfügung
    • Toast-Komponente: 3 Zustände (Laden mit Spinner, Erfolg grün, Fehler rot), animiertes Ein-/Ausblenden
    • Auto-Dismiss: Erfolg nach 3 s, Fehler nach 5 s, manuell schließbar
    • ProfileForm: Text-Felder speichern beim Verlassen des Feldes (onBlur), Einwilligungs-Checkboxen sofort (onChange)
    • HouseholdAppearanceSection: Farbe und Titelbild werden ohne Submit sofort gespeichert
    • NotificationSettings: Toggle und Vorlaufzeit-Buttons speichern sofort mit Toast-Feedback
    • AvatarSection: inline-Statustext durch Toast ersetzt
    • Submit-Buttons in Profil- und Haushalt-Form entfernt
    Infrastruktur
    • autoSaveProfileFields() Server Action für direkten Aufruf ohne FormData-Wrapper
    • saveHouseholdAppearanceDirect() Server Action für direkten Aufruf aus dem Client
  153. v0.5.4

    OAuth: Google & Facebook Login / Registrierung

    Nutzer können sich jetzt mit ihrem Google- oder Facebook-Konto in einem Klick anmelden oder registrieren. Neue Accounts werden automatisch angelegt und mit dem OAuth-Anbieter verknüpft. Bestehende E-Mail-Konten werden per E-Mail-Adresse zusammengeführt.

    Neu
    • Google OAuth: Login & Registrierung auf Login- und Register-Seite
    • Facebook OAuth: Login & Registrierung auf Login- und Register-Seite
    • Automatische User-Anlage beim ersten OAuth-Login (kein Passwort nötig)
    • Account-Linking: gleiches E-Mail → existierender Account wird verknüpft
    • OAuth-Account-Eintrag in der Datenbank (provider + providerAccountId)
    • Markierte Social-Buttons mit Google- und Facebook-Brand-Icons
    • Ladeindikator pro Button während der OAuth-Weiterleitung
    Infrastruktur
    • GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET in .env dokumentiert
    • FACEBOOK_CLIENT_ID / FACEBOOK_CLIENT_SECRET in .env dokumentiert
    • allowDangerousEmailAccountLinking aktiviert für nahtloses Account-Merging
  154. v0.5.3

    KI-Wochenplan: Claude generiert 7-Tage-Speiseplan

    Plus-Nutzer erhalten einen vollständigen, KI-generierten 7-Tage-Mahlzeitenplan. Claude berücksichtigt Vorratsinhalte, Diätpräferenzen, Budget und Lieblingsküche. Fehlende Zutaten lassen sich mit einem Klick zur Einkaufsliste hinzufügen. Ohne API-Key greift ein deterministischer Fallback-Plan auf Mock-Rezepte zurück.

    Neu
    • KI-Wochenplan via Claude (claude-haiku-4-5): 7 Tage × 3 Mahlzeiten
    • Frühstück, Mittagessen, Abendessen mit Zutaten, Kalorien und Zubereitungszeit
    • Inventory-Abgleich: inStock-Badge pro Zutat, Gesamtfortschrittsbalken
    • Fehlende Zutaten per Klick zur Einkaufsliste hinzufügen (tage- oder wochenweise)
    • Präferenz-Steuerung: Personen, Budget, Diät, Küche
    • Deterministischer Fallback-Plan (Mulberry32-RNG) ohne API-Key
    • Speicherung im DB-Modell MealPlan (upsert pro User)
    • Plan-Gate: Freie Nutzer sehen Upgrade-Prompt, kein Zugang zum KI-Planer
    • Navigation: Wochenplan in Seitenleiste und Mehr-Menü
  155. v0.5.2

    PWA: App installierbar, Service Worker, Offline-Modus

    StockPilot ist jetzt als Progressive Web App installierbar. Auf Android erscheint automatisch ein Installieren-Banner. Statische Assets werden gecacht, bei fehlender Verbindung erscheint eine saubere Offline-Seite. App-Icon in Brand-Grün generiert Next.js automatisch.

    Neu
    • App installierbar: Web App Manifest vollständig (id, lang, shortcuts, screenshots)
    • Service Worker: Cache-First für _next/static und Icons, Network-First für Seiten
    • Offline-Fallback: saubere /offline.html bei fehlender Verbindung
    • Installieren-Banner (Android/Chrome): beforeinstallprompt — verschwindet nach Wahl oder Dismiss
    • App-Icon 512×512 und Apple-Icon 180×180 per Next.js ImageResponse — kein externes Tool nötig
    • Theme-Color korrigiert: #16a34a (Brand-Grün) statt #5a3d27
    • iOS Add-to-Home-Screen: apple-mobile-web-app-capable bereits gesetzt
  156. v0.5.1

    Rewards: Punkte-Vergabe jetzt live

    Das Rewards-System ist vollständig produktiv: Punkte werden bei echten Aktionen automatisch vergeben, Streaks werden täglich aktualisiert, Achievements werden automatisch entsperrt. Die Rewards-Seite zeigt echte DB-Daten aus bisherigen Aktivitäten.

    Neu
    • Punkte-Vergabe bei Kassenbon-Import (+10 Punkte)
    • Punkte-Vergabe bei Produkt verbraucht/gerettet (+3 Punkte)
    • Punkte-Vergabe beim Abhaken von Einkaufslisten-Positionen (+2 Punkte)
    • Barcode-Scan (+5 Punkte) und Rezept-Fehlende-Zutaten (+3 Punkte) waren bereits verdrahtet
    • Streak-Tracking: täglich bei jeder Punktevergabe automatisch aktualisiert
    • 7-Tage-Streak (+25 Bonus) und 30-Tage-Streak (+100 Bonus) automatisch ausgelöst
    • Achievement-Unlock automatisch nach Erreichen von Meilensteinen (erster Scan, 5/25 Scans, erster Bon, 1k/3k Punkte, 7/30 Streak, Referral)
    • Rewards-Seite zeigt echten Punktestand, Level, Streak, Errungenschaften und Transaktionshistorie
  157. v0.5.0

    Preisintelligenz: echte Daten, Marktvergleich & Alarme

    Die Preisbeobachtungs-Seite läuft jetzt auf echten Kassenbon-Daten statt Mock. Preistrends werden aus persönlichen Kassenbons berechnet, Marktvergleiche zeigen welcher Händler am günstigsten ist, Preisalarme werden in der DB gespeichert und der CSV-Export ermöglicht DSGVO-konformen Datenabzug.

    Neu
    • Preisseite als Server Component — echte Daten aus ReceiptLineItem + ProductPriceObservation
    • Monatliche Preishistorie pro Produkt mit recharts-Liniendiagramm
    • Marktvergleich: welcher Händler ist für ein Produkt am günstigsten (aus Kassenbons)
    • Preisalarm: Schwellenwert setzen, in DB persistieren, visuell anzeigen wenn ausgelöst
    • Alarm-Referenzlinie im Chart als grüne gestrichelte Linie
    • CSV-Export persönlicher Preishistorie (DSGVO Art. 20 — Datenübertragbarkeit)
    • Empty-State wenn noch keine Kassenbons eingescannt wurden (kein Crash)
    • Triggered-Alarme-Banner wenn Preis unter Schwellenwert gefallen
    • Consent-Hinweis: unterscheidet zwischen persönlicher und aggregierter Nutzung
    Infrastruktur
    • Neues PriceAlert-Modell in Prisma-Schema (userId, productName, targetPrice, unit, active)
    • User-Relation priceAlerts[] hinzugefügt
    • modules/prices/price.service.ts — Preisaggregation, Trendberechnung, Marktvergleich, CSV-Builder
    • app/app/prices/actions.ts — createPriceAlertAction, deletePriceAlertAction, exportPriceCsvAction
  158. v0.4.3

    Rezept-Schritte: Mengen & Equipment-Trenner

    In den Zubereitungsschritten werden jetzt die konkreten Mengen jeder Zutat angezeigt. Zutaten und Equipment sind optisch durch einen Trennstrich getrennt. Mengen skalieren mit dem Portionenregler.

    Neu
    • Zutatenchips in Schritten zeigen jetzt Menge + Einheit (z. B. "200 g Mehl")
    • Mengen skalieren automatisch mit dem Portionenregler
    • Trennlinie (<hr>) zwischen Zutaten-Chips und Equipment-Chips
    • Zubereitung in Client-Komponente verschoben — Portionsskalierung greift jetzt auch in den Schritten
    • Mengenangabe in Fettschrift, Zutatname normal — bessere Lesbarkeit
  159. v0.4.2

    Changelog: Uhrzeit (Berliner Zeit)

    Jeder Changelog-Eintrag zeigt jetzt zusätzlich zum Datum die exakte Uhrzeit in Berliner Zeit an.

    Neu
    • Changelog-Einträge zeigen Datum + Uhrzeit in Berliner Zeit (Europe/Berlin)
    • Uhrzeit wird in Monospace-Schrift neben dem Datum dargestellt
    • Alle bisherigen Einträge mit exakten Git-Commit-Zeitstempeln versehen
    • date-Feld in ChangelogEntry verwendet volle ISO-8601-Datetimes statt YYYY-MM-DD
  160. v0.4.1

    Bugfix: Profilbild-Upload

    Profilbild wird jetzt zuverlässig gespeichert und nach Seitenreload wieder angezeigt.

    Bugfix
    • Avatar-Upload: FormData/Hidden-Input-Ansatz durch direkten Server-Action-Aufruf ersetzt — kein Datenverlust mehr bei React-Re-Render zwischen Dateiauswahl und Submit
    • try/catch schluckt keine Next.js-Redirect-Fehler mehr (NEXT_REDIRECT wird korrekt weitergegeben)
    • Optimistisches Preview mit Rollback: bei Speicherfehler wird das alte Bild wiederhergestellt
    • Auto-Save beim Dateiauswählen — kein separater Speichern-Button mehr nötig
    • Lade-Spinner direkt auf dem Avatar-Kreis während des Speichervorgangs
    • Fehlerresistente Canvas-Resize-Funktion mit expliziten onerror-Callbacks
  161. v0.4.0

    Stripe Billing & Kassenbon-OCR

    Vollständige Abo-Integration mit Free/Plus/Family-Plänen, Kassenbon-Scan via Tabscanner-OCR und robustes CI/CD-Deployment.

    Neu
    • Stripe Billing: Free / Plus (2,99 €/Monat) / Family (5,99 €/Monat) Pläne
    • Feature-Gating: Inventory-Limit und monatliches Bon-Kontingent je Plan
    • Upgrade-Banner (soft / hard) wenn Limits erreicht oder annähernd erreicht
    • Billing-Einstellungsseite mit Plan-Vergleich, Upgrade-Buttons und Stripe Portal
    • Stripe Webhook-Handler für automatische Plan-Aktivierung nach Zahlung
    • Kassenbon-OCR via Tabscanner (100 Bons/Monat kostenlos, kein Credit Card)
    • OCR-Provider wählbar via ENV: mock | mindee | tabscanner
    Infrastruktur
    • GitHub Actions CI/CD: git archive | ssh statt git pull — Server braucht keine GitHub-Credentials
    • deploy.sh: --force-recreate stellt sicher, dass ENV-Änderungen sofort wirksam werden
    • Neuer --env-only Modus: Container-Neustart ohne Build in ~10 Sekunden
    • pg_isready-Healthcheck ersetzt blindes sleep 5
    • Sanity-Check warnt bei nicht gesetzten Pflicht-Secrets
    • Aktive Konfiguration wird nach jedem Deploy im Log ausgegeben
    Bugfix
    • Stripe SDK v22: API-Version auf 2026-04-22.dahlia aktualisiert
    • Build-sicherer Placeholder-Key verhindert Crash wenn STRIPE_SECRET_KEY nicht gesetzt
    • .gitattributes: LF-Zeilenenden erzwungen (Windows/CRLF-Deploymentfehler behoben)
  162. v0.3.0

    Admin, E-Mail & CI/CD

    Vollständiger Admin-Bereich, Passwort-Reset via E-Mail (Resend) und automatisches Deployment über GitHub Actions.

    Neu
    • Admin-Dashboard: Nutzer-, Haushalts- und Kampagnenverwaltung
    • Passwort vergessen / Passwort zurücksetzen (Anti-Enumeration-sicher)
    • Welcome-E-Mail nach Registrierung
    • Resend E-Mail-Adapter (100 E-Mails/Tag kostenlos)
    • Audit-Log für sensible Admin-Aktionen
    • Infografik: StockPilot-Plattformüberblick
    Infrastruktur
    • GitHub Actions: TypeCheck + Lint als Quality Gate vor jedem Deploy
    • deploy.sh: prisma db push statt migrate deploy (kein migrations-Ordner benötigt)
    • Docker Compose Produktions-Setup mit Traefik, SSL (Let's Encrypt) und Redis
    • VPS-Deployment auf IONOS (eprojekt.cloud) erstmalig live
  163. v0.2.0

    Core-App: Vorrat, Scan, Rezepte & mehr

    Vollständige Kern-App mit Vorratsverwaltung, Barcode-Scan, Einkaufsliste, Rezeptvorschlägen, Health-Scoring und FoodShare.

    Neu
    • Vorratsverwaltung mit MHD-Tracking und Statusbadges
    • Barcode-Scan (Browser-Kamera) mit Open Food Facts Adapter
    • Kassenbon-Upload mit Mock-Parser und Line-Item-Korrektur
    • Einkaufsliste mit smarten Vorschlägen und Pantry-Staples
    • Rezeptvorschläge basierend auf vorhandenem Vorrat
    • Health-Scoring mit Ampelsystem (informativ, keine medizinischen Versprechen)
    • FoodShare: Produkte zum Teilen markieren, Impact-Counter, aggregierte Heatmap
    • Preisintelligenz: Preisverläufe und Marktvergleiche
    • Punkte & Prämien: Aktionspunkte und Einlösung
    • Marktplatz für Haushaltsgegenstände
    • Werbepartner-Dashboard: Kampagnen, Angebote, Berichte
    • Push-Benachrichtigungen für MHD-Warnungen
    • Dark Mode (systemfolgende und manuelle Umschaltung)
    Infrastruktur
    • Prisma-Schema mit allen Domänenmodellen
    • NextAuth v5 mit RBAC (USER, PARTNER, ADMIN, SUPER_ADMIN)
    • Redis für Session-Caching
    • Avatar, Haushalt-Farbauswahl und Cover-Bild
  164. v0.1.0

    UI-Shell, Landingpage & Auth

    Initiales Setup mit Designsystem, Marketing-Seiten, Authentifizierung und App-Shell für alle drei Bereiche.

    Neu
    • Designsystem: Tailwind v4, brand/accent Farbpalette, shadcn/ui-ready
    • Landingpage mit Hero, Features, Preismodell und FAQ
    • Login, Registrierung und Onboarding-Flow
    • App-Shell mit responsiver Sidebar (Desktop) und Bottom-Nav (Mobile)
    • Avatar-Dropdown mit Haushalt-Switcher und Darkmode-Toggle
    • Datenschutz- und Impressum-Seiten (DSGVO)
    • Cookie-Banner (Privacy-by-Design)
    • Marketing-Footer mit Spaltennavigation
    Infrastruktur
    • Next.js 15 App Router, TypeScript strict, Prisma 7, PostgreSQL
    • Docker Compose Dev-Setup
    • Mock-Adapter für alle externen APIs (Produkte, Bons, Billing, E-Mail)