Files
EverShelf/CHANGELOG.md
T
dadaloop82 8359b14931 Banner: adapt expired icon/color/title to safety level (non-alarmist)
- ok level (long-life/freezer safe): green banner,  icon, 'Scaduto (ancora ok)'
- warning level: amber banner, 👀 icon, 'Scaduto (controlla)'
- danger level: unchanged red 🚫 banner
- Added banner-expired-ok / banner-expired-warning CSS variants
- Added expiry.expired_suffix_ok / expired_suffix_warning i18n keys (IT/EN/DE)
- Updated README and CHANGELOG
2026-04-30 05:21:50 +00:00

8.7 KiB

Changelog

All notable changes to EverShelf will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[Unreleased] - 2026-04-30

Changed

  • Non-alarmist expired banner — Banner icon, CSS class, and title suffix now adapt to the getExpiredSafety() level:
    • ok (long-life products, freezer within margin): green banner, icon, "— Scaduto (ancora ok)"
    • warning (items that should be inspected): amber/yellow banner, 👀 icon, "— Scaduto (controlla)"
    • danger (raw meat, dairy, fish, etc.): unchanged red 🚫 banner and "— Scaduto!" title
  • Added expiry.expired_suffix_ok and expiry.expired_suffix_warning i18n keys to all three language files (IT/EN/DE)
  • Added banner-expired-ok and banner-expired-warning CSS variants (green / amber) in style.css

[1.5.0] - 2026-04-28

Added

  • Expired banner for opened products — Products whose opened-product shelf-life has passed (e.g. fridge cream opened 6 days ago) now appear in the top notification banner, not just the dashboard list
  • Safety-aware expired banner — Each expired banner item shows a contextual safety tip (from getExpiredSafety()); danger-level items (fridge dairy/meat/fish) get an intense red banner and "L'ho buttato" as the primary button; safe/warning items keep the original button order
  • AI model fallback — All Gemini API endpoints (expiry scan, product identification, chat, recipe non-streaming, shopping name classifier) now try gemini-2.5-flash first and fall back to gemini-2.0-flash automatically, matching the resilience already in place for recipe streaming
  • Friendly AI quota message — When the AI returns a quota/rate-limit error the user sees "Quota AI esaurita. Riprova tra qualche minuto." instead of the raw API error string
  • Cooking TTS auto-read — Each recipe step is read aloud automatically when navigating forward or backward; the first step is also read when entering cooking mode
  • Cooking timer 10-second warning — When a cooking timer reaches 10 seconds the TTS announces "Attenzione! [label]: mancano 10 secondi!"
  • Cooking recipe completion announcement — "Ricetta completata! Buon appetito!" is spoken via TTS when the last step is confirmed

Fixed

  • Cooking TTS gatespeakCookingStep() was blocked by the global tts_enabled setting; the _cookingTTS toggle (🔊/🔇 button) is now the only gate; browser Web Speech API is used by default without requiring TTS configuration in Settings
  • Anomaly dismiss label — The "La quantità è giusta" button now appends the current inventory quantity, e.g. "La quantità è giusta (2 pz)", so the action is unambiguous
  • i18n sync — Added timer_warning_tts, recipe_done_tts, error.ai_quota keys to all three language files (IT/EN/DE)

Added

  • Generic shopping names — Products are grouped by type ("Latte", "Affettato", "Pasta") rather than brand; computed via an expanded keyword map with Google Gemini AI as fallback for unknown products
  • Bring! auto-migration — Existing list items with old specific names are silently migrated to generic names on every list load, throttled to once per 10 minutes
  • Bring! catalog coverage — All 93 shopping_name values now resolve to a German Bring! catalog key (icons and categories in the Bring! app); 24 aliases added to cover previously unmatched names
  • Auto-add to Bring! on depletion — When a product reaches zero the app adds it to Bring! automatically using the generic shopping name, with the specific product name and brand in the specification field
  • Finished-product confirmation banner — Instead of silently deleting zero-stock entries, a banner prompts the user to confirm; banner title includes the last 3 digits of the product barcode for easier identification
  • Anomaly detection banner — Dashboard notifications for suspicious inventory/transaction mismatches and consumption prediction errors, with one-tap inline correction
  • SSE recipe streaming — Recipe generation streams live via Server-Sent Events; Gemini agent feedback is shown in real time as it is generated
  • Smart alert banners — Configurable expired-only mode with explanatory messages; banner buttons are fully internationalized

