🌍 English | Deutsch | Français | Español | Italiano
Un gestore di inventario cucina self-hosted con scansione di codici a barre tramite IA, generazione di ricette e pianificazione dei pasti. Realizzato con React, Express e SQLite.
FoodAI non ha autenticazione integrata. E progettato solo per reti locali affidabili. NON esporlo a internet pubblico senza aggiungere un reverse proxy con autenticazione (es. Authelia, Authentik o HTTP Basic Auth via Caddy/nginx).
- Scanner di codici a barre -- Scansiona codici a barre EAN/UPC con la fotocamera del telefono. I prodotti vengono cercati tramite OpenFoodFacts e UPCItemDB, poi memorizzati localmente nella cache.
- Riconoscimento prodotti tramite IA -- Punta la fotocamera su qualsiasi alimento e lascia che l'IA identifichi il prodotto, la categoria, la quantità e la data di scadenza.
- Inventario per confezione -- Ogni confezione fisica viene tracciata individualmente con stato aperto/chiuso, livello di riempimento e dimensione della confezione.
- Scansione data di scadenza -- OCR via Tesseract.js con fallback IA per leggere le date di scadenza dalle confezioni.
- Generazione ricette tramite IA -- Genera singole ricette o piani settimanali completi basati sul tuo inventario attuale, dando priorità agli articoli in scadenza.
- Ingredienti extra -- Opzionalmente consenti all'IA di suggerire un numero limitato di ingredienti che non hai.
- Ricette preferite -- Salva e riutilizza le ricette che ti piacciono.
- Calendario dei pasti -- Pianifica i pasti per date specifiche, contrassegnali come cucinati e deduci automaticamente gli ingredienti dall'inventario.
- Deduzione intelligente -- Durante la cottura, il sistema apre le confezioni secondo necessità e crea articoli di inventario "aperti" con date di scadenza adattate (stimate dall'IA).
- Lista della spesa -- Calcola automaticamente gli ingredienti mancanti per i pasti pianificati in arrivo.
- Modalità cottura libera -- Fotografa i tuoi ingredienti sul piano di lavoro; l'IA li abbina all'inventario e suggerisce le quantità.
- Integrazione Bring! -- Invia gli ingredienti mancanti all'app per la lista della spesa Bring! (segnaposto -- credenziali configurate nell'app).
- Display specchio -- Un endpoint autonomo
/mirror/todaycon tema scuro che mostra la ricetta del giorno, adatto per l'integrazione su uno specchio intelligente o tablet. - Supporto multi-provider IA -- Passa tra Gemini, OpenAI, Anthropic, DeepSeek, Moonshot o Ollama (locale) direttamente nella pagina Impostazioni.
- PWA -- Installabile come Progressive Web App su dispositivi mobili.
- Tema Scuro/Chiaro/Personalizzato -- Passa tra i temi Chiaro, Scuro e Personalizzato nelle Impostazioni. Il tema personalizzato supporta il caricamento di un file CSS.
- Tracciamento prezzi per articolo -- Ogni articolo dell'inventario puo avere un prezzo (EUR). La dashboard mostra il valore totale delle scorte.
- Posizione di stoccaggio -- Assegna gli articoli a dispensa, frigorifero, congelatore, cambusa o cantina.
- Avvisi scorta minima -- Imposta una soglia di scorta minima per articolo. La dashboard mostra il conteggio degli articoli con scorte basse.
- Ispirazione culinaria RSS -- La barra laterale della dashboard mostra idee di ricette giornaliere da GuteKueche.de (DE) o BBC Good Food (EN), con TheMealDB come fallback.
- Lista modelli IA in tempo reale -- Il menu a tendina nelle Impostazioni recupera i modelli disponibili dall'API del fornitore (Gemini, OpenAI, Anthropic, DeepSeek, Moonshot, Ollama).
- Miglioramenti di sicurezza -- Limitazione della frequenza sugli endpoint IA, protezione XSS, validazione SSRF, segreti mascherati, container Docker non-root.
| Livello | Tecnologia |
|---|---|
| Frontend | React 19, TypeScript, React Router v7, Tailwind CSS v4, Framer Motion |
| Backend | Node.js, Express, TypeScript (tsx) |
| Database | SQLite via better-sqlite3 |
| Scansione | html5-qrcode, Tesseract.js |
| SDK IA | @google/genai, openai, @anthropic-ai/sdk |
| Build | Vite, vite-plugin-pwa |
| Icone | Lucide React |
| Deployment | Docker, docker-compose |
Tutti i provider sono configurabili nella pagina Impostazioni dell'app. Puoi impostare la chiave API, selezionare i modelli e scegliere modelli separati per l'IA principale (ricette, scansione) e l'IA consulente (stima quantità, controlli scadenza).
| Provider | Note |
|---|---|
| Google Gemini | Qualsiasi modello (es. Gemini 2.5 Flash/Pro). Inserisci l'ID del modello nelle Impostazioni. |
| OpenAI | Qualsiasi modello (es. GPT-4o, o1). Inserisci l'ID del modello nelle Impostazioni. |
| Anthropic | Qualsiasi modello (es. Claude Opus 4.6, Sonnet). Inserisci l'ID del modello nelle Impostazioni. |
| DeepSeek | Qualsiasi modello (es. deepseek-chat). Inserisci l'ID del modello nelle Impostazioni. |
| Moonshot (Kimi) | Qualsiasi modello. Inserisci l'ID del modello nelle Impostazioni. |
| Ollama (locale) | Qualsiasi modello scaricato localmente (llama3, mistral, llava, etc.) |
- Node.js 20+ (22 consigliato)
- Una chiave API di almeno un provider IA (il livello gratuito di Gemini funziona)
# Installare le dipendenze
npm install
# Creare il file di ambiente
cp .env.example .env.local
# Modifica .env.local e aggiungi la tua GEMINI_API_KEY (o configura altri provider nell'app)
# Avviare il server di sviluppo (Express + Vite HMR)
npm run devL'app sarà disponibile su:
- https://localhost:3000 (HTTPS con certificato autofirmato generato automaticamente -- necessario per l'accesso alla fotocamera su mobile)
- http://localhost:3001 (HTTP per integrazione locale, es. iframe di specchio intelligente)
Il certificato autofirmato attiverà un avviso del browser alla prima visita. Accettalo per procedere.
npm run build # Compila il frontend in dist/
npm start # Avvia il server di produzioneImmagini multi-arch precostruite (amd64 + arm64) vengono pubblicate nel GitHub Container Registry ad ogni release.
services:
foodai:
image: ghcr.io/jiromusik/foodai:latest
container_name: foodai
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- foodai-data:/app/data
env_file:
- .env
environment:
- DB_DIR=/app/data
- NODE_ENV=production
volumes:
foodai-data:FoodAI richiede HTTPS per l'accesso alla fotocamera su mobile. Un certificato autofirmato viene generato automaticamente al primo avvio. Accetta l'avviso del browser una volta, oppure monta i tuoi certificati:
volumes:
- ./certs/cert.pem:/app/data/server.cert:ro
- ./certs/key.pem:/app/data/server.key:ro| Variabile | Obbligatoria | Predefinito | Descrizione |
|---|---|---|---|
GEMINI_API_KEY |
No | -- | Chiave API Gemini predefinita (può essere impostata anche nell'app) |
DB_DIR |
No | ./ |
Directory per il database SQLite e i certificati SSL |
HTTP_PORT |
No | 3001 |
Porta per il server HTTP |
NODE_ENV |
No | -- | Impostare su production per servire il frontend precompilato |
server.ts Backend Express (route API, integrazione IA, database)
src/
App.tsx Configurazione del router React
main.tsx Punto di ingresso
types.ts Interfacce TypeScript
pages/
Dashboard.tsx Panoramica (articoli in scadenza, confezioni aperte, pasti di oggi)
Inventory.tsx Gestione inventario per confezione
Scanner.tsx Scanner codici a barre + fotocamera IA
Recipes.tsx Generazione ricette tramite IA (singola + settimanale)
Calendar.tsx Calendario pianificazione pasti
FreeCook.tsx Assistente di cottura libera
ShoppingList.tsx Lista della spesa auto-generata
Settings.tsx Impostazioni provider IA, modello e integrazioni
components/
Navigation.tsx Barra di navigazione inferiore
RecipeCard.tsx Componente di visualizzazione ricetta
OpenedItemsModal.tsx Modale per regolazioni scadenza articoli aperti
FoodAI usa react-i18next. I file di traduzione si trovano in src/i18n/locales/.
Per aggiungere una nuova lingua:
- Copia
src/i18n/locales/en.jsoninsrc/i18n/locales/xx.json - Traduci tutti i valori (mantieni le chiavi in inglese)
- Aggiungi l'import in
src/i18n/i18n.ts - Aggiungi l'opzione lingua in
src/pages/Settings.tsx - Invia una PR!
Apache-2.0 — vedi LICENSE
Built with ❤️ and AI by N3LSON
