Резюме · 2026 · удалённо

Владимир
Ершов Продуктовый инженер полного цикла

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

Формат
Удалённо · только
Ищу
Продукт или проект
Условия
Доля или фикс за этап
Telegram
@ershov_vladimir
Почта
ershovva83@gmail.com
Код
gitflic.ru · приватные репозитории
7 продуктов в боевой эксплуатации, написанных и поддерживаемых лично
10 000 телефонных номеров в пулах телеком-платформы: распределение и контроль
4 года в телеком-проекте, последние 2 — тимлидом команды из четырёх специалистов
13 языков в переводчике телефонного разговора реального времени
01

Продукты

Всё перечисленное спроектировано, написано и выведено в прод лично

Ariel — платформа «сеть сайтов + CRM»

в проде

архитектура · разработка · эксплуатация · с мая 2026, в бою с 3 июня 2026

Один код обслуживает сеть сайтов и сводит все обращения с них в одну воронку продаж — от клика по объявлению до подписанного договора.

CRM: воронка заявок по этапам с SLA, тегами и ответственными CRM: экран «Мой день» — новые без ответа, просроченный SLA, задачи на сегодня, сумма в воронке
демо-стенд CRM · по клику — в полный размер
  • Сеть сайтов. Десятки доменов на одной установке; новый сайт — запись в базе, а не правка конфигов. Тексты и картинки редактируются прямо на странице, без админки. Общий каталог товаров с индивидуальным набором и порядком позиций на каждом сайте, галереи, отзывы, вопросы-ответы, SEO-метаданные.
  • CRM. Воронка с этапами и подэтапами, произвольные поля под нишу, теги, задачи и отложенные напоминания, контроль просроченных, слияние дублей, архив, массовый перенос лидов между менеджерами, полная история обращений клиента.
  • Документы. Коммерческое предложение и договор формируются из карточки сделки — менеджер не собирает их вручную.
  • Все каналы в одном окне. Звонки с записью, привязанные к нужному сайту сети; переписка из Telegram, VK, MAX, Avito, SMS и «Одноклассников»; push менеджеру на телефон.
  • Сквозная аналитика. Стоимость заявки, стоимость продажи и возврат на рекламу по каждой кампании: данные тянутся из Яндекс.Директа, события звонков уходят в Метрику. Видно, какая кампания приносит деньги, а не клики.
  • Данные клиентов по 152-ФЗ. Аудит доступа, маскирование контактов, ежедневные копии в объектное хранилище, резервирование DNS.
  • Интерфейс для языковых моделей. Лиды, звонки с расшифровкой, переписки и аналитика доступны ассистенту напрямую — вопросы по базе задаются словами.

От старта разработки до первой заявки — 9 дней: работа началась 25 мая 2026, первый лид пришёл 3 июня. С тех пор через систему прошло 306 лидов и 774 звонка с расшифровкой и разбором — на трёх сайтах сети, силами одного отдела продаж. Скорость отдачи после тюнинга: ассет 37 → 3 мс, страница 96 → 72 мс.

PHP 8.2MySQLvanilla JS мультитенантностьтелефонияЯндекс.Директ API MCP152-ФЗnginx

Телеком-платформа телефонных консультаций

в проде

4 года в проекте, последние 2 — тимлидом · Франция и Бельгия

Клиент звонит консультанту: около 10 000 телефонных номеров в пулах разных операторов, маршрутизация вызовов, тарифы, расписания консультантов и мобильные приложения.

  • Распределение номеров. Служба перераспределения по расписанию с двумя стратегиями — статическая привязка консультанта к номеру и динамическая для маркетплейса. Алгоритм строит ожидаемый набор номеров, сравнивает с текущим и применяет разницу одной транзакцией с откатом; есть режим сухого прогона для проверки на стенде.
  • Динамический коллтрекинг. На витрине каждый посетитель получает свой номер — по тарифу, рекламной кампании и сессии, с промежуточным номером переадресации. Звонок связывается с визитом и с источником трафика.
  • Административная часть: консультанты и их расписания, тарифы и операторы, промокоды, отзывы с модерацией, проверка личности, роли и права доступа, выгрузки и статистика, отдельное API для мобильных приложений.
  • Контроль вместо тестов. Ограничения жёсткие: доступа к базе снаружи нет, журналов телефонной станции нет, а о сбоях узнают из жалоб клиентов. Поэтому проверка встроена в сам боевой код: после выполнения алгоритм доказывает себе, что результат корректен — нет дублей, нет осиротевших номеров, номер из своего пула, переадресация ведёт туда же. Расхождение пишется в журнал нарушений и уходит в Telegram.
  • Мониторинг инцидентов: отдельная служба приёма событий с фронта и бэкенда, маршрутизация по важности в Telegram и push, внешняя проверка доступности, ежедневная сводка. Каждый разобранный инцидент превращается в постоянную проверку.
  • Голосовые надстройки — разбор звонков, перевод разговора в реальном времени и объявления по расписанию — вынесены в раздел «Телефония и голос».

