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…
15.5 s → 14 msgraph plot matching on 1,600 elements
~85%smaller initial bundle from route-level code splitting
580+merged PRs at TRM Labs
Mar 2026Orion chat UI launched
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.
Entity details
Linked addresses
Risk indicators
Notes
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.
Address↕
Type↕
Risk↕
0x9f…a21
Exchange
Low
0x3c…7e0
Mixer
High
0x71…b4d
OTC desk
Medium
0xa4…19c
Bridge
High
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
Fix
Before (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.
The work that doesn’t show up in a screenshot: systems that make everyone else’s PRs safer.
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.
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.
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.
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.
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.
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
Nov 2023 – 2026
TRM Labs
Frontend Engineer
TRM Forensics, a graph-based blockchain investigation product used by government agencies and financial institutions.
Mar 2022 – Oct 2023
Paytm
Senior Software Engineer
Paytm Payments and Paytm Money.
Oct 2020 – Mar 2022
Enterprise Minds
Senior Software Engineer, Consulting
Frontend modernization for product companies.
Apr 2018 – Oct 2020
Infosys
Senior Systems Engineer
Mobile and frontend delivery for enterprise clients.