19489a02653340c6438dffa79df583abe304425d
PHP getStats() opened section: - Primary detection: opened_at IS NOT NULL (reliable, set by useFromInventory) Fallback: fractional-qty pattern (legacy items) - Per-item compute opened_expiry = min(opened_at + estimateOpenedExpiryDaysPHP, original_expiry) → vacuum_sealed items get 1.5× multiplier → always take sooner of 'opened shelf life' vs 'original sealed expiry' - Add days_to_expiry, opened_expiry, is_edible, has_opened_at to each item - Filter legacy items (no opened_at) with expiry > 14 days (too much noise) - Sort by days_to_expiry ASC (soonest/spoiled first) instead of updated_at DESC JS dashboard opened render: - Expiry badge: ⛔ Scaduto / ⚠️ Scade oggi / ⏰ Xgg (urgent≤2, soon≤5, ok>5) - 🔒 icon added when vacuum_sealed=1 - Spoiled items shown with strikethrough name + muted styling (.alert-item-spoiled) - Cap display at 10 items; 'e altri N prodotti aperti...' note if more - Sort comes from server (removed JS openedFraction sort) CSS: - .opened-expiry-{ok,soon,urgent,today,spoiled} badge classes - .alert-item-spoiled strikethrough styling - .alert-more-note
Description
EverShelf: Your pantry's best friend. A self-hosted, open source smart pantry manager with AI expiry tracking, barcode scanning, smart shopping lists, and Android Kiosk support.
android-kioskdockerfood-wastehome-automationinventory-managementinventory-trackingiotopen-sourcepantry-managerself-hostedsmart-kitchensustainability
MIT
87 MiB
Languages
JavaScript
42.5%
PHP
33.8%
CSS
8.3%
Kotlin
8%
HTML
6.5%
Other
0.7%