At StreamTech, I was responsible for a real-time betting platform that served thousands of concurrent users. Initial page loads were taking 4–6 seconds on average — unacceptable for a high-traffic, competitive product. Users were bouncing, conversion rates suffered, and Lighthouse scores were in the low 50s.
After two focused optimization sprints, we reduced Time to Interactive (TTI) and Largest Contentful Paint (LCP) by ~30% across key pages — without rewriting the entire codebase.
Here’s exactly what worked, what didn’t, and the trade-offs we accepted.
The app had several heavy components (charts, live odds tables, user dashboards) loaded on every page — even if the user never scrolled to them.
What we did:
// Before (blocks render)
import HeavyChart from '../components/HeavyChart';
// After
import dynamic from 'next/dynamic';
const HeavyChart = dynamic(() => import('../components/HeavyChart'), {
ssr: false,
loading: () => <div className="h-64 flex items-center justify-center">Loading chart...</div>,
});