День аудита Courier и выкладки PWA
Проверили уведомления и рассылки в Courier, сверили деньги в SmartMoney, подняли Snipe и TrendX как PWA и разобрали несколько продуктовых развилок.
Фокус дня
Куда ушло внимание за день — по объёму переписки в AgentChat, 314 сообщений всего.
- Courier — 29%
- Virale — 15%
- SmartMoney — 11%
- Snipe — 9%
- Mentor — 6%
- Logo — 5%
- AgentChat — 4%
- Next — 4%
- Блог — 3%
- LYSAK — 3%
- PULSE — 3%
- Другое — 2%
- Music — 2%
- TrendX — 2%
- Sentinel — 2%
- Память — 1%
Courier
Courier — это центр для email-рассылок, шаблонов, кампаний, сегментов и админки уведомлений в ChatPlace-части портфеля. Сегодня мы не чинили одну конкретную отправку, а сделали полный аудит того, что уже работает, что распределено по разным контурам и что нужно собрать в одно место.
Самое полезное — зафиксировали текущую картину по трём каналам. Email уже живёт в app/services/mailer.py и Courier, там есть 14 отправок в логе, 5 шаблонов и 1 активная кампания user.registered. Telegram-уведомления работают через app/services/notify.py и olehov-bot.service, но все 12 системных Daily сейчас выключены флагами. Push тоже разобрали отдельно: на olehov.com подписок нет, а независимый push у AgentChat живёт в своём server.js со своей базой и логикой.
Ещё важнее — выписали список того, что надо собрать в Courier как продуктовую админку: /admin/courier, /admin/courier/sends, /admin/courier/suppressions, шаблоны, кампании и /admin/subscribers. Отдельно увидели, что сейчас разъехались drip-очереди и таймеры-отправители: code_drip, school_drip, komanda_drip, masshtab_drip, content_factory_drip, плюс welcome, book_notify, herald_updates, блоговые и музыкальные подписчики, а также набор scheduled jobs и project Daily.
Рекомендация на завтра: собрать Courier как единый центр управления рассылками и уведомлениями, чтобы перестать искать отправки по разным сервисам и кроном.
Virale
Virale сейчас выглядит не как «ещё один генератор видео», а как ставка на сериализацию живого материала. По сегодняшней сессии мы зафиксировали правильный угол: не platform for creators и не тяжёлый рендерер, а сырой материал из жизни → сериал → CTA.
Сегодняшняя работа была именно про выбор направления. Из разбора получилось, что ReelSaga — подходящая ставка на сейчас, а не конкурентный AI-slop-генератор. Отдельно проговорили, что Energy Detective не надо смешивать с этой веткой: его можно оставить как wedge для PULSE позже, но не тащить в текущий продукт.
В практическом плане мы получили очень конкретный план первого дня: отдельная страница olehov.com/reelsaga или поддомен, три demo before/after на реальных DM/отзывах, upload скрина → LLM → три hooks, money-test с кнопкой 690 ₽ или 99 ₽, и CTA в Reels через STORY → ChatPlace → /go/story.
Рекомендация на завтра: не распыляться на код платформы и рендеры, а выбрать между полноценным Day 1 и чистым money-test, чтобы быстро проверить спрос.
SmartMoney
SmartMoney — это денежный контур портфеля, где мы сводим наличные, безналичные поступления и расходы в одну общую картину. Сегодня мы не добавляли новые источники, а просто сверили фактические платежи ЮKassa с тем, что уже показывает Money.
Главный факт дня: за 30 августа ЮKassa провела 2 платежа на 198 ₽, комиссия составила 6,94 ₽, а к зачислению вышло 191,06 ₽. При этом Money сейчас учитывает только наличные 50 000 ₽, поэтому баланс был неполным — это и подтвердили по данным webhook и по итоговой сверке.
После сверки сложилась правильная картина: общий баланс 50 191,06 ₽, поступления 50 198 ₽, расходы 6,94 ₽, наличные 50 000 ₽ и безналичные через ЮKassa 191,06 ₽ чистыми. Заодно сформировали понятный UX-план: оставить одну главную карточку «Текущий баланс», под ней разделить наличные и ЮKassa, а в истории показывать платёж одной логичной группой с комиссией отдельной строкой и фильтрами по типу операции.
Рекомендация на завтра: дотянуть Money до нормальной синхронизации с ЮKassa и уже после этого добить интерфейс истории и фильтры, чтобы цифры совпадали с реальностью без ручных сверок.
Snipe
Snipe — это PWA-кабинет для торгового контура, который уже живёт на отдельном поддомене и работает как мобильное приложение в Apple Style. Сегодня мы не трогали торговую логику напрямую, но сделали важную внешнюю упаковку и отдельно разобрали отчёт по paper-сделкам.
Сначала подняли сам PWA: snipe.olehov.com уже доступен, данные лежат в /opt/portfolio/Snipe, health units snipe-guardian и snipe-autopilot online, SSL выписан до 2026-11-29, а интерфейс проверен и на mobile, и на desktop. На QA всё сошлось: без cookie идёт 302 на login, с админской cookie — 200, работают пять вкладок, manifest/service worker/assets отвечают нормально, на телефоне нет горизонтального скролла, иконка и меню на месте.
Параллельно пришёл разбор результатов за две недели, и там важный вывод оказался не в самом PnL, а в природе цифр. Цифры отчёта 1:1 совпали с data/paper/paper_position_pnl_events.jsonl, а большая часть headline-PnL оказалась артефактом ложных mega-TP по Bonk из-за скачков priceUsd между шкалами. На «честном» ядре без mega-сделок картина даже выглядит лучше: прошлый период был в минусе, текущий уже в небольшом плюсе.
Рекомендация на завтра: чинить источник цены в snipe_guardian.py, чтобы get_price() больше не брал пару без проверки шкалы, и после этого смотреть на реальную эффективность без глюков DexScreener.
TrendX
TrendX — ещё один PWA-кабинет в том же стиле, но уже для dashboard-портфеля с метриками, парами, сделками и health-статусом. Сегодня мы довели его от отсутствующего DNS до полноценного опубликованного кабинета.
Сначала поддомен trendx.olehov.com даже не резолвился, потом DNS появился, мы выписали Let’s Encrypt и собрали кабинет по образцу SnipeOpenCode. Внутри TrendX работает на том же olehov-web, берёт данные из живого metrics.json, показывает equity, пары, сделки, daemon/kill и readiness, а также имеет пять вкладок: Обзор, Пары, Сделки, Здоровье и Ещё. Добавили insta-капсулу, pull-to-refresh, иконку из TX-логотипа и SNI 8462.
Проверка тоже была полноценной: без cookie — 302 на login, с админом — 200, manifest/SW/icons/CSS/JS отдают 200, на mobile labels скрываются, капсула держит высоту 56px, на desktop вкладки кликаются. Важно и то, что dashboard.olehov.com/trendx/ мы не трогали — это именно отдельный поддоменный PWA-кабинет.
Рекомендация на завтра: уже не наращивать сам кабинет, а только следить за качеством данных и, если нужно, довести UX на телефоне до совсем гладкого состояния через повторный визуальный проход.
AgentChat
AgentChat — это наш рабочий AI-клиент с сессиями, уведомлениями и handoff между моделями. Сегодня мы закрыли сразу несколько прикладных багов и одну важную логику перехода между провайдерами.
Сначала починили сообщение-переход при смене модели: теперь в server.js пишется lastProvider на каждый ход, при смене провайдера новая модель получает историю чата и блок «Переключение модели… продолжи с места остановки», а старый CLI-thread после handoff не поднимается, чтобы Grok не продолжал старый тред вместо новой задачи. Усилили и поведение фраз вроде «продолжи», а окно истории при handoff ограничили 40 сообщениями. Всё это уже проверено на практике: сессия Courier дала HANDOFF_QA_PASS, сервис поднялся заново и код загрузился после правки.
Ещё отдельно разобрали iOS push. Сейчас проблема в том, что тап по системному push должен открывать конкретный диалог-источник, а не общий список. Мы посмотрели цепочку push payload → notificationclick → открытие сессии и зафиксировали план: передавать sessionId и конкретный URL, открывать нужную сессию и в закрытом, и в фоне открытом PWA, а если сессия удалена — аккуратно возвращать к списку. Для группировки тоже нужен отдельный шаг, чтобы ответы одной сессии заменяли старую плашку, а не копили сотню уведомлений.
Наконец, починили верстку переписки: длинный неразрывный кусок текста растягивал bubble шире экрана, потому что flex-элементы не сжимались. Добавили min-width: 0 и max-width: 100% по цепочке #messages → .message → .bubble, плюс overflow-x: hidden как страховку, и горизонтальный скролл ушёл.
Рекомендация на завтра: сначала закрепить push-навигацию на конкретную сессию, а уже потом добивать удобство группировки и сценарии с фоном/закрытым приложением.
Next
Next — это игровой продукт с постоянным экраном, где мы добавляем мягкую соцмеханику поверх уже существующего ядра. Сегодня мы не изобретали новый игровой цикл, а аккуратно встроили шаринг в интерфейс и проверили, как это должно работать через единый реферальный контур.
Сначала нашли лучшее место для кнопки шеринга: маленькая иконка справа от NEXT, а не большая отдельная кнопка под полем. Логика здесь простая — иконка всегда доступна, не съедает высоту экрана и выглядит как естественный, ненавязчивый action на постоянном игровом поле. По нажатию должна открываться компактная карточка «Делись и зарабатывай» с персональной ссылкой, копированием и системным шарингом.
Дальше мы проверили, как это вяжется с текущими правилами портфеля, и переключили реализацию на стандарт create-olehov-affiliate-link. Это важнее локальной рефералки продукта, потому что нужен единый OleHov referral-код, бессрочная first-touch-атрибуция, click_id и начисления из общего обработчика подтверждённых оплат. Уже зафиксировано, что ключевая механика собрана: share-иконка рядом с логотипом, модалка закрывается по фону, крестику и Escape, ссылка создаётся из канонического кода, а переход пишет UTM и click_id.
Рекомендация на завтра: проверить, как этот шаринг ведёт себя на реальных оплатах NEXT, и только потом расширять UX, если понадобится.
PULSE
PULSE — это приложение для чек-инов, энергии и напоминаний, где сейчас отдельно живут Telegram и push. Сегодняшняя работа была про выбор основного канала и про то, как заменить старую схему на уведомления из самого приложения.
На скрине увидели Telegram-напоминание «Пора отметить энергию», которое ведёт в Safari/сайт, а не в установленное приложение. При этом в PULSE уже есть и Telegram-напоминания через reminder_dispatch.py, и заготовки Web Push через push_reminder_dispatch.py в 11:00 МСК, плюс кнопка в профиле «Включить push-напоминания». Но сейчас на push 0 подписок, а тап по push на iPhone часто открывает Safari, а не PWA — это и есть слабое место.
Мы не меняли код, а зафиксировали целевой порядок действий: основным каналом сделать push из приложения, Telegram либо отключить, либо оставить только как запасной, починить service worker, чтобы тап открывал PWA, перенести персональное время напоминания с Telegram на push и сделать push главным блоком в профиле. Это хороший пример, где продукт уже почти готов, но канал доставки ещё не дотянут до нормального пользовательского опыта.
Рекомендация на завтра: сначала выбрать финальную политику для Telegram как fallback или как выключаемый канал, а потом уже чинить путь клика до конкретного PWA-сценария.
Коротко по остальному
Mentor — разобрали мобильное нижнее меню: нужно не менять состав иконок, а только геометрию капсулы, отступы, радиус и эффект матового стекла; desktop уже ок.
Рекомендация на завтра: править только мобильную форму, не трогая навигацию целиком.
Logo — зафиксировали стиль приложения: это квадратная металлическая иконка в Apple-стиле, а не плоский логотип; предложили кандидат скилла olehov-app-logo-generate, но файлы скилла пока не трогали.
Рекомендация на завтра: сначала утвердить стиль на практике, потом уже собирать генератор.
Блог — добавили живую карточку блога в самый низ главной olehov.com после блока «Партнёры», с автоподтягиванием заголовка и описания последней статьи из markdown; заодно нашли, что живая главная рендерится не Astro, а отдельным FastAPI-приложением.
Рекомендация на завтра: просто продолжать публиковать статьи — карточка уже обновляется сама.
LYSAK — обсуждали позиционирование NFT-страницы без преждевременных обещаний: коллекция готовится к выпуску в NFT, а не «уже токенизирована».
Рекомендация на завтра: аккуратно собрать сайт вокруг физического искусства и цифровой истории, не перегружая главную словом NFT.
Sentinel — разобрали внешние таймауты у бесплатных моделей OpenCode: это не баг кода, а кратковременная перегрузка провайдера, и предложили добавить повторную проверку через 3–5 минут перед exit 1.
Рекомендация на завтра: если править, то только retry-логику, а не права или доступы.
Другое — проверили подключение учёта токенов для AgentChatVoice и зафиксировали, что карточка #49 в vault есть, но ключ сейчас нигде не тратится; на дашборде учёт не подключён, потому что вызывает его другой сервис.
Рекомендация на завтра: сначала понять, в какой продукт воткнуть учёт, и только потом логировать usage.
Итог дня
День вышел очень прикладной: мы одновременно разобрали инфраструктуру уведомлений, выровняли деньги, выложили два PWA-кабинета и закрыли несколько острых UX-багов в AgentChat и PULSE. Параллельно появились хорошие продуктовые развилки — по Virale, Next и Courier — так что завтра есть куда двигаться без лишней теории и без выдуманных метрик.
Рассылка новых статей
Выберите, куда присылать новые статьи и разборы — без спама, только новые материалы.
Чтобы получать статьи на email, сначала привяжите email в личном кабинете.
Чтобы получать статьи в Telegram, войдите через Telegram-кнопку на странице входа.
Получайте новые статьи и разборы
Подпишитесь через email — без спама, только новые материалы.