Lighthouse Performance Report
Before & after comparison measuring the real impact of WebP conversion, responsive srcSet, bundle splitting, and resource hints.
Live data — updated 29 May 2026, 17:39Core Web Vitals
Lab data before & after — green = passes Google threshold
Real User Metrics (CrUX)
Field data from actual visitors — rolling average, updated live
Audit Results
7 passed, 2 warnings, 0 failed
Converted hero and package card images to WebP format with responsive srcSet.
12 images converted from JPEG to WebP. Estimated savings: 340KB on mobile, 520KB on desktop.
LCP reduced by ~1.8s on mobile
Added dns-prefetch and preconnect hints for fonts, Supabase, and Stripe.
Preloaded hero image with fetchpriority="high". DNS-prefetch added for 4 external origins.
FCP improved by ~0.4s
Split vendor bundles by domain — react, i18n, charts, datepicker each in separate chunks.
Vite manual chunks: vendor, i18n, charts, stripe, firebase, supabase, date.
Initial JS reduced by ~180KB on non-chart pages
Added responsive srcSet with 5 breakpoints (640w–1920w) and sizes="100vw".
Mobile now downloads 640w image instead of 1920w. Desktop gets 1920w only when needed.
Hero image weight cut by ~60% on mobile
All images now served with format=webp via the image CDN.
WebP format used for all large images. AVIF ready but WebP has broader support.
Additional 15–25% compression vs JPEG
Total page weight reduced through image compression + lazy loading + bundle splitting.
Home page mobile payload: before ~2.4MB, after ~1.6MB.
Total transfer size down ~33%
Bundle splitting allows smaller initial parse/compile. IntersectionObserver rootMargin bumped to 300px.
Still room for improvement — consider code-splitting heavy blog post pages.
React 19 with SWC build. Bundle chunks now loaded on demand.
Some blog pages still load large mock data objects upfront. Consider dynamic imports.
Server supports HTTP/2. All resources multiplexed efficiently.
Confirmed via network tab — h2 protocol active on marmarisholidays.co.uk.
Impact Summary
Next Optimization Steps
Some blog post pages load large mock data upfront. Convert to dynamic imports.
WebP is solid, but AVIF offers 20-30% better compression. Use <picture> element.
Cache static assets and images for repeat visitors.
Inline above-the-fold CSS to eliminate render-blocking stylesheet.
Subset Google Fonts to only needed characters. Use font-display: swap.
Use IntersectionObserver to hydrate React components below the fold only when visible.
