---
name: kodoceh-web-overview
description: "Монорепо семейства сайтов КодоЦех (студия-зонтик + продукты Гаечкин/ВакХантер/Автеро) — стек, бренд, хостинг, статус"
metadata: 
  node_type: memory
  type: project
  originSessionId: b11e39bd-4f6f-47c9-ba7b-680ccf041a5b
---

**kodoceh-web** — монорепо семейства сайтов студии **КодоЦех** (бренд-зонтик; CeBers_dev — автор/личность). Цель: единый корпоративный бренд, современный анимированный UI (уровень Awwwards/Linear), общая дизайн-система. План: `~/.claude/plans/happy-crunching-neumann.md` (одобрен 2026-06-24).

**Состав:** студия-зонтик `<apex>` + лендинги-и-приложения продуктов: **Гаечкин** (CRM автосервисов, полный web-app+админка), **ВакХантер** (вакансии, лента+кабинет+админка), **Автеро** (запчасти по VIN — переоформить существующий одностраничник в общий стиль + админка). Земля без риска и Торги без риска — НЕ продукты-семейства (нет kodoceh-поддоменов/лендингов, не полностью принадлежат), НО по просьбе юзера (2026-06-25) ДОБАВЛЕНЫ в портфолио-кейсы на студии (секция «Наши продукты») со своими лого и ссылками на их реальные сайты (zbrcheck.ru, lots.zbrcheck.ru).

**Бренд (АКТУАЛЬНОЕ, юзер 2026-06-25):** палитра спокойная, благородно-нейтрально-зелёная, **СВЕТЛАЯ по умолчанию** (юзер: тёмно-зелёный отпугивает). Primary emerald `#2F8E6B`, акцент `#2E8C66`. Акценты на продукт (спокойнее прежних): Гаечкин янтарь `#D8902E`, ВакХантер teal `#1F97A6`, Автеро emerald `#2E9C74`. Шрифты Unbounded/Onest/JetBrains Mono. **Лого: у КАЖДОГО продукта СВОЙ знак** (`@cbr/ui` Header проп `logo`): КодоЦех = реальная иконка `~/Downloads/иконка кодоцех.png` (наковальня+`</>`+искры+дымок) — используется как app-icon в шапке студии (`apps/studio/public/kodoceh-icon.png`, `<img>` в Header logo) И favicon (`apps/studio/app/icon.png`); вектор `LogoMark` оставлен для крошечного `ProductBadge` (13px, где растр смажется); Гаечкин = `LogoGaechkin` вектор гайка+галочка (юзер сказал «ок», не менять). **ВакХантер и Автеро — реальные растровые иконки юзера** (`~/Downloads/иконка вакхантер.png`, `Иконка автеро.png`) как app-icon в шапке (`apps/<a>/public/<a>-icon.png`, `<img>` в Header logo) + favicon (`app/icon.png`); векторы `LogoVakhunter`/`LogoAvtero` в `ui/Logos.tsx` оставлены как fallback. Все 4 продукта: КодоЦех+ВакХантер+Автеро = растровые PNG-иконки юзера, Гаечкин = вектор. У каждого app свой `app/icon.svg` favicon с его знаком. Подпись **«Продукт КодоЦех»** (`ProductBadge`) обязательна на всех — теперь с РЕАЛЬНОЙ иконкой бренда (`kodoceh-icon.png` лежит в `public/` КАЖДОГО app, `<img src="/kodoceh-icon.png">`), не тонированный вектор. **Тарифы (ИСПРАВЛЕНО 2026-06-25 — жалоба «сайты врут vs бот»):** прежняя единая модель «лимит/день + Подписка скоро + API» оказалась ВЫДУМКОЙ «Claude design» (фейк-тариф «API — скоро» был на всех 3 продуктах). Убрано, теперь у каждого — РЕАЛЬНОЕ из кода: **ВакХантер** Trial 0₽ (1 подписка/6 площадок/раз в 6ч) / Standard 149₽ (2/12/3ч) / Pro 490₽ (3/все 20/мгновенные алерты, Платега боевая) — 1:1 с `tariff_plans` бота, маркетинг «20 площадок»; **Автеро** — бесплатно в раннем доступе (доступ по заявке, лимит фактически снят `TRIAL_LIMIT=999999`), платных тарифов НЕТ; **Гаечкин** — Старт бесплатно / Бизнес «скоро» (биллинг Platega позже) / White-label «скоро» (реальный флаг `hide_engine_branding`). НЕ возвращать «API»-тариф — продукта нет. При правке лендинга СВЕРЯТЬ с ботом/бэкендом.

