Senior Frontend Engineer8 years · React · TypeScript · ex-TRM Labs, Paytm

I make broken interfaces fast, accessible and global.

This page is a working demo. Break it, then watch me fix it. Each problem is a re-creation of one I fixed in production, and every number you see is measured live, in your browser.

Loading the demos…

Six things I fix for a living

Each card can be broken and fixed on its own. Problems are re-created with synthetic workloads; the measurements are real.

fix 01 · performanceHealthy

A graph that freezes while plotting

The broken version finds each incoming element’s index by scanning everything already plotted (findIndex inside the loop): quadratic work that blocks the main thread. The fix memoizes each element’s index in a Map as it is plotted, so every lookup is O(1): linear work, identical output.

Before · measured—not measured yet
After · measured—not measured yet

In production at TRM Labs: graph plot matching on 1,600 elements went from 15.5 s → 14 ms after a 20+ PR push he led.

fix 02 · renderingHealthy

A sidebar that stutters

Opening the sidebar resizes the graph. Broken: heavy work runs during the animation. Fixed: the work waits until the transition ends, then runs in small idle chunks.

Before · dropped frames—not measured yet
After · dropped frames—not measured yet

At TRM Labs: deferring sidebar work while the graph resized removed visible jank.

fix 03 · loadingHealthy

Every route, shipped up front

Broken: all route code loads before anything works. Fixed: only the core loads; each route’s code loads the first time you open it.

core.js—
admin.js—
graph.js—
reports.js—
search.js—
settings.js—
Before · JS on load—not measured yet
After · JS on load—not measured yet

At TRM Labs: route-level code splitting cut the initial bundle by ~85%. This demo’s chunks are sized to mirror that.

fix 04 · networkHealthy

Requests nobody asked for

Broken: every panel fetches on load, a late banner shoves the layout, and a status check polls 30 times a second. Fixed: panels fetch as you scroll near them, space is reserved, and polling backs off.

  • Loading panel 1
  • Loading panel 2
  • Loading panel 3
  • Loading panel 4
  • Loading panel 5
  • Loading panel 6
  • Loading panel 7
  • Loading panel 8
  • Loading panel 9
  • Loading panel 10
  • Loading panel 11
  • Loading panel 12
  • Loading panel 13
  • Loading panel 14
  • Loading panel 15
  • Loading panel 16
  • Loading panel 17
  • Loading panel 18
  • Loading panel 19
  • Loading panel 20
  • Loading panel 21
  • Loading panel 22
  • Loading panel 23
  • Loading panel 24
status polling: 0 req/spanels fetched: 0/24
Before · requests in 6 s—not measured yet
After · requests in 6 s—not measured yet

At TRM Labs: a p95 25 s request moved off the entity page’s initial load, and polling went from 30 req/s → ~3 req/min.

fix 05 · accessibilityHealthy

A panel only mouse users can use

Broken: every control works with a mouse and nothing else. Clickable divs, no focus ring, an unlabeled icon, faint text. Fixed: real buttons and menus, labels, visible focus, readable contrast, and a sortable table you can drive from the keyboard.

AddressTypeRisk
0x9f…a21ExchangeLow
0x3c…7e0MixerHigh
0x71…b4dOTC deskMedium
0xa4…19cBridgeHigh

WS rows · AD headers · arrow keys cells · Enter sorts

4 addresses linked to a flagged entity.

In the broken state this demo panel is intentionally inaccessible. The Fix button below always works.

Before · live audit—not measured yet
After · live audit—not measured yet

At TRM Labs: an accessible Radix + Tailwind design system (all new UI is built on it) and keyboard tables for a government contract.

fix 06 · internationalizationHealthy

A product that only speaks English

Broken: strings are hard-coded, so switching language shows raw keys. Fixed: typed keys, and translations that load the first time a language is picked, then come from cache.

en · bundled with the page

Investigation overview

6 addresses linked to a flagged entity

Open graphAlertsUpdated just now
// generated from en.json, checked in CI
type I18nKey = 'alerts' | 'open' | 'sub' | 'title' | 'updated';
Before · missing strings—not measured yet
After · missing strings—not measured yet

Led frontend internationalization at TRM Labs: typed keys, lazy-loaded translations, and pre-commit and CI checks so untranslated text can’t ship.

Your session’s results

Filled in from real measurements as you break and fix things above.

Not startedPR #581 · Let Subham fix it
Before and after measurements from this session, with production results
FixBefore (your device)After (your device)In production
Plot matching——15.5 s → 14 ms
Sidebar animation——Jank removed
JS on load——~85% smaller
Requests in 6 s——30 req/s → ~3 req/min polling
Accessibility audit——Design system for all new UI
Missing translations——Typed keys + CI checks

Case studies

The context, constraints and trade-offs behind the demos.

How I make a team faster

The work that doesn’t show up in a screenshot: systems that make everyone else’s PRs safer.

  1. 01

    Standards other teams build on

    Proposed a Radix + Tailwind design system with accessibility built into the components. All new UI at TRM is built on it.

  2. 02

    Contracts across team boundaries

    Generated OpenAPI types in a pre-commit hook and CI, so a breaking backend change fails in the backend PR instead of in production.

  3. 03

    Guardrails that scale review

    Typed translation keys and CI checks so untranslated text can’t ship, with agent rules so AI-written PRs follow the same process.

  4. 04

    Tooling for an AI-native team

    Split a 3,000-line agent instruction file into scoped skills, built a parallel git-worktree skill, and wrote agents the team used daily.

  5. 05

    Prototype before building

    Built working prototypes with AI agents and tested them with internal investigators before committing to a design, then proposed one assistant instead of two.

  6. 06

    Confidence at speed

    Pushed for regression coverage as AI-assisted PR volume grew, and led a 20+ PR performance push in small, reviewable, revertable steps.

Where I’ve been fixing things

  1. Nov 2023 – 2026

    TRM Labs

    Frontend Engineer

    TRM Forensics, a graph-based blockchain investigation product used by government agencies and financial institutions.

  2. Mar 2022 – Oct 2023

    Paytm

    Senior Software Engineer

    Paytm Payments and Paytm Money.

  3. Oct 2020 – Mar 2022

    Enterprise Minds

    Senior Software Engineer, Consulting

    Frontend modernization for product companies.

  4. Apr 2018 – Oct 2020

    Infosys

    Senior Systems Engineer

    Mobile and frontend delivery for enterprise clients.

Got something that needs fixing?

Bengaluru, India · open to remote roles