AValeradev12Написать
Алексей МатвиенкоMobile · Frontend · Backend

Делаю продукт целиком — от гипотезы до выручки.

Сильнее всего во фронтенде, большой опыт в мобильных приложениях на React Native. Пишу бэкенд, настраиваю CI/CD и серверы — руками и вместе с ИИ-агентами.

Pronto test DGTсвой движок карточек
Story Pulseквесты с ИИ-ведущим
4+ года
в React Native
3 стора
Google Play, App Store и RuStore — публиковал сам
12
принятых PR в open source
2009
первый проект с настоящей аудиторией — forws.net
00 · Коротко

Что обычно спрашивают первым

— В чём ты сильнее всего?

Во фронтенде и мобильных приложениях: интерфейсы, жесты, анимации, производительность, сборки и релизы в сторы. Бэкенд пишу регулярно — GraphQL и Node.js, NestJS с PostgreSQL, фичи на .NET — и могу провести фичу от миграции до экрана.

01 · Руками и с ИИ

Код руками — и с ИИ-агентами

Я начинал задолго до ИИ-агентов: каталог forws.net на PHP, WPF в университете, потом несколько лет коммерческой разработки мобильных приложений и бэкенда — всё руками. Поэтому понимаю, что генерирует модель, и вижу, где она ошибается. С агентами ускоряюсь в разы — и сам решаю, где им можно доверять.

До ИИ-агентов

Руками

Весь код писал сам — от доработок PHP-каталога в 2009-м до медицинских и финтех-приложений. Отсюда привычка читать код, профилировать и доходить до причины.

  • Каталог forws.net на PHP — первый продукт, которым пользовались люди
  • Плеер треков взгляда на WPF для исследований с айтрекером
  • Медицинские приложения с Bluetooth: React Native и .NET
  • Карта на 13 000 точек и 4 принятых PR в её библиотеку
  • Свой движок карточек на Reanimated — от профилирования до UI thread
  • ERP в телеграм-боте на NestJS: клиенты, склад, заказы, работы
С ИИ-агентами

В разы быстрее

Несколько агентов параллельно пишут, тестируют и выкладывают, а я ставлю задачи и проверяю результат. Так вторую версию Multstand Hub — веб-приложение со СДЭК и генератором документов — собрал примерно за месяц.

  • Story Pulse: веб, Telegram Mini App и iOS/Android из одного кода, сервер и движок ИИ-ведущего
  • Multstand Hub: ERP из телеграм-бота стала веб-приложением со СДЭК и своим генератором документов
  • Инструкции для агентов лежат в одном пакете и подключаются во все мои проекты
  • Партии Story Pulse проходят ИИ-игроки и оценивают их — это плейтесты
  • Агент открывает нужный экран Storybook по диплинку и проверяет его сам

Прод компании

ИИ — напарник. Архитектурные решения и code review — мои, и отвечаю за них я. Не «ИИ сделал, я запушил».

Прототипы и свои продукты

Выстраиваю работу сразу нескольких агентов, каждый в своём worktree: прототип, разработка, отладка, тесты, деплой. Моя часть — задачи, проверка и слияние.

Сервер и выкладка

Поднимаю и настраиваю серверы, разворачиваю и поддерживаю приложения. Дома работает Proxmox с множеством LXC-контейнеров под разные задачи.

02 · Проекты

Семь IT-проектов и два офлайн-бизнеса

  1. 01Платформа для сотрудников ВкусВиллаAlly SoftwareFullstack-разработчик1 месяц
  2. 02Pronto test DGTDevarchReact Native-разработчик7 месяцев
  3. 03«Счёт-бухгалтеру»ИнвойсбоксReact Native-разработчик, один на приложении1 год 8 месяцев
  4. 04Prisma App и LuisaMCC-SOFTReact Native + backend на .NET2 года 3 месяца
  5. 05Онлайн-квесты с ИИ-ведущимStory PulseFullstack, свой стартап
  6. 06Multstand HubMultstandСвой проект: первая версия руками, вторая — с ИИ-агентами
  7. 07AleraplanAleraplanСвой проект, один
  8. 08Мультисториясеть мастерских мультфильмовСооснователь и руководительс 2013
  9. 09Мультстанкиmultstand.ruПроектирую и произвожу станкис 2016

Коммерческие проекты

01
Ally Softwareкоммерческий1 месяц

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

Платформа для сотрудников ВкусВилла. Сервис, в котором десятки тысяч сотрудников ВкусВилла работают с графиком смен, календарём, заявками и базой знаний. Веб, мобильное приложение и GraphQL-сервер — в одном монорепо.Fullstack-разработчик

1кнопка вместо объяснений

Отчёт одной кнопкой

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

read-onlyпо умолчанию данные не меняются

Отладка глазами пользователя

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

ADRрешение описано для команды

Общие модули платформы

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

1 запросна весь список сотрудников

Место работы и ближайшая смена

В профиле сотрудника — на вебе и в мобильном приложении — появились места работы и ближайшая смена. Для списка сотрудников сервер загружает эти данные одним запросом к базе, а не отдельным на каждого; ближайшей считается и смена, которая уже идёт.

  • React 19
  • React Native
  • Expo
  • GraphQL
  • Apollo
  • Node.js
  • PostgreSQL
  • Jest
02
Devarchкоммерческий7 месяцев

