Leonard Babakov - solo product engineer_

Пишу CRM и мобильные приложения под ключ

Это не портфолио агентства - я работаю один, от бизнес-задачи до кода: технология здесь средство, не цель. Ниже - реальные проекты, каждый сам довёл до результата, который видно в цифрах.

NEXT.JS 15 SUPABASE N8N FLUTTER PYTHON FIGMA SELF-HOSTED

Кейс 01

ТвойCRM под конкретный бизнес

в проде
Роль
Архитектура и весь стек, соло
Живой продукт
Посадочная
Данные
Хранится на российском сервере, не за рубежом
Документация

CRM разворачиваю под конкретный бизнес - никакой готовой коробки с зашитыми полями. Термины, стадии сделок, типы клиентов настраиваются в справочниках, без правки кода. Школы и дистрибьюторы - готовые вертикали уже сегодня, частный случай платформы, не её потолок.

Заявка из Telegram-бота или голосовая заметка менеджера сама попадает в карточку сделки - никто не тратит вечер на перенос переписки в таблицу. У каждого клиента - своя отдельная база: чужие данные физически не смешиваются с вашими, даже по ошибке.

  • 5 компаний работают уже сейчас, каждая в своей отдельной базе данных
  • Ежедневные резервные копии на отдельном сервере, восстановление проверено вручную
  • Обновления выкладываются одной командой и откатываются сами, если что-то пошло не так
  • Документация - часть сдачи проекта: что сделано, почему и как это работает, веду и обновляю по ходу работы, не задним числом
  • Тот же движок стал основой аналитического модуля для CRM клиента (Кейс 03) и линии Telegram-ботов (Кейс 04) - платформа оказалась шире одного клиентского проекта
  • Написана с нуля - под новый бизнес достаточно завести справочники, ядро трогать не нужно
Как это устроено

Изоляция данных - на уровне базы: у каждого клиента своя схема Postgres и свои политики Row Level Security - никакого общего флага tenant_id поверх одной таблицы. Термины, стадии сделок и поля читаются из справочников - под нового клиента с другой терминологией не нужен деплой.

Заявки из Telegram-бота и голосовые заметки менеджеров попадают в CRM через n8n - без no-code коннекторов, прямыми запросами к Telegram Bot API и REST. Голос проходит AI-структуризацию перед тем как лечь в карточку сделки. Инфраструктура своя: VPS, self-hosted Supabase, свой n8n, своя аналитика - сам решаю, что живёт на своём сервере, а что уходит во внешний API.

Документация ведётся по ходу работы, не пишется задним числом под сдачу: тематический журнал решений и ошибок (n8n, деплой, фронтенд, доступы, БД), живая схема базы, карта архитектуры, changelog с версиями.

Next.js / React Supabase Postgres · RLS · RPC n8n Voice → AI структуризация Telegram

Кейс 02

Приложение-компаньон Ignis для диагностического прибора

в проде
Роль
Приложение, защита данных, бренд
Живой продукт
Платформы
iOS (PWA), Android, macOS
Стадия
Собственный продукт, разработка
Документация

Мобильное приложение-компаньон для физического диагностического прибора - подключаешься по коду, как к беспроводным наушникам, только вместо звука получаешь показания прибора в реальном времени.

Приватные ключи никогда не покидают защищённое хранилище телефона - так же, как банковское приложение прячет данные карты. На iPhone приложение ставится прямо из браузера, без App Store и платного аккаунта разработчика. Чтобы тестировать без физического прибора, написал его цифровой двойник - удалённые тестировщики подключаются к виртуальному прибору так же, как к настоящему.

  • Свой эмулятор прибора - тестирование не привязано к железу
  • Шифрование собственного протокола, не сторонняя готовая библиотека
  • Установка на iPhone в три касания, без App Store
  • Журнал решений и ошибок - тот же принцип, что и в ТвойCRM: видно, что и почему сделано, не только готовый результат
Как это устроено

Приложение на Flutter, приватные ключи в Keychain/Keystore. Протокол шифрования - на базе Ed25519/crypto_box, байт-совместимый Dart-порт PyNaCl, не готовая библиотека "из коробки".

Для тестирования без физического устройства написан отдельный эмулятор прибора и облачный WebSocket-мост на своём сервере. Логотип и бренд-система собраны в Figma, не нарисованы руками поверх кода.

Журнал решений и ошибок разбит на отдельные файлы по процессу, приложению, сборке, реверс-инжинирингу и безопасности, с автоматической проверкой на дубли номеров перед каждым коммитом.

Flutter App iOS · Android · macOS Ed25519 Cloud bridge WebSocket, свой VPS Прибор Эмулятор

Кейс 03

Аналитический дашборд для отдела продаж