**Стек/архитектура:** Next.js 14 + Tailwind + Framer Motion; бэкенды FastAPI. Монорепо `~/Разработки/kodoceh-web` (npm workspaces): `apps/{studio,gaechkin,vakhunter,avtero}` + `packages/{tokens,ui,config}`. `@cbr/tokens` = источник истины (палитра + Tailwind preset, `tailwind-preset.cjs`); `@cbr/ui` = общие компоненты (ProductBadge, Button…). Apps подключают пакеты через `transpilePackages`. **Node 22** (`/opt/homebrew/opt/node@22/bin`) — Next 14; не node 26 по умолчанию.

**Дизайн реализован САМ в коде** (не через внешний Claude design; промпты в `kodoceh-web/DESIGN_PROMPTS.md` — запасной путь). **Шрифты (важно, по требованию юзера «уникальные, но аккуратные»):** дисплей **Unbounded**, текст/UI **Onest**, код/числа **JetBrains Mono** — все с КИРИЛЛИЦЕЙ, ставятся через **@fontsource** (offline, в node_modules; Fontshare/Google CDN с mini заблокированы → @fontsource единственный надёжный путь). Импортируются по весам в каждом `apps/*/app/layout.tsx` (`@fontsource/unbounded/600.css` и т.п.); `tokens.cjs` fontFamily ссылается на имена семейств. **Clash/Satoshi отвергнуты** — латинский сабсет без кириллицы. **@cbr/ui расширен:** `LogoMark` (SVG-наковальня, заменила эмодзи ⚒ везде; есть `app/icon.svg` favicon в акценте на каждом app), `Icon` (кастомный line-icon набор `IconName`, ВМЕСТО эмодзи — это главный фикс «не как нейросеть»), `Reveal`/`MagneticButton`/`Marquee`/`Counter`/`SectionHeading`; `Header` scroll-aware (мобильный оверлей — СИБЛИНГ хедера, не внутри, иначе backdrop-blur клампит fixed), `Footer` (колонки+ProductBadge). Общий `globals.css` (одинаков во всех 4 app): `.bg-grid` (точечная сетка), `.glow` (один осмысленный дрейфующий блоб вместо случайного mesh), `.spark`, `.marquee`, `.panel` (вместо тотального glassmorphism), `.text-gradient`, `.mask-fade-*`. **Язык:** тёмный редакторский, нумерованные секции (01–04), у каждого продукта свой hero-mock (Гаечкин — карточка записей+выручка; ВакХантер — лента вакансий+чипы; Автеро — VIN→OEM результат).

**Хостинг (как zemlya-web):** весь код и исполнение — на **mini** (launchd, порты `204xx` фронты / `205xx` API). Новый **отдельный VPS** = edge (Caddy авто-TLS + rathole-server), изолирован от zbrcheck-VPS. DNS `*.<apex>` → новый VPS. Эталон: `~/Services/tbr-frontend/deploy/DEPLOY.md`, rathole `~/Services/zemlya-web/rathole/client.toml`.

**Действия пользователя (вне кода):** зарегистрировать апекс-домен (кандидаты kodoceh.ru/kodocech.ru/cebers.ru) + арендовать новый VPS.

