<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Garvit Sharda</title>
    <description>The latest articles on DEV Community by Garvit Sharda (@garvit_sharda).</description>
    <link>https://dev.to/garvit_sharda</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3884309%2F61966954-410a-4107-ab36-0b9d3df9ebf3.jpg</url>
      <title>DEV Community: Garvit Sharda</title>
      <link>https://dev.to/garvit_sharda</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/garvit_sharda"/>
    <language>en</language>
    <item>
      <title>JavaScript SEO in 2026: The "Two Waves of Indexing" Myth, and What Googlebot Actually Keeps</title>
      <dc:creator>Garvit Sharda</dc:creator>
      <pubDate>Fri, 31 Jul 2026 09:31:18 +0000</pubDate>
      <link>https://dev.to/garvit_sharda/javascript-seo-in-2026-the-two-waves-of-indexing-myth-and-what-googlebot-actually-keeps-20lm</link>
      <guid>https://dev.to/garvit_sharda/javascript-seo-in-2026-the-two-waves-of-indexing-myth-and-what-googlebot-actually-keeps-20lm</guid>
      <description>&lt;p&gt;If you build with React, Vue, or any JavaScript framework and you care about organic traffic, there's a good chance you're still optimizing for a Google that no longer exists.&lt;/p&gt;

&lt;p&gt;For years the mental model was &lt;strong&gt;"two waves of indexing"&lt;/strong&gt;: Google reads your HTML in wave one, then comes back days or weeks later to run your JavaScript in wave two. That model — which Google itself presented back in 2018 — has quietly disappeared from the official documentation. In 2026, rendering is an &lt;strong&gt;asynchronous queue&lt;/strong&gt;, and Google's own docs now say a page &lt;em&gt;"may stay on this queue for a few seconds, but it can take longer than that."&lt;/em&gt; The famous "5-second JS execution limit"? Also not in the docs. It was never a hard rule.&lt;/p&gt;

&lt;p&gt;So the interesting question in 2026 isn't &lt;em&gt;when&lt;/em&gt; Google will run your JavaScript. It's &lt;strong&gt;what Google actually kept after it rendered your page&lt;/strong&gt; — because that's a very different thing, and it's where most JS sites quietly bleed traffic.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Google actually processes a JS page now
&lt;/h2&gt;

&lt;p&gt;Three stages, in order: &lt;strong&gt;crawl → render → index.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Crawl.&lt;/strong&gt; Googlebot makes an HTTP request, checks &lt;code&gt;robots.txt&lt;/code&gt;, and parses whatever HTML comes back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render.&lt;/strong&gt; Every &lt;code&gt;200&lt;/code&gt; page gets queued for rendering in a headless, evergreen Chromium (it understands modern JS — ES2020+, dynamic &lt;code&gt;import()&lt;/code&gt;, even WebAssembly). Syntax support is &lt;em&gt;not&lt;/em&gt; your problem. Resource and queue constraints are.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Index.&lt;/strong&gt; Google indexes the &lt;em&gt;rendered&lt;/em&gt; DOM and re-extracts links from it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One trap worth memorizing: &lt;strong&gt;if a &lt;code&gt;noindex&lt;/code&gt; is present in the initial HTML, Google may skip rendering entirely.&lt;/strong&gt; So the classic "we'll inject the right robots tag with JavaScript" plan can backfire — the script that was supposed to &lt;em&gt;remove&lt;/em&gt; the &lt;code&gt;noindex&lt;/code&gt; never runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The failure modes nobody warns you about
&lt;/h2&gt;

&lt;p&gt;Here's the uncomfortable part. A client-side-rendered (CSR) page ships an almost-empty HTML shell; everything real arrives with the JS. When rendering succeeds and the content looks valuable, the page indexes fine. When it doesn't, you land in one of these buckets — all visible in Search Console:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Typical status&lt;/th&gt;
&lt;th&gt;Likely cause&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HTML is a shell, content from JS&lt;/td&gt;
&lt;td&gt;"Crawled – currently not indexed" &lt;em&gt;(or indexed empty)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;Render failed or judged thin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client-side routing, empty states served as 200&lt;/td&gt;
&lt;td&gt;"Soft 404"&lt;/td&gt;
&lt;td&gt;No real error code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Large JS site, new pages pending&lt;/td&gt;
&lt;td&gt;"Discovered – currently not indexed"&lt;/td&gt;
&lt;td&gt;Render queue / crawl budget&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;title/canonical/robots injected via JS&lt;/td&gt;
&lt;td&gt;Duplicate / canonical conflicts&lt;/td&gt;
&lt;td&gt;Initial HTML disagrees with the render&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The most insidious is the &lt;strong&gt;indexed-empty shell&lt;/strong&gt;: the URL is &lt;em&gt;in&lt;/em&gt; the index, but it ranks for nothing because Google kept the pre-JS shell. Nothing looks broken until you compare what got indexed with what should have.&lt;/p&gt;

&lt;p&gt;And "Soft 404" is a pure SPA disease: your router shows a "no results" view but the server still returns &lt;code&gt;200&lt;/code&gt;. Sold-out products, empty search pages, and misconfigured fallback routes generate these at scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  CSR vs SSR vs SSG vs ISR, minus the dogma
&lt;/h2&gt;

&lt;p&gt;You don't need to server-render everything. You need SEO-critical content in the &lt;strong&gt;initial HTML response&lt;/strong&gt;. Quick decision:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CSR&lt;/strong&gt; — browser builds the DOM. Fine for dashboards behind a login; risky for anything you want ranked. Pure CSR can delay indexation enough to cost a large share of organic traffic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSR&lt;/strong&gt; — HTML per request. Best for dynamic or personalized content (e-commerce, feeds).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSG&lt;/strong&gt; — HTML at build time, served from a CDN. Ideal for blogs, docs, landing pages. Fastest TTFB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ISR&lt;/strong&gt; — SSG that revalidates in the background. The pragmatic 2026 default: static speed, fresh-enough data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The non-negotiable, regardless of framework: &lt;strong&gt;your &lt;code&gt;title&lt;/code&gt;, meta description, &lt;code&gt;H1&lt;/code&gt;, canonical, internal links, and structured data must exist in the server HTML&lt;/strong&gt; — not be painted in afterward. That's what lands cleanly in the index with zero dependency on a successful render.&lt;/p&gt;

