Skip to content

Test your website now

Free, no card. We read only public pages.

Run free audit →

Performance · High severity

Largest Contentful Paint Too Slow: Diagnose the Critical Path

Improve slow Largest Contentful Paint. Identify the LCP element, separate server and image delays, prioritise resources, and compare lab with field data.

Published · Updated

What the check tests

Check
perf.cwv.lcp - Largest Contentful Paint under 2.5 s
Passes when
LCP measures when the largest text block or image in the viewport finishes rendering. Good ≤ 2.5 s, poor > 4 s (lab measurement at a mobile viewport on Lighthouse's Slow 4G profile with 4x CPU slowdown).
Scope
graded on every page crawled
Severity
High
Fix effort
medium - a working day
Impact when fixed
high

In one paragraph

Largest Contentful Paint too slow means the largest eligible visible content appeared later than the configured target during the test. Identify the actual LCP element and separate document delivery, resource discovery, transfer, and rendering delays. Fix the dominant bottleneck instead of applying every preload trick. Then confirm the result across representative runs and real-user data where available.

Why it matters

LCP is a Core Web Vital for perceived loading. It reports the timing of the largest eligible content visible in the viewport, such as a prominent image, text block, or qualifying video presentation. The element can change with viewport, content, and loading sequence.

Standard good LCP is 2.5 seconds or less, while over 4 seconds is poor. Field assessment examines the 75th percentile of visits, normally distinguishing mobile and desktop experiences. These thresholds do not turn one laboratory result into a complete ranking or usability assessment.

An image download is not always the whole problem. The browser may discover it late, render it late after download, or wait on document delivery before it can request anything useful. Decomposing the timeline is more informative than replacing an image format blindly.

How WebAuditOS evaluates this finding

The supplied rule loads sampled pages in Chromium at 390×844 with its documented mobile throttling, including four-times CPU slowdown. It records the last observed LCP candidate at network idle, subject to its wait limit. Up to 2.5 seconds passes; over 2.5 through 4 seconds warns; over 4 seconds fails.

Unrendered pages, missing timings, failed throttling, or an exhausted render budget can remain ungraded. The reported result is one controlled observation, not the field percentile. Lab and field can differ in either direction due to cache state, geography, devices, redirects, interactions, and sample composition.

How to fix it

  1. Identify the LCP candidate in a browser trace for the affected layout. Do not assume the hero image is always selected. Repeat at important viewport sizes and content variants.
  2. If document delivery dominates, inspect TTFB and server work. Cache appropriate public responses, reduce expensive blocking dependencies, and review geographic delivery. Keep personalisation and access controls out of unsafe shared-cache paths.
  3. If resource discovery is late, put the necessary reference into discoverable initial markup where appropriate. A CSS background or client-injected image may need an intentional preload or a different delivery design. Preload the correct responsive resource rather than fetching an unused duplicate.
  4. For a critical image that should load immediately, avoid loading="lazy" and consider fetchpriority="high". For example:
<img src="/hero-800.avif" srcset="/hero-800.avif 800w, /hero-1600.avif 1600w" sizes="100vw" width="1600" height="900" fetchpriority="high" alt="Context-appropriate description">

This is illustrative. Match sizes to the actual CSS layout, provide suitable alternatives where needed, and choose meaningful or decorative alt treatment for the real image.

  1. Reduce resource bytes with appropriate dimensions and encoding. Confirm that the selected candidate is the one you optimised and that the network does not still request an oversized variant.
  2. If rendering waits after the resource arrives, inspect blocking styles, long tasks, hydration, visibility logic, and font behaviour. Image compression cannot fix a JavaScript gate that keeps the element hidden.
  3. Test text LCP with appropriate font-display and matched fallback metrics. Do not trade faster text for severe layout shifts or unreadable design.
  4. Rescan under comparable conditions, verify complete journeys, and monitor field data when available. Improve the actual bottleneck and track CLS and responsiveness alongside loading.

What the fix can break

High priority and preload are allocation decisions, not free speed. Marking many resources urgent can delay the actual critical image or CSS. Start from measured dependencies.

Removing lazy loading from every image can make below-the-fold content compete with the initial view. Keep optimisations scoped to the relevant resource.

HTML caching, asynchronous CSS, and script deferral each have correctness risks. Confirm personalised content, visual stability, and functional behaviour rather than accepting a lower LCP with a broken page.

Questions

Why does the scan differ from Search Console?

The scanner reports a sampled throttled load; Search Console's Core Web Vitals use field data. Compare measurement scope and conditions before interpreting the difference.

Does fetchpriority=high guarantee fast LCP?

No. It is a hint and cannot remove server delay, excessive bytes, or render-blocking work. Prioritise the actual candidate.

Can a text block be the LCP element?

Yes. Inspect the browser's candidate rather than assuming every LCP issue is a hero-image problem.

What should I review next?

Review FCP, TTFB, and the Core Web Vitals guide.

Standards and sources

  • web.dev Core Web Vitals

In the report

Test this on your own site

Every scan runs perf.cwv.lcp on every page it crawls, on every plan. The finding carries this id, so a line in a report can be matched to the explanation above - and the free scan needs no account.