**Статус (2026-06-25):** **Все 4 ЛЕНДИНГА переделаны в новый «не-AI» дизайн-язык и проверены** реальным запуском + Playwright (desktop 1280 + mobile 390 + меню open/close=True + сверка computed-шрифтов h1=Unbounded/body=Onest): studio (`:20410`), gaechkin (`:20411`, янтарь), vakhunter (`:20412`, teal), avtero (`:20413`, emerald). Сборка всех 4 `next build` ✓ (Node 22). Билд/рестарт: `export PATH=/opt/homebrew/opt/node@22/bin:$PATH`, `npm run build`, рестарт строго `kill $(lsof -ti tcp:ПОРТ)` + `nohup npm run start`. Скриншот-оркестратор: `/tmp/shoot.py` на mini (venv `~/.venvs/gaechkin/bin/python`), pull через scp в локальный `/tmp/shot`. Файлы правлю локально в `/tmp/kstage` → scp на mini (путь кириллицей). Монорепо НЕ под git. **Светлая/тёмная тема** (юзер попросил перед раскаткой на app): `ThemeToggle` в `@cbr/ui` + семантические CSS-переменные `--bg/--text/--subtext/--muted/--muted-soft/--line/--panel/--panel2/--grid/--header-bg` (тёмная в `:root`, светлая в `:root.light`); Tailwind preset мапит `ink.dark/subtext/muted/line/panel/bg.bottom` на var(...). **Дефолт темы = СИСТЕМНАЯ** (юзер 2026-06-25: «цвет как в системе»): `THEME_INIT` в каждом `layout.tsx` = `saved? saved==='dark' : matchMedia('(prefers-color-scheme: dark)').matches`; пока нет явного выбора — слушаем смену системной темы вживую, ручной клик пишет `kc-theme`. `:root`=светлая, `:root.dark`=тёмная нейтральный графит `#141916`. `ThemeToggle` переписан в **заметный pill-slider** (sun↔moon, `role="switch"`), тогглит класс `.dark` (+`suppressHydrationWarning`). Текст на акценте — фикс `#08130D` (не тема-зависимый). Opacity-модификаторы на тема-цветах НЕ использовать (var≠channels) — для полупрозрачного хедера класс `.header-bg`. Светлая проверена на всех 4 (`body_bg=rgb(244,248,245)`).

⚠️ **Грабли проверки:** (1) `pkill -f "next start"` НЕ убивает дочерний `next-server` → порт держит старый процесс, отдаётся прошлый билд (выглядит как «CSS не применился»). Глушить строго по порту: `kill $(lsof -ti tcp:PORT)`. НИКОГДА не делать `pkill -f next-server` — убьёт live zemlya/tbr (поднимутся через launchd, но всё же). (2) `backdrop-filter`/`backdrop-blur` на sticky-хедере создаёт containing block для `position:fixed` → фуллскрин-оверлей мобильного меню клампится в хедер; фикс — без backdrop-blur на хедере (сделано). (3) `whileInView` + full_page screenshot: секции ниже вьюпорта остаются opacity:0; ПРЫЖОК scrollTo(bottom) их не триггерит (IntersectionObserver не ловит транзит) — снимать ИНКРЕМЕНТАЛЬНЫМ скроллом (шаг ~600px) высоким viewport, это не баг. (4) Шрифты: Fontshare `cdn.fontshare.com` и Google `fonts.gstatic.com` с mini ТАЙМАУТ (RU) — `@import`/`<link>` мёртвы; только `@fontsource` (woff2 в node_modules). Clash/Satoshi = латиница без кириллицы, не годятся для RU. (5) Мобильное меню: оверлей рендерить СИБЛИНГОМ хедера (не внутри), иначе `backdrop-blur` хедера создаёт containing block и клампит `fixed inset-0`.

**Автеро = ПЕРВОЕ РЕАЛЬНОЕ ПРИЛОЖЕНИЕ (web+mobile, готово 2026-06-25):** функционал бэкенда (:8201) втащен в Next.js БЕЗ переписывания — `apps/avtero/next.config.mjs` rewrites `/api/pk/:path*`→`http://127.0.0.1:8201/api/:path*` (same-origin прокси: куки `pk_session`+SSE без CORS). Визард `apps/avtero/app/app/page.tsx`: TG-логин (deep-link+poll), табы VIN/госномер/фото (`ocr_identity`), `ask_async`+EventSource прогресс, `needs_confirmation`-карточка, рендер `PartListResponse` (OEM+аналоги tier-бейджи+отзывы+fitment+жидкости). Лендинг `/` CTA→`/app`. `Icon` получил `style`-проп. E2E пройден (подписать тест-`pk_session`: `cd ~/Services/avtero && python3 -c "import sys;sys.path.insert(0,'.');from app import webauth;print(webauth.make_session({'tg_id':1,'name':'t'}))"` → cookie в Playwright; реальный VIN Solaris→OEM 58302-1RA00+кроссы TRW/Ferodo/Brembo). Капча off (`SMARTCAPTCHA_DISABLED=1`), бот `avtero_bot`. **Дальше:** в `/app` добить гараж/историю + АДМИН (инбокс фидбэка/обучение ИИ из бота). 