в проде
Роль
Интеграция и аналитика данных, соло
Клиент
Онлайн-школа иностранных языков, NDA
Платформа
Движок ТвойCRM - n8n + Supabase
Синк
amoCRM → дашборд каналов, каждые 15 минут
Данные
Хранится на российском сервере, self-hosted

Тот же движок, что несёт ТвойCRM (Кейс 01), только развёрнутый поверх системы клиента - amoCRM у него уже была. Проблема была не в CRM, а в статистике: часть лидов туда попадала, а дашборд с воронкой продаж их не видел. Почти половина лидов на графике значилась просто «Прочее» - деньги на рекламу тратились, а куда шёл каждый второй лид, никто не мог сказать.

Подключил amoCRM к дашборду по API - данные обновляются сами каждые 15 минут, без ручной выгрузки и экселя. Перед тем как включить обновление на боевых данных, сверил всё с реальными сделками клиента: выручка по факту лежала не там, где её ожидали найти. Без этой проверки каждая продажа в отчётах показывала бы ноль.

  • Тот же проверенный движок, что и у ТвойCRM: модуль вырос на платформе, которая уже работает в проде
  • Воронка стала полной - канал, который раньше вообще не считался, теперь виден в общей картине бюджет→выручка
  • Ошибка с выручкой поймана до отчёта клиенту, а не после - иначе каждая продажа отображалась бы нулём
  • Половина «потерянных» лидов теперь на виду - вместо одной цифры «Прочее» видно, откуда они реально пришли
  • Готовая интеграция с amoCRM - для новой компании на той же CRM подключается быстро, а метрики и воронка каждый раз настраиваются под конкретный бизнес, не под шаблон
  • Бюджет и продажи в одном месте - тем же способом ежедневно синкаются траты Google Ads и Яндекс.Директа, дашборд видит расход и выручку по каждому каналу
Как это устроено

Фундамент тот же, что у ТвойCRM: self-hosted n8n и Postgres/Supabase, один и тот же паттерн сервисных функций для записи данных. Синк с amoCRM подключается как ещё один источник данных к уже работающей платформе.

Данные забираются опросом каждые 15 минут, а не через подписку на события amoCRM - так надёжнее: если один тик пропущен, следующий подхватит те же данные, а задвоения не будет, потому что защита стоит на уровне базы данных, а не в логике скрипта.

Перед запуском все цифры сверялись с живыми сделками клиента, а не с описанием API. Так нашлась ошибка с полем выручки и выяснилось, что этапов воронки на деле почти вдвое больше, чем предполагалось изначально - решение по спорным статусам согласовали с клиентом, а не додумали сами.

Заодно навели порядок в источниках трафика: почти полсотни разных значений в CRM были размечены лишь частично, остальное тихо проваливалось в «Прочее». Точные совпадения поправили сразу, а сырое значение источника стали сохранять отдельно - чтобы новый, ещё не размеченный канал было видно в отчётах, а не терять его молча.

Следующий шаг, пока не реализованный: предиктивная аналитика - прогноз выручки по каналу на основе текущей динамики воронки, а не только факт за прошлый период.

amoCRM n8n опрос каждые 15 минут Supabase без задвоений Дашборд каналов

Кейс 04

Три бота для одной онлайн-школы

в проде
Роль
Архитектура и весь стек, соло
Клиент
Онлайн-школа иностранных языков, NDA
Стек ботов
Python, Telegram + Пачка API
Ботов в проде
3, четвёртый - уже на готовом конвейере
Правило
Ни один бот не пишет в боевые системы без подтверждения человека

Три бота под одного клиента, разные задачи, общая архитектура: каждый готовит результат, а подтверждает его человек.

Личностные квиз-боты

Telegram-бот от лица персонажа - Мари, Карен, дальше по очереди. После короткого квиза о характере бот сразу передаёт менеджеру готовый разбор результатов - тот открывает диалог не с чистого листа, а уже зная, что предложить, и именно это поднимает конверсию, а не сам факт квиза. Конвейер: у каждого нового персонажа - готовый чек-лист по медиа и автоматическая проверка перед запуском, четвёртый бот собирается быстрее третьего.

Бот диагностики ученика

Ученик проходит тест по личной ссылке - уровень и вероятные пробелы считаются сами. Преподаватель открывает карточку ученика прямо в Пачке и по шагам заполняет разбор: сильные стороны, зону роста с примером с занятия, цель. На выходе - готовый брендированный отчёт и учебный план, сразу понятный и ученику, и родителю.

Бот учёта совещаний

