📚 Documentation
MangeonsMieux · v0.30.0
Présentation
MangeonsMieux analyse une liste de courses grâce à la base collaborative OpenFoodFacts. Pour chaque produit, l'application affiche le Nutri-Score, le niveau de transformation (NOVA), les additifs et les allergènes, puis calcule un score global du panier assorti de conseils. Aucune donnée n'est vendue, l'API OpenFoodFacts est gratuite et sans clé.
Comment saisir sa liste
Un produit par ligne. Chaque ligne peut être :
- un nom de produit (ex : « Nutella », « yaourt nature ») ;
- un code-barres (8 à 13 chiffres) — résultat exact et fiable.
Si tu colles depuis un tableau, la quantité et le prix (séparés par des tabulations) sont automatiquement ignorés pour la recherche, mais la ligne exacte reste affichée sous le produit.
Comment fonctionne l'analyse
Pour chaque ligne, l'application procède ainsi :
- Code-barres ? → appel direct à la fiche produit (
api/v3/product, la version recommandée de l'API). - Article non alimentaire ? (lessive, papier toilette, mouchoirs…) → mis de côté, car OpenFoodFacts ne référence que l'alimentaire.
- Sinon, recherche par nom — voir le détail dans la section suivante : la requête est nettoyée (prix, quantité, formats comme
8x100gretirés), puis on interroge OpenFoodFacts en privilégiant les produits vendus en France.
Les appels partent 3 à la fois (politesse envers l'API), avec réessai automatique et un « coupe-circuit » qui garde l'appli rapide même si OpenFoodFacts est momentanément indisponible. Les correspondances peu sûres sont signalées « ≈ approximative ».
La recherche de produits en détail
Quand on cherche un produit par son nom, l'objectif est de proposer le bon produit, de préférence vendu en France. Voici les étapes, dans l'ordre :
- Nettoyage de la requête : prix, quantités et formats (
8x100g,1,5 L…) sont retirés. - Priorité France : on interroge d'abord OpenFoodFacts en ne demandant que les produits vendus en France, grâce au filtre
countries_tags. La requête ressemble ànutella AND countries_tags:"en:france". On cherche ainsi dans tout le catalogue français, pas seulement les premiers résultats mondiaux. - Repli mondial : si le filtre France donne moins de 3 résultats (produit étranger, ou recherche trop précise), on complète par la recherche mondiale (jusqu'à 100 produits), les français restant en tête. Un produit étranger reste donc trouvé.
- Choix du meilleur produit, par priorités successives (on ne départage au critère suivant qu'en cas d'égalité) :
- correspondance avec les mots recherchés ;
- vendu en France ;
- choix des utilisateurs (voir plus bas) ;
- popularité (produit souvent analysé) ;
- pertinence du moteur OpenFoodFacts.
- On charge enfin la fiche complète du produit gagnant (toutes les infos) via son code-barres.
Suggestions : jusqu'à 10 autres produits (avec image) sont proposés via le bouton « Autres suggestions », classés eux aussi France d'abord, puis ceux qui ont un Nutri-Score et un score NOVA. Chaque suggestion affiche son Nutri-Score, son NOVA et le drapeau du pays de vente.
L'app apprend des choix : quand on clique sur une suggestion pour remplacer un produit, ce choix est mémorisé (table jvbm_choices, terme → produit). La fois suivante, pour la même recherche, ce produit remonte en premier — pour tout le monde. La popularité globale (produits les plus souvent analysés) est également prise en compte.
Recherche par code-barres : si la ligne est un code-barres (8 à 13 chiffres), on va directement chercher la fiche exacte — c'est le résultat le plus fiable, sans ambiguïté.
Le calcul du score
Chaque produit reçoit des points selon son Nutri-Score :
| Nutri-Score | A | B | C | D | E |
|---|---|---|---|---|---|
| Points | 100 | 80 | 60 | 40 | 20 |
Le score du panier est la moyenne de ces points, avec un malus jusqu'à −20 si beaucoup de produits sont ultra-transformés (NOVA 4). La note globale suit ces seuils : A (≥90), B (≥70), C (≥50), D (≥30), E (<30). Les produits sans Nutri-Score ne comptent pas dans la moyenne.
Détails par produit
Le bouton « Voir les détails » affiche toutes les informations d'OpenFoodFacts : tableau nutritionnel pour 100 g, repères nutritionnels (gras, sucres, sel…), ingrédients, additifs, allergènes et traces, Eco-Score, labels (bio…), régime (végétarien / végan / sans huile de palme), catégories, emballage et origine. Les liens produits pointent vers la version française fr.openfoodfacts.org.
Page Admin
La page /admin est protégée par une connexion Google (via Supabase), réservée à l'administrateur. Elle regroupe :
- Statistiques : visiteurs uniques (total, du jour, par jour), analyses, produits, répartitions Nutri-Score, top produits ;
- Réglages : nombre max de produits par analyse, nombre de candidats de recherche ;
- Logs : journal des analyses avec le détail de chaque appel API (type, cible, statut, durée) ;
- IA : modèles et prompts utilisés (lecture de ticket, nettoyage de liste) ;
- Documentation : cette page.
Base de données (Supabase)
Les données sont stockées dans un projet Supabase, tables préfixées jvbm_ :
jvbm_analyses— une ligne par analyse (compteurs, score) ;jvbm_products— produits trouvés (top produits, répartitions) ;jvbm_choices— choix des utilisateurs (terme → produit) pour affiner la recherche ;jvbm_settings— réglages éditables ;jvbm_visitors/jvbm_visit_days— visiteurs uniques (anonymes) ;jvbm_logs— journal des appels API.
La sécurité repose sur des règles RLS : seul l'email admin peut lire les statistiques, les logs et modifier les réglages. Le suivi des visiteurs utilise un identifiant anonyme aléatoire (pas de cookie de pistage, aucune donnée personnelle).
Pile technique
- Next.js 14 (Pages Router, JavaScript) + Tailwind CSS ;
- @supabase/supabase-js pour l'authentification et la base ;
- Données : OpenFoodFacts (API gratuite, sans clé) ;
- IA : Mistral (lecture de ticket, nettoyage de liste — clé côté serveur) ;
- Hébergement : VPS OVH (PM2 + Nginx, port 3007), prod sur
mangeonsmieux.com.