All apps · 0 apps
EverShelf
Docker app from DevlinDelFuego's Repository
Overview
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.
Connects to OpenFoodFacts for product data (millions of items). Features include camera-based barcode reading, nutrition tracking, allergen information, and offline support for kitchen devices.
For full features (barcode scanning, expiry reading, AI recipe suggestions), you'll need to configure environment variables in the .env file:
- GEMINI_API_KEY: Get free API key at https://aistudio.google.com/app/apikey for AI features
- Optional TTS_URL/TTS_TOKEN for Home Assistant voice readout
Readme
View on GitHub🏠 EverShelf
Self-hosted pantry manager — inventory, barcode scan, AI recipes, less waste.
git clone https://github.com/dadaloop82/EverShelf.git && cd EverShelf
cp .env.example .env && docker compose up -d # → http://localhost:8080
✨ Features
| Inventory | Scan, locations, expiry, opened packs, favourites, CSV import/export |
| AI | Gemini · OpenAI · Llama — identify, OCR expiry, recipes, chat |
| Shopping | Smart list, anti-waste qty, recipe → list with pantry deduction, optional Bring! |
| Cooking | Steps, TTS, timers, zero-waste tips |
| Calendar | Subscribe to expiries — ICS/WebCal feed for Google/Apple Calendar |
| Alerts | Expiry push without Home Assistant — ntfy, JSON webhook or HA, with a test button |
| PWA | Offline queue, installable, multi-device |
Integrations: Home Assistant · MCP · Health Bridge · Kiosk
Languages: IT · EN · DE · FR · ES · ZH — details in wiki → Features
📰 What's new
v1.11.11 — scan screen redesign: hero camera, favourites/recents rail, AI glass tips on-stream, speculative barcode prefetch v1.11.10 — recipe archive dedup by content_hash (no more chat clones); many free-slot recipes per day; “Usa ingrediente” shows big needed qty and scale X / Y v1.11.9 — kiosk dedicated pairing step + token hand-off to WebView (kiosk 1.7.24) v1.11.8 — pairing code visible on a paired device (Settings → Security); kiosk APK from LAN + kiosk-latest; kiosk 1.7.23 emerald Corporate UI redesign (wizard / settings / splash) v1.11.7 — empty recipe “missing from pantry” stub gone; undo of location moves is a pair v1.11.6 — HA shopping_mode + calendar attention=1 v1.11.5 — shopping pack-equiv restock, conf caps, Bring hard-off when internal, HA expiry = dashboard rules v1.11.4 — Open Prices (free) + opt-in Web Push PWA; delete undo toast; torch fillLightMode; settings “da decidere” for prices/push v1.11.3 — shopping trip mode, ntfy digest/Telegram, zerowaste tips, guided settings nav v1.11.2 — extending expiry refreshes banner, dashboard and the current page; optimization backlog in docs/OPTIMIZATION-BACKLOG.md v1.11.1 — faster barcode lookup, top-3 auto-favourites, smart shopping catches depleted stock, Android CI stabilisation v1.11.0 — an article is stored in the singular (Fetta biscottata integrale) and the pantry shows the plural of what is really there (3 Uova medie, 500 g Pasta stays a mass); certifications keep their capitals (IGP, DOP, EVO); the scan step lets you correct the identified title and brand before saving v1.10.1 — splash boot rail: stage icons go grey → blinking → coloured with an aura, a prominent version chip, and every article title now starts with a capital letter v1.10.0 — the genre leads every article title (Yogurt Fiori di latte); products you use often become favourites v1.9.1 — settings collapses into sub-sections, dashboard overview/freshness/trend panels, expiry push without Home Assistant (ntfy/webhook), cron watchdog, setup checklist v1.9.0 — Calendar feed (ICS/WebCal); recipe → shopping list with the pantry deducted; seasonal produce filters; third CSS layer v1.8.10 — Docker build stops baking in local data; CSRF header required on every POST; error reports redacted and GitHub publishing opt-in v1.8.9 — Localised tooltips, placeholders and aria labels; fixed PWA manifest icons v1.8.8 — One-time pairing code for the API token; startup no longer dead-ends behind the splash
⚙️ Install & config
Docker (recommended): docker compose pull && docker compose up -d
Manual: clone → cp .env.example .env → chmod 755 data/ → point web server at repo root.
Minimum .env:
AI_ENABLED=true
AI_PROVIDER=gemini
GEMINI_API_KEY=your_key
Optional: API_TOKEN, SHOPPING_MODE=bring, cron every 5 min on api/cron_smart_shopping.php
Behind a reverse proxy: set TRUSTED_PROXIES to the proxy IP(s)/CIDR so rate
limiting sees real client IPs, and EVERSHELF_CANONICAL_HOST in the Apache vhost
(docker/apache-evershelf.conf) to enable the forced-HTTPS redirect.
First run with API_TOKEN set: the web UI asks for a one-time pairing code.
On a device that is already paired, the live code is under Settings → System →
Security (and Info). It is also printed in the server log:
grep -i "pairing code" logs/evershelf_*.log | tail -1 # bare metal
docker logs evershelf 2>&1 | grep -i "pairing code" | tail -1 # Docker
The token is never handed to an anonymous request. On a fully trusted LAN you can
opt out with API_BOOTSTRAP_OPEN=true (re-exposes the token — see SECURITY.md).
🔌 Integrations & API
| Link | |
|---|---|
| Home Assistant | ha-evershelf |
| MCP agents | mcp-server/README.md |
| Health / Fuel Mode | evershelf-health-bridge/README.md |
| Android kiosk + scale | evershelf-kiosk/README.md |
| Calendar feed (ICS) | Wiki → Calendar Feed |
| REST API | Wiki → API |
🏗️ Architecture & security
index.html SPA · api/index.php · assets/js/app.js · SQLite in data/
🤝 Contributing
CONTRIBUTING.md · Issues · Discussions · Roadmap
Add a language: copy translations/en.json, translate values, open a PR.
📸 Demo

Live demo — no install, full AI.
MIT · Stimpfl Daniel · @dadaloop82
Unrelated iOS app “EverShelf” by Joshumi Technologies — no affiliation.
Categories
Related apps
Explore more like this
Explore allDetails
ghcr.io/dadaloop82/evershelf:latestRuntime arguments
- Web UI
http://[IP]:[PORT:80]- Network
Bridge- Privileged
- false
Template configuration
WebUI port for EverShelf
- Target
- 80
- Default
- 80
- Value
- 80
EverShelf data directory
- Target
- /var/www/html/.env
- Default
- /mnt/user/appdata/evershelf/.env
- Value
- /mnt/user/appdata/evershelf/.env