Личный статус сотрудник надиктовывает голосом - бот сам раскладывает его по задачам в Яндекс Трекере и статьям в Яндекс Вики. С общим созвоном осторожнее: несколько голосов без разметки бот не берётся разносить с той же уверенностью, поэтому такие находки приходят карточками-кандидатами и ничего не создают в рабочих системах, пока их не подтвердит человек.

  • Три бота, один принцип - подтверждение человеком перед любой записью в боевые системы
  • Конвейер вместо разовой сборки - новый квиз-бот выходит на готовых чек-листах и проверках
  • Python - отдельный стек под ботов, независимый от CRM-стека на Next.js и n8n

Кейс 05

Таро-сервис с ИИ и памятью о каждом пользователе

в проде
Роль
Продукт, архитектура и код, соло
Продукт
Собственный: @airustarotbot, ВКонтакте и сайт
Стек
Python, aiogram, FastAPI, PostgreSQL, n8n, Yandex Cloud AI
Оплата
ЮKassa с СБП, абонемент и рефералка
Каналы
Telegram, ВКонтакте и сайт: одна база и один кабинет
Привлечение
Своя автоматизация ВК на n8n с ежедневной проверкой качества
Данные
Сервер, база и модели в России

Сервис раскладов Таро в Telegram, во ВКонтакте и на сайте: карты толкует нейросеть. Таких ботов десятки, этот отличается памятью: он знает, с кем говорит, и толкует карты про конкретного человека, в каком бы канале тот ни появился.

При знакомстве бот задаёт семь коротких вопросов: имя, дату рождения, что сейчас занимает мысли, каким тоном говорить. По дате он сразу считает карту рождения и показывает её. Дальше бот сам выписывает из каждого вопроса людей и дела, а когда срок из вопроса проходит, спрашивает: «Как сложилось?». Следующее толкование уже знает, что сбылось, какие карты выпадали раньше и о ком человек спрашивал в прошлый раз.

Один человек, три входа

Бот работает в Telegram и во ВКонтакте, сайт raskladnik.ru показывает те же расклады и тот же кабинет. Вход через Telegram или ВК ID склеивает историю: расклады, память о человеке и итоги «Как сложилось?» остаются одним профилем в любом канале. Оплата идёт через ЮKassa с СБП.

Сайт под поисковый трафик

У каждой из 78 карт своя страница значений, отдельные страницы есть у чисел и у частых запросов вроде гадания на отношения. Всего в карте сайта больше 240 страниц. Структура строилась от реальных поисковых запросов, а каждый текст перед публикацией проходит проверку скриптом: названия мастей и запретные формулировки. Сайт написан на FastAPI и Jinja2, работает на отдельном сервере, подключена Яндекс Метрика.

Привлечение людей в ВК

Отдельная автоматизация на n8n ведёт людей в сообщество и к боту. Профили отбираются по открытой странице и свежим постам, под постом ставится короткий комментарий по теме, затем лайк и заявка в друзья, а принявшему заявку на следующий день приходит приглашение. Есть дневной лимит, случайные паузы между контактами и один повтор, больше касаний нет. Никакой маскировки текстов и писем незнакомым. Качество комментариев разбирается каждый день по правилам, а пользу повторного касания проверяет контрольная группа.

Кельтский крест из бота: десять карт Таро разложены крестом и столбиком, у каждой номер позиции
Кельтский крест: бот раскладывает 10 карт одной картинкой, как на столе, и открывает их по одной, пока нейросеть пишет толкование.
  • Память о человеке - портрет, люди и дела из вопросов, итоги прошлых раскладов попадают в каждое толкование
  • Три канала, один профиль - Telegram, ВК и сайт читают одну базу, вход через Telegram или ВК ID склеивает кабинеты
  • Сайт под поиск - страницы всех 78 карт, чисел и частых запросов, тексты строятся от реальных запросов и проверяются перед публикацией
  • Привлечение людей в ВК - отбор профилей, комментарий по теме, заявка в друзья, приглашение на следующий день, лимиты и ежедневный разбор качества
  • Оплата и абонемент - первый Кельтский крест в подарок, дальше предпросмотр: карты и первый блок бесплатно, остальное открывается сразу после оплаты через ЮKassa с СБП; абонемент на 1-12 месяцев и неделя в подарок за друга, сделавшего первую оплату
  • Проверки, умеющие падать - журнал событий и 18 проверок данных вида «если было X, обязано быть Y»: оплачено - значит выдано, срок вопроса прошёл - значит спросили. Самопроверка ломает каждую нарочно и требует, чтобы она покраснела
  • Данные в России - сервер, база и модели Yandex Cloud; Telegram-ID и логин в модель не передаются
