Back to home

Overview

I led a performance and SEO overhaul for a web application. Migrated critical rendering paths to Next.js and implemented structured data, dynamic meta tags, Core Web Vitals optimization, and server-side rendering for key landing pages. Monthly Google Search clicks went up 90% in the first quarter.


The other half was building a testing infrastructure from zero. Set up unit testing with Jest and React Testing Library, integration testing for critical user flows, and end-to-end testing with Cypress on the most important conversion paths. Production bug rates dropped 30%, and the team started shipping faster.


New Relic gave us real-user performance metrics so we could make data-driven decisions about what to optimize next. Every improvement was measured against baselines.

Key Features

Tech Stack

Next.js
SSR, static generation, and automatic code splitting for better SEO and performance
Jest
Unit and integration tests with snapshot testing, mocks, and coverage reporting across the component library
Cypress
End-to-end tests for critical user flows with visual regression detection and cross-browser validation
React Testing Library
Component testing focused on user behavior, not implementation details, so tests survive refactors
SEO
Structured data, canonical URLs, sitemap generation, robots.txt optimization, and crawl budget management
New Relic
Real-user metrics, custom dashboards, alerting, and transaction tracing for finding bottlenecks

Architecture

Measure, improve, verify. New Relic baselines told us where to focus. Next.js SSR fixed the biggest SEO bottleneck by serving fully rendered HTML to search crawlers. Testing was layered: Jest for unit tests, React Testing Library for integration, Cypress for end-to-end on critical paths. Performance budgets and test suites gated every deployment in CI.

Challenges & Solutions

Migrating to Next.js without disrupting active development

The team was shipping features weekly, so a big-bang rewrite was off the table. I used an incremental approach with Next.js's pages directory alongside the existing routing, migrating one route at a time. Each migrated page was A/B tested for performance and SEO impact before moving on. This delivered measurable improvements with each step without disrupting ongoing development.

Establishing testing culture in a team without existing test coverage

Adding tests to a codebase with zero coverage takes both infrastructure and buy-in. I started with the most bug-prone modules to show immediate value. In the first month, testing caught three production bugs before they shipped. I set up reusable testing patterns and utilities to lower the effort of writing new tests, documented common scenarios, and put coverage reporting in pull requests so test gaps showed up during code review.