Frontend Engineer
Алексей Нижгородов

Алексей Нижгородов

Frontend Engineer

Карты, дашборды, визуализации. Свои движки, когда готовых не хватает.

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

TypeScript ✲ React ✲ Svelte ✲ JavaScript ✲ ES6+ ✲ Leaflet ✲ WebGL ✲ Canvas ✲ ECharts ✲ Recharts ✲ QGIS ✲ MobX ✲ Redux ✲ Zod ✲ REST ✲ WebSocket ✲ SSE ✲ Capacitor ✲ PWA ✲ Service Worker ✲ Docker ✲ Nginx ✲ CI/CD ✲ Vitest ✲ React Testing Library ✲ Playwright ✲ TypeScript ✲ React ✲ Svelte ✲ JavaScript ✲ ES6+ ✲ Leaflet ✲ WebGL ✲ Canvas ✲ ECharts ✲ Recharts ✲ QGIS ✲ MobX ✲ Redux ✲ Zod ✲ REST ✲ WebSocket ✲ SSE ✲ Capacitor ✲ PWA ✲ Service Worker ✲ Docker ✲ Nginx ✲ CI/CD ✲ Vitest ✲ React Testing Library ✲ Playwright ✲

Обо мне

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

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

Заканчиваю магистратуру ВШЭ по цифровой урбанистике — геоданные, Python, QGIS. Открыт к релокейту и удалёнке, беру фриланс.

Все проекты

8 / 08
01

Edya — веб-кабинет коммерческого VPN

Фронтенд и архитектура, вёл команду· 2026

Спроектировал и собрал продакшен-кабинет VPN: вход через OAuth/OTP, активация на 6 платформах одной ссылкой, перенос подписок из Telegram-бота и свой слой устойчивости к блокировкам. White-label на 8 брендов из одного кода.

−62% к размеру бандла (1706→656 КБ)8 white-label брендов6 платформ активацииOAuth/OTP вход
  • Коммерческому VPN нужен был веб-кабинет под несколько брендов — собрал весь SPA: файловый роутинг с авто-сплитом, root-store из 8 доменных сторов и свой API-клиент с Zod-валидацией каждого ответа. Один код собирается в white-label под 8 брендов через build-time флаг.
  • Под блокировками кабинет должен оставаться доступным, даже когда основной домен выключают. Сделал свой failover: service worker тянет список живых зеркал и редиректит на первое доступное, плюс статичная fallback-страница, а адрес со списком спрятан обфускацией. Кабинет открывается, даже если основной домен заблокирован.
  • Подписки из старого Telegram-бота надо было перенести в новый веб-аккаунт — написал перенос из пяти шагов с кросс-аккаунт логином и определением оплаты по росту срока подписки относительно сохранённого baseline. Работает между аккаунтами и аккуратно ловит случай «уже перенесён».
  • Бандл раздулся от Firebase, Lottie и QR — добавил авто-сплит роутов, ручной vendor-chunking и lazy-загрузку тяжёлых страниц. Стартовый бандл ужался с 1706 до 656 КБ, gzip — с 467 до 175 КБ.
React 19TypeScriptViteTanStack RouterMobX 6Tailwind 4ZodFirebase AuthService WorkerDocker
02

EdyaAI — AI-суперапп в Telegram

Фронтенд: реалтайм, платежи, чат · командный проект· 2025 — 2026

Командный продукт, где я отвечал за WebSocket-движок генерации, слой платежей и интеграцию legacy-чата. Midjourney, GPT-Image и LLM-чат за одним интерфейсом — с реалтаймом и подписками.

реалтайм-генерация по WebSocketMidjourney + GPT-Image + LLMплатная подписка в проде
  • Генерация Midjourney в Telegram должна была показывать живой прогресс — спроектировал свой WebSocket-клиент (EventEmitter + MobX) с реестром запросов: каждое действие получает UUID и запись с конечным автоматом, таймаут 7 минут на тип, авто-реконнект. Канал переживает разрывы соединения.
  • Хотелось дать весь набор инструментов Midjourney, а не только generate — собрал движок действий на MobX, который моделирует дерево истории с родительскими связями узлов. Получился полный набор операций: vary, upscale, zoom, pan, blend, reroll — поверх нестабильного backend-API.
  • Монетизацию делал целиком: токены, тарифы, подписки — покупка, оплата во внешнем браузере, промокоды, поллинг баланса. Реальные платежи в проде.
  • Legacy-чат надо было собрать под одну крышу и довести до прода — сам поднял деплой (Docker + nginx) и встроил отдельное Next.js-приложение чата через iframe с мостом Telegram↔iframe: safe-area и клавиатура через postMessage, проброс haptic. Один деплой и бесшовный чат внутри хаба.