&lt;p&gt;A few concrete gotchas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the &lt;strong&gt;History API&lt;/strong&gt; for SPA routing, not URL fragments — Googlebot can't reliably resolve &lt;code&gt;#/&lt;/code&gt; routes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fingerprint your assets&lt;/strong&gt; (&lt;code&gt;main.2bb85551.js&lt;/code&gt;). Googlebot's Web Rendering Service caches aggressively and may serve stale JS/CSS otherwise.&lt;/li&gt;
&lt;li&gt;Web components get flattened (shadow + light DOM), but only what's in the &lt;em&gt;rendered&lt;/em&gt; HTML is indexable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Stop trusting your own crawler
&lt;/h2&gt;

&lt;p&gt;This is the mistake I see most. Teams run Screaming Frog or Sitebulb in render mode, see their content, and conclude "we're fine." But that only proves &lt;em&gt;your&lt;/em&gt; tool rendered it — with its engine, its timeouts, its settings. It says nothing about what &lt;strong&gt;Google&lt;/strong&gt; rendered or chose to keep.&lt;/p&gt;

&lt;p&gt;The source of truth is Search Console:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL Inspection&lt;/strong&gt; shows Google's &lt;em&gt;own&lt;/em&gt; rendered HTML, the resources it loaded, and any JS exceptions it hit.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Page Indexing report&lt;/strong&gt; gives the verdict per URL, at scale.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On a big JS site the real question isn't "is this one URL rendered right?" — it's &lt;strong&gt;"what share of my JavaScript-dependent pages is actually indexed, and under which exclusion reasons?"&lt;/strong&gt; You answer that by bulk-inspecting your sitemap URLs against the official inspection data, not by re-rendering locally.&lt;/p&gt;

&lt;h2&gt;
  
  
  A 2026 checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] SEO-critical content (title, H1, canonical, links, schema) is in the &lt;strong&gt;initial HTML&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;[ ] No &lt;code&gt;noindex&lt;/code&gt; in the served HTML that you intend to flip with JS&lt;/li&gt;
&lt;li&gt;[ ] SPA routing uses the History API; missing pages return a real &lt;code&gt;404&lt;/code&gt; server-side&lt;/li&gt;
&lt;li&gt;[ ] Assets are content-fingerprinted&lt;/li&gt;
&lt;li&gt;[ ] You verify indexation in &lt;strong&gt;Search Console&lt;/strong&gt;, not your own crawler&lt;/li&gt;
&lt;li&gt;[ ] Anything ranking-critical uses SSR/SSG/ISR, not pure CSR&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this requires abandoning your framework. It requires being deliberate about &lt;em&gt;where&lt;/em&gt; your HTML is generated for the pages that need to rank.&lt;/p&gt;

&lt;p&gt;If you'd rather have someone pressure-test your stack, this is exactly the kind of thing a &lt;a href="https://www.com8.io/services" rel="noopener noreferrer"&gt;technical SEO team&lt;/a&gt; digs into — and running a &lt;a href="https://www.com8.io/free-seo-audit" rel="noopener noreferrer"&gt;free SEO audit&lt;/a&gt; is a fast way to see which of your JS pages Google is quietly dropping before you refactor anything.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Written by Garvit Sharda. I work with &lt;a href="https://www.com8.io/" rel="noopener noreferrer"&gt;COM8 STUDIO&lt;/a&gt;, a digital marketing and web agency, on technical SEO and front-end performance.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
    </item>
    <item>
      <title>The 2026 AI-Crawler Reality Check: What the Data Says for Developers</title>
      <dc:creator>Garvit Sharda</dc:creator>
      <pubDate>Fri, 24 Jul 2026 09:18:57 +0000</pubDate>
      <link>https://dev.to/garvit_sharda/the-2026-ai-crawler-reality-check-what-the-data-says-for-developers-oh6</link>
      <guid>https://dev.to/garvit_sharda/the-2026-ai-crawler-reality-check-what-the-data-says-for-developers-oh6</guid>
      <description>&lt;p&gt;Everyone's writing think-pieces about "optimizing for AI search." I wanted numbers. So I pulled together the 2025-2026 data from Cloudflare, Vercel/MERJ, Ahrefs and the AI providers' own docs. Some of it genuinely changed how I build sites. Here's the reality check, dev to dev.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The AI crawlers do not run your JavaScript
&lt;/h2&gt;

&lt;p&gt;This is the big one. A Vercel/MERJ analysis of &lt;strong&gt;500M+ crawler fetches&lt;/strong&gt; found that &lt;strong&gt;none&lt;/strong&gt; of the major dedicated AI crawlers execute JavaScript — not OpenAI's &lt;code&gt;GPTBot&lt;/code&gt;/&lt;code&gt;OAI-SearchBot&lt;/code&gt;/&lt;code&gt;ChatGPT-User&lt;/code&gt;, not Anthropic's &lt;code&gt;ClaudeBot&lt;/code&gt;, not &lt;code&gt;PerplexityBot&lt;/code&gt;, not Meta or ByteDance's &lt;code&gt;Bytespider&lt;/code&gt;. They fetch your raw HTML and leave. They &lt;em&gt;do&lt;/em&gt; download JS files (~11.5% of ChatGPT's fetches, ~23.8% of Claude's) — they just never run them.&lt;/p&gt;

&lt;p&gt;The exception is &lt;strong&gt;Google&lt;/strong&gt;: its Web Rendering Service is shared across Search and Gemini, so Google-Extended renders JS the same way Googlebot does.&lt;/p&gt;

&lt;p&gt;Translation: if your content only exists after client-side hydration, every AI engine except Google sees an empty shell.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# see what the bots see&lt;/span&gt;
curl &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="s2"&gt;"GPTBot"&lt;/span&gt; https://yoursite.com/page | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"your headline"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If that's empty, you need SSR, SSG, or prerendering.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. AI crawl traffic is exploding — and barely sends anything back
&lt;/h2&gt;