Встроенный контроль закрыл около 80 % классов регрессий без единой тестовой фикстуры — проверка идёт на живых данных, а не на стенде.

PHPCodeIgniter 4MySQL BunSvelteKitReact коллтрекингнаблюдаемостьTelegram

ERP позаказного производства

демо-стенд

собственный продукт · учёт для цеха на 10–50 человек · 2026 · готов к пилоту, ищу первого заказчика

Отвечает владельцу цеха на два вопроса, которые он задаёт вслух: успеваем ли к сроку и что заказ принёс на самом деле.

ERP: утренняя сводка — сроки, деньги, загрузка участков, дефицит на складе ERP: карточка заказа — позиции, успеваем ли к сроку, план против факта в рублях
сводка директора и карточка заказа · по клику — в полный размер
  • Техкарта — правило, а не бумага. Изделие описывается один раз; опции — длина, цвет, исполнение — меняют состав, а не только цену. Заказ сам разбирается в маршрут по участкам, потребность в материалах и время.
  • Себестоимость до запуска. Материалы и труд по статьям и минимальная цена, ниже которой заказ убыточен. Наладка входит в партию один раз — видно, насколько штучный заказ дороже партии.
  • План против факта в рублях: отдельно труд, отдельно материалы, а по материалам — переплатили при закупке или перерасходовали в цеху.
  • Сроки и узкое место. Очередь каждого участка в сменах: заказ, который не успевает, виден заранее, а не в день отгрузки. Материал под запущенные заказы распределяется в порядке срока — дефицит виден до того, как встал цех.
  • Брак заложен в запуск на всю глубину узлов: чтобы сдать 100 годных при 3 % брака, запускается 103. Отметка брака — с именем и расчётной массой; отходы возвращаются на склад по весу и уменьшают себестоимость.
  • Материал живёт партиями: у каждой закупки своя цена и дата, списание от самой давней — факт считается по настоящим накладным, а не по средней цене за год.

Каждая роль видит своё: владелец — деньги и сроки, мастер — работу без сумм, кладовщик — очередь выдачи. Сознательно не берёт на себя то, что у производства уже работает: расписание станков, раскрой листа, зарплату. Ставится на сервер заказчика, без абонентской платы за доступ к собственным данным.

BunHonoMySQL DrizzleSvelteKit

Landing Analyzer

в проде

собственный продукт · поведенческая аналитика · с 2026

Показывает, что посетители на самом деле делают на лендинге и на каком экране теряются.

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

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

BunSQLiteSvelteKit TailwindPlaywright152-ФЗ

«Юность»

в проде

платформа образовательной организации · монорепозиторий · 2026

Занятия, роли, внутренний чат и уведомления в приложении, которое ставится на телефон как обычное.

  • Голосовые сообщения в чате: запись, отправка, воспроизведение с волной на 40 полос, перемотка кликом, визуализация звука прямо во время записи. Одинаково работают на Android и iOS — под iOS запись и воспроизведение написаны отдельно.
  • Push-уведомления на телефон о новых сообщениях. Уведомление не приходит, если человек уже читает эту переписку.
  • Роли и права: доступ проверяется по владению данными, а не только по названию роли.
  • Файлы и записи хранятся в объектном хранилище, выкат на прод — автоматический по отправке в основную ветку.

Проект вёлся распределённой командой ролей — бэкенд, фронтенд, devops, архитектор — с общим планом и обязательным ревью.

Bun workspacesElysiaJSSvelteKit MySQLS3web-pushPWA

gruzpas

разработка

биржа грузоперевозок · обратный аукцион · с 2024, переписан в 2026