React 19TypeScriptMobX 6TanStack RouterTelegram Mini Apps SDKZodWebSocketSSENext.js 15Docker
03

Картография и реалтайм-мониторинг

NDA

Frontend · слой карт и рендер

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

  • Карта должна была держать тысячи маркеров и длинные треки без просадок — сделал свою логику слоёв и оптимизировал рендер: кластеризация, прореживание, отрисовка на Canvas и WebGL. На больших объёмах карта остаётся плавной.
  • Для мониторинга в реальном времени добавил живое обновление маркеров, геозоны и треки с таймлайнами — оператор прокручивает историю перемещений по времени.
  • Карту надо было переиспользовать в нескольких продуктах — вынес её в набор компонентов с единым API, который стал общей основой для нескольких проектов команды.
TypeScriptReactLeafletWebGLCanvasMobX
04

B2B-аналитика предсменных медосмотров

NDA

Фронтенд, BFF и схема данных· 2026

За ~2 недели поднял backend-for-frontend, устойчивый ingest и ~20 клинических дашбордов поверх медтерминалов: своя карта России, RBAC на уровне чтения медданных, классификация давления по российскому стандарту прямо в SQL.

~20 клинических дашбордовустойчивый ingest (circuit breaker)RBAC на медданныеMVP за 2 недели
  • За пару недель надо было поднять B2B-аналитику для медицины с нуля — спроектировал pnpm-монорепо: Vite + React + MobX фронт, Express-BFF и общий пакет Zod-схем как единый источник контрактов. Браузер не видит доступы к внешнему API, а типы сквозные от БД до UI.
  • Внешний API медтерминалов был нестабильным, а записи терять нельзя — написал свой клиент и идемпотентный ingest: backoff на 6 попыток, circuit breaker (порог 8 ошибок, cooldown 60 сек), окна по 7 дней с курсорной пагинацией и инкрементальный cron. Бэкфилл и синхронизация переживают сбои без ручных перезапусков.
  • Медданные нельзя просто прятать в UI — развёл их по отдельным таблицам и сделал RBAC на уровне чтения: урезанная роль физически не джойнится к медицинским полям. Чувствительные данные недоступны на бэкенде, а не просто скрыты на клиенте.
  • Под растровый силуэт России не было готового geo-движка — написал свою проекцию lat/lon в проценты изображения (калибровка по двум углам, нормализация антимеридиана) и компонент карты с пузырями и дрилл-дауном. Получилась интерактивная картосхема прямо в дашборде.
TypeScriptReactMobXEChartsNode + ExpressDrizzle ORMPostgreSQLZodDocker
05

Платформа видеоаналитики

NDA

Frontend · архитектура с нуля, ревью команды

Фронтенд-архитектура с нуля для системы видеонаблюдения и аналитики на TS / React / MobX — проектирование, код-ревью, менторинг команды.

  • Фронтенд платформы видеоаналитики строил с нуля — спроектировал архитектуру на TypeScript / React / MobX, задал паттерны, вёл ревью и менторил команду. На этой базе команда дальше собирает фичи.
  • Сделал реалтайм-дашборды на Recharts — операторы видят аналитику вживую, без перезагрузок.
  • Большие списки тормозили — виртуализировал их, мемоизировал тяжёлые вычисления, профилировал в Chrome DevTools и вычистил утечки памяти. UI остаётся отзывчивым на больших объёмах.
TypeScriptReactMobXWebSocketsRecharts
06

PDF-генератор отчётов (своя библиотека)

NDA

Frontend · автор библиотеки