&lt;p&gt;Cloudflare's data shows AI crawler activity up sharply year over year, with &lt;strong&gt;GPTBot's volume up ~305%&lt;/strong&gt; and reaching &lt;strong&gt;~11.7% of all crawler requests&lt;/strong&gt; by mid-2025. But roughly &lt;strong&gt;86% of that crawling is for model training&lt;/strong&gt;, not live search retrieval.&lt;/p&gt;

&lt;p&gt;And the referrals? Lopsided doesn't cover it. Measured crawl-to-referral ratios hit &lt;strong&gt;~38,065:1 for Anthropic&lt;/strong&gt; and &lt;strong&gt;~1,091:1 for OpenAI&lt;/strong&gt;. They read enormously, cite rarely. AI tools still send &lt;strong&gt;under 1%&lt;/strong&gt; of outbound web traffic today.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The SERP is going zero-click
&lt;/h2&gt;

&lt;p&gt;By early 2026, roughly &lt;strong&gt;68% of Google searches ended without a click&lt;/strong&gt;, and pages with an AI Overview above them saw click-through drop by around &lt;strong&gt;60%&lt;/strong&gt;. Being "on page one" is worth less every quarter; being &lt;em&gt;the cited source&lt;/em&gt; is worth more.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Two overhyped tactics, with the data attached
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;llms.txt&lt;/strong&gt;: adoption grew ~8.8x, but in one May 2026 measurement &lt;strong&gt;97% of llms.txt files received zero requests&lt;/strong&gt;. OpenAI, Anthropic and Google all point site owners to &lt;code&gt;robots.txt&lt;/code&gt; instead. Add it if you like — it's a cheap static file — but don't expect it to do the work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schema/JSON-LD as a citation hack&lt;/strong&gt;: controlled analysis found schema presence &lt;strong&gt;does not independently predict AI citation&lt;/strong&gt; once you correct for content quality. Schema still earns rich results and disambiguates entities — just don't treat it as a magic AI-ranking lever.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What actually moves the needle
&lt;/h2&gt;

&lt;p&gt;Boring, durable engineering:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Server-render your content&lt;/strong&gt; — verify with &lt;code&gt;curl&lt;/code&gt;, not DevTools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Allow the retrieval bots&lt;/strong&gt; you want cited by in &lt;code&gt;robots.txt&lt;/code&gt;; block only what you must.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Answer-first, semantic HTML&lt;/strong&gt; — clean headings, real lists, a direct answer per section.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Core Web Vitals&lt;/strong&gt;, INP included — fast pages get crawled more thoroughly.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of this is a hack. It's the same discipline as good, crawlable web engineering — which is why developers, not marketers, tend to be the ones who move AI visibility. It's the technical backbone of modern &lt;a href="https://www.com8.io/services/seo-agency-dubai/ai-seo" rel="noopener noreferrer"&gt;AI SEO&lt;/a&gt; and it overlaps almost entirely with classic &lt;a href="https://www.com8.io/services/seo-agency-dubai/technical-seo" rel="noopener noreferrer"&gt;technical SEO&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Build for the crawler that can't run your JavaScript, and you're ready for whatever the answer engines do next.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sources: Cloudflare Radar, Vercel/MERJ crawler study, Ahrefs brand-mentions analysis, and OpenAI/Anthropic/Google bot docs (2025-2026).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>seo</category>
      <category>webperf</category>
    </item>
    <item>
      <title>How AI Crawlers Actually Read Your Site: A Developer's Guide to GEO &amp; llms.txt (2026)</title>
      <dc:creator>Garvit Sharda</dc:creator>
      <pubDate>Mon, 20 Jul 2026 06:19:12 +0000</pubDate>
      <link>https://dev.to/garvit_sharda/how-ai-crawlers-actually-read-your-site-a-developers-guide-to-geo-llmstxt-2026-1d90</link>
      <guid>https://dev.to/garvit_sharda/how-ai-crawlers-actually-read-your-site-a-developers-guide-to-geo-llmstxt-2026-1d90</guid>
      <description>&lt;p&gt;Your users increasingly don't scroll ten blue links anymore. They ask ChatGPT, Perplexity, or Google's AI Overview a question and read one synthesized answer. For that answer to mention &lt;em&gt;your&lt;/em&gt; site, a machine has to crawl it, parse it, and decide your content is worth quoting.&lt;/p&gt;

&lt;p&gt;That whole pipeline is &lt;strong&gt;Generative Engine Optimization (GEO)&lt;/strong&gt; — and a surprising amount of it lives in the part of the stack &lt;em&gt;developers&lt;/em&gt; own, not the marketing team.&lt;/p&gt;

&lt;p&gt;Here's the one-line version: &lt;strong&gt;treat AI crawlers like a browser that never runs your JavaScript, and hand them clean, server-rendered, well-structured HTML.&lt;/strong&gt; Everything below unpacks what that means in practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet the bots already hitting your server
&lt;/h2&gt;

&lt;p&gt;Open your access logs and you'll find a new class of user-agents. They fall into two jobs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Training / indexing crawlers&lt;/strong&gt; — &lt;code&gt;GPTBot&lt;/code&gt; (OpenAI), &lt;code&gt;ClaudeBot&lt;/code&gt; (Anthropic), &lt;code&gt;PerplexityBot&lt;/code&gt;, and &lt;code&gt;Google-Extended&lt;/code&gt; (a token that controls whether your content is used for Gemini/AI, &lt;em&gt;separate&lt;/em&gt; from Googlebot).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live "user-triggered" fetchers&lt;/strong&gt; — &lt;code&gt;OAI-SearchBot&lt;/code&gt; and &lt;code&gt;ChatGPT-User&lt;/code&gt;, &lt;code&gt;Claude-User&lt;/code&gt;, &lt;code&gt;Perplexity-User&lt;/code&gt;. These hit your page in real time when someone's prompt needs a fresh source.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You control access to all of them from &lt;code&gt;robots.txt&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight robot_framework"&gt;&lt;code&gt;User-agent: GPTBot&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Allow:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;User-agent:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Google-Extended&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Disallow:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/private&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Blocking them keeps you out of training data &lt;em&gt;and&lt;/em&gt; out of the answers your customers now read. For most businesses, being cited is the goal — so allow the retrieval bots deliberately.&lt;/p&gt;

