No PageSpeed Insights / CrUX API key was available for this audit, so the findings below are a lab-style, source-level analysis (direct curl timing, header inspection, and HTML parsing across the homepage, a city page, and a service page) rather than real-user field data — recommend validating against live PageSpeed Insights before finalizing any client-facing LCP/INP/CLS pass-fail claims. The server foundation here is genuinely better than most small-business WordPress sites: TTFB is excellent and the ExactDN/BunnyCDN image pipeline is correctly configured. The score is dragged down by a caching misconfiguration on the HTML itself and two badly oversized source images.

TTFB & Compression — Pass

PageAvg TTFB (5 samples)
Homepage~147ms
City page (Katy)~170ms
Service page (Tree Trimming)~138ms steady-state

All three well under the 200ms "good" TTFB guideline. Gzip compression is working correctly (homepage HTML: 308,482 bytes → 44,944 bytes gzipped, an 85.4% reduction), and CDN assets are served over HTTP/2.

Critical Finding

PERF-01HTML caching is disabled sitewideFIXED — verified live Oct 4, 2026

Homepage, city page, and service page all return identical headers (Sept 25):

Cache-Control: max-age=0, no-cache, no-store, must-revalidate Expires: Mon, 29 Oct 1923 20:30:00 GMT Pragma: no-cache

This forces a full re-download of the HTML on every repeat visit or crawl. By contrast, ExactDN image assets are correctly cached (Cache-Control: public, max-age=31536000, confirmed cdn-cache: HIT) — the problem is isolated to the WordPress/Apache HTML response.

Root cause found (Oct 4, 2026): this wasn't a leftover misconfiguration — it's WP Fastest Cache's own plugin code, hardcoded with no settings toggle, regenerated into .htaccess on every cache rebuild. Fixed by adding a separate rule block after the plugin's own section (Apache processes same-named Header set directives in order; the later one wins), which survives future plugin cache clears without being overwritten. Live now: Cache-Control: max-age=300, must-revalidate, no more stale 1923 Expires header. Picked a short 5-minute window rather than the originally suggested 600s to balance real caching benefit against how frequently this site's content is being updated this engagement.

High Findings

PERF-02Two portfolio images account for 41% of homepage image weightResized — real-world severity was overstated
FileServed at (Sept 25)Size (Sept 25)Size (Oct 4, resized)
comercial-e1572561462890.jpg1937×1937px495 KB233 KB (origin), 156 KB via ExactDN
tree-removal-rig-and-tackle...jpg1440×1440px475 KB417 KB (origin)

Together ~970KB (41%) of an estimated ~2.35MB worst-case homepage page weight, despite both being capped at 1080px display width per their sizes attribute. Several other portfolio images run 100–165KB each — all Divi gallery images uploaded in 2019 at full resolution and never downsized before upload.

Status (Oct 4, 2026): both master files resized to 1080px/quality 85 (originals backed up first) — real, measurable file-size reduction. But the real-world severity was lower than this finding implied: checking the actual srcset/sizes markup showed these images were already served via ExactDN with correct responsive variants (104-154KB for realistic viewport widths), not the raw 495-599KB master file — real visitors were never actually downloading the worst-case size. The fix is still a genuine improvement (smaller master = smaller worst-case fallback, less storage, faster first-generation of future thumbnail sizes), just not the dramatic page-weight win the original framing suggested.

PERF-039 of 10 stylesheets and 5 scripts block render on the homepageHigh

Only one of the homepage's 10 <link rel="stylesheet"> tags uses the preload/swap pattern; the other 9 are classic render-blocking. Five render-blocking <script> tags with no defer/async also load in <head>: jQuery, jQuery Migrate, and 3 Gravity Forms scripts (~46KB total) — even though the contact form isn't above the fold. City and service pages are cleaner (Gravity Forms isn't loaded there), but still carry 5–7 blocking stylesheets each.

Fix: defer the Gravity Forms JS bundle and apply the preload/swap pattern already used for one Divi stylesheet to the rest.

Image Delivery (ExactDN) — Mostly Good

  • WebP content negotiation confirmed working: same URL returns WebP with an Accept: image/webp header, JPEG otherwise
  • Responsive srcset/sizes correctly generated with full breakpoint sets
  • Long-lived CDN caching on images: max-age=31536000, confirmed BunnyCDN edge HIT
  • Lazy loading implemented via lazysizes.js plus native loading="lazy"; the hero/LCP image correctly skips lazy-loading and uses fetchpriority="high"
  • No <link rel="preload"> hint for the LCP hero image — would give a more direct LCP improvement than most other changes on this list
  • Source master images (see PERF-02) are oversized before ExactDN ever resizes them — FIXED, resized Oct 4, 2026. (ExactDN was already compensating well via responsive srcset even before this fix.)
  • One off-brand hotlinked image (advancedhomeexteriors.net/.../five-stars@2x.png) bypasses ExactDN entirely, pointing to an apparently unrelated third-party domain — FIXED, re-hosted Oct 5, 2026: downloaded, uploaded to the WP media library, and both references (the active Theme Builder header layout and its underlying template style) repointed to the new self-hosted file, now served via ExactDN like every other site image. Verified live.

CLS & INP Notes

  • 26 of 74 homepage <img> tags lack explicit width/height — concentrated in the Google Reviews widget (small avatar images); minor CLS risk
  • DOM size is comfortably under the ~1,500-element Lighthouse threshold on every page tested (homepage ~997, city ~751, service ~487)
  • Minimal third-party script footprint: only Google Tag and reCAPTCHA found — no Facebook Pixel, Hotjar, or other heavy trackers
  • Divi_new/js/scripts.min.js (70.9KB uncompressed) is Divi's core interaction script and a common source of long main-thread tasks on Divi sites — recommend a real Lighthouse/CrUX pass for INP once traffic volume supports field data

Top Quick Wins

#FixExpected Impact
1Resize/re-compress the two oversized portfolio JPEGs to 1080px — DONEDone (real impact was smaller than estimated — ExactDN was already serving optimized responsive variants)
2Fix the HTML no-store cache-control header — DONEDone, verified live
3Preload the hero/LCP image; defer the Gravity Forms JS bundleDirect LCP improvement + removes ~46KB of blocking JS
4Re-host the hotlinked "five-stars" badge via ExactDNRemoves an uncontrolled third-party dependency