Подписки в двух сторах, свой движок карточек и переписанное ядро

Pronto test DGT. Приложение для подготовки к экзамену на водительские права в Испании: тесты по билетам, теория, перевод вопросов, платная подписка.React Native-разработчик

3источника промокода

Подписки и промокоды

Я подключился к проекту на стадии прототипа, до публичного релиза. Настроил подписки в Google Play и App Store и свёл их в RevenueCat. Готовый paywall RevenueCatUI заменил своим: цена в пересчёте на день, размер скидки, восстановление покупки, ввод промокода и ожидание, пока backend подтвердит Premium. Промокод приходит из AppsFlyer при установке, из диплинка или вручную; незавершённая активация продолжается после перезапуска, а если код пришёл из нескольких источников, конфликт разрешается по правилам.

0Redux в модуле тестов после переработки

Переписал ядро продукта

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

UI threadжесты и позиционирование

Движок карточек

Карточки вопросов листаются свайпом на собственном движке на Reanimated и Gesture Handler. Начал с профилирования и встроил в движок диагностику, дальше правил по её показаниям: убрал лишние React-рендеры, перенёс жесты и позиционирование на UI thread, добавил оконный рендеринг и приоритетную загрузку. Зависания, пропущенные свайпы и пустые карточки на слабых устройствах пропали.

FSDграницы слоёв в ESLint

Инженерная база

Перевёл приложение на FSD и закрепил границы слоёв своими правилами ESLint — нарушение ловится до ревью, как и случайный импорт Storybook в продакшен-сборку. Поэтапно обновил React Native с 0.76 до 0.86 и перевёл приложение на New Architecture. Storybook открывается по диплинку в отдельной QA-сборке без Metro, поэтому нужную историю запускают и тестировщик, и ИИ-агент; для этого пришлось патчить сам Storybook.

live codingв настоящем приложении на эмуляторе

Найм и команда

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

  • React Native
  • TypeScript
  • Reanimated
  • Gesture Handler
  • Redux Toolkit
  • TanStack Query
  • OpenAPI codegen
  • RevenueCat
  • AppsFlyer
  • Sentry
  • Storybook
  • Unistyles
  • FSD
  • Jest
Все задачи и результаты50 пунктов
Оплаты и промокоды
  • Настроил продукты подписок в Google Play и App Store, объединил управление через RevenueCat, реализовал полный цикл покупки и восстановления.
  • Промокоды из трёх источников: атрибуция установки AppsFlyer, deep links и ручной ввод.
  • Проверка и активация через backend с отдельной обработкой истёкших, использованных и недоступных пользователю предложений.
  • Восстановление незавершённого flow после перезапуска приложения.
  • Разрешение конфликтов, когда промокод приходит сразу из нескольких источников.
  • Заменил RevenueCatUI paywall на собственный: выбор тарифа, покупка, восстановление, подтверждение Premium через polling backend после покупки, ввод промокодов, корректные для платформ размеры скидок.
  • Серверно-управляемые промо-офферы и flash-sale баннеры с обратным отсчётом.
Переписанный модуль тестов
  • Заменил legacy-реализацию, где множество компонентов меняло взаимосвязанные поля Redux, модулем с единым состоянием сессии и однонаправленным потоком данных.
  • Написал кастомный движок карточек на Reanimated и Gesture Handler со встроенной диагностикой.
  • Профилировал скорость рендеринга компонентов, оптимизировал дерево, убрал лишние React-рендеры и задержку реакции на нажатия.
  • Перенёс управление жестами и позиционированием на UI thread — анимации перестали зависеть от загрузки JS thread.
  • Оконный рендеринг, разреженный кэш, приоритетная загрузка карточек.
  • Устранил зависания, пропуски свайпов и пустые карточки при быстрой навигации, в том числе на слабых устройствах.
  • Заменил рваные переходы между состояниями плавными управляемыми анимациями.
  • Реализовал сложный дизайн карточек без потери производительности: переключение языка по удержанию, анимированная смена градиента по ответу, bottom sheet с теорией, Markdown в вопросах и ответах, подсказки, просмотр результатов.
Архитектура
  • Поэтапно перевёл структуру «всё в одном» на FSD: разделил UI, бизнес-логику и работу с данными, сократил глобальное состояние.
  • Написал собственные ESLint-правила, которые автоматически проверяют границы FSD-слоёв и code style.
  • Внедрил Storybook для изолированной разработки и проверки UI-компонентов.
  • Добавил ESLint-ограничения, исключающие попадание Storybook-кода в production.
  • Мигрировал bottom sheets с Gorhom на TrueSheet под единым интерфейсом, решив platform-specific проблемы прокрутки, клавиатуры и safe area.
  • Перевёл стили со Styled Components на Unistyles 3.
Атрибуция, аналитика, мониторинг
  • Спроектировал AppsFlyer attribution flow: сбор first-touch install source, сохранение до авторизации и гарантированная синхронизация с backend и RevenueCat после перезапуска или сетевой ошибки.
  • App Tracking Transparency на iOS и platform-specific обработка OneLink на обеих платформах.
  • Передача influencer-промокодов и маркетинговых параметров из deep links в продуктовые и платёжные сценарии.
  • Единый слой продуктовой аналитики: каталог событий, маршрутизация в AppsFlyer и Firebase Analytics, защита от повторной отправки одноразовых событий.
  • Настроил Sentry-контекст, сетевые ошибки, navigation breadcrumbs, теги окружения и группировку HTTP-ошибок; сократил ложные и дублирующиеся события.