&lt;h2&gt;
  
  
  The big one: most AI crawlers don't run your JavaScript
&lt;/h2&gt;

&lt;p&gt;Googlebot renders JavaScript with an evergreen Chromium engine. &lt;strong&gt;Most AI-specific crawlers do not.&lt;/strong&gt; They largely fetch your raw HTML response and move on. If your content only appears &lt;em&gt;after&lt;/em&gt; a client-side framework hydrates in the browser, there's a real chance the bot sees an empty &lt;code&gt;&amp;lt;div id="root"&amp;gt;&lt;/code&gt; and nothing else.&lt;/p&gt;

&lt;p&gt;Test it the way the bot does — no browser, no JS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="s2"&gt;"GPTBot"&lt;/span&gt; https://yoursite.com/your-page | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"the headline you expect"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your key content isn't in that response, AI engines probably can't read it. The fixes are the ones you already know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SSR or SSG&lt;/strong&gt; (Next.js, Nuxt, Astro, SvelteKit) so HTML ships with content in it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prerender / dynamic rendering&lt;/strong&gt; for legacy SPAs you can't fully migrate.&lt;/li&gt;
&lt;li&gt;Keep the important text in the initial HTML, not lazy-loaded behind an interaction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This single architectural choice separates sites that get quoted from sites that are invisible to the models.&lt;/p&gt;

&lt;h2&gt;
  
  
  Structure your HTML so a machine can extract answers
&lt;/h2&gt;

&lt;p&gt;Once the bytes arrive, the model has to &lt;em&gt;understand&lt;/em&gt; them. Semantic, answer-first HTML is the highest-leverage, least-hyped tactic here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;, then a logical &lt;code&gt;&amp;lt;h2&amp;gt;/&amp;lt;h3&amp;gt;&lt;/code&gt; outline that reads like the questions people actually ask.&lt;/li&gt;
&lt;li&gt;Lead each section with a &lt;strong&gt;direct, self-contained answer&lt;/strong&gt;, then expand. Models lift clean, standalone sentences far more readily than points buried in a wall of text.&lt;/li&gt;
&lt;li&gt;Use real &lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;ol&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; elements. Structured facts extract cleanly; &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; soup does not.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Add &lt;strong&gt;JSON-LD structured data&lt;/strong&gt; (&lt;code&gt;Organization&lt;/code&gt;, &lt;code&gt;Article&lt;/code&gt;, &lt;code&gt;FAQPage&lt;/code&gt;, &lt;code&gt;BreadcrumbList&lt;/code&gt;, &lt;code&gt;Product&lt;/code&gt;). Whether schema &lt;em&gt;directly&lt;/em&gt; boosts AI citations is still genuinely debated, and I won't oversell it — but it's cheap, it powers traditional rich results, and it removes ambiguity about what your entities are. Clean signals never hurt.&lt;/p&gt;

&lt;h2&gt;
  
  
  llms.txt: add it, but don't believe the hype
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;llms.txt&lt;/code&gt; is a proposed standard (introduced by Jeremy Howard in late 2024): a Markdown file at &lt;code&gt;/llms.txt&lt;/code&gt; that gives models a curated map of your most important content, minus the nav and cruft.&lt;/p&gt;

&lt;p&gt;The honest status in 2026: &lt;strong&gt;adoption among docs and dev-tool sites is real, but no major AI provider has publicly confirmed they consume it&lt;/strong&gt;, and skeptics (including voices at Google) have compared it to the old &lt;code&gt;keywords&lt;/code&gt; meta tag. Server logs rarely show the big crawlers fetching it.&lt;/p&gt;

&lt;p&gt;My take as a developer: it costs ten minutes and a static file, so add it — but treat it as a nice-to-have, not the thing that gets you cited. Your rendered HTML is still what matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Speed is still a ranking &lt;em&gt;and&lt;/em&gt; crawling signal
&lt;/h2&gt;

&lt;p&gt;Core Web Vitals didn't go away. &lt;strong&gt;INP (Interaction to Next Paint) replaced FID in 2024&lt;/strong&gt; as the responsiveness metric, joining LCP and CLS. Fast, server-rendered pages get crawled more thoroughly and are less likely to time out a bot mid-fetch. The performance work you do for users pays off again for machines.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical GEO checklist
&lt;/h2&gt;

&lt;p&gt;If you do nothing else, ship these:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Server-render your content&lt;/strong&gt; — verify with &lt;code&gt;curl&lt;/code&gt;, not just DevTools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Allow the AI retrieval bots&lt;/strong&gt; you want to be cited by in &lt;code&gt;robots.txt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Answer-first sections&lt;/strong&gt; under a clean heading hierarchy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON-LD&lt;/strong&gt; for your core entities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meet Core Web Vitals&lt;/strong&gt;, INP included.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drop an &lt;code&gt;llms.txt&lt;/code&gt;&lt;/strong&gt; — low effort, possible upside.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of this is a growth hack. It's the same discipline as good, crawlable web engineering — which is exactly why developers, not marketers, are often the ones who move the needle on it. This groundwork is the technical core of modern &lt;a href="https://www.com8.io/services/seo-agency-dubai/ai-seo" rel="noopener noreferrer"&gt;AI SEO&lt;/a&gt;, and it overlaps almost entirely with classic &lt;a href="https://www.com8.io/services/seo-agency-dubai/technical-seo" rel="noopener noreferrer"&gt;technical SEO&lt;/a&gt;: fast, semantic, server-rendered pages that both humans and machines can actually read.&lt;/p&gt;

&lt;p&gt;Build for the crawler that can't run your JavaScript, and you'll be ready for whatever the answer engines do next.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seo</category>
      <category>ai</category>
      <category>webperf</category>
    </item>
    <item>
      <title>Getting Your Site Cited by AI Search in 2026: A Front-End Developer's Checklist</title>
      <dc:creator>Garvit Sharda</dc:creator>
      <pubDate>Thu, 16 Jul 2026 05:32:53 +0000</pubDate>
      <link>https://dev.to/garvit_sharda/getting-your-site-cited-by-ai-search-in-2026-a-front-end-developers-checklist-3p3j</link>
      <guid>https://dev.to/garvit_sharda/getting-your-site-cited-by-ai-search-in-2026-a-front-end-developers-checklist-3p3j</guid>
      <description>&lt;p&gt;AI answer engines — Google's AI Overviews, ChatGPT Search, Perplexity, Gemini — increasingly answer users without a click. For developers, that shifts the goal: it's no longer only "rank the page," it's "be the source the model quotes." The good news is that a lot of what makes a site citable is squarely front-end and infra work. Here's the checklist my team actually uses.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Server-render anything you want cited
