⚡ The Lab · Performance
Performance Monitor
Live Core Web Vitals measurement of this very site. Real scores from your browser, with the exact optimisations that achieve them.
“Performance isn't a feature — it's a foundation. Every millisecond is a user you might lose.”
How this works
RealFCP · TTFBCaptured directly from your browser's Performance API on this page load — these are your actual numbers.
RealRequest WaterfallBuilt from the Navigation Timing API — DNS lookup, TCP connect, server response, download, and DOM parse times are all genuine.
Coming SoonLCP · CLS · INPThese require async observation throughout the page lifecycle via the web-vitals package. Currently showing realistic simulated scores for this demo — real wiring is coming soon.
—
⏳ MeasuringLCPLargest Contentful Paint
How long until the largest visible element (image or text block) is rendered.
✅ Good: ≤ 2,500ms⚠️ OK: ≤ 4,000ms
▶How we optimised LCP on this site
- Server-side rendering ensures HTML arrives with content (no waterfall)
- next/font with font-display: swap eliminates render-blocking fonts
- next/image with priority prop on above-the-fold images
- Vercel Edge Network serves assets from the nearest CDN node
—
⏳ MeasuringFCPFirst Contentful Paint
Time until the first text or image is painted on screen.
✅ Good: ≤ 1,800ms⚠️ OK: ≤ 3,000ms
▶How we optimised FCP on this site
- Minimal critical CSS inlined via Tailwind's JIT compiler
- No render-blocking JavaScript on initial load
- HTTP/2 multiplexing for parallel resource loading
- Preconnect hints for Google Fonts loaded via next/font
—
⏳ MeasuringTTFBTime to First Byte
Time from navigation start until the first byte of the response arrives.
✅ Good: ≤ 800ms⚠️ OK: ≤ 1,800ms
▶How we optimised TTFB on this site
- Static pages served directly from Vercel's edge CDN — no server compute on each request
- ISR (Incremental Static Regeneration) for dynamic pages
- Vercel Edge Network with global PoPs close to every user
- Efficient Next.js App Router with React Server Components
—
⏳ MeasuringCLSCumulative Layout Shift
Measures unexpected visual shifts in page content as it loads.
✅ Good: ≤ 0.1⚠️ OK: ≤ 0.25
▶How we optimised CLS on this site
- next/image always reserves space before image loads (width/height required)
- next/font eliminates FOUT (Flash of Unstyled Text) — fonts load with layout reserved
- No dynamically injected content above the fold
- Explicit size on all skeleton/placeholder elements
—
⏳ MeasuringINPInteraction to Next Paint
Responsiveness to user interactions — clicks, taps, key presses.
✅ Good: ≤ 200ms⚠️ OK: ≤ 500ms
▶How we optimised INP on this site
- Server Components reduce client-side JavaScript bundle by ~40%
- "use client" only on components that actually need interactivity
- Framer Motion deferred to idle time with useReducedMotion respect
- No heavy third-party scripts blocking the main thread
🛠 Stack powering these scores
Next.js 15 App RouterReact Server ComponentsVercel Edge CDNnext/fontnext/imageTailwind CSS JITHTTP/2Vercel Analytics