API, данные, отказоустойчивость
  • Типобезопасный OpenAPI pipeline: генерация TypeScript DTO, Axios SDK и TanStack Query helpers.
  • Приведение имён generated-типов к соглашениям проекта, адаптация клиента под React Native, автоматические карты API-операций и типов.
  • Мигрировал вызовы API с RTK Query и raw Axios на сгенерированный SDK и TanStack Query.
  • Offline mode с разделением состояний «нет сети» и «backend недоступен» и persisted-очередью ответов — результаты теста не теряются и уходят при восстановлении связи.
  • Централизовал обработку API-ошибок и структурированное логирование запросов с маскированием токенов и ограничением размера payload.
Сборка и инфраструктура
  • Поэтапно обновил React Native с 0.76 до 0.86, полностью перевёл на New Architecture, разрешил конфликты зависимостей и регрессии после обновлений.
  • Скрипты сборки и локальной разработки — Android: AAB, APK, автономная QA-версия со Storybook, выбор устройства, удаление приложения из всех профилей.
  • iOS: выбор симулятора или устройства, запуск Debug/Release, подготовка CocoaPods.
  • Ускорил Android-сборки: сборка только под архитектуру подключённого устройства плюс ccache.
  • Mobile Storybook как рабочий инструмент разработки и QA: открытие stories и изменение controls через deep links, ADB и iOS tooling, в том числе для автономной работы ИИ-агентов.
  • Отдельная QA-сборка со Storybook, работающая без Metro.
Команда
  • Подготовил вопросы на понимание специфики React Native и live coding в настоящем приложении с эмулятором — кандидат должен был искать и исправлять проблему, а не воспроизводить выученные определения.
  • Ввёл в проект нового коллегу: архитектура, ключевые продуктовые сценарии, окружение, release flow.
  • Code review: бизнес-логика, архитектурные границы, platform-specific сценарии, тестовое покрытие.
  • Прорабатывал задачи с менеджером до начала разработки: сценарии, edge cases, критерии приёмки, технические ограничения.
  • Задокументировал архитектуру, code style, сложные подсистемы и подготовку релизов; создал skills для консистентной работы ИИ-агентов.
Кроме этого
  • Авторизация по email и OTP, Google OAuth, Apple ID, отдельный сценарий входа по IMEI.
  • Защищённое debug-меню: внутренние данные, эмуляция продуктовых сценариев, runtime-переключение staging/production.
  • Интерактивный onboarding на собственном легковесном Stories-компоненте с анимациями.
  • Привязка пользователя к автошколе по коду или персональной ссылке из AppsFlyer.
  • Запрос оценки приложения: scoring-логика выбора момента, собственный баннер и системный review UI.
  • Jest-тесты бизнес-логики и отдельный запуск timezone/DST-зависимых тестов.
  • Генератор миграций Redux Persist.
  • Типобезопасная локализация с модульным хранением переводов.
03
Инвойсбокскоммерческий1 год 8 месяцев

Один вёл мобильное приложение финтех-продукта: код, сборки, три стора

«Счёт-бухгалтеру». B2B-приложение платёжной платформы Инвойсбокс: карты лояльности, которыми сотрудники компаний платят за топливо, рестораны и авиабилеты, а бухгалтерия получает закрывающие документы.React Native-разработчик, один на приложении

48 → 53Expo SDK + New Architecture

Приложение целиком

Был единственным разработчиком приложения на Android и iOS: экраны, навигация, сборки в EAS и локально, подписи, публикация в Google Play, App Store и RuStore. Обновил Expo SDK с 48 до 53 и включил New Architecture, адаптировав нативные проекты, карту, Storybook и сторонние библиотеки. Продукт прошёл два пилота с реальными оплатами: сотрудник заправлялся по QR-коду из приложения со счёта карты лояльности.

13 000точек партнёров на карте

Карта партнёров

Около 13 000 точек партнёров приходили с бэкенда одним списком, без кластеризации, а бэкенд-команда была занята. Сделал всё на клиенте поверх Yandex Map: плиточную загрузку, кластеризацию, фильтрацию по видимой области и кэширование снимков маркеров — карта перестала тормозить при перемещении и масштабировании. Ошибки маркеров, которые упирались в саму библиотеку, исправил в её репозитории: четыре PR приняты.

2WebView в одном платёжном цикле

Оплата через две WebView

Приложение передавало данные в первую WebView партнёрского mini-app и ждало, пока пользователь пройдёт в ней несколько шагов. Затем, не закрывая её, открывало вторую — платёжную, — передавало туда полученные данные, принимало результат оплаты и возвращало его в первую. Реализовал весь цикл с обработкой ошибок на каждом переходе, подогнал встроенные страницы под safe area и статус-бар и обновил SDK mini-apps — изменения прошли через PR в публичном репозитории компании.

3уровня критичности поля

Данные, которые не роняют интерфейс

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

  • React Native
  • Expo SDK 53
  • Expo Router
  • New Architecture
  • TypeScript
  • Redux
  • TanStack Query
  • Yup
  • Yandex Map
  • Sentry
  • Storybook
  • EAS Build
  • FSD