&lt;/h2&gt;

&lt;p&gt;LLM crawlers are far better at parsing HTML that exists &lt;strong&gt;before&lt;/strong&gt; JavaScript runs. If your key content only appears after client-side hydration, assume it won't be reliably read.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prefer SSR or static generation (Next.js, Astro, Nuxt, etc.) for content pages.&lt;/li&gt;
&lt;li&gt;Verify what the bot actually sees:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sL&lt;/span&gt; https://example.com/page | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"your answer text"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your content isn't in that output, a crawler probably can't see it either.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Ship structured data (JSON-LD)
&lt;/h2&gt;

&lt;p&gt;Schema doesn't guarantee a citation, but it makes your page cheaper for a machine to parse and reuse. Add &lt;code&gt;Article&lt;/code&gt;, &lt;code&gt;FAQPage&lt;/code&gt;, &lt;code&gt;HowTo&lt;/code&gt;, &lt;code&gt;Organization&lt;/code&gt;, and &lt;code&gt;BreadcrumbList&lt;/code&gt; where relevant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"application/ld+json"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@context&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://schema.org&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;FAQPage&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mainEntity&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Question&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;What is answer-engine optimization?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;acceptedAnswer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Answer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Validate with Google's Rich Results Test before shipping.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Write answer-first, chunk-friendly HTML
&lt;/h2&gt;

&lt;p&gt;Models extract self-contained passages. Structure content so each section stands alone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Put the direct answer in the first one or two sentences of a section, then expand.&lt;/li&gt;
&lt;li&gt;Use real semantic headings (&lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt;/&lt;code&gt;&amp;lt;h3&amp;gt;&lt;/code&gt;) phrased as questions.&lt;/li&gt;
&lt;li&gt;Short paragraphs, genuine lists, and tables beat walls of text.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Actually let the AI crawlers in
&lt;/h2&gt;

&lt;p&gt;You can't be cited if you block the bots. Check your &lt;code&gt;robots.txt&lt;/code&gt; — plenty of teams block these without realizing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight robot_framework"&gt;&lt;code&gt;User-agent: GPTBot&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Allow:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;User-agent:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;PerplexityBot&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Allow:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;User-agent:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Google-Extended&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Allow:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(&lt;code&gt;Google-Extended&lt;/code&gt; governs Gemini/Vertex grounding and training — decide deliberately rather than by accident.)&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Consider an llms.txt
&lt;/h2&gt;

&lt;p&gt;An emerging convention: a root-level &lt;code&gt;/llms.txt&lt;/code&gt; that points models at your cleanest, most important content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Example Co&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; One-line description of what we do.&lt;/span&gt;

&lt;span class="gu"&gt;## Docs&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Getting started&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com/docs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: setup guide
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;API reference&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com/docs/api&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: endpoints
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It isn't universally consumed yet, but it's cheap to add and forward-looking.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Keep it fast and stable
&lt;/h2&gt;

&lt;p&gt;Core Web Vitals still matter — for users, for classic SEO, and because slow, unstable pages get crawled less. Aim for LCP &amp;lt; 2.5s, INP &amp;lt; 200ms, CLS &amp;lt; 0.1.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Measure citations, not just clicks
&lt;/h2&gt;

&lt;p&gt;This is the hard part: an AI citation often produces &lt;strong&gt;no&lt;/strong&gt; referral in analytics. Track it directly — run your target prompts across ChatGPT, Perplexity, and Google's AI Mode on a schedule and log whether (and how) you appear. Then watch the small-but-high-intent referral traffic that AI &lt;em&gt;does&lt;/em&gt; send.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this nets out
&lt;/h2&gt;

&lt;p&gt;None of this replaces fundamentals — crawlability, real authority, and genuinely useful content still underpin everything. But the front end is where a surprising amount of "AI visibility" is won or lost. If you want a second pair of eyes on the technical and content side, this is the kind of &lt;a href="https://www.com8.io/services/seo-agency-dubai/ai-seo" rel="noopener noreferrer"&gt;answer-engine optimization work&lt;/a&gt; we do day to day, and a quick &lt;a href="https://www.com8.io/free-seo-audit" rel="noopener noreferrer"&gt;free SEO audit&lt;/a&gt; tends to surface the crawlability and schema gaps fastest.&lt;/p&gt;

&lt;p&gt;What are you doing to make your sites citable? Curious what's working for others.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seo</category>
      <category>ai</category>
      <category>webperf</category>
    </item>
    <item>
      <title>Conversion Rate Optimization for Developers: Front-End Changes That Actually Move the Needle</title>
      <dc:creator>Garvit Sharda</dc:creator>
      <pubDate>Sat, 11 Jul 2026 19:10:01 +0000</pubDate>
      <link>https://dev.to/garvit_sharda/conversion-rate-optimization-for-developers-front-end-changes-that-actually-move-the-needle-1pbg</link>
      <guid>https://dev.to/garvit_sharda/conversion-rate-optimization-for-developers-front-end-changes-that-actually-move-the-needle-1pbg</guid>
      <description>&lt;p&gt;Marketing teams obsess over conversion rate. Developers usually treat it as somebody else's metric. That is a mistake — a huge share of what decides whether a visitor converts is settled in the front-end: how fast the page paints, how the form behaves, and how little friction stands between intent and action.&lt;/p&gt;

&lt;p&gt;Here are the front-end changes that, in my experience, actually move conversion — not vanity tweaks.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Speed is a conversion feature, not just an SEO one
&lt;/h2&gt;

