Easy-to-manage touch screens
무료 오픈소스 터치스크린으로 USB 설정 가이드, 드래그‑드롭 편집기, 로컬 제어를 제공하며 Home Assistant용으로 제작되었습니다
Cosme Check이 성분을 해독하고 마케팅 주장을 검증해, 제품이 당신에게 맞는지 알려주는 무료 iOS·Android 앱
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.
라이프스타일TypeScript · HTMLGitHub @lespassiones온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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. 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 :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.