Все задачи и результаты40 пунктов
Продуктовая функциональность
  • Настроил и отладил Deep Link для корректного открытия контента по внешним ссылкам с разных поддоменов.
  • Полностью переработал экраны авторизации: локальные данные вынесены из глобального состояния, улучшена обработка ошибок, корректные таймеры, ввод действующего кода без запроса нового, переработано взаимодействие с API и интерфейс.
  • Переработал главный экран под новую версию интерфейса.
  • Привязка и управление банковскими картами, включая работу с webview банка.
  • Полный сценарий карт лояльности: привязка по коду, отображение карт конкретного партнёра, контроль срока действия, продление, выбор карты при взаимодействии с партнёром.
  • Партнёрские mini-apps и платёжные страницы внутри приложения: авторизация в сторонних сервисах, запуск checkout, передача статусов оплаты, корректное закрытие с возвратом в mini-app.
  • Полностью переработал карту партнёров на Yandex Map: плиточная загрузка, пространственная и нативная кластеризация, фильтрация по видимой области, кэширование снимков маркеров — стабильно на тысячах точек.
  • Резервное определение примерного местоположения через внешний справочник адресов при запрете или недоступности геолокации.
  • Счётчики неоплаченных счетов и непрочитанных уведомлений на главном, отображение организаций, быстрый переход к отфильтрованным операциям.
  • Поддержка разных валют в счетах, заказах и корзине: справочник валют, кэширование, единое форматирование сумм.
  • Проверка актуальности версии приложения с предложением или требованием обновления.
  • Вход через сервис для сторонних приложений по схеме OAuth: вызов приложения через intent, подтверждение входа и возврат сессии в вызвавшее приложение.
API и данные
  • Интегрировал различные API бэкенда для получения и обработки данных.
  • Заменил клиентскую Google reCAPTCHA на Yandex SmartCaptcha через бэкенд; сделал переиспользуемый CAPTCHA-модуль для авторизации, оплаты и запроса документов.
  • Система валидации данных от сервера на Yup: поля разделены на критичные, заменяемые и опциональные.
  • Фабрика валидаторов для декларативного описания правил под тип данных и уровень критичности.
  • Автоматическая подстановка значений по умолчанию для некритичных полей при ошибке валидации.
  • Детальное логирование ошибок валидации в Sentry — жёстких и «мягких» — с указанием поля и контекста.
  • Отказоустойчивость интерфейса при некорректных или неполных данных.
  • Оптимизировал запросы к API и перенёс часть с RTK на TanStack Query.
Навигация и устойчивость
  • Перестроил навигацию: разделил публичные и авторизованные маршруты, защищённые экраны, единый lifecycle авторизации с PIN-кодом и биометрией.
  • Устранил циклические редиректы и ошибки переходов между сценариями авторизации.
  • Глобальный перехват критических JavaScript-ошибок: fallback-экран, логирование причины и безопасный перезапуск вместо падения.
Сборка и окружение
  • Обновил Expo SDK с 48 до 53 и включил New Architecture; адаптировал нативные проекты Android и iOS, навигацию, карту, Storybook и сторонние библиотеки.
  • Переработал значительную часть кодовой базы по FSD; задокументировал структуру проекта и границы слоёв.
  • Настроил окружение под Windows (WSL для локальной сборки) и macOS.
  • Настроил и поддерживал сборку локально и через EAS Build для обеих платформ, включая подписи и сертификаты.
  • Интегрировал Sentry для мониторинга и анализа ошибок.
  • Оптимизировал размер бандла.
  • Сборка с разными Bundle ID, чтобы тестовая и релизная версии стояли на одном устройстве одновременно.
Публикация и поддержка
  • Публиковал и регулярно обновлял приложение в Google Play, App Store, RuStore и других; вёл переписку с поддержкой сторов.
  • Готовил changelog для пользователей и технической команды.
SDK для mini-apps
  • Доработал внутренний SDK для обмена событиями между основным приложением и mini-app партнёров.
  • Опубликовал новые версии SDK в npm и актуализировал публичную документацию.
  • Реализовал интеграцию страниц без SDK через типизированную обработку сообщений WebView.
UI-библиотека и команда
  • Создал и поддерживал переиспользуемые UI-компоненты, включая платформо-зависимые.
  • Глобальный переключатель платформы в Storybook для удобного тестирования.
  • Проводил анализ и предлагал решения по архитектурным вопросам.
  • Подготовил документацию по сборке и публикации, валидации данных и архитектуре проекта.
  • Работал с бэкендом, дизайнерами и QA — дейли, планирования, ретроспективы, демо.
04
MCC-SOFTкоммерческий2 года 3 месяца

Медицинские приложения, которые работают в паре с устройством по Bluetooth

Prisma App и Luisa. Приложения Löwenstein Medical к терапевтическим устройствам: обмен данными с устройством по Bluetooth, статистика терапии, обновление прошивки, отчёты врачу.React Native + backend на .NET

RN + .NETодна фича — обе стороны API

Фичи через клиент и сервер

Вёл фичи целиком, от миграций и логики на .NET до экранов в React Native. Подтверждение владения устройством: если пользователь не подтвердил, что устройство его, оно отключается от синхронизации с сервером. Единое согласие Data Privacy разделил на отдельные соглашения — серверная часть, экран со статусами и показ новой версии уже существующим пользователям при запуске.

50+UI-проблем исправлено

