# Performance Review — santhoshj.com Date: 2026-04-11 ## Lighthouse Scores | Category | Desktop | Mobile | |----------|---------|--------| | Performance | 100 | 95 | | Accessibility | 100 | 100 | | Best Practices | 100 | 100 | | SEO | 100 | 100 | ## Core Web Vitals | Metric | Desktop | Mobile | Rating | |--------|---------|--------|--------| | FCP | 0.4s | 2.3s | Desktop: Great / Mobile: Needs improvement | | LCP | 0.6s | 2.4s | Desktop: Great / Mobile: Good | | TBT | 0ms | 0ms | Great | | CLS | 0.001 | 0.001 | Great | | SI | 0.5s | 2.4s | Desktop: Great / Mobile: Great | | TTI | 0.6s | 2.4s | Desktop: Great / Mobile: Great | LCP element: H1 text node (no image resource). --- ## Actionable Items (Priority Order) ### 1. Fix forced reflow — 48ms waste - `setOpen()` at `index.html:502` causes 47ms forced sync layout - `updateNotchTop()` at `index.html:623` also triggers reflow - Root cause: reads geometric properties (e.g. `offsetWidth`) after DOM writes - Fix: batch all layout reads before writes, or wrap writes in `requestAnimationFrame` ### 2. Add cache headers to JS bundles - Astro-hashed JS assets served with `cache-control` TTL=0 - These files have content hashes in filenames — safe to cache long-term - Fix: set `cache-control: public, max-age=31536000, immutable` on `/_astro/*` and other hashed assets - Location: nginx config or CDN cache policy ### 3. Remove `cache-control: no-store` from HTML - Current: HTML doc uses `no-store` → back/forward cache disabled - Prevents instant back navigation (bfcache) - Fix: replace `no-store` with `cache-control: max-age=0, must-revalidate` - Also affects JS network requests receiving `no-store` resources ### 4. Tree-shake unused CSS — 30KB waste - Two CSS chunks (16KB + 14KB) are entirely unused on the homepage - Likely page-specific styles loaded eagerly - Fix: ensure Astro code-splitting for CSS per page, or remove unused selectors - Check `/_astro/_slug_.*.css` — may bundle all page styles into one sheet ### 5. Defer render-blocking JS — 550ms mobile waste - Main JS bundle and CSS are render-blocking - Fix: inline critical JS/CSS, defer remaining with `async` or `defer` - Or: use `` for critical resources + `defer` for non-critical ### 6. Reduce unused JavaScript — 38KB / 99KB (38% waste) - Main Astro JS bundle: 38KB unused out of 99KB - Fix: audit Astro client-side scripts, remove unused island code, or split into smaller chunks - Check if `setOpen`, `updateNotchTop`, umami analytics, and other inline scripts can be deferred ### 7. Optimize image delivery — 323KB mobile savings - YouTube thumbnails served as-is (JPEG, no WebP/AVIF) - No responsive `srcset` — full-size thumbnails on all viewports - Fix: use `` with WebP/AVIF fallback, add `loading="lazy"` for below-fold images, consider `width`/`height` attributes to reduce CLS risk - Note: these are 3rd-party `ytimg.com` URLs — limited control. Consider proxying or using YouTube's `mqdefault.jpg` (smaller) for mobile