&lt;p&gt;Every study on this says the same thing: conversion rate drops as load time climbs, and the fall is steepest in the first few seconds. A checkout that takes 5s to become interactive loses buyers who would have completed at 2s. So the same Core Web Vitals work you do for rankings pays a second dividend at the cash register. Prioritise the Largest Contentful Paint element, defer third-party scripts until interaction, and keep the main thread free so taps respond instantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Fix your forms — this is where money leaks
&lt;/h2&gt;

&lt;p&gt;Forms are the highest-leverage surface on any lead-gen or checkout page:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the correct &lt;code&gt;type&lt;/code&gt; and &lt;code&gt;autocomplete&lt;/code&gt; tokens (&lt;code&gt;email&lt;/code&gt;, &lt;code&gt;tel&lt;/code&gt;, &lt;code&gt;one-time-code&lt;/code&gt;, &lt;code&gt;cc-number&lt;/code&gt;). Mobile keyboards and autofill do half the work for the user.&lt;/li&gt;
&lt;li&gt;Validate inline on &lt;code&gt;blur&lt;/code&gt;, not only on submit. Telling someone their email is wrong &lt;em&gt;after&lt;/em&gt; they hit submit is the fastest way to lose them.&lt;/li&gt;
&lt;li&gt;Never disable the submit button waiting for "perfect" input — let them submit and show clear, specific errors.&lt;/li&gt;
&lt;li&gt;Cut every field you do not truly need. Each optional field measurably lowers completion.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt;
  &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
  &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
  &lt;span class="na"&gt;autocomplete=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
  &lt;span class="na"&gt;inputmode=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
  &lt;span class="na"&gt;required&lt;/span&gt;
  &lt;span class="na"&gt;aria-describedby=&lt;/span&gt;&lt;span class="s"&gt;"email-err"&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Kill layout shift and interaction jank
&lt;/h2&gt;

&lt;p&gt;Cumulative Layout Shift is not just a Core Web Vitals metric — a button that jumps as an ad loads causes mis-taps and rage clicks. Reserve space for media, ads, and embeds with explicit dimensions or &lt;code&gt;aspect-ratio&lt;/code&gt;, and never inject content above content the user is already reading.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Make the primary CTA unmissable and honest
&lt;/h2&gt;

&lt;p&gt;One primary action per screen, high contrast, describing what happens ("Get my free audit", not "Submit"). Secondary actions get secondary styling. If a user has to hunt for the button, you have already lost some of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Instrument everything — measure, do not guess
&lt;/h2&gt;

&lt;p&gt;You cannot optimise what you do not track. Fire structured events for form starts, field abandonment, CTA clicks, and completions. The gap between "form started" and "form completed" is a treasure map of exactly where users drop. The teams we work with treat CRO and &lt;a href="https://www.com8.io/services" rel="noopener noreferrer"&gt;conversion-focused web development&lt;/a&gt; as a single discipline precisely because the fixes live in the code, but the priorities come from the data.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. A/B test without tanking performance
&lt;/h2&gt;

&lt;p&gt;Client-side testing tools are notorious for causing flicker (FOOC — flash of original content) and adding render-blocking JS, which &lt;em&gt;reduces&lt;/em&gt; the very conversions you are trying to lift. Prefer server-side or edge experiments where you can, keep the variant logic tiny, and always measure the performance cost of the testing tool itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  A realistic workflow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Instrument the funnel and find the biggest drop-off.&lt;/li&gt;
&lt;li&gt;Form a hypothesis about &lt;em&gt;why&lt;/em&gt; (usually friction, confusion, or speed).&lt;/li&gt;
&lt;li&gt;Ship the smallest front-end change that tests it.&lt;/li&gt;
&lt;li&gt;Measure against a real baseline, not a gut feeling.&lt;/li&gt;
&lt;li&gt;Keep the winners, revert the losers, repeat.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is unglamorous, iterative work, but it compounds. We have documented the impact of this exact loop in our &lt;a href="https://www.com8.io/case-studies" rel="noopener noreferrer"&gt;case studies&lt;/a&gt; — small, disciplined front-end changes adding up to double-digit conversion gains.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fast pages convert better — reuse your Core Web Vitals work.&lt;/li&gt;
&lt;li&gt;Forms are where money leaks: correct input types, inline validation, fewer fields.&lt;/li&gt;
&lt;li&gt;Reserve space to stop layout shift and mis-taps.&lt;/li&gt;
&lt;li&gt;One clear, honest primary CTA per screen.&lt;/li&gt;
&lt;li&gt;Instrument the funnel; optimise the biggest drop-off first.&lt;/li&gt;
&lt;li&gt;A/B test without adding render-blocking flicker.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conversion is not a marketing-only concern. It is a front-end responsibility — and one of the highest-ROI things you can ship.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Written by the team at &lt;a href="https://www.com8.io/contact-us" rel="noopener noreferrer"&gt;COM8 STUDIO&lt;/a&gt; — a digital marketing and web development agency helping brands across the UAE and US turn traffic into customers.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ux</category>
      <category>seo</category>
    </item>
    <item>
      <title>Structured Data in 2026: How Developers Get Their Content Cited by AI Search</title>
      <dc:creator>Garvit Sharda</dc:creator>
      <pubDate>Sat, 11 Jul 2026 12:45:20 +0000</pubDate>
      <link>https://dev.to/garvit_sharda/structured-data-in-2026-how-developers-get-their-content-cited-by-ai-search-7a5</link>
      <guid>https://dev.to/garvit_sharda/structured-data-in-2026-how-developers-get-their-content-cited-by-ai-search-7a5</guid>
      <description>&lt;p&gt;Search is splitting in two. Classic blue links are still there, but a growing share of queries now get answered directly — by Google's AI Overviews, and by ChatGPT, Perplexity, and Claude. For developers, the practical question is: what do you put in your HTML so a machine can confidently extract and cite your content?&lt;/p&gt;

&lt;p&gt;The answer is mostly structured data — Schema.org vocabulary expressed as JSON-LD. It is the same technology that has powered rich results for years, but it matters more than ever now that LLM-based answer engines lean on it to understand entities and relationships.&lt;/p&gt;

&lt;p&gt;Here is a developer-focused rundown.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why JSON-LD (not Microdata or RDFa)
&lt;/h2&gt;