Клиент публикует задачу, перевозчики делают ставки, клиент выбирает исполнителя.

  • Закрытая доска. Перевозчик видит заказ, но не телефон клиента; контакт раскрывается только выбранному — на этом построена монетизация.
  • Клиент оформляет заявку квизом и получает ставки по ссылке из сообщения, вообще без регистрации.
  • Перевозчик работает через Telegram-бота: водитель не станет заполнять форму на сайте с телефона.
  • Каталог перевозчиков с профилем и рейтингом плюс посадочные страницы «услуга × город» — на них идёт поисковый трафик.
  • Рабочее место оператора: очередь заявок по корзинам (без ставок дольше 15 минут, ждут ответа клиента, зависшие), карточка заказа с журналом рассылки и лентой событий, ставка от имени перевозчика для холодного старта, приглашение перевозчика одной ссылкой.

Заложена возможность добавить пассажирское направление без переписывания: анкета и параметры техники хранятся данными, а не кодом.

LaravelMySQLTelegram Bot API TailwindAlpine

MyWayRent

в проде

платформа аренды автомобилей · веду с 2019 · текущая версия 2025 — 2026

Сайт аренды с каталогом, расчётом цены и бронированием.

  • Калькулятор: пять тарифных ступеней по длительности, высокий и низкий сезон, дополнительные опции — детское кресло, навигатор, второй водитель, ранняя выдача, поздний возврат.
  • Контент — автомобили, города, блог, вопросы-ответы, посадочные страницы — редактируется в привычной админке, сайт обновляется сам.
  • Отзывы подтягиваются с Яндекс.Карт по расписанию.
  • Заявка уходит менеджеру письмом, данные хранятся по 152-ФЗ, база копируется ежедневно.

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

BunTypeScriptSQLite WordPress APIPuppeteerpm2

Что ещё сделано

коротко
  • Генератор контента для соцсети: выпускает посты в голосе бренда по контент-плану. Опирается на разбор 800 постов восьми конкурентов — форматы, время публикации, работающие заходы.
  • Сервис выставления счетов с автотестами в непрерывной интеграции.
  • Автотесты и приёмка для мультиплатформенного продукта: сквозные сценарии, ночные прогоны, отчётность, аудит покрытия и приём проекта после ухода прежней команды бэкенда.
  • Административные панели и дашборды: разделение на независимо обновляемые части, вход по токенам, защита форм.
  • Сервис реального времени на веб-сокетах с адаптивной частотой опроса источника.
02

Телефония и голос

Редкая часть профиля: работа со звонком на уровне протокола, а не готового виджета

Перевод разговора

реальное время · 13 языков

Переводчик, включённый в живой телефонный звонок: слышит собеседника, переводит и говорит в линию, пока разговор идёт.

  • Тринадцать языков, направление определяется по самому звонку, а не по набранному добавочному.
  • Голос и манера речи настраиваются под конкретный сценарий; поддерживаются две схемы работы с общей историей разговоров.
  • Административная панель: сценарии, языки, голоса, журнал звонков.
  • Собственный телефонный агент и своя доставка звука — готовые библиотеки не держат ритм, и разговор рассыпается на десятой секунде.

Разбор звонков

расшифровка · анализ · интерфейс

Каждый разговор превращается в текст с автоматическим разбором и ложится в карточку клиента.

  • Рабочее место аналитика: карточки звонков, группировка по сотрудникам, графики за период, выгрузка диапазона, переход к нужному месту разговора кликом по расшифровке.
  • Диалог с ассистентом поверх расшифровки — можно спросить про содержание разговора словами.
  • Корректный учёт направлений и пропущенных: по пропущенному сразу ставится задача, чтобы клиент не потерялся.

Голосовые объявления

расписание · офисная громкая связь

Текст и время — на выходе объявление, которое само звучит в офисной колонке.

  • Расписание с часовыми поясами, очередь, журнал прозвучавшего и мониторинг: если объявление не прошло, об этом узнают.
  • Звук готовится под громкую связь — гонг перед текстом, выравнивание громкости, повтор дважды. Иначе объявление либо бубнит, либо оглушает.
  • Работает с чужой станцией, к которой есть только телефонный аккаунт и ничего больше.

Подключение к АТС

интеграция · маршрутизация

