All work

01 / Production fintech · CPA partner platform

Tinkoff fintech platform

Built and evolved partner and internal operations frontends for a fintech platform serving 300,000+ users, spanning onboarding, analytics, approvals, documents, and real-time workflows.

Role
Frontend Developer → Senior Frontend Developer
Period
Aug 2021 — Feb 2026
Scale
300,000+ users
Status
Featured case

01 / Product system

Two products.
One operating model.

The frontend was not a collection of screens. It coordinated two connected experiences, shared infrastructure, and business workflows that crossed role boundaries.

01 / Operations

Manager UI

Control the network, configure products and resolve exceptions.

ProductsOffersPartnersConversionsStatisticsDocumentsApprovals
Shared foundationAuth · UI · routing · API · eventsImpersonation bridge
02 / Self-service

Partner UI

Discover offers, track results and complete operational workflows.

Offer discoveryPerformanceOnboardingQuizAcademySigningSupport

02 / The hard part

Identity was a runtime context.

A manager could open multiple tabs as different partners while global notifications and chat still belonged to the manager session.

Original sessionManager identityOwns global features
Browser tab APartner 1842sessionStorage → token map
Browser tab BPartner 7291sessionStorage → token map
Every requestAuthentication · permission check · audit contextBackend remains authoritative

03 / Architecture

Data changed shape at deliberate boundaries.

An MVVM-inspired flow kept transport models away from view concerns. Components received UI-ready data instead of interpreting backend responses themselves.

State ownership matrixAuthority × lifetime × update radius
01Server stateRTK Query

Remote data, caching, invalidation and request lifecycle

02Session contextTab + memory

Active partner identity and short-lived impersonation tokens

03Shared UI stateRedux

Cross-feature client state with an intentional lifetime

04Local UI stateReact

Forms, drawers and interactions owned by one component tree

04 / Decisions

Architecture followed the constraints.

The important choices were less about picking libraries and more about making ownership, identity and change safe at product scale.

01

How should one product serve two very different roles?

A modular SPA with explicit domain boundaries

Why this fit

The teams shared authentication, routing, UI foundations and release cadence. Independent deployments would have added coordination cost without solving an organisational problem.

02

How can a manager safely work as several partners?

Identity became explicit request context

Why this fit

Each browser tab owns an active partner ID; an in-memory map resolves it to a short-lived token. Manager-owned features remain attached to the original session.

03

Where should changing product data live?

State ownership follows authority and lifetime

Why this fit

Remote data stays in the server-state layer. Session, shared UI and local interaction state each have smaller, deliberate update paths.

04

How could the system evolve while it was still shipping?

Sequenced migration into shared foundations

Why this fit

Product delivery continued while shared contracts, tooling and components became stronger. Each migration reduced risk without requiring a disruptive rewrite.

05 / Contribution

Built inside a living product.

I built the frontend from scratch, defined its architecture and state-management approach, and owned delivery for critical workflows. From requirements through release, I worked with product, design, backend, and QA. I was promoted to Senior in January 2024.

6s → 2sProduction p75 LCP · critical pages
−70%Production p75 INP · 500ms → 150ms
0.3 → 0.1Production p75 CLS · layout stability
−35%Unnecessary React renders · measured workflows

Performance

Measure loading, interaction, and rendering separately.

Product pressure
Critical pages loaded slowly, interactions were delayed, and content shifted as data arrived.
My contribution
I optimized bundles, removed unnecessary dependencies, and improved React rendering. Redux Toolkit and RTK Query clarified state and data-fetching boundaries. Reserved loading space, reduced font reflow, and retained content during refetches addressed layout instability.
Observed result
Production p75 LCP fell from 6s to 2s, INP from 500ms to 150ms, and CLS from 0.3 to 0.1. Separately, state-management changes reduced unnecessary renders by 35% in measured workflows. Performance changes were validated through production monitoring and controlled tests.

Onboarding reliability

Replace the integration that was losing submissions.

Product pressure
A malfunctioning third-party framework integration caused data loss in approximately 10% of onboarding submissions.
My contribution
I replaced that integration with an internally controlled solution, taking responsibility for the behavior the onboarding workflow depended on.
Observed result
The onboarding defect was resolved, and submission behavior moved from the faulty third-party integration into an internally controlled solution.

Delivery

Reduce the cost of building and checking a release.

Product pressure
Production builds took 20 minutes and manual regression testing required 90 minutes per release.
My contribution
I optimized Vite and Rollup configuration, reduced the initial JavaScript payload, and automated critical user journeys with Cypress and Playwright. Component and integration tests complemented Storybook.
Observed result
Production build time fell to 6 minutes, a 70% reduction. Manual regression testing fell to 20 minutes per release, while automated journeys covered critical behavior.

The diagrams use simplified flows and generalized domain names. They contain no proprietary source code, customer data, or internal system details.

06 / Outcome

Faster pages, responsive workflows, and an onboarding defect resolved.