Skip to content
mcar.

Frontend Developer · Moscow · hybrid, remote

Makar Korolenko

Four years on the amoCRM frontend: the amo messenger (web and Electron), a promo landing page service on Astro, an AI assistant. I take tasks from spec to production on my own.

Experience

amoCRM · 10.2022 — present

amo messenger is a corporate messenger for web and desktop with tens of thousands of users. Since 2026 I also work on amoCRM promo sites and the AI assistant.

Products: amo.tm, amocrm.ru

01amoCRM promo · 2026

A promo landing page service from scratch

The old promo site was heavy, and every text change had to be shipped by a developer.

  • Proposed moving landing pages into a separate Astro service, and the proposal was accepted
  • Built the service from scratch: GitLab CI, nginx, a UI kit in Storybook
  • Set up landing page generation from Markdown with content checks in CI
  • Used Webvisor session replays to find where the landing page was losing visitors and added a sign-up form to the first screen
  • Set up an AI agent that builds landing pages from Figma mockups

ResultThe content team publishes landing pages on its own, without a developer.

02amoCRM · 2026

amoCRM AI assistant

The assistant answers in chat and performs actions in the CRM by itself via MCP.

  • Worked on the chat: SSE streaming, the AG-UI protocol
  • Built an onboarding tour in which the assistant helps a new customer set up their account through a dialogue
  • Built an AI agent widget for websites

ResultThe assistant and the tour are in production.

03amo messenger · 2025

Calls and conferences

The messenger had no calls.

  • Broke the feature down and wrote the spec myself
  • Calls, conferences and screen sharing on Jitsi, on web and desktop
  • Designed video preprocessing with codec licensing in mind

ResultCalls have been in production since 2025.

  • Jitsi
  • Electron
  • WebSocket
  • React

amo.tm

04amo messenger

Permissions, pins and a dark theme

Messenger features I built on my own or together with a colleague.

  • Channel access permissions
  • Pinned messages and reactions
  • With a colleague: a dark theme built on design tokens and Tailwind

ResultNew screens are built from tokens and shared components.

  • React
  • Redux
  • Tailwind
  • Design tokens

05amo messenger

Build, linter and CI

The build was slow, the linter was broken, and tests were optional.

  • Together with a colleague, moved the build from Create React App to Rsbuild
  • Brought the linter back and made tests required in CI
  • Started the migration to TypeScript

ResultBuild time went down from 10–20 to 3–5 seconds.

  • Rsbuild
  • TypeScript
  • Jest
  • GitLab CI

06amoCRM

Team

The previous frontend team had left.

  • Hired four developers
  • Led them as a tech lead: tasks, onboarding, code review
  • Review and test my colleagues’ work before release

ResultTwo of the developers I hired still work with me.

  • Hiring
  • Code review
  • Onboarding

Bug write-ups

amo messenger · WebSocket

Crash after sleep

Symptom
The client crashed after the computer woke up from sleep.
Cause
Two race conditions in the WebSocket transport during reconnection.
What I did
Moved the timeouts into the transport and added reconnection with backoff. Customers confirmed the fix.

amo messenger · Electron

Memory leak in the desktop app

Symptom
The desktop app ate more and more memory over time.
Cause
A leak in Chromium itself, invisible in DevTools.
What I did
Reproduced it, estimated the cost of upgrading Electron and shipped a fix for macOS and Linux.

amo messenger · bots

The bot that was “always loading”

Symptom
A customer’s bot never finished loading, while everything worked locally.
Cause
Debugged it on the customer’s machine over AnyDesk: the bot data got corrupted during re-encoding.
What I did
Switched bot data transfer to a binary format.

AI agent · website widget

A widget without styles

Symptom
For some visitors the widget opened without any styles.
Cause
Kaspersky rewrites the CSP, which breaks inline styles.
What I did
Moved the styles into a separate file.

Before amoCRM

02.2022 — 07.2022

Bessonnitsa animation festival — Frontend Developer

