BatchCodeCheck — расшифровка батч-кодов косметики
О проекте
- Клиент Собственный продукт
- Год 2026 → настоящее время
- Категория Веб-сервис / Косметика
- Стек Next.js 15 (App Router), React 19, TypeScript, Tailwind v4, монорепо на npm workspaces с общим пакетом декодера, SQLite (better-sqlite3, WAL), Cloudflare Turnstile, Brevo SMTP, PM2-кластер
- ИИ Claude Vision читает код с фото — и только читает: дату всегда вычисляет движок правил
Описание проекта
На каждой упаковке косметики есть батч-код, который ставит линия розлива, — и прочитать его почти никто не может. BatchCodeCheck расшифровывает его в дату производства: вводите код или фотографируете его, при желании указываете бренд — и сайт возвращает дату вместе с правилом, из которого она получена: группа-производитель, схема и сколько реальных кодов по этой схеме уже сверено. Если схема бренда не подтверждена, сайт так и говорит, а не угадывает.
Несущее решение: схема — это данные со статусом, а не код. У каждого правила декодера есть статус verified / unverified, число эталонных наблюдений и источник. Правило становится подтверждённым, только когда минимум пять наблюдений одной группы оставляют единственную гипотезу, и она сходится с точным эталоном — датой, напечатанной на той же упаковке, отзывом регулятора со списком лотов и дат (openFDA), схемой, опубликованной самим брендом, или ответом его поддержки. Сейчас сайт читает 19 схем: L'Oréal, Estée Lauder, Shiseido, Kenvue, P&G, Beiersdorf, Kao, Henkel, Burt's Bees и Dr. Bronner's; бренды, у которых формат меняется внутри группы (Maybelline, Chanel, Dior), сознательно получают отказ — неверная дата обходится дороже честного «не знаем».
Архитектура: монорепо на npm workspaces — приложение на Next.js 15 и общий пакет с движком декодера, чтобы мобильный клиент взял его без изменений. Движок отдаёт только коды и числа, без единой фразы: весь текст собирается из словаря, а даты форматирует Intl.DateTimeFormat. Фото уменьшается на клиенте и читается Claude Vision; каждый API-маршрут на сервере закрыт Cloudflare Turnstile. Форма «знаю настоящую дату» собирает эталонные образцы в SQLite с уведомлением через Brevo, а таблица покрытия, страницы брендов, sitemap и разметка FAQPage строятся из тех же данных о правилах — новое правило обновляет весь сайт.