Своя библиотека отчётов из React-компонентов: рендерит WebGL-карты и графики в PDF, автонумерация, хедеры/футеры. jsPDF / react-pdf этого не умели — написал своё.

  • Нужно было собирать отчёты с картами и графиками, но jsPDF и react-pdf не умеют рендерить WebGL-карты и сложную вёрстку — написал свою библиотеку, которая собирает PDF прямо из React-компонентов и встраивает WebGL-карты и графики. Отчёты выглядят как UI продукта, без ручной вёрстки PDF.
  • Для многостраничных отчётов добавил автонумерацию и сквозные хедеры с футерами — документы сразу готовы к печати, с правильной пагинацией.
  • Чтобы не дублировать вёрстку, сделал единый слой рендера: одни и те же React-компоненты идут и на экран, и в PDF — один источник правды для интерфейса и отчётов.
TypeScriptReactWebGLCanvasjsPDF
07

Геймифицированный трекер задач для детей

NDA

Frontend · два клиента + натив на Capacitor, вёл нативную команду

Дашборд на большом сенсорном экране + PWA для родителей: два клиента с общим стейтом. Вёл команду, делавшую нативные приложения на Capacitor (iOS / Android / Android TV).

  • Продукт жил на двух очень разных клиентах — геймифицированный дашборд на большом сенсорном экране и PWA для родителей. Спроектировал оба с общим стейтом и реалтайм-синхронизацией, чтобы экран и телефон родителя всегда показывали одно и то же.
  • Продукт надо было вывести в сторы и на Android TV — вёл команду, которая упаковывала веб в нативные приложения на Capacitor (iOS, Android, Android TV). Один код доехал до нескольких платформ.
  • Добавил Service Worker для офлайна и автообновления — приложение работает без сети и обновляется само.
TypeScriptReactPWACapacitorWebSocketsService Worker
08

Планшет обратной связи у окна (GovTech-киоск)

NDA

Frontend · архитектура MVP· 2026

За ~4 дня собрал планшет, который сам ловит вызов из очереди по WebSocket (без relay-бэкенда), развлекает и показывает контекстную рекламу во время приёма, а в конце собирает официальную госоценку качества.

WebSocket-очередь без relayофиц. госопрос качестваMVP за 4 дня
  • Планшет должен был сам понимать, что вызвали именно его окно, без промежуточного бэкенда — написал самопереподключающийся WebSocket-клиент, который сравнивает снимки очереди и выводит события call / recall / finish по своему идентификатору окна. Маршрутизация работает на каждом окне без своего бэкенда.
  • Между таймером-фолбэком и реальным «finish» от оператора возникала гонка — написал конечный автомат idle → called → serving → rating → thanks с защитами от устаревших событий и убрал баг с дублем анкеты. Поток идёт ровно, без двойного опроса.
  • Ожидание у окна хотелось занять релевантной рекламой и развлечь медленных посетителей — сделал эвристику «услуга → жизненная ситуация», легальные форматы рекламы и мини-игру, которая подстраивает сложность под время реакции игрока. Контекстная реклама плюс развлечение, в которое играют даже пожилые.
  • Анимации на планшете подёргивались — перевёл прогресс-бар слайдов с JS-анимации ширины на CSS-keyframes scaleX, только на композиторе, без layout. Прогресс-бар идёт плавно, на GPU.
React 18TypeScriptViteWebSocketEmotionFramer MotionFeature-Sliced

Бэкграунд

Опыт

Perfema

2023 — н.в.

Frontend Developer

Делал продукты с нуля: архитектура, код, ревью, менторинг стажёров. Карты, дашборды, аналитика, нативные приложения, своя PDF-генерация отчётов. Где-то вёл команду фронтендеров, где-то был единственным фронтом.

Edya

Frontend · парттайм

Парттайм-подработка: веб-кабинет коммерческого VPN (white-label на 8 брендов, свой failover под блокировки) и AI-суперапп в Telegram (реалтайм-генерация, платежи).

Яндекс

2023

Асессор-разработчик

Размечал материалы по программированию и CS, писал и редактировал эталонные ответы YandexGPT по IT, занимался фактчекингом.

Образование

ВШЭ

2024 — 2026

Магистратура, Цифровая урбанистика

Пошёл осознанно: всегда была интересна урбанистика, а программа плотно завязана на аналитику данных (Python, геоданные, QGIS) — по сути айтишная. Прокачал картографию и геоаналитику, которые люблю и во фронтенде.

Диплом (ВКР) ↗

МИСиС

2020 — 2024

Бакалавриат, Информационные системы и технологии

Фундамент: алгоритмы, структуры данных, инженерия ПО.

Контакты

Алексей Нижгородов

Aleksey Nizhgorodov | 2026