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.
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.
01 / BackendDomain models
02 / Data accessRTK Query
03 / View modelHooks + selectors
04 / InterfaceReact components
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.
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.