Fixed

  • Scale double-deduction — Multiple BLE stable readings of the same weight no longer fire duplicate inventory_use events; JS preserves the confirmation sentinel on submit and PHP rejects a second out transaction for the same product within 12 seconds
  • Kiosk native TTS — CI workflow now builds the APK on develop branch too; the native Android TextToSpeech bridge bypasses Web Speech API voice-availability issues without requiring offline voice packs
  • TTS voice loading — Retries for up to 10 seconds on page load; shows a message if no voices are available and offers a manual refresh button
  • Bring! migration — Corrected two bugs: wrong removal API (DELETE /itemPUT remove=item) and wrong purchase key sent to Bring! (Italian shopping name → German catalog key), which previously created Italian/German duplicate entries
  • Gemini 429 rate limiting — API calls are retried with exponential backoff; recipe requests are capped at 5 per minute with a dedicated rate-limit bucket

Performance

  • Gemini calls centralized — All Gemini API requests go through a single callGemini() helper with intelligent backoff; Gemini removed from the product-selection and bringSuggest flows in favour of fast offline logic

[1.3.0] - 2026-04-18

Added

  • Expired product banner — Dashboard notifications for expired products with use, throw away, edit, and dismiss actions
  • Expiring soon banner — Dashboard notifications for products expiring within 3 days with use, edit, and dismiss actions
  • Priority-sorted notifications — Banner alerts sorted by urgency: expired > expiring > suspicious quantities > consumption predictions
  • Swipe navigation — Touch swipe left/right to browse banner notifications, with dot indicators and arrow buttons
  • Quick-access buttons — Inventory page shows 4 recently used and up to 8 most popular products for quick selection
  • Recent & popular products API — New recent_popular_products endpoint
  • Auto-refresh — Banner notifications refresh every 5 minutes while on the dashboard
  • Edit from expiry banner — Correct expiry dates directly from expired/expiring notifications

Fixed

  • Negative scale values — BLE scale readings with negative weight are now ignored
  • Banner re-appearing after edit — Editing from a banner now persists the confirmation so it doesn't reappear on dashboard reload
  • False consumption predictions — Manual inventory edits (updated_at > last restock) now use the correct baseline for prediction calculations
  • Kiosk overlay blocking header — Removed injected exit/refresh buttons from the web app header in kiosk mode

[1.2.0] - 2026-04-13

Changed

  • Project renamed from "Dispensa Manager" to EverShelf
  • Contact email updated to evershelfproject@gmail.com
  • Docker service, container, and volume renamed to evershelf
  • SQLite database renamed from dispensa.db to evershelf.db
  • All localStorage keys migrated: dispensa_*evershelf_*
  • Apache config file renamed to evershelf.conf
  • CI workflow Docker image/container names updated
  • App name updated in all translations (it, en, de)
  • Navigation title updated to EverShelf across all languages

Added

  • Version badge (v1.2.0) in the app header

Fixed

  • JS file truncation caused by sed in-place edit on large files
  • Browser cache invalidation via bumped asset version strings (?v=20260413a)

[1.0.0] - 2026-04-10

Added

  • Complete pantry inventory management (Pantry, Fridge, Freezer, Other)
  • Barcode scanning with QuaggaJS
  • Open Food Facts barcode lookup
  • Google Gemini AI integration (product identification, expiry reading, recipes, chat)
  • Bring! shopping list integration
  • Smart shopping predictions with cron-based caching
  • Cooking mode with step-by-step guidance and TTS support
  • Opened product tracking with reduced shelf-life calculation
  • Vacuum-sealed product support with extended expiry
  • Waste vs. consumption tracking (30-day chart)
  • Expired product safety assessment by category
  • Weekly meal plan configuration
  • DupliClick online grocery ordering integration
  • PWA support (installable, mobile-first)
  • Local database backup script
  • Multi-device settings sync via SQLite

Security

  • Centralized .env configuration (secrets never in code)
  • Removed all hardcoded credentials and personal data
  • Input validation on inventory operations
  • Parameterized SQL queries throughout