Все возможности бота
  • Бесплатно - три карты, да / нет, карта дня с утренней рассылкой, уточняющая карта, до трёх раскладов в день
  • Кельтский крест - первый блок толкования отвечает прямо на вопрос: по частям и по срокам, которые человек назвал
  • Копнуть глубже - второй слой толкования к раскладу на три карты
  • Знакомство - семь вопросов и карта рождения по нумерологии старших арканов
  • Числа - нумерология по дате, значения чисел собраны на отдельных страницах сайта
  • Характер таролога - мистик, психолог или друг подбирается по ответу «Таро для вас - это…»
  • Обращение по имени - род бот определяет сам, при двусмысленном имени вроде Саши спрашивает, а до ответа пишет без родовых окончаний
  • «Как сложилось?» - по сроку из вопроса: сбылось, отчасти, нет или рассказ своими словами
  • Карта жизни - люди, дела, частые темы и карты, которые возвращаются, в кабинете пользователя
  • Контроль у человека - всё, что бот помнит, видно в кабинете; любой факт можно стереть, кнопка «Забыть мой портрет» стирает всё
  • Тестеры - доступ по ссылке-приглашению без оплаты и команда /bug разработчику
  • Бережность - на тревожные фразы бот отвечает телефонами доверия вместо гадания
  • Устойчивость - повторное нажатие кнопки при обрыве связи отбрасывается, двойного ответа нет
Как это устроено

Python и aiogram, база - PostgreSQL в собственной Supabase на сервере в России. Толкование опирается на 348 выжимок из десяти книг о Таро: бот находит их точно по карте и её положению, модель получает их как материал и пересказывает своими словами.

Бот и сайт делят ядро: толкование, память и оплата лежат в общем коде, поэтому Telegram, ВК и сайт отвечают одинаково. Люди из разных каналов связываются таблицей способов входа: Telegram и ВК ID ведут в один профиль.

Журнал событий записывает каждое нажатие и каждый вызов Telegram с итогом. На нём стоят 18 проверок данных: они запускаются раз в день, а по понедельникам присылают отчёт «всё зелёное», чтобы тишина не читалась как «всё хорошо». Самопроверка ломает каждую проверку нарочно в блоке с откатом и требует красного результата.

Каждое толкование получает сжатый портрет: анкету, факты и людей из прошлых вопросов, итоги прошлых раскладов. Отдельной строкой идут сигналы, которые человек должен заметить: выпала его карта рождения или карта, которая возвращается третий раз за месяц.

Модели Yandex Cloud: быстрая Alice AI Flash на бесплатных раскладах и крупная Qwen3-235B на платных. Срок для «Как сложилось?» модель называет датой, а дни считает код: в арифметике дат модели ошибаются.

Оплата идёт через заказ. У креста толкование пишется ещё до оплаты, поэтому закрытые блоки приходят сразу после неё. Весь путь денег от подарка до абонемента прогоняется тестом с настоящей базой и моделью.

Вопрос и карты Память портрет, люди Модель + книги о Таро Толкование про человека Как сложилось? итог в память

07

Рабочий стек

Список ниже - для тех, кому интересно заглянуть под капот. Разбираться в нём не нужно - выбор инструментов остаётся моей заботой, даже если стек заказчика устроен иначе. Нанимают за результат.

Frontend / UI
Next.js 15 (App Router) React 19 TypeScript Tailwind CSS 4 shadcn/ui · Radix Flutter
Данные и бэкенд
PostgreSQL Supabase (self-hosted) Row Level Security RPC / PL-pgSQL JSONB-схемы
Автоматизация
n8n (self-hosted) amoCRM API Google Ads API Яндекс.Директ API Webhooks
Боты
Python Telegram Bot API aiogram Telegram Stars / Payments Yandex Cloud AI Studio Пачка API Яндекс Трекер API Яндекс Вики API Whisper (self-hosted) GPT-совместимая модель
Безопасность и крипто
Ed25519 / crypto_box Keychain / Keystore RLS-аудит доступа
Инфраструктура
VPS (nginx, pm2) Скриптованный деплой Бэкапы БД Self-hosted аналитика
Дизайн и бренд
Figma Дизайн-токены Айдентика и лого
Процесс
Claude Code Дисциплина миграций Журнал решений и ошибок

08

Расскажите о задаче

Если задача не мой профиль - скажу сразу, без недели вежливой переписки. Дизайн с нуля - честно, не моя сильная сторона. А вот готовую дизайн-систему или референсы возьму и доведу до рабочего интерфейса без потерь.

  • Асинхронно - без обязательных созвонов по расписанию, пишу и отвечаю по мере готовности
  • ТЗ - хоть голосовым в Telegram: наговорили мысль, я сам оформлю её в план
  • План согласуем - и сразу в работу, без долгих раскачек
  • Каждая правка видна сразу на превью-ссылке - не нужно ждать демо-звонка, чтобы понять, что происходит с вашим заказом

LEONARD BABAKOV - SOLO PRODUCT ENGINEER - VOLZHSKY, RU

Превью деплоится автоматически при каждом обновлении - уведомление в Telegram-бот подтверждено