Your Hero Image Is Lying to You: AI Tricks for a Site That Feels Instant
Zero-latency is a slightly dishonest phrase. Packets still travel. Jakarta to a server in Frankfurt is still physics. What you can do is make the largest thing on the screen show up so fast that the page feels like it was alredy there. That feeling has a name: Largest Contentful Paint. And most sites fail it for embarrassingly small reasons.
I used to treat Lighthouse like a personality test. Green score on my Mac, 4.1 seconds LCP on a real Redmi in Bekasi on XL. The lab is a compliment. The field is the ranking input. Google still looks at the 75th percentile of real Chrome users over a rolling 28-day window. Pass means under 2.5 seconds. Feeling instant means you secretly want 1.2.
Here’s the slightly annoying good news. In 2026 you dont have to guess wich element is the LCP node, or wich third-party script is sitting on the main thread like a cat on a keyboard. You can have models read traces, label the stages, and even propose the preload tags. You still have to ship the fix. AI is a very fast intern. It is not your CDN.
What LCP is actually timing (not “page speed”)
LCP is the moment the largest text block or image in the viewport finishes painting. Usualy a hero image. Sometimes an H1. Sometimes a poster frame you forgot about. It is not “when the page is done.” A page can keep loading chat widgets forever and still have a decent LCP if the hero arrived early.
The metric splits into four stages peopel mix up constantly:
- Time to First Byte (TTFB) — HTML starts arriving. If this is 800ms, you are alredy in a hole. A lot of folks still treat 200ms as the grown-up target.
- Resource load delay — the browser has the HTML but hasnt even started fetching the LCP image yet. This is the “we lazy-loaded the hero” special.
- Resource load time — the file itself. Fat PNG from a photoshoot in Labuan Bajo, served at 4000px to a 390px phone.
- Render delay — the bytes are here but CSS or fonts or a blocking script wont let it paint.
If you only compress images, you are treating stage 3 like it’s the whole movie. I see this on Indonesian hotel sites all the time. Beautiful WebP, still 3.8s LCP, becuase TTFB from a cheap shared host in another island is 1.4 seconds and the CSS file is a 900kb souvenir from 2021.
The other two vitals, quickly, so we dont pretend LCP lives alone
INP wants under 200ms. CLS under 0.1. INP replaced FID a while back. A zero-latency feeling dies if the tap on “Beli” does nothign. I’m focusing on LCP here becuase it is the one AI tooling is suddenly good at diagnosing, and becuase it is the one executives understand: “the picture showed up late.”
Let a model read the trace before you touch CSS
Old workflow: run PageSpeed, skim “opportunities,” change a random plugin, hope. New workflow: export a performace trace or a WebPageTest filmstrip, dump the LCP element screenshot, and ask a model to allocate milliseconds to the four stages. It is weirdly good at this if you give it the actual numbers.
A prompt I reuse: “Here is a lab JSON from Lighthouse and a field note from CrUX. Identify the LCP element. Split the 3.4s into TTFB, delay, download, render. For each slice over 200ms, give one fix that would land this week on a WordPress + WooCommerce stack hosted in Singapore, audence mostly Java and Sumatra on 4G. No generic advice. Name files if you see them.”
The last sentance is the whole game. If you dont forbid generic advice you get “use a CDN.” Yes. Wich asset. Wich header. Wich plugin is injecting the 400kb slider.
I also paste the HTML of the first 50 lines of <head>. Models notice stylesheet order, missing fetchpriority="high", and the classic crime: loading="lazy" on the hero. That single attribute is still, in 2026, one of the highest-ROI reverses you can do. Peopel have measured 200–500ms just from not lazy-loading the LCP image and giving it priority. Not a redesign. An attribute.
Fix the element, not “the site”
Find the LCP node. DevTools will name it. Search Console’s Core Web Vitals report will tell you wich URL groups fail in the field. Your AI intern can cluster those URLs by template — all category pages, all blog posts with a featured image, the homepage with the video poster.
Then treat that template like a patient, not a mood.
Images, the honest version
Serve AVIF or WebP. Size to the slot. srcset so a phone in Yogyakarta does not download the desktop hero. Width and height (or aspect-ratio) so CLS doesnt sneak in while you’re being a performace hero. Preload the exact URL the browser will request, not a diffrent crop, or you preload the wrong file and help nobody.
<link rel="preload" as="image" href="/hero-1200.avif" fetchpriority="high"> <img src="/hero-1200.avif" width="1200" height="720" fetchpriority="high" alt="...">
Notice there is no lazy attribute. Notice the preload matches. This is the part AI codegen gets wrong constantly — it preloads hero.jpg and then the responsive image requests hero-800.avif. You paid for an extra request and still waited.
For a travel site like a smaller cousin of Traveloka, the LCP is almost allways a destination photo. Photographers deliver huge TIFFs, the CMS “compresses,” and you still ship 1.2MB. An image CDN (Cloudflare Images, a local optimizer, whatever you alredy pay for) that resizes at the edge is not glamorous. It is how you stop arguing with authors about export settings.
TTFB: the unsexy half of “zero latency”
If HTML is slow, nothign else matters. Edge caching, HTML streaming, origin in the right city. Indonesian users on a site whose origin is only in the US will lose TTFB even with a CDN if HTML is uncacheable and the origin roundtrip is long. I have seen “global brand” landing pages for a Jakarta flash sale where TTFB was over a second becuase every request hit Magento in Virginia with a full cart session.
AI can help here in a surprisingly practical way: paste your response headers and ask wich ones prevent CDN cache. You will find Set-Cookie on anonymous pages, Cache-Control: private, or a personalisation plugin that varies on a cookie nobody uses. Models are good at reading header dumps. They are bad at pretending they know your hit rate.
Practical targets I actualy use:
- Cacheable marketing pages: TTFB under 200ms from a POP near the user.
- Logged-out homepage: full HTML at the edge, even if the rupiah formatter is slightly stale for 60 seconds.
- PDP: stale-while-revalidate. Shoppers would rather see the prodcut 300ms sooner than see the exact stock count in the first paint.
Fonts and CSS, the silent render delay
Custom fonts that block, a 4,000-line Tailwind build you never purged, a slider CSS that loads on pages withotu sliders. font-display: swap is table stakes. Preload only the one weight you use in the H1. If your brand font is for headlines, dont block the LCP image on a full family download.
AI is usefull for “this CSS file is 280kb, wich selectors are unused on this URL.” Pair it with coverage in DevTools, not vibes. I once watched a generated “critical CSS” omit the hero height and the image popped in late with a layout jump. Critical CSS is a sharp tool. Give it tests.
Where AI strategies actually beat a human with a checklist
Three places I will defend this withotu sounding like a keynote.
1. Finding the real LCP across templates
You think it’s the image. On mobile it is the H1 becuase the image pushed below the fold. A model looking at screenshots from three breakpoints will catch that. Humans looking at desktop DevTools will “optimise” the wrong asset for a month.
2. Predicting the next navigation
Speculation rules and speculation-rules-like prefetch are how pages start feeling zero-latency after the first hit. If 40% of users on a category go to the same three PDPs, prefetch those on idle. AI clustering on your analytics paths is better than guessing. For an online grocery in Jabodetabek, the paths are boring and precious: category → best seller → cart. Prefetch those, not the About page.
3. Writing the performance budget in language a PM will not ignore
Engineers say “200kb JS.” PMs hear static. I have used a model to translate a budget into user stories: “If we add this review widget, LCP on mobile 4G in Surabaya likely mvoes from 1.8s to 2.6s based on last month’s field data.” Suddenly the widget is optional. That is not magic. That is turning a trace into a sentance.
A worked mini-case: fashion PDP that “looked fine”
A Bandung label, Shopify, pretty theme, Instagram trafic, LCP 3.6s at p75 on mobile. Everyone blamed the prodcut photos. The trace said somehting ruder:
- TTFB 420ms — app proxy in the US, no edge HTML.
- Hero was lazy-loaded by the theme’s “performace” setting. Resource delay ~600ms.
- Image was 1800px WebP, not terrible, download ~700ms on mid 4G.
- Render delay from a blocking app that injected a size chart modal’s CSS in the head of every PDP.
We did not “rebuild the stack.” We turned off lazy on the first image, added fetchpriority, served a 900px srcset for mobile, moved the size chart to on-demand, and put a CDN cache in front of the collection pages. Field LCP slid under 2.2s over the next CrUX window. Not zero. Fast enought that bounce on paid ads stopped looking cursed.
The AI part was not the CDN. It was labelling those four slices from a messy JSON so the founder stopped arguing about “mayb we need a new theme.” Themes are rarely the first fix. Attributes are.
What “AI optimisation” should not mean
Do not let a plugin rewrite every image into a diffrent URL space withotu preload updates. Do not let a chatbot add more JavaScript to “improve speed.” I have seen that sentance in the wild. Extra JS to speed up LCP is a joke that costs money.
Do not optimise only the homepage. CrUX is origin-level and URL-group-level. A blazing home and sluggish category grid still fails the property. Indonesian ecommerce expecially: peopel land on search result pages from Google, not your cinematic home. Those grids with 24 prodcut images and no priority hints are the real LCP battlefield.
Do not trust lab-only wins. Throttle CPU, test on a mid-range Android, look at field data after 28 days. If you ship on a Friday you will spend the next month saying “but Lighthouse is green.” Field data is slower to move and ruder when it does.
A field-first checklist I actually print
- Confirm the LCP element on mobile and desktop, separately.
- If it’s an image: no lazy, fetchpriority high, matching preload, modern format, srcset, dimensions set.
- If it’s text: font preload for that one file, avoid invisible text for too long, make sure the heading is in the first HTML flush.
- TTFB: cache HTML where you can, origin close to users, cookies not poisoning cache.
- Kill or defer anythign in
<head>that is not needed to paint that element. - Third parties: chat, reviews, heatmaps — after LCP, not before. Your live chat vendor does not care about your vitals.
- Re-measure on a phone on 4G, then wait for CrUX. Put the date in the changelog so nobody “reverts the theme” in week two.
Use AI to generate the first draft of that audit from a trace. Then delete every sentance that could apply to any website on earth. What’s left is the work.
How I would start on your site this week
Pick the template that earns money. Not the blog. The PDP, the booking form, the course landing page. Run WebPageTest from Singapore and from Jakarta if you can. Export the LCP breakdown. Feed it to a model with the “no generic advice” rule. Ipmlement the top two stage-specfic fixes, not ten.
Then add field monitoring — the web-vitals library, or Search Console, or both. Lab is how you debug. Field is how you know you are done. Aim under 2.5s becuase that is the pass line. Aim under 1.5s becuase that is when a site on 4G in Semarang starts to feel like it was waiting for you, not the other way around.
Zero-latency is marketing language. What you are realy building is a page that paints the importent thing before the person’s thumb gets bored. That is a smaller, kinder problem. It is also one you can finish.
Go find the hero. Look it in the eye. If it has loading="lazy", you alredy know what to do before any model speaks.

Post a Comment for "Your Hero Image Is Lying to You: AI Tricks for a Site That Feels Instant"
Post a Comment