A classifieds board with categories, a home page and articles in Markdown, authentication, an interactive map of the venue. A PWA that fully caches server data, since the festival venue had no reliable connection.

  • React
  • TypeScript
  • Chakra UI
  • PWA

07.2022 — 08.2022

Chistodar — Fullstack Developer

An online store on WordPress and WooCommerce: a custom plugin for quick checkout from the cart, Alfa-Bank payment acquiring, catalog import from 1 °C.

  • WordPress
  • WooCommerce
  • PHP

Projects

Side projects

I build tools that solve my own problems and ship them to real users. The code is open.

amo stickers

80+ users on the Chrome Web Store

Stickers and GIFs for the amo messenger in the browser: a button next to the emoji picker, sending in one click.

  • A single TypeScript core builds into a Chrome extension (MV3) and a userscript
  • Import of Telegram sticker packs by link, custom stickers from images, videos and animated .tgs
  • GIF search via KLIPY and GIPHY
  • A documentation site in Russian and English
  • TypeScript
  • Preact
  • Tailwind
  • esbuild
  • Vitest
The Autograph interface: text on the left, a squared page written by hand in the center, paper, handwriting and ink options on the right

Autograph

Turns typed text into photos of handwritten pages. Runs entirely in the browser, with no server.

  • Detects the ruling on a photo of a notebook page by itself: line spacing, margins, tilt, paper curl and perspective
  • Uneven handwriting: every letter gets its own outline, yet joined-up writing stays connected
  • Rendering on canvas, export of pages to JPEG or in bulk to ZIP
  • Unit, component and screenshot tests in Docker, Storybook, FSD
  • React
  • TypeScript
  • Zustand
  • Radix UI
  • Canvas
  • Playwright

lecture-transcript

MVP

A local pipeline that turns an mp4 lecture recording into a transcript with slides, LaTeX formulas and timestamps.

  • Slide detection by pixel variance, frame deduplication by perceptual hash
  • OCR of slides and formulas, speech recognition with punctuation, with terms from the slides used as hints for ASR
  • A 93-minute lecture is processed in ~11 minutes on an RTX 4060, fully offline
  • 587 fast tests and 24 on a reference recording
  • Python
  • ffmpeg
  • OpenCV
  • PaddleOCR
  • GigaAM

More

  • sheet_money_helper

    A Telegram bot for expense tracking: spending by category goes into a Google Sheet.

    • TypeScript
    • Telegraf
    • Google Sheets API

    BotGitHub

  • video-chat

    A WebRTC video chat in the browser with a signaling server on Socket.IO and Express.

    • React
    • TypeScript
    • WebRTC
    • Socket.IO

    GitHub

  • Battleship

    The Battleship game on Next.js, installable as a PWA.

    • Next.js
    • Zustand
    • Serwist
    • Jest

    PlayGitHub

Everything else, including study projects from 2021–2022, is on GitHub.

Stack

What I work with

Languages
  • TypeScript
  • JavaScript
Frontend
  • React
  • Next.js
  • Astro
  • Preact
  • Redux Toolkit
  • Redux Saga
  • Zustand
  • Vue 2
Layout
  • CSS
  • Sass
  • Tailwind
  • Design tokens
  • Theming
  • Responsive layout
  • a11y
Build and CI
  • Rsbuild
  • Vite
  • Webpack
  • SWC
  • Docker
  • GitLab CI
  • nginx
Testing
  • Jest
  • Storybook
  • Screenshot tests
  • Lighthouse CI
Desktop and backend
  • Electron
  • Node.js
  • Express
  • Nest.js
  • TypeORM
Protocols
  • WebSocket
  • gRPC
  • SSE
AI
  • Claude Code
  • MCP
  • Figma MCP
  • AG-UI
  • Custom agent skills
Analytics
  • Yandex Metrica
  • Webvisor
  • Web Vitals
Other
  • Figma
  • FSD
  • PWA

Contacts

Open to offers — get in touch