Scan a food product: halal, questionable or haram according to your school, health rating, additives and best alternatives.
AI translation
Scannez un produit alimentaire : halal, douteux ou haram selon votre école, note santé, additifs et meilleures alternatives.
HealthJavaScript · CSSGitHub @agozel5OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Scanner halal & santé. L'essentiel gratuit, sans publicité, sans pistage. « Le halal est clair (bayyin) et le haram est clair, et entre les deux se trouvent des choses douteuses. » — hadith rapporté par al-Bukhari (52) et Muslim (1599) Bayyin signifie « clair » en arabe : les trois statuts de l'app (halal, douteux, haram) viennent de ce hadith. L'icône reprend la lettre ب, initiale du mot. Application iOS et Android (et version web) qui scanne le code-barres d'un produit alimentaire et indique :Read the full README ↗
Scanner halal & santé. L'essentiel gratuit, sans publicité, sans pistage.
« Le halal est clair (bayyin) et le haram est clair, et entre les deux se trouvent des choses douteuses. » — hadith rapporté par al-Bukhari (52) et Muslim (1599)
Bayyin signifie « clair » en arabe : les trois statuts de l'app (halal, douteux, haram) viennent de ce hadith. L'icône reprend la lettre ب, initiale du mot.
Application iOS et Android (et version web) qui scanne le code-barres d'un produit alimentaire et indique :
Ce qui la distingue :
Bayyin Premium (abonnement facultatif, 14,99 €/an ou 2,49 €/mois) réserve le confort : mode rayon, mode courses, comparaison, famille, hors connexion et historique complet. Le verdict halal, les notes, les rappels et les alertes allergies restent gratuits. Mise en vente : voir docs/abonnement.md.
Les données produits viennent d'Open Food Facts (base collaborative, gratuite, plus de 3 millions de produits).
L'app est 100 % statique : le dossier public/ suffit. Le navigateur
interroge directement Open Food Facts et applique les règles lui-même, donc
aucun serveur n'est nécessaire en production.
Le dossier mobile/ contient la vraie application native, écrite avec React Native + Expo.
Elle reprend le même moteur que la version web (public/lib : règles halal, note santé,
traductions, sources), donc une règle corrigée profite aux deux.
Différences avec la version web : lecture des codes-barres par la caméra native du téléphone, retour haptique, lampe, partage natif, données gardées sur l'appareil (AsyncStorage).
À chaque modification, le workflow .github/workflows/mobile.yml compile un APK et le publie :
https://github.com/agozel5/bayyin/releases/download/android-latest/Bayyin.apk
Sur le téléphone : télécharger le fichier, l'ouvrir, autoriser « installer depuis cette source ».
Apple n'autorise pas l'installation d'un fichier comme sur Android. Deux possibilités :
git clone https://github.com/agozel5/bayyin && cd bayyin/mobile
npm run setup # installe Expo et les modules natifs aux bonnes versions
npm run tunnel # affiche un QR code
Scanner le QR code avec l'appareil photo de l'iPhone : l'app s'ouvre dans Expo Go.npx eas build --platform ios
et npx eas submit (TestFlight, puis App Store). Pour le Play Store : compte Google Play (25 $),
npx eas build --platform android --profile production.Le workflow vérifie aussi à chaque modification que l'app iOS compile.
Adresse : https://agozel5.github.io/bayyin/
La caméra du téléphone n'est autorisée qu'en HTTPS, d'où l'hébergement sur
GitHub Pages. Le workflow .github/workflows/pages.yml lance les tests puis
publie le dossier public/ à chaque push sur main.
Réglage à faire une seule fois : Settings → Pages → Source : GitHub Actions, puis relancer le workflow depuis l'onglet Actions (ou pousser un commit).
Sur le téléphone : ouvrir l'adresse, autoriser la caméra, puis « Ajouter à l'écran d'accueil » pour l'avoir comme une application.
Mode démo sans internet : ajouter ?demo à la fin de l'adresse.
Prérequis : Node.js 18 ou plus récent. Aucune dépendance à installer.
npm start # http://localhost:3000 (sert public/ + une API JSON)
npm test # tests des règles halal, de la note santé et de l'API
Sur ordinateur, la caméra fonctionne sur localhost.
mobile/ l'app native iOS / Android (Expo)
src/App.js onglets + pile d'écrans (caméra, fiche, lecture d'étiquette)
src/screens/ Scanner, Recherche, Historique, Additifs, Réglages
src/components/ fiche produit, caméra, OCR (Tesseract dans une WebView), icônes
src/core.js réexporte le moteur de public/lib
public/ la version web (à héberger telle quelle)
index.html
app.js onglets Scanner, Recherche, Historique, Additifs, Infos + fiche produit
style.css thème clair, barre d'onglets en bas
lib/camera.js caméra plein écran + décodage (BarcodeDetector natif ou ZXing WebAssembly)
lib/barcode.js validation des codes EAN/UPC
lib/health.js note santé, seuils nutritionnels, risque des additifs, allergènes, NOVA
lib/settings.js réglages (langue, école, avis par sujet), gardés sur l'appareil
lib/i18n.js traductions ; dictionnaires dans lib/i18n/{fr,en,ar,tr}.js
lib/ocr.js lecture d'étiquette (Tesseract.js chargé à la demande)
lib/sources.js sources officielles et correspondance avec chaque explication
sw.js service worker : mode hors connexion
lib/store.js historique et favoris (localStorage, consultables hors connexion)
lib/rules.js moteur de classification halal
lib/off.js appels à Open Food Facts depuis le navigateur
lib/fixtures.js produits d'exemple (tests + mode démo)
lib/beauty.js règles halal des cosmétiques (ingrédients INCI)
lib/medicine.js médicaments : code CIP13, verdict selon la forme
lib/profile.js profil allergies / régime comparé à chaque produit
data/med/NN.json base des médicaments découpée en 100 fichiers (workflow medicaments.yml, chaque lundi)
lib/cosmetic.js note des cosmétiques (danger × exposition) et base CosIng (data/cosing.json, chaque mois)
lib/search.js recherche : pertinence, fautes de frappe, traduction des mots courants (ar/tr/en → fr)
lib/recalls.js rappels de produits ; data/rappels/NN.json construit chaque nuit (workflow rappels.yml)
lib/certifiers.js fiches des organismes de certification halal
lib/places.js commerces halal autour de soi (OpenStreetMap / Overpass)
lib/aisle.js mode rayon : plusieurs codes-barres dans la même image
lib/premium.js Bayyin Premium : clé de licence Lemon Squeezy (réglages : premium-config.js)
scripts/build-medicaments.mjs construit data/med depuis la base publique
src/server.js serveur local optionnel : sert public/ + API JSON
test/ tests node:test
Utile pour un futur client mobile natif ; l'app web ne s'en sert pas.
| Route | Rôle |
|---|---|
GET /api/product/:code | Fiche + verdict pour un code-barres (8 à 14 chiffres) |
GET /api/search?q=nutella | Recherche par nom, 12 résultats max avec verdict |
GET /api/health | État du serveur, mode hors-ligne ou non |
Exemple de réponse (abrégée) :
{
"found": true,
"product": {
"code": "4001686301029",
"name": "Dragibus",
"brand": "Haribo",
"verdict": {
"status": "mashbouh",
"statusLabel": "Douteux",
"certification": null,
"flags": [
{ "id": "gelatine", "severity": "mashbouh", "label": "Gélatine", "reason": "…", "source": "gelatine" },
{ "id": "e120", "severity": "mashbouh", "label": "E120 (carmin)", "reason": "…", "source": "E120" }
],
"notes": []
}
}
}
public/lib/rules.js)additives_tags d'Open Food Facts et dans le
texte. Les dérivés d'acides gras (E471, E472…, E481…) passent en simple
information si l'étiquette précise une origine végétale ou si le produit est
végétalien.Chaque signalement a une sévérité : haram, mashbouh (douteux) ou info
(point d'attention qui ne change pas le verdict, ex. vinaigre de vin).
Pour ajouter une règle (public/lib/rules.js) : une entrée dans TEXT_RULES ou ADDITIVES, puis un
test dans test/rules.test.js.
public/lib/camera.js)La caméra est pilotée directement (getUserMedia), sans bibliothèque de scan. Plusieurs fois
par seconde, la zone du cadre est copiée dans un canvas et décodée :
BarcodeDetector du navigateur quand elle existe (Chrome sur Android) ;barcode-detector chargé depuis jsDelivr (iPhone, Firefox).Une analyse sur quatre porte sur l'image entière, pour les caméras dont l'image est rognée à l'écran. Secours : photo du code-barres ou saisie des chiffres.
public/lib/health.js)| Composante | Points |
|---|---|
| Nutri-Score A / B / C / D / E | 60 / 45 / 30 / 15 / 0 |
| Additifs (30 au départ) | −30 risque élevé, −10 modéré, −4 limité ; un risque élevé plafonne la note à 49 |
| Label bio | +10 |
Sans Nutri-Score sur la fiche, aucune note n'est affichée. Les seuils sucre, sel, graisses saturées et calories suivent les feux tricolores de la Food Standards Agency (aliments et boissons séparés). Les niveaux de risque des additifs résument des avis EFSA, ANSES et CIRC.
public/lib/rules.js)Chaque point débattu est un « sujet ». Pour chacun, l'utilisateur choisit permis (simple information),
douteux ou interdit, directement ou via un préréglage d'école (SCHOOLS). Les préréglages s'appuient sur
une recherche documentée et sourcée : docs/avis-des-ecoles.md.
Les sujets sont de deux natures, que le moteur distingue :
gelatine, viande, extraits_animaux, derives, presure, arome_alcool,
traces_alcool) : un label halal lève le doute ;insectes, vinaigre, fruits_de_mer, crevettes, insectes_alimentaires,
grenouille, escargot, cheval, boissons_desalcoolisees, alcool_cosmetique, graisse_cosmetique) :
un label ne les tranche pas ; le produit certifié reçoit alors la note « interdit ou débattu selon votre école ».Un médicament n'est jamais classé « haram » : toutes les instances consultées l'autorisent en cas de nécessité.
lib/i18n/fr.js est la référence. Un test vérifie que en, ar et tr ont exactement
les mêmes clés et les mêmes variables {x}. Pour ajouter une langue : un nouveau fichier,
puis l'ajouter à DICTS (lib/i18n.js) et à LANGS (lib/settings.js).
Icônes, écrans de démarrage, captures et textes des stores : docs/store/ (regénérés par scripts/store-assets.py).