§01
Обзор
- Что это: full-stack B2B-платформа продаж клининговой химии. Публичный сайт (каталог, отрасли, блог, калькуляторы расхода, лиды), Elysia API, админка с RBAC (лиды, каталог, коммерческие предложения) и Telegram mini-app для менеджеров (калькулятор + генерация PDF-предложений). Построено на собственном SaaS-бойлерплейте «ShipKit» (бренд DavrApps).
- Тип / статус / роль: web-app (монорепо) / active / solo (~99% коммитов — пользователь; один внешний контрибьютор с 2 коммитами).
- Окно активности: 2025-11-10 → 2026-05-14, ~6 месяцев плотной разработки, проект живой (самые свежие коммиты — правки UI и контента в мае 2026).
§02
Стек
- Языки: TypeScript (strict), SQL (Drizzle).
- Фреймворки/библиотеки: Next.js 16 (App Router, роутинг
[locale], Turbopack, React 19), Elysia.js (Bun-нативный типизированный API), Drizzle ORM, Better Auth (+ RBAC, access-control), grammY (Telegram-бот), @react-pdf/renderer (PDF коммерческих предложений), next-intl v4.5 (useExtracted+.po/gettext), Tailwind v4 + shadcn/ui, Fuse.js (поиск), Polar.sh (из бойлерплейта). - Инфра/деплой: Turborepo (монорепо, 4 приложения + 10 пакетов), Bun 1.3 (рантайм + пакетный менеджер), deploy-skill (nginx + systemd + SSL).
.mcp.json,.claude/skills/— AI-native обвязка. - Данные: PostgreSQL (Drizzle, 16+ таблиц), Redis (ioredis — кэш, rate limit, учёт использования).
- Заметный тулинг:
.pen-файлы (Pencil — дизайн-макеты), CLI-пакет, React Email + Resend, собственный бойлерплейт как фундамент.
§03
Что реализовано
Сообщения коммитов аккуратные, в стиле conventional commits (feat(...), fix(...), refactor(...)) — в отличие от более старых проектов.
- Доменная модель калькулятора — таблицы
object_types,object_type_parameters,consumption_rules,calculation_periods: расчёт расхода химии по типу объекта и параметрам. - Калькулятор расхода + bin-packing (
feat(calc): industry-specific ... savings calculator— автомойки/horeca/клининг): подбирает фасовки, чтобы покрыть требуемый объём. - Коммерческие предложения —
quotes/quote_items, атомарная нумерацияKP-00042, генерация PDF (ru/uz, НДС, скидки). - Лиды —
feat(leads): server-side /api/lead bridge posts to Telegram group via bot+localStorage retry queue(клиентская очередь повторов при сбое). - Онбординг менеджеров в Telegram — инвайт-токены (
inv_...), калькулятор в mini-app. - Блог с модерируемыми комментариями —
feat(blog): moderated comments system end-to-end, 6 SEO-статей. - Сравнение товаров + поиск —
feat(compare): /compare side-by-side,agent/search: catalog search with Fuse.js (Ctrl+K). - Сквозная i18n по всему сайту — next-intl
useExtracted+.po, 3 языка (ru/uz/en). - SEO — sitemap, robots, JSON-LD, канонизация роутов с 301-редиректами, noindex на служебных страницах.
- Объём: 189 коммитов за ~6 месяцев. Примечательно: работа идёт через ветки
agent/*(agent/calculators, agent/sample, agent/compare, agent/search, agent/routes-dedup) — параллельные AI-агенты, вливаемые в master.
§04
Технические челленджи
- Жадный bin-packing с юнит-тестами (
apps/api/src/modules/v1/calculator/pack-greedy.ts+pack-greedy.test.ts): покрыть требуемый объёмrequiredMlнабором фасовок — сортировка по убыванию объёма,floorдля всего, кроме самой мелкой фасовки,ceilдля округления остатка вверх, деньги вBigInt(UZS). → Настоящий алгоритм + TDD; доказательство инженерной работы, а не CRUD. - BigInt-safe деньги (
apps/api/src/lib/bigint-json.ts): цены/суммы хранятся как Drizzlebigint(без проблем с точностью float), а глобальныйBigInt.prototype.toJSONчинит сериализацию в ответах Elysia. Подробный комментарий объясняет, почему именно так, а не через number. → Осознанное решение для денежной арифметики. - Атомарная нумерация предложений (
quotes/number.ts):UPDATE counters SET value = value + 1 ... RETURNING valueвнутри транзакции вместе со вставкой предложения → race-safe последовательностьKP-NNNNN. - Singleton Telegram-бот с защитой от init-race (
telegram/bot.ts, grammY): двойной guard (botSingleton+botInitPromise), одноразовые инвайты с проверками not_found/used/expired, запуск mini-app через кнопкуweb_app. - Генерация PDF-предложений (
packages/pdf, @react-pdf/renderer): кастомные кириллические шрифты, ru/uz, снапшот цены на момент оформления (unitPriceUzsSnapshot), расчёт НДС/скидок, подписи/реквизиты. - i18n в масштабе (next-intl v4.5
useExtracted+ gettext.po,proxy.tsдля Next 16): профессиональная локализация каждой страницы на 3 языках. - Архитектура монорепо (Turborepo): чистое разделение приложений (web/api/admin/miniapp) и общих пакетов (auth/db/cache/ui/email/entities/pdf/cli) через
workspace:*.
§05
AI-разработка
- Найдено сессий: 2 (локальная директория сессий Claude Code для этого проекта), суммарно ~13 МБ (9.3 МБ + 3.3 МБ) — очень плотное использование AI. Присутствует директория
memory/. - Что делалось с AI: массовый перевод каждой страницы (
useExtracted/getExtracted), фичи калькулятора, сравнение/поиск, SEO-аудит, генерация контента блога. Сессии включают собственныйI18N_GUIDE.mdпроекта как контекст. - Паттерны AI-воркфлоу (сильный сигнал для бренда):
- Параллельные агенты на git-ветках —
agent/calculators,agent/sample,agent/compare,agent/search,agent/routes-dedup, вливаемые в master: пользователь распараллеливает независимые фичи по AI-агентам. - AI-native репозиторий —
CLAUDE.md(210+ строк правил «из реальных продакшн-багов»),.claude/skills/(deploy/dev/ui-ux/polar),.mcp.json. - superpowers-скиллы — в сессиях видно вызов
superpowers:using-superpowers. - Бойлерплейт спроектирован под AI-ассистентов (Claude Code/Cursor/Copilot/Windsurf).
§06
Достижения и метрики
- 4 приложения + 10 пакетов в одном Turborepo, solo-разработка.
- 16+ таблиц БД (Drizzle): posts, leads, products, product_variants, object_types, consumption_rules, calculation_periods, managers, manager_invites, quotes, quote_items, settings, counters, blogComments, subscriptions.
- 3 языка интерфейса через полноценный gettext-пайплайн.
- Реальный продукт на самом современном стеке 2026 года (Next 16 / React 19 / Bun / Elysia / Tailwind v4).
- README позиционирует фундамент как ShipKit — бойлерплейт, на котором «построено 4+ живых SaaS».