&lt;p&gt;You can express Schema.org three ways, but JSON-LD wins for one reason: it lives in a single &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; block, decoupled from your markup. You do not have to thread &lt;code&gt;itemprop&lt;/code&gt; attributes through your components, and it is trivial to generate from the same data you already render.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"application/ld+json"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@context&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://schema.org&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Organization&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Acme Co&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://acme.example&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;logo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://acme.example/logo.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sameAs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://www.linkedin.com/company/acme&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://twitter.com/acme&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Google, Bing, and the crawlers behind AI answer engines all parse this block first.&lt;/p&gt;

&lt;h2&gt;
  
  
  The schema types worth your time
&lt;/h2&gt;

&lt;p&gt;You do not need all 800+ Schema.org types. In practice, 90% of the value comes from a handful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Organization / LocalBusiness&lt;/strong&gt; — who you are, your logo, address, and &lt;code&gt;sameAs&lt;/code&gt; links to your social and authority profiles. This is what builds your &lt;em&gt;entity&lt;/em&gt; in the knowledge graph.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebSite&lt;/strong&gt; with &lt;code&gt;SearchAction&lt;/code&gt; — enables the sitelinks search box.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Article / BlogPosting&lt;/strong&gt; — author, &lt;code&gt;datePublished&lt;/code&gt;, &lt;code&gt;headline&lt;/code&gt;, &lt;code&gt;image&lt;/code&gt;. Critical for being cited as a source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BreadcrumbList&lt;/strong&gt; — helps crawlers understand site hierarchy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FAQPage&lt;/strong&gt; — pairs a question with an answer, which answer engines love to lift verbatim.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product / Offer&lt;/strong&gt; and &lt;strong&gt;Review / AggregateRating&lt;/strong&gt; — commerce rich results.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The sameAs trick for entity SEO
&lt;/h2&gt;

&lt;p&gt;If you do one thing, do this: add a complete &lt;code&gt;sameAs&lt;/code&gt; array to your Organization schema, pointing at every authoritative profile you own — LinkedIn, Crunchbase, GitHub, Wikidata if you have it. This is how you tell machines "all of these identities are the same entity," which is the foundation of &lt;a href="https://www.com8.io/services" rel="noopener noreferrer"&gt;answer engine optimization&lt;/a&gt;. Without a strong entity, you do not get surfaced in generated answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validate before you ship
&lt;/h2&gt;

&lt;p&gt;Never hand-write JSON-LD and hope. Two free tools:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Schema.org Validator&lt;/strong&gt; (validator.schema.org) — catches vocabulary errors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Rich Results Test&lt;/strong&gt; — tells you which rich results you actually qualify for.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Wire the validator into CI if structured data is business-critical. A single malformed date or missing required field silently disqualifies you from rich results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generating schema in a component framework
&lt;/h2&gt;

&lt;p&gt;The clean pattern in React/Next.js, Vue/Nuxt, or Astro is to build the object server-side and serialize it once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ArticleSchema&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@context&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://schema.org&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;BlogPosting&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;datePublished&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publishedAt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Person&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;author&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coverImage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"application/ld+json"&lt;/span&gt;
      &lt;span class="na"&gt;dangerouslySetInnerHTML&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;__html&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Serialize with &lt;code&gt;JSON.stringify&lt;/code&gt; (not a template literal) so quotes and special characters escape correctly — a classic source of invalid markup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rendering matters: do not hide it behind client-side JS
&lt;/h2&gt;

&lt;p&gt;Answer-engine crawlers are far less patient than Googlebot about executing JavaScript. If your JSON-LD is injected only after hydration, some crawlers will not see it. Server-render or statically generate your structured data. This is the same crawlability principle that underpins all technical SEO — if a bot cannot cheaply read it, it does not count. When we run &lt;a href="https://www.com8.io/free-seo-audit" rel="noopener noreferrer"&gt;a technical SEO audit&lt;/a&gt;, missing or client-only structured data is one of the most common issues we flag.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;JSON-LD&lt;/strong&gt; in a &lt;code&gt;&amp;lt;script type="application/ld+json"&amp;gt;&lt;/code&gt; block.&lt;/li&gt;
&lt;li&gt;Prioritise &lt;strong&gt;Organization, Article, FAQPage, BreadcrumbList&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Build a complete &lt;strong&gt;&lt;code&gt;sameAs&lt;/code&gt;&lt;/strong&gt; array — it is the backbone of entity and answer-engine SEO.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate&lt;/strong&gt; (Schema.org Validator + Rich Results Test), ideally in CI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server-render&lt;/strong&gt; it so every crawler sees it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Structured data used to be about star ratings in the search results. In 2026 it is about whether an AI names &lt;em&gt;you&lt;/em&gt; as the source. Ship it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Written by the team at &lt;a href="https://www.com8.io/about-us" rel="noopener noreferrer"&gt;COM8 STUDIO&lt;/a&gt; — a digital marketing and web development agency specialising in SEO, AEO/GEO, and web engineering for brands across the UAE and US.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seo</category>
      <category>ai</category>
    </item>
    <item>
      <title>Core Web Vitals in 2026: A Front-End Checklist That Also Boosts SEO</title>
      <dc:creator>Garvit Sharda</dc:creator>
      <pubDate>Sat, 11 Jul 2026 11:50:28 +0000</pubDate>
      <link>https://dev.to/garvit_sharda/core-web-vitals-in-2026-a-front-end-checklist-that-also-boosts-seo-1no0</link>
      <guid>https://dev.to/garvit_sharda/core-web-vitals-in-2026-a-front-end-checklist-that-also-boosts-seo-1no0</guid>
      <description>&lt;p&gt;Performance work used to be the thing front-end teams did "if there was time left." In 2026 it is table stakes. Core Web Vitals are a confirmed Google ranking input, and real users bounce from anything that feels sluggish on a mid-range Android phone over a flaky mobile connection.&lt;/p&gt;

