Problem
61 <img> elements across src/ and recipe-gallery/, with several issues:
Missing alt
src/components/Prtnr.tsx:86 — <img src={prtnr.imageUrl} />
recipe-gallery/sweetalert2-laravel.tsx:96
(The rest do have alt; Header.tsx correctly uses alt="" for the decorative logo track.)
Zero lazy loading
$ grep -rno 'loading="lazy"' src recipe-gallery --include=*.tsx | wc -l
0
Nothing on the site is lazy-loaded. The worst case is Sponsors.tsx, which eager-loads ~40 sponsor logos far below the fold on the homepage — all competing for bandwidth with the LCP element. Every one of them should be loading="lazy" decoding="async".
The GitHub-stars <iframe> at src/components/Header.tsx:39 (ghbtns.com) also has no loading="lazy" and sits at the very top of the page.
Missing intrinsic dimensions
Most <img> have no width/height (some do — e.g. Themes.tsx passes width={300}). Without both dimensions the browser can't reserve space, so images popping in shift layout → CLS, which is a Core Web Vitals ranking signal.
No modern formats
public/images/ is 1.8 MB of PNG/JPEG/GIF with only one .webp (prtnrs/deel.webp). Notable offenders:
public/images/prtnrs/hostinger.png — 332 KB
public/images/picture.jpg — 156 KB
public/images/sweetalert2.gif and nyan-cat.gif — animated GIFs
WebP/AVIF would cut most of these by 60–80%.
Suggested fix
- Add
alt to the two images missing it (Prtnr should use the partner name; alt="" if genuinely decorative).
- Add
loading="lazy" decoding="async" to all below-the-fold images — centralise it in the Sponsors/Prtnr render loops rather than per-link.
- Add
loading="lazy" to the GitHub-stars iframe.
- Add
width/height to every <img>.
- Convert
public/images/** to WebP (keep PNG fallback only where needed); re-compress hostinger.png.
Impact
Medium — direct CLS/LCP improvement, and CWV is a ranking signal.
Problem
61
<img>elements acrosssrc/andrecipe-gallery/, with several issues:Missing
altsrc/components/Prtnr.tsx:86—<img src={prtnr.imageUrl} />recipe-gallery/sweetalert2-laravel.tsx:96(The rest do have
alt;Header.tsxcorrectly usesalt=""for the decorative logo track.)Zero lazy loading
Nothing on the site is lazy-loaded. The worst case is
Sponsors.tsx, which eager-loads ~40 sponsor logos far below the fold on the homepage — all competing for bandwidth with the LCP element. Every one of them should beloading="lazy" decoding="async".The GitHub-stars
<iframe>atsrc/components/Header.tsx:39(ghbtns.com) also has noloading="lazy"and sits at the very top of the page.Missing intrinsic dimensions
Most
<img>have nowidth/height(some do — e.g.Themes.tsxpasseswidth={300}). Without both dimensions the browser can't reserve space, so images popping in shift layout → CLS, which is a Core Web Vitals ranking signal.No modern formats
public/images/is 1.8 MB of PNG/JPEG/GIF with only one.webp(prtnrs/deel.webp). Notable offenders:public/images/prtnrs/hostinger.png— 332 KBpublic/images/picture.jpg— 156 KBpublic/images/sweetalert2.gifandnyan-cat.gif— animated GIFsWebP/AVIF would cut most of these by 60–80%.
Suggested fix
altto the two images missing it (Prtnrshould use the partner name;alt=""if genuinely decorative).loading="lazy" decoding="async"to all below-the-fold images — centralise it in theSponsors/Prtnrrender loops rather than per-link.loading="lazy"to the GitHub-stars iframe.width/heightto every<img>.public/images/**to WebP (keep PNG fallback only where needed); re-compresshostinger.png.Impact
Medium — direct CLS/LCP improvement, and CWV is a ranking signal.