Аудит интерфейса

Интерфейс разъезжался на устройствах с другими размерами экрана и шрифта. Сначала сам заводил и чинил отдельные баги, потом вместе с дизайнером провёл аудит всего приложения. Подключил к одному Metro три эмулятора с разными параметрами и проходил каждый экран сразу на всех. Выделил переиспользуемые компоненты, добавил озвучку кнопок-изображений для незрячих пользователей и провёл презентацию на 61 слайд для разработчиков из нескольких проектов.

100+баг-репортов, большая часть закрыта мной

Продакшен

Разбирал проблемы продакшена: события Sentry и OpenSearch, обращения из поддержки, логи с устройств пользователей. Доходил до причины и оформлял задачу — больше сотни баг-репортов, большую часть исправил сам. Написал Azure-функцию, которая связала две системы тикетов поддержки и убрала ручной перенос обращений.

1 → 3сервиса после разделения

Бэкенд и тесты

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

  • React Native
  • TypeScript
  • Redux
  • TanStack Query
  • React Navigation
  • Reanimated
  • Bluetooth
  • .NET
  • PostgreSQL
  • Azure
  • Sentry
  • OpenSearch
Все задачи и результаты17 пунктов
Real-time и работа с устройством
  • Управление терапевтическим устройством по Bluetooth: обмен данными в реальном времени, статистика, обновление прошивки.
  • Отображение статистики терапии, генерация отчётов, отправка обратной связи доктору.
  • Завершил фичу добавления нового устройства в аккаунт пользователя — бэкенд и мобильный клиент.
  • Реализовал отключение устройства от синхронизации с сервером, если пользователь не подтвердил владение — бэкенд и мобильный клиент.
Прод и качество
  • Разбирал тикеты из Sentry и OpenSearch, помогал обрабатывать обращения из службы поддержки.
  • Исследовал логи с пользовательских устройств, находил причины проблем, превращал их в задачи.
  • Создал более 100 баг-репортов и большую часть из них исправил.
  • Совместно с дизайнером исправил и улучшил значительную часть интерфейса.
Бэкенд и интеграции
  • Разделил единое Data Privacy на несколько отдельных соглашений: серверная часть с миграциями, UI со списком и статусом соглашений.
  • Показ новой версии соглашения при запуске для уже существующих пользователей.
  • Отрефакторил сервис на бэкенде, разделив на три сервиса — значительно повысил читаемость.
  • Разработал Azure-функцию для интеграции двух сервисов службы поддержки.
Интерфейс и доступность
  • Адаптировал интерфейс под разные размеры и формы экрана и разный размер шрифта.
  • Адаптировал приложение для пользователей с ограниченными возможностями зрения: озвучивание кнопок-изображений.
Команда
  • Работал в международной команде.
  • Обобщил знания в ёмкую презентацию и поделился опытом с коллегами.
  • Написал несколько статей в Wiki проекта для обмена знаниями.

Свои проекты

05
Story Pulseсвой проект

ИИ ведёт игру, а сервер следит, чтобы он не нарушал правила мира

Онлайн-квесты с ИИ-ведущим. Текстовые квесты для компании игроков: каждый пишет, что делает его персонаж, а ИИ-ведущий сводит ходы всех в одну историю и каждому рассказывает его часть. Играть можно в браузере и в Telegram.Fullstack, свой стартап

3ИИ-роли: приёмщик, ведущий, рассказчик

Ход как конвейер

Ход — это окно по времени. Игрок пишет шаг своего персонажа свободным текстом, и ИИ-приёмщик сразу отвечает, подходит ли он. Когда окно закрылось или сходили все, ведущий одним вызовом решает, что случилось с каждым персонажем, а рассказчик пишет каждому игроку его текст и 2–4 варианта следующего шага. Ведущий видит весь мир, рассказчик — только исход своего персонажа, поэтому разгадки в его промпте просто нет.

JSONпроверяется до применения к миру

Сервер не верит модели

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

outboxуведомления с повторами

Надёжность

Состояние хода хранится в PostgreSQL: закрыть ход может только один процесс, версии мира не перезаписываются, а партия не заблокирована, пока модель думает. Уведомления в Telegram уходят через очередь с повторами. Провайдеры моделей выстроены цепочкой с запасными, а стоимость партии считается по каждой попытке.

Expoвеб, Telegram Mini App, iOS и Android

Один код — три клиента

Игра — одно Expo-приложение, которое работает в браузере, внутри Telegram и на телефонах. У игроков свои скины интерфейса, у оператора — консоль управления партиями. Если игроков не хватает, пустые места по запросу оператора занимают ИИ-игроки.

6ИИ-агентов за столом в прогоне

Плейтесты на ИИ-игроках

Партии прогоняю на ИИ-агентах-игроках: у каждого своя расшифровка партии и оценка. После того как агенты пожаловались на «рельсы», мир переделан в три слоя — неизменный канон, подсказки автора и состояние конкретной партии, которое ведущий обновляет каждый ход.

  • Expo
  • React Native
  • react-native-web
  • Reanimated 4
  • Unistyles
  • NestJS
  • PostgreSQL
  • zod
  • grammY
  • Telegram Mini App
  • Vitest
  • Playwright
  • Turbo
06
Multstandсвой проект

ERP: сначала руками, потом — с ИИ-агентами