**Гаечкин = веб-кабинет, ПЕРВЫЙ СРЕЗ ГОТОВ (2026-06-25):** бэкенд-движок `~/Разработки/Gaechkin` (на mini, launchd `local.gaechkin`, venv `~/.venvs/gaechkin/bin/python`, :20150, Postgres `gaechkin`) дополнен: `gaechkin/api/cab_session.py` (TG-логин HMAC-cookie `gk_session`, deep-link `t.me/gaechkin_bot`, клон Автероа) + `gaechkin/api/cabinet.py` (`/api/auth/*` + `/api/cabinet/{dashboard,bookings,bookings/{id}/status}`, tenant-scoped по `owner_tg_id`; данные из готовых репозиториев). Роутеры подключены в `gaechkin/api/app.py`. Фронт `apps/gaechkin`: `next.config.mjs` rewrites `/api/gk/*`→`:20150/api/*`; `app/cabinet/page.tsx` = логин-гейт + сайдбар (Дашборд KPI/выручка + Записи с действиями), янтарь `#D8902E`. Лендинг nav +«Кабинет». E2E на реальной БД пройден (тест-`gk_session`: `cd ~/Разработки/Gaechkin && ~/.venvs/gaechkin/bin/python -c "from gaechkin.api import cab_session; print(cab_session.make_session({'tg_id':1005954706,'name':'x'}))"`; владелец тест-тенанта id=1, открытых ремонтов 54). **Грабли:** ДО рестарта live-сервиса проверять импорт venv-ом (держит боты!); рестарт `launchctl kickstart -k gui/$(id -u)/local.gaechkin`. **Осталось:** вход владельца требует правки /start @gaechkin_bot (login_<token>→/api/auth/telegram/confirm) — ЖИВОЙ бот, по согласованию; затем вкладки Клиенты/Услуги/Мастера/Выручка/Витрина + админка.

