L'app
openplate registra il cibo e, se lo desideri, stima i macronutrienti di un piatto a partire da una foto. Cerca un alimento o scansiona un piatto, e la voce comparirà nel tuo diario del giorno. Sulla tua istanza non c'è alcuna schermata di registrazione: apri l'app e inizia a inserire i dati. Sull'istanza gestita, accedi prima.
Il diario mostra un giorno per volta: i pasti che hai registrato, il loro impatto rispetto al limite giornaliero e quanto ne rimane.
Queste schermate mostrano dati di esempio, non un diario reale.

Nessun app store di mezzo
openplate è un'applicazione web (una PWA) che installi dal browser, su un telefono o un computer. Non c'è alcun app store. Nessuno ha bisogno di un account Apple o Google, e nessuna revisione o commissione di uno store si frappone tra un rilascio e il tuo dispositivo. Un'istituzione che ospita openplate la serve dal proprio dominio, e un aggiornamento raggiunge ogni dispositivo alla successiva apertura dell'applicazione.
I promemoria sono facoltativi. Se li attivi, viaggiano tramite il servizio push del produttore del tuo browser, come avviene per ogni web push.
Cosa memorizza sul dispositivo
Tutto ciò che appartiene a un utente (registri dei pasti, pesi, cibi personali, obiettivi, impostazioni dell'IA) viene scritto nell'IndexedDB del browser sul dispositivo in cui è stato inserito (app/lib/local-store/). Lì viene salvato in chiaro, perché è il tuo dispositivo, e non lo lascia mai se non nelle due forme che scegli: un'esportazione JSON che scarichi, oppure un blob cifrato di sincronizzazione.
Il server dell'app è un unico container stateless. Nessun database, nessun ORM, nessuna migrazione, e nessun secret richiesto per l'avvio. Può contenere esattamente un secret opzionale, la chiave del gestore per il database alimentare, descritta sotto. Distruggere il container non fa perdere nulla. Non si tratta di parsimonia, è l'intera promessa: vedi ADR-0006.
Cosa lascia il dispositivo
Una foto del piatto viene letta nel browser e inviata direttamente all'endpoint compatibile con OpenAI che hai configurato. Il server openplate non fa mai parte di quella richiesta. Non viene caricata qui, non viene scritta su disco, non viene registrata nei log. Vengono salvati solo i numeri risultanti, nell'archivio locale del dispositivo; la foto rimane sul dispositivo che l'ha scattata, esclusa sia dalle esportazioni JSON sia dai payload di sincronizzazione.
Quell'endpoint è un provider cloud che paghi (il percorso BYOK) oppure il tuo container openplate-inference. Nel caso self-hosted il modello individua i cibi sul piatto e stima i grammi, poi i macronutrienti vengono cercati, non inventati: carboidrati, proteine, grassi e kcal vengono ricavati per nome dalla fonte alimentare configurata, per impostazione predefinita un estratto integrato di USDA FoodData Central (8.041 cibi generici inclusi nell'immagine, nessuna chiamata di rete, pubblico dominio). Il modello linguistico non inventa mai i valori dei macronutrienti.
Dato che è il browser a effettuare la chiamata, l'endpoint deve essere un indirizzo raggiungibile da un browser. Un hostname di compose come http://inference:8300/v1 non funzionerà, anche se i due container possono comunicare tra loro in quel modo. Usa l'indirizzo LAN dell'host, un nome della tailnet, o un hostname sul tuo reverse proxy.
Documentazione: architettura, Self-hosting