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.
Product IT company (under NDA), 2025 - now
Sole frontend developer. 1352 commits out of 1550, about 3,500 tests, 49 releases. I joined when a demo prototype of a few dozen 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, 2024 - 2026 - caerusrentacar.com
The website of a car rental owned by one of GlobalRental’s founders. From May 2024 it ran on the GlobalRental engine: I set it up as a second brand through config, and it replaced the rental’s old site. In August 2025 I split the frontends into two repositories. In March 2026 I separated it completely. Until then, 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 its own database and backend, bookings, cars and the partner dashboard moved over without losses, automatic deploys. After that, bug fixes and support; all 92 commits of that stage are mine.
The dashboard became the rental’s working calendar: about 1,400 entries over two years. Direct bookings from the site keep growing: 13 in 2025, 31 in 2026, up to 10 a month in season. Stack - Next.js, Express, Prisma with PostgreSQL, vouchers rendered as PDFs on the server, 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.
GlobalRental, 2023 - 2025
A car rental aggregator in Montenegro, globalrental.pro: customers search by city and dates and book without signing up, rental companies keep a booking calendar, seasonal rates and their fleet in a partner dashboard. I was the technical director, and the role changed over time. In 2023 I managed the contractor, Infinity studio, on the investor’s side: specs and business logic, scope of each phase, acceptance, the production server and deploys. In 2024 I wrote code alongside the studio’s developer: react-email emails, a Telegram bot for booking alerts, Sentry, an admin panel with stats, seasonal pricing. From December 2024 I was the only developer on both frontend and backend: moderation, logging in as a partner, currencies and countries, the SEO groundwork (clean URLs, canonical, hreflang, schema.org), and in 2025 yacht rentals. 331 of the 645 frontend commits and 136 of the 294 backend commits are mine.
I integrated Stripe and verified it with a live payment, but real customers never got to pay online: the project was shut down before that. Next.js 14, Express, Prisma with PostgreSQL. Caerus ran on the same engine from 2024.
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. Product screenshots.
First came web flight booking: flight search over socket.io with live results, fares, passengers, payment with 3DS. Then hotels and a white-label hotel widget that airlines embedded on their own sites; Smartavia ran it in production. Then the corporate B2B portal: company account, employees, corporate cards, travel policy, reports, flights and hotels. A colleague and I built the first version of the portal together, and after that I led its frontend.
Along the way we moved the frontend to an Nx monorepo, I upgraded React 17 to 18, introduced Next.js and set up a separate Cloud Run environment for every release branch. The appintheair.com website was entirely mine too. I hired the frontend developers myself: job posting, technical interview, a take-home task with a code review.
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.