**СТАТУС 2026-06-25 (вечер) — все 3 продукта = web-приложения, фейк убран, закоммичено:**
- **Гаечкин ЗАКРЫТ:** кабинет полный (Дашборд/Записи/Клиенты/Услуги/**Мастера**/**Выручка**/**Витрина**) + **супер-админка** `/admin` (гейт `admin_tg_ids`, `/me`+is_admin). Витрина `/w/<slug>` опубликована наружу: next.config проксирует `/w`+`/privacy`→:20150, `PUBLIC_BASE_URL=https://gaechkin.codoceh.ru` в plist (⚠️ plist-правка → `bootout`+`bootstrap`, не kickstart). Эндпоинты в `cabinet.py` (mechanics/revenue/vitrina/admin). Login_ ветка @gaechkin_bot уже была (7992f3d).
- **Автеро /app ОЖИВЛЁН:** главная приложения (приветствие+гараж из localStorage `pk_garage`+большой CTA), Framer-анимации, поэтапный раскрыв результата. Логика визарда не тронута. Осталось: АДМИН (инбокс фидбэка/обучение из бота).
- **ВакХантер web-app ЯДРО ГОТОВО:** у бота не было web-API → построен `web/webapp.py` (standalone aiohttp :20452, launchd `local.vakhunter-web`, читает vakhunter.db, БЕЗ правки db.py) + ветка `login_` в `cmd_start` бота (inline sqlite в `web_login`). Фронт `apps/vakhunter/app/app/page.tsx`: лента+фильтры+избранное/отклики/профиль+тариф. Proxy `/api/vh/*`→:20452. Живой TG-вход проверен. Осталось: AI-коуч, оплата Platega, рефералка, веб-админка.
- **Фейк убран со ВСЕХ лендингов** (см. [[vakhunter-overview]], Changelog): «API/Подписка — скоро» удалены, цифры сверены с кодом.
- **Коммиты:** kodoceh-web (mini) `5c042e4`+`67f8166`; Gaechkin (локально Mac) `da3f72c`; VakHunter (mini) `be2ba63` (⚠️ pre-commit hook ruff+pytest — учитывать: одинарные кавычки в SQL через ssh-heredoc срезаются, UP031 не любит `%`-формат). ⚠️ kodoceh-web репо ТЕПЕРЬ под git на mini (вопреки старой пометке «не под git»).
- **Открыто (следующие заходы):** вход без Telegram для Гаечкина (multi-identity, owner_tg_id→account_id); OAuth Яндекс/Mail/VK для Автероа (нужны client_id/secret); ВакХантер AI-коуч/оплата/рефералка/админка; Автеро админка; флаг юзеру — studio-портфолио показывает Землю/Торги (план их исключал).

**СТАТУС 2026-06-25 (поздний вечер) — ВакХантер-оплата + зонтичная политика + согласие везде:**
- **Оплата в web ВакХантера** (реюз бота, БЕЗ нового callback): `web/webapp.py` +`POST /api/pay` (Platega-транзакция через `bot.payment_service.get_payment_service`, строка `payments` сырым sqlite), `GET /api/tariffs` (Standard 149/Pro 490 из `tariff_plans`), `GET /api/legal`. `bot/payment_service.create_payment` получил опц. `return_url/failed_url` (обратносовместимо). **Активирует тариф существующий вебхук бота** по invoice_id в общей таблице payments — отдельный callback вебу НЕ нужен. Фронт: вкладка Профиль = текущий тариф + апгрейд, формулировка «первые 7 дней Pro → бесплатный Trial» **без слова Platega** (требование юзера). E2E: реальная транзакция `pay.platega.io` + строка payments (удалена после теста). Коммиты VakHunter `5b9b3f3`, kodoceh-web `4b24c76`.
- **Зонтичная Политика конфиденциальности** `apps/studio/app/privacy` (`codoceh.ru/privacy`, оператор «Администрация сервиса КодоЦех», контакт @cebers_dev, 152-ФЗ). **Согласие на ПДн при входе ВЕЗДЕ**: Автеро+Гаечкин LoginCard → ссылка на codoceh.ru/privacy; ВакХантер на своих telegra.ph (под Platega); студия — ссылка в футере. Коммит kodoceh-web `fd68122`. Все скриншоты вычитаны, edge `/privacy`=200.
- **Портфолио Земля/Торги — ОСТАВИТЬ** (юзер: его отдельные проекты, разрабатывал сам; флаг закрыт).
- **Открыто:** Гаечкин вход без Telegram (#16, последний хвост); ВакХантер AI-коуч/рефералка/веб-админка (отложены юзером).

**TODO UI (юзер 2026-06-25):** интерфейс приложения Автероа `apps/avtero/app/app` сейчас «топорный» — надо сделать **живым как лендинги** (анимации Reveal/Framer-motion, stagger, MagneticButton, поэтапный раскрыв результата, микро-интеракции, без «голых» панелей) + добавить **полноценную ГЛАВНУЮ приложения** (приветствие, гараж последних VIN, история подборов, крупный CTA «Новый подбор», статус тарифа), а не «сразу форма». Уточнить смысл «главной» у юзера.

**Дальше (большая фаза):** полноценные web-приложения + админки: Гаечкин (Мастера/Выручка/Витрина + админка), ВакХантер лента/кабинет/админка. UI-полировка Автеро /app (см. TODO выше). Деплой — на новый VPS-edge (ждёт аренды VPS + домена kodoceh.ru, ~2026-06-25/26). Дев-серверы пока крутятся локально на mini (:20410-20413), наружу не выставлены. Связь: [[ceberspost-overview]] (бренд/канал @CodoCeh), [[gaechkin-planning]], [[vakhunter-overview]], [[avtero-overview]], [[cebers-dev-brand]].