Multstand Hub. ERP мастерской, которая делает мультстанки — станки для покадровой анимации. Заказы, производство изделий, склад комплектующих, отчёты мастеров с оплатой, документы и отправки. Менеджер работает с компьютера, мастера — с телефона.Свой проект: первая версия руками, вторая — с ИИ-агентами

2023–2024ERP внутри телеграм-бота

Первая версия — руками

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

2026бот → веб-приложение

Вторая версия — с ИИ-агентами

В чате было плохо видно заказы и нехватку комплектующих, а вводить приходилось много. В 2026-м вместе с ИИ-агентами переписал систему на новый стек: рабочее место менеджера для компьютера, экран мастера для телефона, интеграция со СДЭК и собственный генератор документов. Задачи, проверку и выкладку оставил за собой; сервер и фронтенд покрыты автотестами.

BOMмодули и себестоимость из спецификации

Изделие из спецификации

Менеджер выбирает модель станка, число стёкол, тип светодиодной ленты, регуляторы и опции — система сама считает модули, себестоимость и имя изделия вида 112-TM-2ст-пп-прем-ткань. Блок питания тоже подбирается автоматически: по мощности и длине ленты с запасом.

PDFдоговор, КП, счёт, акт, накладная

Документы и доставка

Документы собираются из данных заказа. Сервер маленький, поэтому Chromium для PDF вынесен из API в отдельный сервис: он запускается по заданию в очереди и работает с ограничением памяти. Шаблоны версионируются, а продавец в документе сверяется с заказом. Доставка — через API СДЭК: города, пункты выдачи, тарифы, создание заказа и печатные формы.

backupперед каждой миграцией

Продакшен без риска

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

  • TypeScript
  • NestJS
  • GraphQL
  • TypeORM
  • SQLite
  • Telegraf
  • React 19
  • Vite
  • Apollo Client
  • Zustand
  • Tailwind
  • Radix UI
  • Playwright
  • pdf-lib
  • CDEK API
  • Jest
  • Vitest
07
Aleraplanсвой проект

Планировщик, написанный целиком — от жеста до базы данных

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

5 миншаг привязки блока

Таймлайн на жестах

День — это таймлайн, где длительность блока меняется перетаскиванием края. Жесты на Gesture Handler, анимации на Reanimated 4 с общими значениями, привязка к пятиминутной сетке и расширенная зона касания, чтобы палец попадал по краю. Тепловую карту привычек за 12 недель написал сам, без библиотек графиков.

outboxочередь офлайн-операций

Офлайн и стриминг

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

4случая пересечения интервалов

Сервер

REST API на NestJS: 11 модулей, тонкие контроллеры, OpenAPI из DTO, JWT для приложения и отдельный API-ключ для AI-агента. Схема на Prisma — 13 сущностей и 14 миграций. Тайм-трекер разрешает пересечения записей в четырёх случаях: поглощение, обрезка слева, обрезка справа, разбиение надвое. Время хранится в UTC, а группируется по локальному дню пользователя.

PM2домашний сервер, доступ через WireGuard

Тесты и деплой

Интеграционные тесты (~1 600 строк) гоняются против отдельной тестовой базы: авторизация, заметки, категории, проекты, трекер, синхронизация с внешним сервисом, API агента. Сервер работает под PM2 на домашнем сервере, доступ снаружи — через WireGuard.

  • React Native 0.81
  • Expo SDK 54
  • Expo Router
  • Reanimated 4
  • Gesture Handler
  • TanStack Query
  • Zustand
  • Unistyles 3
  • SSE
  • NestJS
  • Prisma
  • SQLite
  • Jest
  • supertest
  • PM2
Все задачи и результаты31 пункт
Архитектура приложения
  • Построил приложение по Feature-Sliced Design: 12 доменных сущностей, слои features, widgets, pages и общий слой из 19 UI-компонентов.
  • Разделил серверное и клиентское состояние: TanStack Query отвечает за данные с сервера и кэш, Zustand — за узкие клиентские задачи: сессия, очередь офлайн-операций, отладочный режим.
  • Настроил Storybook сразу в двух конфигурациях — на устройстве и в вебе, 28 историй компонентов; использую как рабочий инструмент, а не формальность.
  • Актуальный стек целиком: React Native 0.81, React 19, Expo SDK 54 с New Architecture, Expo Router, Unistyles 3 с тёмной темой.
  • Отладочная панель с плавающей кнопкой для просмотра внутреннего состояния во время разработки.
Жесты, анимации, визуализация
  • Таймлайн дня с изменением длительности блока перетаскиванием: жесты на Gesture Handler, анимации на Reanimated 4 с общими значениями и анимированными стилями, привязка к пятиминутной сетке, расширенная зона касания под палец.
  • Собственный компонент тепловой карты для 12-недельной статистики привычек — без сторонних библиотек графиков, с легендой и плашками показателей.
Данные и сеть
  • Единый HTTP-клиент: подстановка токена, собственный тип ошибки с разбором формата ошибок сервера, отмена запросов.
  • Офлайн-режим по паттерну outbox для заметок: операции складываются в персистентную очередь, отдельный движок синхронизации разбирает её, классифицируя ошибки на временные и конфликтные, и сопоставляет временный клиентский идентификатор с серверным после создания.
  • Потоковая передача ответов AI-ассистента через SSE: штатный fetch в React Native не отдаёт поток, поэтому отдельный SSE-клиент; гонка с завершением ответа — несколько сигналов завершения на одно сообщение из-за вызовов инструментов — решена отложенной финализацией.