&lt;p&gt;This is the checklist I keep coming back to when I audit a site. It is written for developers, but every item also moves the SEO needle — which is exactly why performance and search visibility have stopped being two separate conversations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three metrics that actually matter
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Largest Contentful Paint (LCP)&lt;/strong&gt; — aim for under 2.5s. This is almost always your hero image or main headline. Quick wins: serve correctly sized images in AVIF/WebP, add &lt;code&gt;fetchpriority="high"&lt;/code&gt; to the LCP image, preload the hero font, and remove render-blocking CSS from the critical path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interaction to Next Paint (INP)&lt;/strong&gt; — aim for under 200ms. INP replaced First Input Delay in 2024 and it is far less forgiving. It measures the latency of &lt;em&gt;every&lt;/em&gt; interaction on the page, not just the first one. Wins: break up long tasks, &lt;code&gt;yield&lt;/code&gt; back to the main thread, debounce expensive handlers, and push non-urgent work into &lt;code&gt;requestIdleCallback&lt;/code&gt; or a web worker.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cumulative Layout Shift (CLS)&lt;/strong&gt; — aim for under 0.1. Wins: set explicit &lt;code&gt;width&lt;/code&gt;/&lt;code&gt;height&lt;/code&gt; or &lt;code&gt;aspect-ratio&lt;/code&gt; on all media, reserve space for ads and embeds, and never insert content above content that has already rendered.&lt;/p&gt;

&lt;h2&gt;
  
  
  The checklist
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Images
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Convert to AVIF with a WebP fallback.&lt;/li&gt;
&lt;li&gt;Use responsive &lt;code&gt;srcset&lt;/code&gt;/&lt;code&gt;sizes&lt;/code&gt; so phones never download desktop-sized artwork.&lt;/li&gt;
&lt;li&gt;Lazy-load everything below the fold with &lt;code&gt;loading="lazy"&lt;/code&gt; — but eager-load the LCP image.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Fonts
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Self-host and subset your fonts. A third-party font CDN adds a DNS lookup and a connection you do not control.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;font-display: swap&lt;/code&gt; so text paints immediately.&lt;/li&gt;
&lt;li&gt;Preload only the one or two weights you actually use above the fold.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  JavaScript
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Audit the bundle. A brochure or marketing site rarely needs 400KB of JS.&lt;/li&gt;
&lt;li&gt;Code-split by route and defer everything non-critical.&lt;/li&gt;
&lt;li&gt;Swap heavy date/utility libraries for native APIs (&lt;code&gt;Intl&lt;/code&gt;, &lt;code&gt;structuredClone&lt;/code&gt;, &lt;code&gt;URLSearchParams&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Delay third-party tags — chat widgets, analytics, heatmaps — until the first user interaction. These are the number-one INP killers I see in real audits.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Delivery
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Serve over HTTP/2 or HTTP/3 from a CDN.&lt;/li&gt;
&lt;li&gt;Set a long &lt;code&gt;Cache-Control&lt;/code&gt; for hashed static assets.&lt;/li&gt;
&lt;li&gt;Turn on Brotli compression.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Measure the way Google measures
&lt;/h2&gt;

&lt;p&gt;Lab tools like Lighthouse are great for catching regressions in CI, but Google ranks on field data — the Chrome User Experience Report (CrUX) gathered from real Chrome users. A site can score a perfect 100 in Lighthouse and still fail Core Web Vitals in the field, because your actual visitors are on slower devices and worse networks than your dev laptop.&lt;/p&gt;

&lt;p&gt;So run all three:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Lighthouse in CI to catch obvious regressions before they ship.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;web-vitals&lt;/code&gt; npm package in production, streaming real INP/LCP/CLS into your analytics.&lt;/li&gt;
&lt;li&gt;The Core Web Vitals report in Search Console — that is the CrUX data Google actually ranks on.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why front-end performance is an SEO strategy
&lt;/h2&gt;

&lt;p&gt;Here is the part the product and marketing side cares about: faster pages rank higher and convert better. Google has said plainly that Core Web Vitals act as a tiebreaker between pages of comparable relevance, and the correlation between a slow LCP and a high bounce rate is brutal. Every 100ms you shave off is measurable revenue on a commerce or lead-gen site.&lt;/p&gt;

&lt;p&gt;That overlap is why the teams I work with treat performance budgets and &lt;a href="https://www.com8.io/services" rel="noopener noreferrer"&gt;technical SEO&lt;/a&gt; as a single workstream instead of two competing backlogs. When engineering owns Core Web Vitals, the SEO team stops filing tickets for problems the front-end already fixed.&lt;/p&gt;

&lt;p&gt;If you want an outside read on where a site currently stands, a structured &lt;a href="https://www.com8.io/free-seo-audit" rel="noopener noreferrer"&gt;free SEO audit&lt;/a&gt; will surface the CWV failures, crawl and indexation issues, and rendering problems in one pass — and, satisfyingly, most of the recommended fixes land right back in the front-end checklist above.&lt;/p&gt;

&lt;h2&gt;
  
  
  A note on frameworks
&lt;/h2&gt;

&lt;p&gt;None of this is framework-specific, but a few defaults help. Next.js and Nuxt give you image optimization and route-level code splitting for free. Astro and other "islands" frameworks ship near-zero JS by default, which is fantastic for content sites. SvelteKit and SolidStart compile away a lot of runtime overhead. Whatever you use, the metrics do not care about your framework — they care about bytes, main-thread time, and layout stability.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;LCP &amp;lt; 2.5s — optimize hero image + font&lt;/li&gt;
&lt;li&gt;INP &amp;lt; 200ms — break up long tasks, defer third-party JS&lt;/li&gt;
&lt;li&gt;CLS &amp;lt; 0.1 — reserve space for media and ads&lt;/li&gt;
&lt;li&gt;AVIF/WebP + responsive images&lt;/li&gt;
&lt;li&gt;Self-hosted, subset fonts&lt;/li&gt;
&lt;li&gt;Route-based code splitting&lt;/li&gt;
&lt;li&gt;CDN + Brotli + HTTP/3&lt;/li&gt;
&lt;li&gt;Measure field data, not just Lighthouse&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Performance is a feature. Budget for it, measure it in the field, and ship it like one.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Written by the team at &lt;a href="https://www.com8.io/" rel="noopener noreferrer"&gt;COM8 STUDIO&lt;/a&gt; — a digital marketing and web development agency working with brands across the UAE and US.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>performance</category>
      <category>seo</category>
    </item>
  </channel>
</rss>
