SagaraHarasgama · Consulting
ServicesWorkAboutInsightsContactDiscuss a Project
Production healthcare compliance SaaS · US-based, distributed team

Solo-owning a healthcare compliance SaaS frontend for a year

Sole frontend owner of a live healthcare compliance platform for a year — architecture, design system, performance, test infrastructure, CI/CD and security, on a codebase that grew to roughly 225,000 lines.
ROLE

Embedded Senior Frontend Engineer — sole frontend owner

TIMEFRAME

~12 months

Dashboard load time

6.2s

1.1s

Dashboard data transfer

4,886 kB

113 kB

Unit test suite runtime

11 min

2.8 min

Average PR CI time

~15 min

~2 min

Context

The product helps healthcare organizations track regulatory compliance — clinicians upload documents, an AI pipeline extracts and matches rules against them, and staff work through per-chapter checklists in real time. There was no dedicated frontend lead when the engagement started; ownership of architecture, delivery, performance and infrastructure sat with one person for the full year.

The challenge

This wasn't a green-field build. Across roughly 1,750 commits, fixes outnumbered new features by nearly two to one — the signature of a live product under constant stakeholder feedback, not a demo. On top of that steady iteration, the main dashboard had degraded to 6+ seconds to feel usable, the local test suite crashed unpredictably partway through every run, and there was no design system — just ad-hoc component usage spreading further with every new page.

Approach

Owned the frontend architecture end-to-end: a layered pages → hooks → API-service structure, a centralized API client with automatic response-envelope unwrapping, a query-key factory to prevent cache collisions across 44 hooks, and a full RBAC/entitlement system mapped to roughly 400 backend permissions.

Diagnosed the dashboard's real bottleneck instead of accepting the default explanation. "Slow backend" turned out to be three unrelated problems stacked together: a 1,000-record client-side fetch computing one number, a 2.4MB unconditional request, and a silent double-unwrap bug in the API client that made the loading guard permanently true.

Root-caused a non-deterministic local test crash to a leaking Web Worker rather than writing it off as flaky infrastructure — the fix, plus switching the DOM test environment, cut suite runtime by 75%.

Built a change-aware CI test gate using import-graph analysis instead of the industry-default choice between "run everything" and "run only same-folder tests" — neither of which was accurate for a codebase this size.

What shipped

Shipped a dedicated dashboard analytics endpoint with the backend team, removed the redundant client-side fetch, gated the unconditional rules request, and fixed the double-unwrap — three root causes, one coordinated fix.

Designed and built a full design system from scratch: CSS custom-property tokens across 4 palettes and 3 density modes, a shared component library, and Storybook coverage with Chromatic visual regression testing.

Authored three GitHub Actions pipelines solo: a quality gate (lint, typecheck, tests, security audit), a nightly full-regression run with Slack alerting, and automated AI-assisted code review on every PR.

Built a coverage ratchet that blocks any PR from silently reducing test coverage — it directly surfaced a live production bug where an added case status was falling through to "Unknown" undetected for weeks.

Delivered major product systems solo end to end: the core compliance-checklist module (AI-driven document analysis with real-time job polling), a 7-tab API cost analytics dashboard, real-time WebSocket chat, a fuzzy-search command palette, and Stripe-based subscription billing.

Scale of ownership

1,758

Commits (non-merge)

~225,000

Lines of TypeScript

88

Pages

363

Reusable components

286

Test files

897+

Passing tests at handover
Lessons

The surface symptom pointed away from the real cause almost every time — a slow dashboard blamed on the backend, random test crashes blamed on flakiness, a two-click navigation bug blamed on React rendering. In every case, the fix only arrived after discarding the obvious explanation and reading one layer deeper. At handover: ten technical documentation pages, roughly 500 non-essential files removed from the repository, and every open dependency PR triaged with written rationale — so the next owner didn't need the previous one in the room.

Technology
React 19
TypeScript
Vite 7
MUI v7
TanStack Query v5
React Router v7
Recharts
Playwright
Vitest
GitHub Actions
Sentry
SonarQube
Storybook
Have a codebase or product with similar problems?

Tell me what you're working on and where you're stuck. I'll determine whether I can help.

Discuss a Project