Реализованные разделы
  • Планировщик дня с таймлайном.
  • Иерархические задачи с подзадачами, привязкой к проектам и целям.
  • Заметки с категориями и курсорной пагинацией.
  • Привычки с детальной статистикой.
  • Тайм-трекер и экспорт во внешний сервис с разрешением дублей.
  • AI-чат с историей сессий и рендером Markdown.
  • Авторизация.
Сервер: API и данные
  • REST API на NestJS: тонкие контроллеры, бизнес-логика в сервисах, 11 доменных модулей.
  • Сквозная валидация входных данных через глобальный pipe с отсечением неописанных полей и приведением типов; документация OpenAPI генерируется из описаний DTO.
  • Два независимых механизма аутентификации для двух типов клиентов: JWT со стратегией passport и bcrypt для приложения, авторизация по API-ключу для AI-агента.
  • Схема на 13 сущностей в Prisma: иерархия задач через самоссылку, связи многие-ко-многим между записями трекера и проектами, задачами, привычками и заметками, продуманное поведение при удалении — где каскад, где обнуление ссылки.
  • Схема развивается через миграции: 14 миграций за три месяца.
  • Составные индексы под конкретные запросы, включая индекс под курсорную пагинацию с сортировкой по дате и идентификатору.
Сервер: нетривиальная логика
  • Разрешение пересечений интервалов в тайм-трекере: при старте или правке записи разбираются четыре случая — полное поглощение существующей записи, обрезка слева, обрезка справа, разбиение на две части.
  • Теневые записи трекера: отдельная сущность, позволяющая переопределить завершённую запись для отчётности и выгрузки, не меняя исходные данные.
  • Интеграция с внешним сервисом учёта времени: HTTP-клиент, ручной разбор и форматирование времени со смещением часового пояса, дедупликация записей по допускам в 60 секунд по времени старта и длительности.
  • Расчёт статистики привычек: текущая и лучшая серия, процент выполнения за 30 дней, недельная агрегация, разные формулы дневной нормы для трёх типов привычек — доза, счётчик, отметка.
  • Сквозная работа с часовыми поясами: сервер хранит UTC, но группирует данные по локальному дню пользователя из переданного смещения — паттерн применяется системно на обоих слоях.
Тестирование и эксплуатация
  • 7 интеграционных наборов тестов на Jest и supertest (~1 600 строк) с отдельной тестовой базой: авторизация, заметки, категории, проекты, трекер, синхронизация с внешним сервисом, API агента.
  • Self-hosted окружение: сборка и запуск под PM2 на домашнем сервере, документация по доступу в репозитории.
  • Объём: приложение ~22 000 строк TypeScript и 138 коммитов; сервер ~9 000 строк, 51 коммит, 14 миграций.

Офлайн-бизнес

Перерыв на бизнес: студия мультфильмов

с 2013

Помогал открыть детский центр медийного творчества — думал, что сделаю сайт и настрою CRM. В итоге стал сооснователем и руководил сетью мастерских мультфильмов «Мультистория».

3500+мультфильмов сняли в нашей студии в Томске

Команда и сеть

Нанимал и обучал сотрудников, упаковал наработки в вики и запустил франшизу. Управлял бизнесом онлайн из другого города.

Внутри продукта

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

Продажи и заказы

Продавал сам. Брал заказы на stop-motion анимацию для организаций и распределял работу по команде.

Сайт, учёт и дизайн

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

400+мультстанков с 2016 года

Из студии выросло своё производство: спроектировал станки для покадровой анимации — для школ, детских садов и дома. Учёт и автоматизацию мастерской реализовал в Multstand Hub.

Multstand Hub в проектах ↑
03 · Как работаю

Пять привычек — и где они проявились

  1. 01

    Замечаю то, что легко пропустить

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

    • Prisma App · UI-аудиттри эмулятора с разными экранами и шрифтами на одном Metro; больше 50 исправленных UI-проблем
    • Риск при релизепосле рабочего дня заметил сбойный сценарий в соседнем коде; раскатку приостановили, проверка подтвердила проблему
  2. 02

    Повторяющуюся проблему превращаю в инструмент

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

    • Prisma App · автотестыповторяющуюся подготовку данных собрал в фабрику сценариев пользователей и устройств
    • Prisma App · передача знанийпо итогам UI-аудита — презентация на 61 слайд для разработчиков нескольких проектов
    • Свои проекты · агентыинструкции для ИИ-агентов собрал в один пакет, который подключается во все проекты
    • Pronto · архитектураграницы FSD-слоёв и code style закреплены собственными правилами ESLint
  3. 03

    Сначала понимаю систему, потом меняю

    Какое-то время работаю с существующим кодом, чтобы увидеть реальные связи. Небольшие улучшения вношу маленькими коммитами, а большую переработку начинаю, когда на неё согласовано время.

    • Pronto · модуль тестовоколо пяти месяцев работал с ним как есть; новый UI собрал рядом со старым в Storybook и только потом заменил поток данных
    • Prisma App · бэкенддва класса, которые постоянно путали, разобрал вместе с коллегой: общее — в абстрактный класс, две явные реализации
  4. 04

    Сложные сценарии раскладываю на явные состояния

    Где встречаются клиент, backend, сторы и внешние сервисы, явно задаю состояния и переходы — включая ожидание, ошибку, перезапуск и неполные данные.

    • Pronto · монетизациядва стора, RevenueCat, AppsFlyer и backend; покупка и промокод восстанавливаются после ошибки и перезапуска
    • Story Pulse · ходкаждый ход проходит явные этапы — приём шагов, решение ведущего, рассказ игрокам, и ни один не выполнится дважды
    • Prisma App · устройствопредупреждение, срок подтверждения, отвязка и повторная привязка — на клиенте и на сервере
  5. 05

    Делаю работу коллег проще

    Смотрю не только на свой код, но и на то, где команда теряет время, — и забираю это на себя.

    • Prisma App · поддержкасвязал две системы тикетов через webhooks, сверяясь с коллегой, которая с ними работала; обращения больше не переносят вручную
    • Ally · ADRизменения в общих модулях платформы описал в ADR, чтобы команде было видно, что и почему изменилось
    • Pronto · наймlive coding в настоящем приложении вместо вопросов по определениям; ввёл нового разработчика в проект