Подключаю CRM к телефонии при любом уровне доступа к станции — от готового HTTP-роута до собственного телефонного агента.

  • Звонок привязывается к нужному сайту сети, попадает в карточку и в воронку.
  • События звонков уходят в веб-аналитику: звонок считается конверсией наравне с заявкой с сайта.
  • Автоматические задачи по пропущенным и корректная работа с записями разговоров.
03

AI и языковые модели

Не «прикрутить чат», а вывести модель в прод и научиться измерять её качество

Доступ модели к системам

три сервера в проде

Ассистент отвечает на вопросы по боевым данным компании — без выгрузок и отчётов.

  • CRM: лиды и история активностей, звонки с расшифровкой и разбором, переписки мессенджеров, клиенты с маскированием контактов, аналитика по кампаниям, справочники. Доступ ограничен областью выданного токена.
  • Аналитика сайтов: трафик, каналы, качество кампаний, ключевые фразы, воронки и точки обрыва, связка визита с заявкой.
  • База знаний: хранилище решений и фактов с тегами и поиском.

Генерация текстов

с контролем качества

Поток текстов без ручного ввода, где качество не оценивается на глаз, а проверяется автоматически перед выпуском.

  • Проверки на выпуск: длина и ритм, повторы между текстами, запрещённые обороты и штампы, однообразие построения, обещания и советы, которых давать нельзя.
  • Забракованный текст переписывается с точечными замечаниями, а не целиком — и берётся лучший из полученных вариантов.
  • Смысл задаётся системой, модель отвечает только за язык: тема, угол подачи и форма приходят из расчёта, а не из фантазии модели.
  • Отдельный режим сравнения вариантов промпта на серии прогонов — чтобы отличать реальное улучшение от разброса.

Эксплуатация моделей

лимиты · стоимость · отказы

Регулярный выпуск укладывается в бесплатный тариф провайдера и не падает на лимитах.

  • Собственный регулировщик темпа по остатку лимита, обработка отказов, автоматическое переключение между моделями при исчерпании квоты.
  • Расход каждого выпуска пишется в его метаданные — стоимость видна, а не угадывается.
  • Голосовые модели: синтез речи и распознавание в реальном времени, с их тарифными и техническими ограничениями.

Свои расчёты

там, где модель не знает ответа

Всё, что можно посчитать, считается кодом — модели остаётся только формулировка.

  • Астрономический движок без внешних зависимостей: положения планет и Луны, фазы, обратные движения на любую дату. Точность лучше одной угловой минуты, проверена по независимым опорным точкам.
  • Векторные представления текста и классические методы там, где они дешевле и предсказуемее модели: карта оценок по отзывам, перенос поведенческого знания между лендингами.
04

Инфраструктура и эксплуатация

Прод, который некому чинить кроме меня — поэтому он спроектирован не падать

Работа и доставка

серверы · выкаты · скорость

  • Настройка и сопровождение серверов: веб-сервер, сертификаты с автопродлением, службы автозапуска, разделение проектов на одной машине.
  • Автоматический выкат из репозитория, ночные прогоны тестов, откат к предыдущей версии.
  • Ускорение отдачи: современный протокол, постоянные соединения, кеширование статики. Измеримый результат — ассет с 37 до 3 мс.
  • Переезд боевой площадки без простоя: обе площадки работают параллельно, переключение по DNS занимает пять минут и так же откатывается.

Надёжность и данные

бэкапы · доступ · соответствие

  • Ежедневные копии баз и файлов в объектное хранилище с проверкой восстановления.
  • Резервирование DNS, мониторинг доступности и сертификатов с оповещением до того, как заметит клиент.
  • Пароли и ключи не лежат в коде: подставляются в момент запуска, есть регламент ротации.
  • Защита от перебора и лишнего трафика, ограничение доступа к служебным интерфейсам, аудит доступа к персональным данным и трек соответствия 152-ФЗ.
05

Стек

Инструмент выбирается под задачу и ограничения площадки, а не наоборот

Бэкенд

  • PHP 8 без фреймворка, Laravel
  • Bun, TypeScript, Hono, ElysiaJS
  • Node.js
  • Python — интеграции, телефония
  • MySQL 8, PostgreSQL, SQLite
  • Drizzle, Zod, MongoDB

Фронтенд

  • SvelteKit, Svelte 5 runes
  • React
  • Tailwind CSS v4, shadcn
  • PWA, мобильная адаптация
  • Vanilla JS без сборки
  • Серверный рендеринг: EJS, Blade

