Easy-to-manage touch screens
Free, open-source touch screens. Guided USB setup, a drag-and-drop editor and local control. Made for Home Assistant.
Cosme Check décode les ingrédients, vérifie les promesses marketing et te dit si le produit te correspond vraiment. Application gratuite sur iOS et Android.
Translation pending
LifestyleTypeScript · HTMLGitHub @lespassionesOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
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.
Application qui décode les cosmétiques : composition, promesses marketing, ingrédients clefs. 15 722 ingrédients indexés, classés par tolérance (vert / jaune / orange / rouge), avec autocomplete fuzzy et fiches détaillées. Stack : Next.js 15 + React 19 + Tailwind CSS 3 + Supabase free tier. Aucun service payant. Light mode strict. Le site démarre sur http://localhost:3000. L'application est immédiatement opérationnelle sur les 15 722 ingrédients déjà chargés dans Supabase. Le fichier .env contient les identifiants Supabase : Le scraping est séparé du site. Quatre phases :Read the full README ↗
Application qui décode les cosmétiques : composition, promesses marketing, ingrédients clefs. 15 722 ingrédients indexés, classés par tolérance (vert / jaune / orange / rouge), avec autocomplete fuzzy et fiches détaillées.
Stack : Next.js 15 + React 19 + Tailwind CSS 3 + Supabase free tier. Aucun service payant. Light mode strict.
npm install
npm run dev
Le site démarre sur http://localhost:3000. L'application est immédiatement opérationnelle sur les 15 722 ingrédients déjà chargés dans Supabase.
Le fichier .env contient les identifiants Supabase :
| Clé | Rôle |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | URL de l'API Supabase |
NEXT_PUBLIC_SUPABASE_ANON_KEY | Clé publique (lecture seule via RLS) |
SUPABASE_SERVICE_ROLE_KEY | Clé secrète, côté serveur uniquement. Utilisée par les scripts Python |
Cosme Check/
├── app/ ← Next.js App Router
│ ├── layout.tsx ← layout global, light mode forcé
│ ├── page.tsx ← page d'accueil (SearchBar centrée)
│ ├── globals.css
│ ├── about/page.tsx ← page "À propos"
│ ├── search/page.tsx ← liste de résultats étendue
│ ├── i/[slug]/page.tsx ← fiche ingrédient (ISR 24h)
│ ├── api/search/route.ts ← endpoint autocomplete (rate limited)
│ ├── robots.txt/route.ts ← robots.txt strict
│ └── not-found.tsx ← 404 stylée
├── components/
│ ├── SearchBar.tsx ← input + dropdown avec debounce 150ms
│ ├── ColorBadge.tsx ← badge de classification
│ └── Logo.tsx
├── lib/
│ ├── supabase.ts ← clients (anon, service) + types TS
│ ├── ratelimit.ts ← rate-limit in-memory + blacklist
│ └── colors.ts ← palette + classes Tailwind par rating
├── middleware.ts ← filtre UA + bot traps
├── scripts/ ← pipeline Python (indépendant du site)
│ └── (scripts ETL internes)
├── data/
│ └── reference/
└── docs/cahier-des-charges.md ← spec complète
Le scraping est séparé du site. Quatre phases :
cosme_check.ingredients peuplée).cosmetwiki-products. Le site n'a plus aucune dépendance externe pour ses ressources.Performances mesurées (enrichissement détaillé) :
--no-images)details_scraped en BDDEstimation pour les 15 622 ingrédients restants :
Toutes les données vivent dans le schéma isolé cosme_check (la base est partagée avec une autre app, le schéma public n'est pas touché).
| Table | Rôle |
|---|---|
cosme_check.ingredients | 15 722 ingrédients INCI, full-text + trigram |
cosme_check.products | produits scrapés (avec image_url en hotlink) |
cosme_check.product_ingredients | jonction produits ↔ ingrédients |
cosme_check.search_log | log anonyme des recherches (service_role only) |
Le client web ne tape pas directement les tables : il appelle des fonctions RPC définies dans public en SECURITY DEFINER :
| RPC | Rôle | Accès |
|---|---|---|
cosme_check_search(q, result_limit) | autocomplete fuzzy (trigram + tsvector) | anon |
cosme_check_get_ingredient(slug) | fiche complète | anon |
cosme_check_products_for_ingredient(id, limit) | produits associés | anon |
cosme_check_popular_suggestions(limit) | suggestions home | anon |
cosme_check_pending_ingredients(limit) | liste à enrichir | service_role only |
cosme_check_upsert_ingredients(rows) | upsert batch ingrédients | service_role only |
cosme_check_upsert_products(rows) | upsert batch produits + composition | service_role only |
| Couche | Implémentation |
|---|---|
| RLS | toutes les tables ont ENABLE ROW LEVEL SECURITY, policy SELECT pour anon, écriture service_role uniquement |
| Rate limit | 30 req/min/IP en mémoire, sur /api/search (lib/ratelimit.ts) |
| Honeypot | champ email_confirm masqué dans la SearchBar → IP blacklistée 24 h si rempli |
| Bot traps | URLs piégées (/admin-bot-trap, /wp-admin, /wp-login.php) → 404 + log |
| UA filter | middleware bloque curl, python-requests, GPTBot, ClaudeBot, etc. sur /api/ |
| robots.txt | Googlebot/Bingbot/DuckDuckBot autorisés, IA scrapers (GPTBot, ClaudeBot, CCBot, Bytespider) bannis |
| Headers | X-Frame-Options: DENY, X-Content-Type-Options: nosniff, Referrer-Policy: strict-origin-when-cross-origin, Permissions-Policy minimale |
| ISR | fiches mises en cache 24 h côté Vercel → ~95 % des hits ne tapent pas Supabase |
hCaptcha n'est pas activé dans cette première version pour ne pas bloquer le démarrage. Pour l'ajouter plus tard : créer un compte gratuit sur hcaptcha.com, ajouter
NEXT_PUBLIC_HCAPTCHA_SITE_KEYetHCAPTCHA_SECRET_KEYau.env, intégrer dansSearchBar.
prefers-color-scheme: dark est ignoré).soft et ink.fade-in, slide-down).glycerin en tapant glicerine, glycérol, 56-81-5 (CAS).| Quota | Free tier | Estimation | Marge |
|---|---|---|---|
| Supabase DB | 500 MB | ~80 MB après enrichissement complet | ✅ x6 |
| Supabase Bandwidth | 5 GB/mois | dépend du trafic ; ISR aide | ⚠️ surveiller |
| Vercel Bandwidth | 100 GB/mois | ~10 GB pour 100 visites/jour | ✅ |
| Storage Supabase | 1 GB | ~330 MB une fois toutes les images téléchargées (75 000 × ~4.5 KB WebP) | ✅ marge x3 |
| Commande | Effet |
|---|---|
npm run dev | dev server sur http://localhost:3000 |
npm run build | build de production |
npm run start | serve le build |
Voir PROJECT_STATUS.md pour la roadmap complète et l'historique des décisions.