Home / Guides

How to fix slow LCP in a vibe-coded app

Largest Contentful Paint over 2.5s? Practical fixes for Lovable, Bolt, v0 and Cursor apps: hero images, fonts, client-side rendering, JS bundles and caching.

Updated 2026-10-15 · ShipCheck guides

Largest Contentful Paint (LCP) is the time until the biggest thing above the fold, usually the hero image or headline, appears on screen. It is a Core Web Vital and feeds into Google ranking. More importantly, it is what a visitor feels as "this site is slow". The target is 2.5 seconds or less on mobile.

AI-built apps tend to fail LCP for the same few reasons. Here is how to diagnose and fix each one.

Step 1: measure and find the LCP element

Run your URL through PageSpeed Insights on the mobile tab, or use Lighthouse in Chrome DevTools. Under "Largest Contentful Paint element" you will see which element it is and how its time breaks down:

Fix the biggest slice first.

Step 2: fix the hero image (most common)

<link rel="preload" as="image" href="/hero.webp" fetchpriority="high">
<img src="/hero.webp" width="1600" height="900" alt="…" fetchpriority="high">

Step 3: reduce client-side rendering delay

Lovable, Bolt and many Cursor projects are Vite + React single-page apps. The HTML is an empty <div id="root">, so nothing paints until the whole bundle downloads, parses and runs. Options, from easiest to most work:

Step 4: fonts

Step 5: render-blocking CSS and third-party scripts

Step 6: server response and caching

Step 7: re-measure

Lab scores vary from run to run, so test two or three times. Real-user LCP from the Chrome UX Report (shown at the top of PageSpeed Insights once you have traffic) is what Google actually uses.

ShipCheck runs a mobile PageSpeed check as part of its free scan, alongside security headers and leaked-key checks, so you can watch performance and security together before you launch. For the rest of the pre-launch list, see the vibe-coded app launch checklist.

Scan your app free

Paste your live URL or public GitHub repo. ShipCheck checks for leaked keys, committed .env files, missing security headers, HTTPS issues and slow pages, then gives you copy-paste fixes. No signup.

FAQ

What is a good LCP?

Google considers Largest Contentful Paint good at 2.5 seconds or less, measured at the 75th percentile of real page loads. Over 4 seconds is rated poor.

Why is LCP slow in apps made with Lovable or Bolt?

They are usually client-side rendered React (Vite) apps. The browser must download and run the JavaScript bundle before anything renders, and the hero is often an uncompressed image or waits on a data fetch.

How do I find my LCP element?

Run PageSpeed Insights or Lighthouse in Chrome DevTools. The diagnostics name the LCP element and break its time into TTFB, load delay, load time and render delay.

More guides

Is my Lovable app secure?

How to check whether your Lovable app is secure: Supabase Row Level Security, exposed keys, security headers, auth and storage. A step-by-step checklist with fixes.

How to add security headers on Vercel

Copy-paste vercel.json to add CSP, HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy and Permissions-Policy on Vercel, plus how to test them.

How to add security headers on Netlify

Add CSP, HSTS, X-Frame-Options and other security headers on Netlify using a _headers file or netlify.toml. Copy-paste examples, framework tips and testing.

The vibe-coded app launch checklist

A practical pre-launch checklist for apps built with Lovable, Cursor, Bolt, v0 or Replit: security, secrets, database rules, performance, SEO, legal and monitoring.