04 · Стек

Основной стек — и всё, что было в проектах

  • React
  • React Native
  • TypeScript
  • Reanimated
  • Node.js
  • NestJS
  • GraphQL
  • PostgreSQL
  • CI/CD
  • Linux · Proxmox

Мобильная разработка

React Native · React · TypeScript · New Architecture · Expo · Expo Router · React Navigation · Reanimated · Gesture Handler · FlashList · TrueSheet · Unistyles · Styled Components · Storybook · Яндекс Карты · WebView · i18next

Данные и состояние

TanStack Query · Redux Toolkit · RTK Query · Redux Persist · Zustand · Axios · OpenAPI codegen · Zod · Yup · MMKV · AsyncStorage · SSE · offline mode

Бэкенд

Node.js · NestJS · Prisma · TypeORM · PostgreSQL · SQLite · REST + OpenAPI · GraphQL / Apollo Server · JWT / Passport · class-validator · Telegraf · .NET · Azure Functions

Сборка и нативная часть

Xcode · Android Gradle · CocoaPods · EAS Build · ADB · ccache · WSL · AAB / APK · code signing · provisioning profiles · keystore · React Native upgrades · dependency patches · versionCode / buildNumber

Публикация в сторах

Google Play Console · App Store Connect · RuStore · оформление и публикация релиза · соглашения и юридические данные · in-app purchases · subscriptions · RevenueCat · StoreKit · App Tracking Transparency · прохождение модерации · переписка с поддержкой сторов

Качество кода

Jest · React Native Testing Library · unit tests · integration tests · ESLint · custom lint rules · Prettier · Feature-Sliced Design · code review · conventional commits · Git / GitLab

Мониторинг и аналитика

Sentry · crash reporting · post-release monitoring · Firebase Analytics · AppMetrica · AppsFlyer · OpenSearch · server logs

05 · Open source

Open source — принятые PR в библиотеки и SDK

12смерженных PR в публичные репозитории
aleradev12/reelconverter ↗

ReelConverter

Нативное macOS-приложение на Swift: сжать запись экрана или изменить скорость перед отправкой. Ставится через свой Homebrew tap.

  • Swift
  • SwiftPM
  • macOS
  • Homebrew
aleradev12/pi-model-picker ↗

Pi Model Picker

Расширение для агентного CLI Pi: выбор модели в начале сессии — нечёткий поиск, группировка по провайдерам, избранное, контекст и цены. Опубликовано в npm.

  • TypeScript
  • npm
  • Pi
  • GitHub Actions
06 · Что было до

Код с 2009 года — задолго до ИИ-агентов

Команда WAFT на Imagine Cup 2012 с сертификатом «1 место — билет в финал»
Imagine Cup · команда WAFT · 1 место, билет в российский финал
до 2011

Первый код и олимпиады

Увлёкся программированием и сам изучал классику — PHP, HTML и CSS, код писал в блокноте. Несколько лет подряд занимал первые места на городских олимпиадах.

2009–2012

forws.net — первый продукт

Глобальный интернет тогда был медленным, а областная локальная сеть — в разы быстрее. Файлы выкладывали в её хранилище, но искать их приходилось по сотням страниц форума. forws.net стал для них удобным каталогом: я дорабатывал его PHP-движок, а новинки добавляла команда модераторов. Сайт жил, пока быстрый интернет не появился у всех.

2012–2013

Imagine Cup: Total Recall

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

2013

ExGIS — первый оплаченный проект

Интерактивная карта для Министерства образования. Перевели адреса тысяч школ в координаты через API геосервисов и вывели на карту: по каждой школе — данные по экзаменам, связи «кто где сдаёт ЕГЭ» и большая панель фильтров. Сделали вдвоём с одногруппником.

Вне работы
  • Локальные ИИ-моделиЗапускаю ИИ-модели локально и пробую, где они полезны без облака.
  • 3D-проектирование и печатьПроектирую детали и печатаю их на 3D-принтере.
  • Домашние серверыНастраиваю Proxmox и Linux-серверы под разные задачи.
  • Приложение для дочкиСделал мобильное приложение для обучения счёту больших чисел.

07 · Контакты

Ищете разработчика, который отвечает за продукт целиком? Напишите.