Интеграции

  • SIP, RTP, Asterisk, Sipuni
  • Telegram, VK, MAX, OK, Avito, SMS
  • Яндекс.Директ, Метрика, VK API
  • Синтез и распознавание речи
  • Веб-сокеты, вебхуки, push
  • Объектное хранилище, платежи
06

Как я работаю

Как принимаю решения и почему довожу до эксплуатации, а не до сдачи
01

Считаю деньги, а не только строки кода

Разобрал руками все 43 обращения, застрявшие в статусе «не дозвонились». Оказалось: 24 из них потеряны не клиентом, а системой — медиана до первого звонка 22 часа при норме в минуты, у части не было и двух попыток, SMS не ушло ни одного. В этой куче висел человек с подтверждённым интересом почти на 300 тысяч. Вывод владельцу был не «нужно больше рекламы», а «почините первое касание».

02

Влезаю в предметную область, а не только в стек

Чтобы написать распределение номеров, пришлось разобраться в тарифах и пулах операторов. Чтобы построить воронку мебельного производства — в цикле от замера до монтажа. Чтобы считать налог самозанятого — в правилах НПД. Чтобы вести склад металла — в прослеживаемости плавки, которую требуют пищевые клиенты. Без этого получается технически исправная система, которой никто не пользуется.

03

Решаю, чего не делать

Отклонённое обосновываю так же подробно, как сделанное — включая собственную работу. Разобрал свою первую версию продукта и признал: дешевле переписать, чем латать. Причём корень был не в стеке, а в том, что на сайте не стояло ни одной формы, и жалоба «реклама не даёт заявок» была непроверяемой в принципе.

04

Поломка должна быть громкой

Худший отказ — тихий: заголовок безопасности, который молча не применился; запись звука, которая отдаёт тишину; проверка текста, которая не срабатывает на кириллице. Симптом всегда один — результат выглядит слишком хорошо. Поэтому защиту проверяю на заведомо плохом входе, а инцидент заканчивается автоматической проверкой, а не заплаткой.

05

Гипотеза проверяется прототипом, а не совещанием

Стоимость проверки идеи за последние годы упала на порядок, и это изменило не скорость набора кода, а то, какие решения вообще можно принимать. Раньше «строить или не строить» решалось догадкой, потому что проверка стоила квартал. Теперь она стоит неделю — и догадка заменяется фактом. Поэтому предпочту работающий прототип через неделю идеальному плану через квартал: план проверить нечем, прототип показывает правду.

Спор «допустимо ли пользоваться моделями» считаю решённым — вопрос в том, как выстроить работу, чтобы результату можно было доверять. У меня это выстроено, а не стихийно: агенты разведены по ролям — бэкенд, фронтенд, инфраструктура, архитектурное ревью; у проекта есть письменные правила и общая память между сессиями; модели дан прямой доступ к боевым данным через собственные интерфейсы; сделанное принимается только живым запуском. Где у модели потолок, знаю по замерам, а не по ощущениям, и туда её не ставлю.

Граница простая: ускоряется проверка, а не мышление. Архитектура, выбор компромиссов и ответственность за то, что работает в проде, остаются на мне.

06

Веду команду, когда команда нужна

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

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

07

Довожу до прода и остаюсь с ним

Продукт сделан не тогда, когда закрыта задача, а когда он работает у клиента. Всё перечисленное выше я не только написал, но и держу в эксплуатации сам: серверы, выкаты, резервные копии, мониторинг и разбор инцидентов. Поэтому и проектирую с расчётом, что чинить это ночью придётся мне — а значит, чинить должно быть нечего.

07

Лаборатория

Некоммерческие исследования — то, чем занимаюсь для удовольствия

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

Noema

когнитивная архитектура

Собеседник без языковой модели внутри: память эпизодов и долговременная память, образное полушарие, планировщик реплики и отдельный слой её проговаривания, чувства как оценка событий, фоновая работа во время простоя. Независимость от внешней модели подтверждена контрольной проверкой.

HoloBase

весовая база данных

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

Images Engine

псевдоголограммы

Изображение, которое выглядит объёмным на обычном экране телефона. Разобрано, что работает параллакс движения, а не стереопара: искажение под одну точку зрения, слои, наклон устройства в руках, слежение за головой через камеру.