Frontend architecture
Monorepo topology, package boundaries, rendering strategy per route, and the type contracts that keep three products from drifting apart.
Open to senior frontend roles and select contract work
Senior Frontend Engineer
Next.js & React Specialist
Four years deep in Next.js, React and TypeScript — shipping healthcare platforms, a UK telecom storefront and configuration tools where a slow page or a broken flow costs actual money. Architecture first, animations last, and performance treated as a feature rather than a cleanup task.
▸$ next build --turbo
✓ Compiled successfully in 3.1s
○ (Static) prerendered as static content
Four years of frontend, spent almost entirely on products where the interface is the product.
I’m a senior frontend engineer working across healthcare, telecom, fintech, e-commerce, SaaS and industrial tooling. Most of that time has been in Next.js and React with TypeScript underneath, and most of it has been spent on systems that other teams depend on — a clinical platform used by operations staff every shift, a national telecom storefront measured in revenue per hundred milliseconds, a configuration engine where a wrong quantity becomes a wrong delivery on a construction site.
At Segwitz I own the frontend of the Genomas health platform: three products — Novameds B2B, Reveal B2C and an internal Admin Portal — running out of a single Turborepo with shared UI, shared hooks and one typed contract against the backend. The same role pulled in the BT/EE storefront work, where the brief was bluntly commercial: make it faster, make it accessible, keep the conversion journey intact. That work landed at 40% better LCP, 35% better FCP and Lighthouse scores above 95 on the audited routes.
Before that, at Latitude Technolabs, I moved quickly between client platforms — e-learning, fraud analytics, insurance quoting, real-estate search, AEM-backed frontends and a headless Strapi marketing site. Different domains, same recurring problem: an interface that had grown faster than its architecture. Picking those up mid-flight is why I now spend the first week of any engagement on structure rather than screens.
I’ve worked fully remote for three-plus years with teams across the UK, EU and US. That means writing things down: architecture notes, convention docs, PR descriptions that explain the trade-off. It also means I’m comfortable being the person who says a feature is not finished because it isn’t keyboard accessible, or because it pushed LCP past budget.
Monorepo topology, package boundaries, rendering strategy per route, and the type contracts that keep three products from drifting apart.
Core Web Vitals set as acceptance criteria — measured in the field, guarded in CI, and defended during feature work.
WCAG 2.1 AA conformance built into shared primitives: keyboard models, focus management, contrast, honest labelling.
React Query for server state, Zustand for UI state, typed GraphQL/REST clients, and invalidation modelled per domain.
Storybook-driven components, Jest and Cypress on critical paths, contract tests at the API boundary, CI that gives a clear answer.
Architecture reviews, PR walkthroughs, pairing sessions, and the written conventions the team onboards from.
Not a list of responsibilities — a record of what I owned, how it was structured, and what changed because of it.
01 — 2023 — Present
Senior Frontend Engineer
Full-time · Patna / Remote
Frontend owner across a portfolio of enterprise products — the Genomas health platform, a UK telecom e-commerce build and a parametric scaffolding configuration platform. I sit between design, backend and client stakeholders, and I'm accountable for the architecture, not just the tickets.
40%
LCP improvement
35%
FCP improvement
95+
Lighthouse (mobile)
02 — 2021 — 2023
Senior Next.js / React Developer
Full-time · Patna / Hybrid
Delivered client platforms across e-learning, fintech, insurance and real estate — often picking up codebases mid-flight and being asked to make them faster, testable and shippable.
6+
Client platforms shipped
5
Industries covered
03 — 2020 — Present
Frontend Consultant
Contract · Remote
Short, focused engagements: performance rescues, design-system extraction, migration off legacy React, and building the first version of a product frontend properly.
3+ yrs
Remote delivery
UK · EU · US
Timezones covered
A highly interactive frontend experience featuring complex micro-animations and smooth transitions. Check out my best animation work here.
A personal utility platform built to solve real-world conversion tasks effortlessly.
Each of these is written up as a full case study — the problem, what I was responsible for, how it was structured, the parts that were genuinely hard, and what changed as a result.
A Turborepo monorepo serving three healthcare products from one typed design system.
Full-time at Segwitz
Wholesale ordering surface for clinics and distributors: catalogues, negotiated pricing tiers, multi-cart checkout and order history.
Consumer-facing genetic testing storefront with kit selection, a guided sample-registration flow and result delivery.
Internal operations console — patient and sample records, lab pipeline states, user roles, content and reporting.
Three healthcare products had grown from the same origin into three codebases, each with its own component library, its own fetch layer and its own idea of what a button does. Features shipped to one product had to be re-implemented in the others, healthcare-specific states (loading, empty, error, restricted-by-role) were inconsistent, and clinical reviewers were seeing different behaviour for the same data on different surfaces. Release risk was climbing faster than the roadmap.
Frontend architecture and delivery lead across all three surfaces. I defined the monorepo structure and package boundaries, set the data-fetching and state conventions, built the shared component and type layer, reviewed every significant PR, and worked directly with product and clinical stakeholders to turn ambiguous healthcare requirements into typed interfaces.
3
Products on one codebase
1
Shared design system
B2B · B2C · Admin
Surfaces covered
Three apps — novameds, reveal, admin — plus shared packages for ui, hooks, api-client, types and config. Task graph with remote caching means a change to a shared component rebuilds only what depends on it, and CI stays under control as the repo grows.
One query-key factory per domain, explicit stale times, and an invalidation map co-located with mutations. Optimistic updates only where the backend contract guarantees them. Prefetching on intent for the flows where perceived latency mattered most.
Cart, filters, wizard progress and panel layout live in small Zustand slices with selectors, kept entirely out of the server cache. The rule enforced in review: if the server owns it, React Query owns it.
API response types generated from backend schemas and consumed by all three apps, so a field rename is a compile error rather than a runtime surprise in a clinical workflow.
A single permission model drives navigation, row-level actions and route guards across Novameds, Reveal and Admin — implemented once in the shared layer instead of three times with drift.
A big-bang rewrite was off the table — features kept shipping. I extracted the shared UI package incrementally, starting with the highest-usage primitives, and codemodded consumers app by app so each migration was independently shippable and revertible.
Clinical records mean PII, strict role boundaries and audit trails. Every list, export and mutation needed explicit permission checks, defensive empty states and no client-side caching of sensitive payloads beyond what the flow required.
An admin action can invalidate data a B2B user is looking at. Invalidation was modelled per domain rather than per screen, with targeted query invalidation instead of blanket refetches that would have hammered the API.
Sample registration and wholesale checkout both span several steps with validation and resumability. A shared wizard primitive handles persistence, step validation and deep-linkable state so each product only writes its business rules.
Rule-driven configuration, live material take-off generation and multi-role ordering.
Full-time at Segwitz
Defines the configurable product catalogue: component rules, compatibility constraints, pricing, tax, stock and the templates members configure against.
The configurator itself — dimensions, structure type and constraints drive a live bill of materials, saved configurations and checkout.
Order, invoice, payment and credit workflows tied back to generated MTOs, with approval states and export.
Scaffolding orders were assembled manually: a customer described a structure, someone with domain knowledge worked out which standards, ledgers, boards and couplers were needed, and priced it in a spreadsheet. The process didn't scale, was error-prone, and gave customers no visibility into what they were actually buying. The product needed a configuration engine that encoded expert rules and produced an accurate material take-off on demand.
Owned the frontend of the configuration and ordering experience across all three roles: the rule-driven form engine, the live MTO computation and preview, saved-configuration state, and the checkout/order workflow that hands off to finance.
3
Role-based surfaces
Dynamic
Configuration engine
Live
MTO generation
Fields aren't hardcoded — Super Admin defines configuration parameters, constraints and dependencies, and the Member UI renders and validates them dynamically. Adding a new product family is a data change, not a release.
The material take-off is treated as a pure derivation of configuration inputs. Inputs live in a Zustand slice; quantities recompute through a memoised selector pipeline so the preview stays in sync without a server round-trip on every keystroke.
Client-side numbers are an estimate for responsiveness; the server recomputes quantities and pricing at checkout. The UI makes the authority boundary explicit so nobody ships on a stale client calculation.
Super Admin, Member and Finance share an app shell but resolve navigation, guards and action availability from a single role model — no duplicated permission logic per screen.
Draft → quoted → ordered → approved → invoiced → fulfilled, modelled as explicit states. Every screen reads from the same machine, which removed a family of 'impossible status' bugs.
Scaffolding compatibility rules live in people's heads. I worked through them with domain experts, turned them into declarative constraint data, and built a validation layer that explains *why* a configuration is invalid — not just that it is.
Recalculating a full bill of materials on every input change is expensive on large structures. Selectors were scoped per component family and results memoised, keeping interaction latency well inside a frame budget.
Finance sees an order that Admin configured and a Member placed. Keeping IDs, versions and snapshots consistent across those views meant treating the order as an immutable record with references rather than a mutable shared object.
Configurations get edited mid-flow. The checkout re-validates against the current rule set and surfaces a diff of what changed before committing an order.
High-traffic telecom storefront where Core Web Vitals and WCAG are release criteria.
Full-time at Segwitz
Public catalogue and offer pages: mobile plans, handsets, broadband and TV, with comparison, eligibility and pricing logic.
Multi-step acquisition flows with address, credit and tariff selection — conversion-critical and heavily instrumented.
Marketing-led landing pages and campaign templates rendered from a CMS with strict performance budgets.
A national telecom storefront serves enormous organic and paid traffic, ranks in a brutally competitive SERP, and converts on a multi-step journey. Every hundred milliseconds of LCP is measurable revenue, accessibility is a legal and brand requirement, and the frontend consumes a large GraphQL catalogue API owned by another team. Slow pages, janky journeys and inaccessible components were direct commercial problems.
Senior frontend engineer on the storefront: rendering strategy per route, GraphQL integration, Core Web Vitals remediation, WCAG conformance work, and contract testing against the backend catalogue API. I also owned the frontend performance reporting that went to stakeholders.
40%
LCP improvement
35%
FCP improvement
95+
Lighthouse score
Catalogue and offer pages are SSG/ISR with targeted revalidation so marketing changes go live without a deploy. Eligibility, pricing and checkout are dynamic and streamed. Nothing is server-rendered by default just because it can be.
Operations colocated with the components that use them, generated types, and a normalised cache layer. Field-level selection kept payloads small — the catalogue API can return far more than a page needs.
Storybook-backed components with keyboard and screen-reader behaviour specified in the component contract, so accessibility is a property of the primitive rather than something each page re-implements.
Consumer-driven contract tests verify the frontend's assumptions about the GraphQL schema. Breaking changes fail in CI, which matters when the API is owned by a different team on a different release train.
Lab (Lighthouse CI) plus field (RUM) measurement, with budgets per route. Improvements were only claimed when the field data agreed with the lab.
Handset imagery dominates the viewport. Fixing it meant responsive srcsets at real device sizes, modern formats, correct priority hints on the single above-the-fold image, CDN cache configuration, and removing the layouts that caused images to be discovered late.
Analytics, tagging, chat and payment SDKs competed with the page. Scripts were audited, deferred or moved off the critical path, and their cost reported per tag rather than accepted as unavoidable.
Thousands of templated pages inherit whatever the components do. Fixes had to land in the primitives: focus management in modals and mega-menus, honest labelling on price and tariff tables, contrast on promotional styling, and a keyboard path through every journey.
Eligibility-dependent content arriving after render caused CLS. Reserved space, skeleton sizing matched to real dimensions and streamed placeholders removed the shift without delaying the content.
Contract tests plus a defensive rendering layer meant schema drift degraded a component gracefully instead of blanking a revenue page.
Client work delivered at Latitude Technolabs and on contract — e-learning, fraud analytics, headless marketing, no-code SaaS, insurance and proptech.
No percentage bars — a percentage of TypeScript means nothing. Every item here is something I have shipped with, what I actually use it for, and which project it appears in.
Select a technology to see how I use it and where it has shipped. On desktop, the rest of the wall dims so you can read one thing at a time.
Where the day-to-day lives.
Server state and UI state kept honestly apart.
Design systems, then animation as behaviour.
Confidence that survives a refactor.
Frontend that deploys without drama.
Where marketing meets engineering.
Non-negotiables on every build.
Eight positions I hold on every project. They are opinions formed by production incidents, failed refactors and the audits that followed.
core-web-vitals
Budgets are set before the first component is written, not negotiated after the audit. Every route gets a rendering strategy on purpose — static, incremental, streamed or dynamic — and third-party scripts have to justify their bytes.
40% faster LCP and 35% faster FCP on a production telecom storefront, measured in the field.
scalability
A monorepo, a typed contract between client and server, and a clear boundary between server state and UI state do more for velocity than any component library. Structure decides how cheap the next change is.
Three Genomas products share one UI package, one config layer and one type system.
wcag-2.1-aa
Semantic markup, a coherent keyboard model, visible focus, honest labelling and sufficient contrast. If a component only works with a mouse, it isn't finished — it's a demo.
WCAG-conformant delivery on an enterprise UK e-commerce platform.
storybook
Build components in isolation with documented variants and states, then compose. Storybook is where edge cases get found — empty, loading, error, overflow, long-label — before QA finds them.
Shared design-system package consumed by B2B, B2C and admin surfaces.
maintainability
Small typed functions, explicit data flow, names that describe intent, and comments that explain why. I write for the engineer who inherits this in eighteen months, who is usually me.
Frontend conventions doc adopted across the team and used in onboarding.
jest · cypress · contracts
Unit tests on logic, integration tests on user journeys, contract tests on the API boundary. Coverage that breaks when behaviour breaks is worth more than coverage that breaks when markup changes.
Contract tests catching breaking schema changes in CI before release.
metadata · structured-data
Render strategy determines crawlability. Server-rendered critical content, a deliberate metadata layer, canonical discipline, sitemaps and schema — decided at architecture time, not bolted on.
SSR/SSG storefront routes with structured data and stable Core Web Vitals.
dx
Fast builds, useful types, sane folder structure, working local environment in one command, and CI that gives a clear answer. Friction in the toolchain is friction in every feature that follows.
Turborepo caching and a standardised Next.js starter reused across projects.
Only figures I can point at: field Core Web Vitals deltas on a production storefront, Lighthouse on audited routes, and time actually spent doing this work.
React & Next.js product engineering
Distributed teams across UK, EU & US
Largest Core Web Vitals gain shipped
Same production storefront baseline
Performance, a11y, best practices, SEO
Healthcare · telecom · fintech · SaaS · e-comm · industrial
If you have a product where the frontend is the bottleneck — slow, inconsistent, hard to extend, or failing an accessibility or performance bar — that is exactly the conversation I want to have. Full-time senior roles and focused contract work both welcome.
Typical reply — within two working days
Detailed CV and references available on request.