Experience
The plain chronology with dates and stacks lives in the CV. This page is what stands behind it: the problems that took real digging, and the findings that usually come up in interviews.
Video calling product, 2025 — now
Sole frontend developer. 1043 commits out of 1165, ~96,000 lines, 758 test cases, 34 release tags. I joined when a demo prototype of about twenty files was sitting there; none of its files exist today.
Spoofed sender in recording control. Recording commands arrived over a WebRTC data channel and the handler never verified who actually sent them. Any participant could claim someone else’s identity and pin a stuck “recording in progress” toast on everyone, with the button locked. Caught it in review, fixed it test-first: the first test has one participant impersonating another.
A microphone that turned itself back on. After a reconnect the client briefly dropped the microphone publication — a full track republish. The device health monitor saw “microphone off” and helpfully switched it back on against the user’s will. The cause was in the media SDK’s behaviour; the fix is to keep the intended mute state separate from the actual one.
Navigation freezing because of ResizeObserver. In the calendar one node sat under two ResizeObservers, and one of them wrote an inline variable derived from the element’s own height. A loop of a hundred firings within seconds kept Next from finishing a route transition: the URL changed, the screen did not, and only a reload helped. It never reproduced locally — I diagnosed it from a HAR log.
Separately I set up CI with builds and signing for macOS and Windows: Developer ID with notarization, Windows through a hardware token over PKCS11. Added trivy to the pipeline and took the production image from 49 findings down to zero.
Caerus, 2026 — caerusrentacar.com
All 87 commits are mine. The partner’s site lived inside a shared aggregator: in production both products ran the same binary against the same database and differed only by environment variables, with no data separation in the schema at all. Splitting that blindly is a reliable way to take both down.
I started with a production audit: a map of processes, the differences between configurations, a snapshot as a rollback point. Then the split, and running the product alone since: SEO pages for queries like “car rental in Montenegro”, human-readable URLs, fixes driven by partner complaints. Stack — Next.js, Express, Prisma with PostgreSQL, Stripe and PayPal, contracts assembled as PDFs, email through a separate service.
Psychotherapy and coaching platform, 2025 — 2026
Frontend in a team under a separate lead. My slice was the Supervisions feature end to end, from onboarding to payment: the “about me as a supervisor” profile field, public supervisor search with filters and infinite loading, supervision purchase by a client, the specialist dashboard with payment methods, session list, cancellation and rescheduling, and supervisions shown in the calendar in their own colour.
Next.js 15 App Router in an Nx monorepo, Feature-Sliced Design, Zustand, CSS Modules. I built the feature through an agent-driven spec workflow: 4-5 hours of work against my own manual estimate of 19 hours.
EVIRMA, 2025 — evirma.ru
A Manifest V3 extension for Wildberries marketplace sellers: ad analytics embedded directly into the marketplace interface. In a team of 7-8, 56 merged PRs out of 229 — second after the tech lead. By commits it would read as 13%, but the team used squash merges and one PR equals one task.
Technically this is work inside someone else’s production where nothing belongs to you:
intercepting fetch in world: MAIN to read the internal API, token-bucket rate limiting (the
marketplace bans by request frequency), background jobs in a service worker that survive
suspension, React injected into foreign markup with style isolation through a custom build plugin.
My areas: the seller sales funnel from scratch, campaign statistics by keyword and day with cost
share calculations, export into multi-sheet Excel workbooks.
Car rental aggregator, 2024 — 2025
Caerus’s predecessor; the collaboration has ended. I wrote half of the frontend — 331 commits out of 645: a catalog with faceted filters and price calculation, booking with calendar availability checks, a partner dashboard with a booking timeline, a role-based admin panel, six languages, Stripe and PayPal. Work went through pull requests with code review.
App In The Air, 2019 — 2024, USA
I joined when the company had a mobile app and no web product, and grew from developer to lead of a team of five.
First a flight booking service: search, results, passenger details, payment. Then hotel booking. Provider integrations ran through the company’s own backend; on the frontend there were Stripe, i18next with ICU, Sentry. Then the corporate portal: company account, employees, corporate cards, self-service booking within travel policy, expense analysis. Along the way I moved the frontend to an Nx monorepo, upgraded React 17 to 18 and introduced Next.js.
I stayed to the end: the service was shut down in October 2024 and I worked until it was.
webrise, 2016 — 2019
An agency, many clients, the most varied period. Sberbank Insurance — a full redesign of the main site and about fifteen insurance calculators, including internal ones for bank staff. A topic interviewers like to dig into: an error in a calculation form quotes the customer the wrong policy price, which is why the maths was covered by tests.
Ingosstrakh — the main site and a line of calculators. An education platform for a nationwide contest with video and chat in the browser and lectures from teachers. The Usachevsky market store with React Native mobile apps. Unilever promo campaigns, a browser game for Ritter Sport, a digital platform for a transport university with sub-projects for students, group leaders and teachers.
Zaymer, 2014 — 2016 — zaymer.ru
A robot issuing microloans to bank cards without human involvement, in Russia and Kazakhstan. I built the client dashboard and the staff dashboard. Laravel 5, KatanaFramework, MySQL, PostgreSQL, MongoDB, Selenium tests. Fintech with real money: the cost of a calculation error is measured in someone else’s roubles, and that disciplines better than any process document.
it-infinity, 2013 — 2014 — itinfinity.ru
First commercial websites: redesigns built on plain HTML, CSS and JS on top of 1C-Bitrix. The first line of the career.