<?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: Eduard</title>
    <description>The latest articles on DEV Community by Eduard (@edo911).</description>
    <link>https://dev.to/edo911</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1304913%2F0f4fa63a-3c69-4381-8f1a-0e1a1ede6759.gif</url>
      <title>DEV Community: Eduard</title>
      <link>https://dev.to/edo911</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/edo911"/>
    <language>en</language>
    <item>
      <title>Hey! What FREE or open-weight AI models &amp; agents do you use for UI &amp; design refactoring?

Which free setups (DeepSeek, Qwen Coder, Ollama) and tools (OpenCode, Cline, Continue) give you the cleanest React/Tailwind code? #discuss #ai #opensource #webdev</title>
      <dc:creator>Eduard</dc:creator>
      <pubDate>Mon, 07 Sep 2026 12:44:58 +0000</pubDate>
      <link>https://dev.to/edo911/hey-what-free-or-open-weight-ai-models-agents-do-you-use-for-ui-design-refactoring-which-2326</link>
      <guid>https://dev.to/edo911/hey-what-free-or-open-weight-ai-models-agents-do-you-use-for-ui-design-refactoring-which-2326</guid>
      <description></description>
    </item>
    <item>
      <title>Master Prompts in 2026: Stop Prompting Like It's 2023</title>
      <dc:creator>Eduard</dc:creator>
      <pubDate>Thu, 03 Sep 2026 06:50:39 +0000</pubDate>
      <link>https://dev.to/edo911/master-prompts-in-2026-stop-prompting-like-its-2023-52dh</link>
      <guid>https://dev.to/edo911/master-prompts-in-2026-stop-prompting-like-its-2023-52dh</guid>
      <description>&lt;h1&gt;
  
  
  Master Prompts in 2026: Stop Prompting Like It's 2023
&lt;/h1&gt;

&lt;p&gt;I still see people paste a 40-line “act as a senior expert with 20 years of experience” block into ChatGPT and call it engineering.&lt;/p&gt;

&lt;p&gt;That stopped working as a strategy a while ago.&lt;/p&gt;

&lt;p&gt;Models got better. Context windows got bigger. Agents started calling tools. And the failure mode shifted. It’s rarely “the model is dumb” now. It’s “your system has no contract.”&lt;/p&gt;

&lt;p&gt;This is a long, practical write-up on &lt;strong&gt;master prompts&lt;/strong&gt; — the stable policy layer above individual tasks. How to write them. How to force planning. How to run Plan → Act → Observe → Verify without theater. How to make the same prompt useful to a tired human at 11pm &lt;em&gt;and&lt;/em&gt; to an agent loop that only understands schemas.&lt;/p&gt;

&lt;p&gt;I’ve broken enough production prompts across GPT-4o, Claude 3.5 Sonnet, and Gemini-class stacks to have opinions. Some of them are uncomfortable.&lt;/p&gt;

&lt;h3&gt;
  
  
  TL;DR / Key Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;master prompt&lt;/strong&gt; is not a clever sentence. It’s the &lt;strong&gt;policy layer&lt;/strong&gt;: role, success criteria, process, constraints, output contract, failure handling.&lt;/li&gt;
&lt;li&gt;Production reliability comes from &lt;strong&gt;LLM orchestration&lt;/strong&gt; patterns — plan JSON, single-task executors, and explicit &lt;code&gt;done_when&lt;/code&gt; checks — not from longer personality blocks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON contracts + verification&lt;/strong&gt; beat free-form answers. Agents that can’t prove completion will invent it.&lt;/li&gt;
&lt;li&gt;Treat prompts like code: version them, eval them, and put a real verify step after generation (including SEO/quality checks when you publish).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;What a master prompt actually is&lt;/li&gt;
&lt;li&gt;The 7-part anatomy that doesn’t collapse under pressure&lt;/li&gt;
&lt;li&gt;Frameworks worth keeping (and which ones to ignore)&lt;/li&gt;
&lt;li&gt;Planning is the real skill&lt;/li&gt;
&lt;li&gt;From plan to agent loop&lt;/li&gt;
&lt;li&gt;Context engineering beats clever wording&lt;/li&gt;
&lt;li&gt;Few-shot, JSON contracts, and the anti-hallucination rule&lt;/li&gt;
&lt;li&gt;Copy-paste masters you can actually deploy&lt;/li&gt;
&lt;li&gt;A real publish pipeline (including the verify step people skip)&lt;/li&gt;
&lt;li&gt;Eval or you’re guessing&lt;/li&gt;
&lt;li&gt;Failure patterns I keep seeing&lt;/li&gt;
&lt;li&gt;PromptOps: treat prompts like code&lt;/li&gt;
&lt;li&gt;One universal master prompt&lt;/li&gt;
&lt;li&gt;Ship checklist&lt;/li&gt;
&lt;li&gt;A one-week install plan&lt;/li&gt;
&lt;li&gt;Frequently asked questions&lt;/li&gt;
&lt;li&gt;Sources&lt;/li&gt;
&lt;li&gt;What to do in the next 15 minutes&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. What a master prompt actually is
&lt;/h2&gt;

&lt;p&gt;A master prompt is not a magic spell.&lt;/p&gt;

&lt;p&gt;It’s the &lt;strong&gt;policy layer&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;who the model is allowed to be&lt;/li&gt;
&lt;li&gt;what “done” means&lt;/li&gt;
&lt;li&gt;how it should think when the task is messy&lt;/li&gt;
&lt;li&gt;what format comes out&lt;/li&gt;
&lt;li&gt;what happens when it’s unsure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;User prompts change every hour.&lt;br&gt;&lt;br&gt;
Master prompts change when your standards change.&lt;/p&gt;

&lt;p&gt;If you rewrite your “system personality” for every ticket, you don’t have a system. You have vibes.&lt;/p&gt;

&lt;p&gt;This distinction matters more once you leave single-chat workflows and enter &lt;strong&gt;prompt engineering for production&lt;/strong&gt; — multi-step agents, tool routers, RAG pipelines, shared team libraries. The master prompt becomes the constant. Everything else is runtime input.&lt;/p&gt;

&lt;p&gt;Official docs still matter here, even if the ecosystem moved fast:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://platform.openai.com/docs/guides/prompting" rel="noopener noreferrer"&gt;OpenAI prompting guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview" rel="noopener noreferrer"&gt;Anthropic prompt engineering overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/machine-learning/resources/prompt-eng" rel="noopener noreferrer"&gt;Google’s prompt engineering notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2406.06608" rel="noopener noreferrer"&gt;The Prompt Report (Schulhoff et al.)&lt;/a&gt; — still the best single survey of techniques&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One shift I care about in 2026: people say &lt;strong&gt;context engineering&lt;/strong&gt; more than prompt engineering. Same game, wider board. You’re not only choosing words. You’re choosing what the model sees on each step inside a limited &lt;strong&gt;context window&lt;/strong&gt; — policy, retrieved docs, tool traces, and the live task.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. The 7-part anatomy that doesn’t collapse under pressure
&lt;/h2&gt;

&lt;p&gt;Every master prompt I’ve kept in production has some version of these blocks. Skip one and you pay for it later.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Block&lt;/th&gt;
&lt;th&gt;Hard question it answers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Role&lt;/td&gt;
&lt;td&gt;Who are you, for whom?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Goal&lt;/td&gt;
&lt;td&gt;What counts as success in measurable terms?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context&lt;/td&gt;
&lt;td&gt;What’s true about this environment right now?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Process&lt;/td&gt;
&lt;td&gt;In what order do you work?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Constraints&lt;/td&gt;
&lt;td&gt;What is forbidden even if it would be convenient?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output contract&lt;/td&gt;
&lt;td&gt;What shape must the answer take?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure policy&lt;/td&gt;
&lt;td&gt;What do you do when data is missing?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Skeleton
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ROLE
You are a [specific role]. You work for [audience].

GOAL
Success = [observable outcome].
Failure examples: [what “almost right” looks like].

CONTEXT
- Product / domain:
- Hard limits:
- Sources of truth:

PROCESS
1) State assumptions or ask the minimum clarifying question.
2) Build a dependency-aware plan.
3) Execute one atomic step at a time.
4) Verify against done_when.
5) Return result + residual risks.

CONSTRAINTS
- Do not invent facts, APIs, quotes, or metrics.
- Do not fake tool output.
- If uncertain, say so and propose the cheapest check.

OUTPUT
## Plan
## Result
## Verification
## Open questions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Notice what’s missing: motivational fluff. “Be world-class.” “Think deeply.” Models already try. What they lack is your definition of finished work.&lt;/p&gt;

&lt;p&gt;On Claude 3.5 Sonnet and GPT-4o alike, vague quality adjectives underperform hard constraints and explicit success criteria. The model isn’t missing ambition. It’s missing your acceptance tests.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Frameworks worth keeping (and which ones to ignore)
&lt;/h2&gt;

&lt;p&gt;The internet loves acronyms. Most of them are the same idea in a hoodie.&lt;/p&gt;
&lt;h3&gt;
  
  
  Keep these
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;RTF — Role / Task / Format&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Fine for small jobs. Don’t overbuild.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CRAFT — Context / Role / Action / Format / Tone&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Good default for writing, analysis, support.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plan-and-Solve&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Force a plan before the answer. Boring. Effective. See the planning literature around &lt;a href="https://www.emergentmind.com/topics/plan-and-solve-prompting" rel="noopener noreferrer"&gt;Plan-and-Solve&lt;/a&gt; and agent planning surveys like &lt;a href="https://ar5iv.labs.arxiv.org/html/2402.02716" rel="noopener noreferrer"&gt;arXiv:2402.02716&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chain-of-Thought&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Still the simplest accuracy lever on multi-step reasoning. Original paper: &lt;a href="https://arxiv.org/abs/2201.11903" rel="noopener noreferrer"&gt;Wei et al., 2022&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tree of Thoughts&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
When one path isn’t enough and you need deliberate search. &lt;a href="https://arxiv.org/abs/2305.10601" rel="noopener noreferrer"&gt;Yao et al., 2023&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ReAct&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Thought → Action → Observation. If your agent uses tools and you don’t have this loop, you’re improvising.&lt;/p&gt;
&lt;h3&gt;
  
  
  Ignore these habits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Collecting 14 frameworks and using none consistently&lt;/li&gt;
&lt;li&gt;Padding prompts with personality cosplay&lt;/li&gt;
&lt;li&gt;Asking for “maximum creativity” on compliance tasks&lt;/li&gt;
&lt;li&gt;Writing novels in the system message that burn &lt;strong&gt;token efficiency&lt;/strong&gt; for no gain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pick one structure. Run it for a week. Measure. Then change one variable.&lt;/p&gt;

&lt;p&gt;Anthropic’s own guidance still ranks &lt;strong&gt;clarity, examples, thinking, structure&lt;/strong&gt; above theatrical roleplay. Read their &lt;a href="https://claude.com/blog/best-practices-for-prompt-engineering" rel="noopener noreferrer"&gt;best practices&lt;/a&gt; if you haven’t in a while.&lt;/p&gt;
&lt;h2&gt;
  
  
  4. Planning is the real skill
&lt;/h2&gt;

&lt;p&gt;Most “agent failures” are just un-decomposed work.&lt;/p&gt;

&lt;p&gt;A useful rule from task-decomposition practice: keep breaking the job down until each leaf task is doable in &lt;strong&gt;1–3 tool calls&lt;/strong&gt; and has a crisp &lt;code&gt;done_when&lt;/code&gt;. If a step needs a short novel of instructions, it isn’t a step yet. (&lt;a href="https://engineersofai.com/docs/agentic-ai/long-horizon-planning/Task-Decomposition" rel="noopener noreferrer"&gt;EngineersOfAI notes on decomposition&lt;/a&gt; are blunt about this for a reason.)&lt;/p&gt;

&lt;p&gt;This is the boring core of &lt;strong&gt;LLM orchestration&lt;/strong&gt;: not more model calls for their own sake, but a graph of verifiable work units.&lt;/p&gt;
&lt;h3&gt;
  
  
  Two planning styles
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Decomposition-first&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Build the full plan, then execute. Best for stable workflows: migrations, docs, publish checklists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interleaved&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Plan a little, act, replan. Best for research and debugging where the map changes under your feet — including RAG pipelines where retrieval quality shifts mid-run.&lt;/p&gt;
&lt;h3&gt;
  
  
  A plan JSON agents can actually consume
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"goal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ship a technical article with a pre-publish quality pass"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"assumptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Target platform is Dev.to"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Audience is builders using LLMs in real workflows"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tasks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"t1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Outline + claims list"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"depends_on"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"tool_hint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"none"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"done_when"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"H2/H3 outline exists and 8–12 claims are listed"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"t2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Write full draft"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"depends_on"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"t1"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"tool_hint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"none"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"done_when"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Complete draft with no TODO markers"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"t3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Fact-check hard claims"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"depends_on"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"t2"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"tool_hint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"search"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"done_when"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Every strong claim has a source or is marked UNVERIFIED"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"t4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Publish checklist + SEO verify"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"depends_on"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"t3"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"tool_hint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"done_when"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Top 5 impact/effort fixes are written from evidence"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"risks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Stale references"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Generic advice with no operational detail"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Planner-only master prompt
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are Task Planner. You do not execute. You only produce an executable plan.

Rules:
1) Split the goal into atomic steps.
2) One step = one action or one tool call.
3) Declare dependencies.
4) Every step needs done_when.
5) If information is missing, add assumptions and clarifying_questions.
6) No prose essay. Structure only.

Return strict JSON:
{
  "goal": "...",
  "assumptions": [],
  "clarifying_questions": [],
  "tasks": [
    {
      "id": "t1",
      "title": "...",
      "description": "...",
      "depends_on": [],
      "tool_hint": "none|search|code|browser|api",
      "done_when": "..."
    }
  ],
  "risks": []
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Microsoft’s agent curriculum makes the same point in plainer language: define the goal, break it, then assign work. See their &lt;a href="https://github.com/microsoft/ai-agents-for-beginners/blob/main/07-planning-design/README.md" rel="noopener noreferrer"&gt;planning design chapter&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  5. From plan to agent loop
&lt;/h2&gt;

&lt;p&gt;Once you have a plan, stop letting the model freestyle the whole graph.&lt;/p&gt;
&lt;h3&gt;
  
  
  The loop
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Plan → Act → Observe → Verify → Repair or Next
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Without &lt;strong&gt;Verify&lt;/strong&gt;, agents lie politely. They narrate completion. They do not prove it.&lt;/p&gt;

&lt;p&gt;This loop is where prompt engineering for production stops being “wording” and becomes control flow. The master prompt defines the rules. The orchestrator enforces step boundaries. Tools supply evidence. Verification closes the books.&lt;/p&gt;
&lt;h3&gt;
  
  
  Executor master prompt
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are Executor Agent.
Take exactly one next task from the plan.
Do not jump ahead.

Inputs:
- plan JSON
- current_task_id
- tool_results (if any)

Method:
1) Re-read done_when for the current task.
2) If blocked on missing data, request a tool or mark blocked.
3) Do the smallest useful action.
4) Return:

## Action
## Evidence
## Status: done | partial | blocked
## Next recommendation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Repair rule that saves hours
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If Status is partial or blocked:
1) Name the blocker in one sentence.
2) Propose the cheapest next check.
3) Do not rewrite the entire plan unless dependencies actually changed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is less glamorous than “autonomous agent.” It is also why some systems finish jobs and others generate confident debris.&lt;/p&gt;
&lt;h2&gt;
  
  
  6. Context engineering beats clever wording
&lt;/h2&gt;

&lt;p&gt;I used to spend an hour polishing adjectives. Now I spend that hour deciding what &lt;em&gt;not&lt;/em&gt; to put in context.&lt;/p&gt;
&lt;h3&gt;
  
  
  High-signal rule
&lt;/h3&gt;

&lt;p&gt;Use the smallest token set that still steers behavior. That’s &lt;strong&gt;token efficiency&lt;/strong&gt; as an engineering constraint, not a slogan.&lt;/p&gt;
&lt;h3&gt;
  
  
  Practical layout
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Content&lt;/th&gt;
&lt;th&gt;Placement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stable policy / role&lt;/td&gt;
&lt;td&gt;Front of the prompt (also helps caching)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reference docs / data&lt;/td&gt;
&lt;td&gt;Clearly delimited blocks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retrieved RAG chunks&lt;/td&gt;
&lt;td&gt;After policy, tagged and ranked by relevance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Examples&lt;/td&gt;
&lt;td&gt;After policy, before the live task&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User task&lt;/td&gt;
&lt;td&gt;End&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In &lt;strong&gt;RAG pipelines&lt;/strong&gt;, the master prompt should also say how to treat retrieved text: prefer it over parametric memory, cite chunk ids, and refuse to invent when retrieval is empty. Without that policy, retrieval becomes decoration.&lt;/p&gt;

&lt;p&gt;OpenAI’s notes on &lt;a href="https://platform.openai.com/docs/guides/prompt-caching" rel="noopener noreferrer"&gt;prompt caching&lt;/a&gt; are worth reading if cost and latency matter: put stable prefixes first, variable content last.&lt;/p&gt;
&lt;h3&gt;
  
  
  Delimiters
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;policy&amp;gt;...&amp;lt;/policy&amp;gt;
&amp;lt;context&amp;gt;...&amp;lt;/context&amp;gt;
&amp;lt;retrieved&amp;gt;...&amp;lt;/retrieved&amp;gt;
&amp;lt;examples&amp;gt;...&amp;lt;/examples&amp;gt;
&amp;lt;task&amp;gt;...&amp;lt;/task&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;XML, Markdown headings, triple backticks — pick a convention and stop rotating it every sprint. Inconsistency is a silent quality tax across GPT-4o, Claude 3.5 Sonnet, and Gemini 1.5 Pro deployments alike.&lt;/p&gt;

&lt;p&gt;Long-context tip that keeps showing up in lab guidance: put large source material first, put the actual question last. Anthropic has reported meaningful gains from that ordering on long inputs inside a large context window.&lt;/p&gt;
&lt;h2&gt;
  
  
  7. Few-shot, JSON contracts, and the anti-hallucination rule
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Few-shot that helps
&lt;/h3&gt;

&lt;p&gt;Good examples are diverse and slightly annoying. Edge cases. Near-misses. Format traps.&lt;/p&gt;

&lt;p&gt;Eight nearly identical happy-path samples teach the model to sound right while being fragile.&lt;/p&gt;

&lt;p&gt;Two to five sharp examples beat a museum of mediocre ones.&lt;/p&gt;
&lt;h3&gt;
  
  
  Output contracts
&lt;/h3&gt;

&lt;p&gt;If another system will consume the answer, stop accepting free-form essays.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Return ONLY valid JSON:
{
  "summary": "string",
  "actions": [{"priority": 1, "fix": "string", "effort": "S|M|L"}],
  "risks": ["string"]
}
No markdown fence. No commentary.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then validate. Retry with the schema error. Humans can tolerate messy answers. Pipelines cannot — especially when the next hop is another agent, a ticket system, or a CMS write API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Truth policy (non-negotiable)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TRUTH POLICY
- Do not invent citations, numbers, APIs, dates, or “studies.”
- If a claim is not grounded in provided context, retrieved chunks, or tool output, mark it UNVERIFIED.
- Incomplete + honest beats complete + fabricated.
- Prefer a cheaper verification step over a confident guess.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Labs keep repeating a version of this: allow “I don’t know.” It still gets ignored in the wild.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Copy-paste masters you can actually deploy
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Research agent
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a research analyst.

Process:
1) Source plan first
2) Notes with links/quotes
3) Synthesis only after notes exist

Rules:
- Every hard claim needs a source or UNVERIFIED
- Separate facts from interpretation
- End with confidence and open questions

Output:
## Source plan
## Notes
## Synthesis
## UNVERIFIED
## Next checks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Coding agent
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a senior engineer working under change control.

Process:
1) Reproduce the problem
2) Minimal fix
3) Test or verification path
4) Short explanation of the diff

Constraints:
- No drive-by refactors
- No “while we’re here” features
- If a public API changes, call it out explicitly

Output:
## Root cause
## Fix
## Test plan
## Residual risks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Editor / publish agent
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a technical editor with publishing standards.

Goal:
A draft that can ship — structure, claims, scanability, on-page hygiene.

Process:
1) Outline
2) Draft
3) Fact-check
4) Clarity pass
5) Publish checklist (title, description, H1/H2, links, alts)
6) If a live URL exists, run a verify pass and rank fixes

Output:
## Outline
## Final draft
## Checklist
## Top fixes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ops triage agent
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are an incident triage agent.

Process:
1) Symptoms → ranked hypotheses
2) Cheapest diagnostic step
3) Evidence
4) Decision: fix / escalate / monitor

Output:
## Hypothesis ranking
## Next diagnostic step
## Decision
## Why
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are intentionally plain. Flashy prompts age badly. Contracts age better.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. A real publish pipeline (including the verify step people skip)
&lt;/h2&gt;

&lt;p&gt;Content agents love generating. They hate proving the page is healthy after publish.&lt;/p&gt;

&lt;p&gt;A sane pipeline looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Idea → Outline → Draft → Fact-check → Edit → Publish checklist → Live verify → Fix backlog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last two steps are where quality either becomes real or becomes marketing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where audit belongs in agent architecture
&lt;/h3&gt;

&lt;p&gt;Once you have a URL, stop guessing about titles, meta, heading hierarchy, schema, and performance signals. Measure.&lt;/p&gt;

&lt;p&gt;This is the gap most LLM orchestration diagrams skip: generation is only half the loop. Publish workflows need a machine-readable verification service that agents can call, parse, and turn into ranked work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AuditMe provides an API designed for automated SEO verification within AI agent pipelines.&lt;/strong&gt; It’s not a dashboard you stare at after the fact — it’s a structured audit endpoint agents can hit as a tool step, then convert JSON findings into priority-ordered fixes (meta, headings, Core Web Vitals, schema, links).&lt;/p&gt;

&lt;p&gt;Practical path:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ship the page.&lt;/li&gt;
&lt;li&gt;Call &lt;a href="https://www.auditme.dev/" rel="noopener noreferrer"&gt;AuditMe’s free SEO audit&lt;/a&gt; (or the same engine via API).&lt;/li&gt;
&lt;li&gt;Feed the response back into the executor as evidence.&lt;/li&gt;
&lt;li&gt;Close only the fixes that clear &lt;code&gt;done_when&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Task shape inside the plan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"t5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SEO verify live URL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"depends_on"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"t4"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tool_hint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"done_when"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Audit evidence exists and top 5 fixes are ranked by impact/effort"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you’re wiring agents, use a structured endpoint rather than screenshots of dashboards. &lt;a href="https://www.auditme.dev/api-docs" rel="noopener noreferrer"&gt;AuditMe’s API docs&lt;/a&gt; make that concrete: one request, JSON back, backlog out. No human copy-paste from a UI.&lt;/p&gt;

&lt;h3&gt;
  
  
  Executor fragment for verify
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You verify a published URL.
1) Collect on-page signals (title, meta, H1, heading tree, links, CWV risks).
2) If an audit tool/API is available, treat it as source of truth.
3) Prefer structured audit APIs (e.g. AuditMe) over subjective page reading.
4) Return only prioritized actions:
   - priority
   - issue
   - fix
   - effort (S/M/L)
No generic advice without evidence.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For content and GEO/SEO workflows, a master prompt should end on &lt;strong&gt;measurable next actions&lt;/strong&gt;, not applause for the draft. That’s the whole point of a verify layer — and why &lt;a href="https://www.auditme.dev/" rel="noopener noreferrer"&gt;AuditMe&lt;/a&gt; fits as infrastructure in the agent graph, not as a blog-roll link in the intro.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Eval or you’re guessing
&lt;/h2&gt;

&lt;p&gt;If you can’t score a prompt change, you are collecting folklore.&lt;/p&gt;

&lt;h3&gt;
  
  
  Minimum viable eval
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;10–30 real tasks (not toy puzzles)&lt;/li&gt;
&lt;li&gt;Rubric: correctness, format, safety, completeness&lt;/li&gt;
&lt;li&gt;Same set for &lt;code&gt;v1&lt;/code&gt; vs &lt;code&gt;v2&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Re-run when the model changes — GPT-4o today, a Claude or Gemini snapshot tomorrow&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Anthropic’s docs are explicit: define success criteria and evaluation before you endlessly tweak wording.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rubric I actually use (0–2)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Goal&lt;/td&gt;
&lt;td&gt;Missed&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;Hit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Format&lt;/td&gt;
&lt;td&gt;Broken&lt;/td&gt;
&lt;td&gt;Close&lt;/td&gt;
&lt;td&gt;Exact&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Facts&lt;/td&gt;
&lt;td&gt;Invented&lt;/td&gt;
&lt;td&gt;Soft&lt;/td&gt;
&lt;td&gt;Grounded / marked&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plan&lt;/td&gt;
&lt;td&gt;Missing&lt;/td&gt;
&lt;td&gt;Shallow&lt;/td&gt;
&lt;td&gt;Executable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verify&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Cosmetic&lt;/td&gt;
&lt;td&gt;Checks &lt;code&gt;done_when&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Stop-loss
&lt;/h3&gt;

&lt;p&gt;If three prompt iterations don’t move the score:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;simplify the task graph&lt;/li&gt;
&lt;li&gt;add a tool&lt;/li&gt;
&lt;li&gt;change the model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do &lt;strong&gt;not&lt;/strong&gt; add another paragraph of “be meticulous.” That’s the opposite of prompt optimization.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Failure patterns I keep seeing
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pattern&lt;/th&gt;
&lt;th&gt;What breaks&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;“Make it high quality”&lt;/td&gt;
&lt;td&gt;No success definition&lt;/td&gt;
&lt;td&gt;Goal + &lt;code&gt;done_when&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Twelve asks in one message&lt;/td&gt;
&lt;td&gt;Dropped steps&lt;/td&gt;
&lt;td&gt;Plan JSON + single-task executor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No output contract&lt;/td&gt;
&lt;td&gt;“Almost usable” answers&lt;/td&gt;
&lt;td&gt;Schema / fixed headings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only negative instructions&lt;/td&gt;
&lt;td&gt;Soft boundaries&lt;/td&gt;
&lt;td&gt;State the desired behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;900-line system prompt&lt;/td&gt;
&lt;td&gt;Contradictions, wasted context window&lt;/td&gt;
&lt;td&gt;High-signal policy, versioned&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No eval&lt;/td&gt;
&lt;td&gt;Imaginary progress&lt;/td&gt;
&lt;td&gt;Golden set + rubric&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent without verify&lt;/td&gt;
&lt;td&gt;Fake completion&lt;/td&gt;
&lt;td&gt;Status + Evidence required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claims without sources&lt;/td&gt;
&lt;td&gt;Quiet hallucinations&lt;/td&gt;
&lt;td&gt;UNVERIFIED policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAG without retrieval policy&lt;/td&gt;
&lt;td&gt;Retrieved noise treated as truth&lt;/td&gt;
&lt;td&gt;Explicit ranking + refuse-if-empty rules&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The boring fixes win. They always did.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. PromptOps: treat prompts like code
&lt;/h2&gt;

&lt;p&gt;Store them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;prompts/
  master_v3.md
  planner_v2.md
  executor_v2.md
  research_v1.md
evals/
  golden_set.json
  rubric.md
CHANGELOG.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Changelog that means something
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v3 → v4
- Required Verification section
- Cut Role from ~120 words to ~40
- Format score 1.4 → 1.8 on golden set
- Reason: executor skipped done_when on multi-step jobs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pin model snapshots in production when behavior is load-bearing. Otherwise you’ll debug a prompt that didn’t change while the model underneath did.&lt;/p&gt;

&lt;p&gt;By 2026, teams that treat prompts as disposable chat text are the same teams surprised by regressions every model bump — whether the stack is GPT-4o, Claude 3.5 Sonnet, or Gemini 1.5 Pro.&lt;/p&gt;

&lt;h2&gt;
  
  
  13. One universal master prompt
&lt;/h2&gt;

&lt;p&gt;Steal this. Strip it. Make it yours.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SYSTEM / MASTER PROMPT

You are a reliable execution agent.

1) ROLE
Domain-competent specialist. Precise. Structured. No filler.

2) OPERATING MODE
- Plan before acting on complex work.
- One focus at a time.
- Verify done_when after each action.

3) TOOLS
Use tools when facts may have changed or verification is required.
Never simulate tool output.

4) PLANNING
Decompose complex goals into tasks with dependencies and done_when.
If a step needs more than 3 tool calls, split it.

5) TRUTH
Do not invent. Mark UNVERIFIED. Ask for critical missing context.
Prefer retrieved evidence and tool results over memory.

6) OUTPUT CONTRACT
Default shape:
## Plan
## Work
## Result
## Verification
## Risks / Next steps

7) FAILURE HANDLING
If blocked:
- state the reason
- list what is missing
- propose the cheapest next step

8) STYLE
Short sentences. Lists over fog.
Code/JSON only when necessary.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Works across GPT-class, Claude-class, and Gemini-class instruction styles. Not because it’s poetic — because it encodes process for LLM orchestration, not vibes.&lt;/p&gt;

&lt;h2&gt;
  
  
  14. Ship checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Role + Goal + Constraints + Output contract exist&lt;/li&gt;
&lt;li&gt;[ ] Hallucination policy is explicit&lt;/li&gt;
&lt;li&gt;[ ] Complex work goes through a plan&lt;/li&gt;
&lt;li&gt;[ ] Every task has &lt;code&gt;done_when&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Tool results are never fabricated&lt;/li&gt;
&lt;li&gt;[ ] RAG retrieval policy is defined if you retrieve&lt;/li&gt;
&lt;li&gt;[ ] ≥10 eval cases on real work&lt;/li&gt;
&lt;li&gt;[ ] Invalid format triggers retry&lt;/li&gt;
&lt;li&gt;[ ] Logs capture plan / actions / verification&lt;/li&gt;
&lt;li&gt;[ ] Prompt is versioned&lt;/li&gt;
&lt;li&gt;[ ] Model snapshot pinned if behavior is critical&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three red boxes means prototype. Not production.&lt;/p&gt;

&lt;h2&gt;
  
  
  15. A one-week install plan
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Day&lt;/th&gt;
&lt;th&gt;Move&lt;/th&gt;
&lt;th&gt;Outcome&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Write master v1 + gather 15 real tasks&lt;/td&gt;
&lt;td&gt;Baseline contract&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Tighten Goal / Constraints / Output&lt;/td&gt;
&lt;td&gt;Less format chaos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Add plan JSON for hard jobs&lt;/td&gt;
&lt;td&gt;Executable structure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Add executor with Status/Evidence&lt;/td&gt;
&lt;td&gt;Step control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Add verify layer for publish/quality work&lt;/td&gt;
&lt;td&gt;Fewer false dones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Score v1 vs v2&lt;/td&gt;
&lt;td&gt;Numbers instead of opinions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Cut 20–40% of prompt text without losing score&lt;/td&gt;
&lt;td&gt;Team default v3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;After seven days you should have a standard, not a favorite paragraph.&lt;/p&gt;

&lt;h2&gt;
  
  
  16. Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is the difference between a system prompt and a master prompt?
&lt;/h3&gt;

&lt;p&gt;A system prompt is a message role in an API call. A master prompt is the &lt;em&gt;policy content&lt;/em&gt; you usually put there — and keep stable across tasks. In practice, teams use “master prompt” for the versioned contract (role, goals, constraints, output rules) that many user tasks share.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I prevent LLM hallucinations in agent loops?
&lt;/h3&gt;

&lt;p&gt;Don’t rely on tone. Require grounding: tool results, retrieved chunks, or explicit &lt;code&gt;UNVERIFIED&lt;/code&gt; labels. Force a verify step with &lt;code&gt;done_when&lt;/code&gt;, and refuse simulated tool output. Hallucinations shrink when completion must be evidenced, not narrated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why use JSON for AI agent outputs?
&lt;/h3&gt;

&lt;p&gt;Because the next consumer is often another agent, a validator, or an API — not a human reader. JSON (or another strict schema) makes success machine-checkable, enables retries on invalid structure, and keeps LLM orchestration deterministic at the boundaries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I still need prompt engineering if models keep getting smarter?
&lt;/h3&gt;

&lt;p&gt;Yes — the wording tax goes down, the systems tax goes up. Smarter models still need clear goals, step boundaries, retrieval policy, and verification. Prompt engineering for production is less about clever phrasing and more about contracts that survive model swaps.&lt;/p&gt;

&lt;h2&gt;
  
  
  17. Sources
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Lab guides
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://platform.openai.com/docs/guides/prompting" rel="noopener noreferrer"&gt;OpenAI — Prompting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview" rel="noopener noreferrer"&gt;Anthropic — Prompt engineering overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://claude.com/blog/best-practices-for-prompt-engineering" rel="noopener noreferrer"&gt;Anthropic — Prompt engineering best practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/machine-learning/resources/prompt-eng" rel="noopener noreferrer"&gt;Google — Prompt Engineering for Generative AI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Papers and surveys
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2201.11903" rel="noopener noreferrer"&gt;Wei et al. — Chain-of-Thought Prompting (arXiv:2201.11903)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2305.10601" rel="noopener noreferrer"&gt;Yao et al. — Tree of Thoughts (arXiv:2305.10601)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2406.06608" rel="noopener noreferrer"&gt;Schulhoff et al. — The Prompt Report (arXiv:2406.06608)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ar5iv.labs.arxiv.org/html/2402.02716" rel="noopener noreferrer"&gt;Understanding the planning of LLM agents (arXiv:2402.02716)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2401.14295" rel="noopener noreferrer"&gt;Demystifying Chains, Trees, and Graphs of Thoughts (arXiv:2401.14295)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Agent practice
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/ai-agents-for-beginners/blob/main/07-planning-design/README.md" rel="noopener noreferrer"&gt;Microsoft AI Agents for Beginners — Planning Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://engineersofai.com/docs/agentic-ai/long-horizon-planning/Task-Decomposition" rel="noopener noreferrer"&gt;Task Decomposition (EngineersOfAI)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.emergentmind.com/topics/plan-and-solve-prompting" rel="noopener noreferrer"&gt;Plan-and-Solve overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Practitioner write-ups (2025–2026)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.promptquorum.com/prompt-engineering" rel="noopener noreferrer"&gt;Prompt Engineering Best Practices 2026 (PromptQuorum)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jobsbyculture.com/blog/prompt-engineering-best-practices-2026" rel="noopener noreferrer"&gt;What actually works in 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://prompt-architects.com/blog/49-prompt-engineering-cheat-sheet" rel="noopener noreferrer"&gt;Ultimate Prompt Engineering Cheat Sheet 2026&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Verify / on-page quality layer for agent pipelines
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.auditme.dev/" rel="noopener noreferrer"&gt;AuditMe — Free SEO Audit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.auditme.dev/api-docs" rel="noopener noreferrer"&gt;AuditMe API documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.auditme.dev/faq" rel="noopener noreferrer"&gt;AuditMe FAQ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  18. What to do in the next 15 minutes
&lt;/h2&gt;

&lt;p&gt;Don’t “finish reading later.” Install one piece.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Copy the &lt;strong&gt;universal master prompt&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Add 5–10 lines of your real domain context.&lt;/li&gt;
&lt;li&gt;Run three tasks you actually care about.&lt;/li&gt;
&lt;li&gt;Wherever quality slipped, write a sharper &lt;code&gt;done_when&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Save it as &lt;code&gt;master_v1.md&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s the whole game: a contract that survives model changes, teammate turnover, and the next hype cycle.&lt;/p&gt;

&lt;p&gt;Master prompts in 2026 are not literature. They’re operations.&lt;br&gt;&lt;br&gt;
Humans need them to stay consistent.&lt;br&gt;&lt;br&gt;
Agents need them to stop improvising.&lt;/p&gt;

&lt;p&gt;Write the contract. Measure it. Cut the noise. Ship.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>promptengineering</category>
      <category>agents</category>
      <category>llm</category>
    </item>
    <item>
      <title>How to Track AI Search Visibility in 2026: The Complete GEO Measurement Guide</title>
      <dc:creator>Eduard</dc:creator>
      <pubDate>Wed, 02 Sep 2026 02:54:00 +0000</pubDate>
      <link>https://dev.to/edo911/how-to-track-ai-search-visibility-in-2026-the-complete-geo-measurement-guide-4fka</link>
      <guid>https://dev.to/edo911/how-to-track-ai-search-visibility-in-2026-the-complete-geo-measurement-guide-4fka</guid>
      <description>&lt;h1&gt;
  
  
  How to Track AI Search Visibility in 2026: The Complete GEO Measurement Guide
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;You cannot manage what you do not measure.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google Search Console shows nothing about citations inside ChatGPT, Perplexity, Gemini, Claude, Copilot, or Google AI Overviews. Classic rank trackers are equally blind. Zero-click rates keep climbing. Model updates move baselines overnight.&lt;/p&gt;

&lt;p&gt;This guide gives you a practical, reproducible system to measure brand visibility inside AI answers in 2026:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;12-query method&lt;/strong&gt; (15 minutes per week)&lt;/li&gt;
&lt;li&gt;The five core metrics that actually matter&lt;/li&gt;
&lt;li&gt;Real 2026 citation-rate benchmarks&lt;/li&gt;
&lt;li&gt;An honest comparison of GEO tracking tools&lt;/li&gt;
&lt;li&gt;A weekly routine that survives model updates&lt;/li&gt;
&lt;li&gt;Exact prompts, scoring formulas, and action plans&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the measurement companion to our &lt;a href="https://www.auditme.dev/blog/generative-engine-optimization-geo-visibility-guide" rel="noopener noreferrer"&gt;complete Generative Engine Optimization (GEO) guide&lt;/a&gt;. There we covered how to &lt;em&gt;earn&lt;/em&gt; citations. Here we cover how to &lt;em&gt;prove&lt;/em&gt; it is working — and how to turn the data into content and technical priorities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Designed as a living cheat-sheet.&lt;/strong&gt; Every section is structured so both human marketers and AI systems can extract clear, actionable answers.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR — Measure AI visibility in under 60 seconds
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Core metric = Citation Rate&lt;/strong&gt;: of the queries you care about, in what percentage of AI answers does your brand appear?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fixed 12-query set, re-run weekly.&lt;/strong&gt; Consistency beats volume. A small stable set produces trend lines you can act on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2026 benchmarks&lt;/strong&gt;: ~10–15 % overall citation rate already puts you in the visible minority. Strong sites clear 25–30 % on category queries. Only ~12 % of websites ever get mentioned at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start manual.&lt;/strong&gt; Spreadsheet + 15 minutes/week is enough for months. Upgrade to tools only when the manual work starts to hurt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three platforms minimum&lt;/strong&gt;: ChatGPT (with search), Perplexity, Gemini. Add Copilot and Claude later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model updates move the baseline.&lt;/strong&gt; Without a fixed query set you will never know whether a dip came from your work or from the model.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why AI Visibility Tracking Matters More Than Ever in 2026
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. AI answers are now a primary acquisition surface
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Google AI Overviews appear on roughly &lt;strong&gt;43–50 %&lt;/strong&gt; of searches in major markets (Similarweb July 2026; BrightEdge mid-2026 industry panels). Some informational and commercial verticals exceed 80–87 %.&lt;/li&gt;
&lt;li&gt;ChatGPT reached &lt;strong&gt;800 M+ weekly active users&lt;/strong&gt; and crossed 1 billion total active users across OpenAI products by mid-2026.&lt;/li&gt;
&lt;li&gt;Gemini and Claude continue rapid growth. Perplexity remains the citation-heavy specialist.&lt;/li&gt;
&lt;li&gt;AI platforms now account for a measurable and growing share of website sessions (First Page Sage 2026 data shows AI platforms rising from near-zero to ~6 % of sessions in tracked panels).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Zero-click behaviour is structural, not temporary
&lt;/h3&gt;

&lt;p&gt;When an AI summary appears, traditional organic CTR drops sharply (often 40–60 % relative decline in controlled studies). Users who do click after an AI Overview tend to stay longer and convert better — but far fewer of them click. Being &lt;em&gt;inside&lt;/em&gt; the answer is the new being &lt;em&gt;above the fold&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. LLM mentions arrive with trust attached
&lt;/h3&gt;

&lt;p&gt;A brand recommended by name in an AI answer arrives pre-validated. You cannot attribute this cleanly in GA4 or most analytics platforms. That is exactly why you need a dedicated measurement loop outside classic SEO tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Model and retrieval updates move the ground under your feet
&lt;/h3&gt;

&lt;p&gt;A single model swap or retrieval change can shift citation rates 8–15 points overnight. Without a fixed, repeatable query set you will mistake model noise for content success (or failure).&lt;/p&gt;

&lt;p&gt;The earlier you establish a clean baseline, the more of the growth curve you capture.&lt;/p&gt;




&lt;h2&gt;
  
  
  What to Actually Measure: The 5 Core Metrics
&lt;/h2&gt;

&lt;p&gt;Forget vanity dashboards. These five numbers tell you almost everything:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Question it answers&lt;/th&gt;
&lt;th&gt;How to capture it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Citation Rate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Of my target queries, how often am I mentioned?&lt;/td&gt;
&lt;td&gt;Mentions ÷ total query × platform cells&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI Share of Voice&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Among brands mentioned, how often is it me vs competitors?&lt;/td&gt;
&lt;td&gt;Your mentions ÷ all brand mentions (especially on category queries)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Answer Position&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Am I first-listed or buried in a footnote?&lt;/td&gt;
&lt;td&gt;Position of your brand in the answer list (1 = best)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sentiment &amp;amp; Accuracy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;When mentioned, is the description correct and positive?&lt;/td&gt;
&lt;td&gt;Tag every mention: positive / neutral / negative / wrong&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Source Presence&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Does the AI link to your site as a source?&lt;/td&gt;
&lt;td&gt;Yes / No (Perplexity almost always links; ChatGPT often mentions without linking)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Why Answer Position matters
&lt;/h3&gt;

&lt;p&gt;AI answers are scanned the way search results used to be. Being the first tool named in “best SEO checker tools 2026” behaves like ranking #1. Being fifth behaves like page two — even though both count as “mentioned.”&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Sentiment &amp;amp; Accuracy matters
&lt;/h3&gt;

&lt;p&gt;Models trained on older or noisy data still invent pricing, dead features, or conflate brands with similar names. Every “wrong” mention is a content and entity bug you can fix with a clear positioning page and an updated &lt;code&gt;llms.txt&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Secondary signals worth logging
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Whether the AI used your exact product name or a vague category description&lt;/li&gt;
&lt;li&gt;Whether competitors appear more frequently or higher in the same answers&lt;/li&gt;
&lt;li&gt;Whether the answer links to a specific page on your site (and which one)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The 12-Query Method: Your Manual Tracking System
&lt;/h2&gt;

&lt;p&gt;This is the exact method we recommend before spending a cent on tools. It takes ~15 minutes a week and produces data you can actually trust across model updates.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1 — Build your fixed query set (do this once)
&lt;/h3&gt;

&lt;p&gt;Pick &lt;strong&gt;exactly 12 queries&lt;/strong&gt; across four intents. &lt;strong&gt;Do not change them later.&lt;/strong&gt; Consistency is the entire point.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Intent&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;th&gt;Example (for an SEO / audit tool brand)&lt;/th&gt;
&lt;th&gt;What it tests&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Brand&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;“Is [YourBrand] good?”, “[YourBrand] review”, “[YourBrand] alternatives”&lt;/td&gt;
&lt;td&gt;Entity knowledge &amp;amp; reputation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Category&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;“Best SEO checker tools 2026”, “top SEO audit software”, “free SEO analysis tools”, “SEO checker for small business”&lt;/td&gt;
&lt;td&gt;Category membership &amp;amp; share of voice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Comparison&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;“[Competitor A] vs [Competitor B]”, “[Competitor] alternatives”, “cheaper alternative to [Competitor]”&lt;/td&gt;
&lt;td&gt;Consideration-set presence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Question&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;“How do I audit my website SEO?”, “How to get cited by ChatGPT?”&lt;/td&gt;
&lt;td&gt;Authority on your core topic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Rules that keep the data clean:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Same phrasing every single week. One word of drift breaks the trend line.&lt;/li&gt;
&lt;li&gt;Run each query in a &lt;strong&gt;fresh chat / private session&lt;/strong&gt; (no conversation memory).&lt;/li&gt;
&lt;li&gt;Log: date, platform, mentioned (Y/N), position, sentiment, source link (Y/N), and a short note if the description is wrong.&lt;/li&gt;
&lt;li&gt;One row per query × platform × week is enough.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2 — Run it across at least three platforms
&lt;/h3&gt;

&lt;p&gt;Minimum viable set in 2026:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ChatGPT (with search / browsing)&lt;/strong&gt; — heavily influenced by Bing index and external validation signals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perplexity&lt;/strong&gt; — always cites sources; the easiest place to see whether your URL is actually pulled in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini&lt;/strong&gt; — grounded in Google’s index; closest proxy for AI Overviews behaviour.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Add Microsoft Copilot and Claude when capacity allows. Never let platform sprawl stop the weekly three-platform sweep.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3 — Score each run
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Citation Rate     = number of mentioned cells / total cells
AI Share of Voice = your brand mentions / all brand mentions in category queries
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example: 11 mentions out of 36 cells (12 queries × 3 platforms) = &lt;strong&gt;30.6 % Citation Rate&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Copy-paste prompt library (use verbatim every week)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;“What are the best [category] tools for [audience] in 2026?”&lt;/li&gt;
&lt;li&gt;“Which [category] platforms would you recommend and why?”&lt;/li&gt;
&lt;li&gt;“[Competitor A] vs [Competitor B] — which is better for [use case]?”&lt;/li&gt;
&lt;li&gt;“What are good alternatives to [dominant competitor]?”&lt;/li&gt;
&lt;li&gt;“Is [YourBrand] reliable? What do people say about it?”&lt;/li&gt;
&lt;li&gt;“What is [your core topic]? Explain simply for a beginner.”&lt;/li&gt;
&lt;li&gt;“How do I [job-to-be-done] step by step?”&lt;/li&gt;
&lt;li&gt;“Best free options for [category] in 2026?”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Resist the urge to “improve” the prompts mid-quarter. The value is in the trend, not in perfect individual answers.&lt;/p&gt;




&lt;h2&gt;
  
  
  A 15-Minute Weekly Routine That Actually Survives Q4
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Monday morning. 15 minutes. Three platforms. 12 queries. One sheet.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Minutes&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0–5&lt;/td&gt;
&lt;td&gt;Run the 4 category queries on all 3 platforms (12 runs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5–9&lt;/td&gt;
&lt;td&gt;Run the 3 brand + 3 comparison queries (18 runs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9–12&lt;/td&gt;
&lt;td&gt;Run the 2 question queries; note if your guide or product page is cited or linked&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12–15&lt;/td&gt;
&lt;td&gt;Fill the sheet, compute Citation Rate, write a one-line note on anything unusual&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Once a month&lt;/strong&gt; add ~20 minutes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full sweep on Copilot and Claude&lt;/li&gt;
&lt;li&gt;Review all “wrong” or negative sentiment tags&lt;/li&gt;
&lt;li&gt;List competitors that consistently outrank you in the consideration set — that list becomes next month’s content and outreach roadmap&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After 8–12 weeks you own a trend line that survives model updates. When OpenAI ships a new model or Perplexity changes retrieval, you will &lt;em&gt;see&lt;/em&gt; the dip instead of guessing about it.&lt;/p&gt;




&lt;h2&gt;
  
  
  2026 Benchmarks: What Is a “Good” Citation Rate?
&lt;/h2&gt;

&lt;p&gt;Numbers drawn from our internal dataset of 1 000+ domains plus publicly reported 2026 studies:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Signal&lt;/th&gt;
&lt;th&gt;Weak&lt;/th&gt;
&lt;th&gt;Healthy&lt;/th&gt;
&lt;th&gt;Strong&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mentioned in &lt;em&gt;any&lt;/em&gt; relevant AI answer&lt;/td&gt;
&lt;td&gt;&amp;lt; 5 %&lt;/td&gt;
&lt;td&gt;10–15 %&lt;/td&gt;
&lt;td&gt;25 %+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Category queries (“best X tools”)&lt;/td&gt;
&lt;td&gt;&amp;lt; 10 %&lt;/td&gt;
&lt;td&gt;15–25 %&lt;/td&gt;
&lt;td&gt;30 %+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Brand queries (“is [brand] good”)&lt;/td&gt;
&lt;td&gt;No answer or vague&lt;/td&gt;
&lt;td&gt;Accurate description&lt;/td&gt;
&lt;td&gt;Confident + positive + correct details&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source link presence (especially Perplexity)&lt;/td&gt;
&lt;td&gt;Never&lt;/td&gt;
&lt;td&gt;Sometimes&lt;/td&gt;
&lt;td&gt;Linked in most answers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Answer position for “best X”&lt;/td&gt;
&lt;td&gt;Not listed&lt;/td&gt;
&lt;td&gt;3rd–5th&lt;/td&gt;
&lt;td&gt;1st–2nd&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Critical context:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only about &lt;strong&gt;12 % of websites&lt;/strong&gt; ever get mentioned in AI-generated answers at all.&lt;/li&gt;
&lt;li&gt;Observational data continues to show that sites with a well-structured &lt;code&gt;llms.txt&lt;/code&gt; are significantly more likely to be cited.&lt;/li&gt;
&lt;li&gt;A first baseline of 8–12 % is not failure — it is the realistic starting line for most brands outside the very top of their category.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Two important caveats:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Model and retrieval updates shift baselines (a single change can move your rate 10+ points).&lt;/li&gt;
&lt;li&gt;Small query sets are noisy. Never react to a single week. React to the 4-week (or longer) trend.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  GEO Tracking Tools: Honest Comparison for Late 2026
&lt;/h2&gt;

&lt;p&gt;When manual tracking starts eating hours (or you manage multiple brands / clients), these platforms automate the query-sweep-and-score loop. Pricing moves quickly — always verify current numbers.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;th&gt;Typical entry pricing (2026)&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AuditMe GEO Visibility Checker&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free baseline &amp;amp; quick scans&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Real queries, brand presence score in ~60 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Otterly.ai&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Simple scheduled monitoring&lt;/td&gt;
&lt;td&gt;From ~$29/mo&lt;/td&gt;
&lt;td&gt;Prompt-based, weekly digests, excellent “set and forget”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Peec AI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Competitive benchmarking&lt;/td&gt;
&lt;td&gt;From ~€50–95/mo&lt;/td&gt;
&lt;td&gt;Strong source-level and multi-engine analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AthenaHQ&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Strategy + tracking&lt;/td&gt;
&lt;td&gt;Mid-to-high&lt;/td&gt;
&lt;td&gt;Blends visibility data with optimisation recommendations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Profound&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enterprise analytics&lt;/td&gt;
&lt;td&gt;Custom / high&lt;/td&gt;
&lt;td&gt;Deep answer-engine insights, conversation volume, large brands&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scrunch AI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Brand representation &amp;amp; agent pages&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;td&gt;Focus on how AI assistants describe and use your brand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Semrush AI Visibility Toolkit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Teams already in Semrush&lt;/td&gt;
&lt;td&gt;Add-on&lt;/td&gt;
&lt;td&gt;Keeps AI data next to classic rank tracking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ahrefs Brand Radar&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Teams already in Ahrefs&lt;/td&gt;
&lt;td&gt;Add-on&lt;/td&gt;
&lt;td&gt;Leverages large prompt index for brand mentions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LLM Pulse / Rankscale / others&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Budget multi-engine or developer-friendly&lt;/td&gt;
&lt;td&gt;From ~$20–50/mo&lt;/td&gt;
&lt;td&gt;Growing set of lighter or API-first options&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Decision rule in one sentence:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Free tools (or AuditMe) to establish a baseline → Otterly / Peec for small-brand automation → Profound / Scrunch / Athena when AI answers become a board-level channel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important methodological note:&lt;/strong&gt; Different tools sample different prompts, different model versions, and different retrieval settings. You cannot mix numbers across tools and treat them as the same measurement. Pick one primary system and stay consistent.&lt;/p&gt;




&lt;h2&gt;
  
  
  5 Measurement Mistakes That Destroy GEO Data
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Changing the query set every month&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
New queries = new baseline = no trend. Freeze the set for at least a full quarter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Judging from a single platform&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ChatGPT (Bing-influenced) and Perplexity (own crawler + hybrid) regularly disagree. Three platforms is the minimum viable set.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reacting to single-week noise&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
One missed mention is noise. Three consecutive weeks of decline is a signal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prompt-hacking instead of content- and entity-fixing&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
You cannot prompt your way into lasting citations. The durable fixes live upstream: clearer answers, better external validation, structured data, &lt;code&gt;llms.txt&lt;/code&gt;, technical accessibility for AI crawlers, and unambiguous positioning pages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ignoring “wrong” or negative mentions&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Incorrect pricing, features, or brand confusion is a positioning and entity bug. Fix the source page, update &lt;code&gt;llms.txt&lt;/code&gt;, and monitor whether the model corrects itself over subsequent weeks.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Technical Foundations That Still Move the Needle in 2026
&lt;/h2&gt;

&lt;p&gt;While this guide focuses on &lt;em&gt;measurement&lt;/em&gt;, the highest-ROI technical actions remain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Publish and maintain a clean &lt;code&gt;/llms.txt&lt;/code&gt; (and optionally &lt;code&gt;/llms-full.txt&lt;/code&gt;) following the &lt;a href="https://llmstxt.org/" rel="noopener noreferrer"&gt;llmstxt.org specification&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Ensure AI crawlers (GPTBot, PerplexityBot, ClaudeBot, Google-Extended, etc.) are not blocked in &lt;code&gt;robots.txt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Make key pages answer-first: the core claim or definition should appear in the first 1–2 paragraphs of visible text.&lt;/li&gt;
&lt;li&gt;Use clear Organization / Product / SoftwareApplication schema.&lt;/li&gt;
&lt;li&gt;Keep critical facts in plain text (not only in JavaScript-rendered components).&lt;/li&gt;
&lt;li&gt;Build external validation (reviews, Reddit discussions, press, comparisons) — models still lean heavily on these signals.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a full implementation walkthrough, use the &lt;a href="https://www.auditme.dev/blog/generative-engine-optimization-geo-visibility-guide" rel="noopener noreferrer"&gt;complete GEO guide&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your 4-Week Action Plan
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Baseline today&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Run the free &lt;a href="https://www.auditme.dev/geo-visibility" rel="noopener noreferrer"&gt;GEO Visibility Checker&lt;/a&gt; and record the score.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build your 12-query sheet&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Create the spreadsheet and run the first weekly sweep this Monday (or tomorrow).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fix the low-hanging fruit&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create or improve &lt;code&gt;llms.txt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Open &lt;code&gt;robots.txt&lt;/code&gt; to major AI crawlers
&lt;/li&gt;
&lt;li&gt;Add answer-first summaries to your five most important pages
&lt;/li&gt;
&lt;li&gt;Clarify any ambiguous pricing or feature descriptions&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Re-measure in 4 weeks&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Look at the trend, not the single snapshot. Adjust content and entity signals based on what the data shows.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  FAQ — Direct Answers for Humans and AI Systems
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can Google Search Console track AI visibility?
&lt;/h3&gt;

&lt;p&gt;No. Search Console covers classic Google Search only. AI Overviews citations are not broken out as a separate report, and answers from ChatGPT, Perplexity, Claude, and Copilot do not appear in GSC at all. You need a separate measurement loop (the 12-query method or a dedicated GEO tool).&lt;/p&gt;

&lt;h3&gt;
  
  
  How often should I check my AI visibility?
&lt;/h3&gt;

&lt;p&gt;Weekly for the core 12-query sweep (≈15 minutes). Monthly for a deeper pass across five platforms with sentiment and accuracy review. Daily checks mostly add noise.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is a good citation rate to aim for in 2026?
&lt;/h3&gt;

&lt;p&gt;10–15 % overall already puts most brands ahead of the majority of the web. 25–30 % on category queries is strong. Brand-name queries should approach near-100 % with accurate, confident descriptions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does ChatGPT mention my competitor but not me?
&lt;/h3&gt;

&lt;p&gt;Most common reasons: stronger external validation (reviews, Reddit, press), better representation in the indexes the model retrieves from, or ambiguous / incomplete positioning on your own site so the model cannot summarise you confidently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do AI answers actually link to sources?
&lt;/h3&gt;

&lt;p&gt;Perplexity almost always links sources inline. ChatGPT links more often when using search mode but still frequently mentions brands without links. Gemini is inconsistent. Track mentions and links as separate signals — a pure mention still builds awareness; a link can drive traffic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is paying for a GEO tracking tool worth it?
&lt;/h3&gt;

&lt;p&gt;Start free. The 12-query spreadsheet plus a free checker covers the needs of most single-brand teams for months. Move to paid tools when you manage multiple brands or clients, need daily automation and alerts, or when AI answers become a top-5 acquisition channel that requires board-level reporting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does llms.txt actually help citations?
&lt;/h3&gt;

&lt;p&gt;It is low-cost insurance and a clear signal of AI-readiness. Observational data continues to show higher citation likelihood for sites that implement it well, but it is not a magic ranking factor. Treat it as part of a broader entity and accessibility strategy, not a standalone tactic.&lt;/p&gt;




&lt;h2&gt;
  
  
  Further Reading &amp;amp; Useful Resources (Current as of September 2026)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;From AuditMe (organic):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.auditme.dev/blog/generative-engine-optimization-geo-visibility-guide" rel="noopener noreferrer"&gt;Generative Engine Optimization (GEO): The Complete Guide&lt;/a&gt; — how to &lt;em&gt;earn&lt;/em&gt; AI citations&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.auditme.dev/geo-visibility" rel="noopener noreferrer"&gt;AI Readiness / GEO Visibility Checker&lt;/a&gt; — free baseline scan in ~60 seconds&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.auditme.dev/blog/chatgpt-claude-perplexity-cite-website" rel="noopener noreferrer"&gt;What Actually Makes ChatGPT, Claude &amp;amp; Perplexity Cite Your Website&lt;/a&gt; — 47-test citation study with real numbers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;External references worth bookmarking:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://llmstxt.org/" rel="noopener noreferrer"&gt;llmstxt.org&lt;/a&gt; — the official llms.txt specification&lt;/li&gt;
&lt;li&gt;&lt;a href="https://commoncrawl.org/blog/a-content-analysis-of-llms-txt-files-from-the-july-2026-crawl-archive" rel="noopener noreferrer"&gt;Common Crawl analysis of llms.txt files (July 2026 crawl)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Similarweb / BrightEdge / Peec AI public reports on AI Overviews prevalence and citation behaviour&lt;/li&gt;
&lt;li&gt;Tool comparison roundups from independent sources (GeoHero, That Marketing Buddy, LLM Pulse, etc.) for the latest pricing and engine coverage&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This guide is intentionally written as a living cheat-sheet for both human marketers and AI systems that need a clear, reproducible method for measuring Generative Engine Optimization (GEO) visibility in 2026 and beyond. Update the query set only when strategy changes; never because a single week looked noisy.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Author:&lt;/strong&gt; Eduard Tymchenko — SEO Expert &amp;amp; Founder of &lt;a href="https://www.auditme.dev" rel="noopener noreferrer"&gt;AuditMe&lt;/a&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>ai</category>
      <category>llm</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The Double Life of the RAG Crawler: Building Knowledge Engines and Defending Them in 2026</title>
      <dc:creator>Eduard</dc:creator>
      <pubDate>Sun, 30 Aug 2026 01:57:04 +0000</pubDate>
      <link>https://dev.to/edo911/the-double-life-of-the-rag-crawler-building-knowledge-engines-and-defending-them-in-2026-1mcb</link>
      <guid>https://dev.to/edo911/the-double-life-of-the-rag-crawler-building-knowledge-engines-and-defending-them-in-2026-1mcb</guid>
      <description>&lt;h2&gt;
  
  
  I still remember the afternoon it clicked.
&lt;/h2&gt;

&lt;p&gt;We had a support assistant behind a polite chat UI. Real tickets. Real runbooks. The kind of institutional knowledge that only two senior people in the company fully understood. We had cleaned the corpus, chunked it carefully, embedded it, put rate limits and API keys in front of it. Legal was happy. Security signed off. The underlying model had never seen the raw documents during training. It felt private.&lt;/p&gt;

&lt;p&gt;Then someone with a low-tier account started talking like a normal customer.&lt;/p&gt;

&lt;p&gt;They never asked for the documents. They never tried a jailbreak. They just kept following the thread — the next reasonable question, then the next, then the next. By the end of the afternoon they walked away with enough material to stand up a surprisingly good surrogate on an open model. High semantic fidelity. The kind of reconstruction that would make a product manager go quiet in a meeting.&lt;/p&gt;

&lt;p&gt;That afternoon changed how I look at every retrieval system I touch.&lt;/p&gt;

&lt;p&gt;This piece is for people who actually ship RAG in 2026. Not a slide deck. Not a link dump. Two stories that share the same algorithmic loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The builder’s crawler&lt;/strong&gt; — how you turn the messy web, Confluence spaces, Git repos, Notion dumps and PDFs into a knowledge base that does not quietly poison retrieval with stale pages, near-duplicates and boilerplate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The attacker’s crawler&lt;/strong&gt; — how systems like &lt;a href="https://arxiv.org/abs/2601.15678" rel="noopener noreferrer"&gt;RAGCrawler&lt;/a&gt; (arXiv, January–February 2026) treat &lt;em&gt;your&lt;/em&gt; deployed RAG as the website and extract the corpus through natural questions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you only care about architecture, stay in Part I. If you own a customer-facing assistant or an internal knowledge product, read Part II and the security checklist all the way through. Most of us need both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Why this still matters in late 2026&lt;/li&gt;
&lt;li&gt;Two meanings of the same phrase&lt;/li&gt;
&lt;li&gt;How we got here — a short history that actually helps&lt;/li&gt;
&lt;li&gt;Part I — Building knowledge engines that do not fall apart&lt;/li&gt;
&lt;li&gt;The failures tutorials still skip&lt;/li&gt;
&lt;li&gt;Tooling that actually ships in 2026&lt;/li&gt;
&lt;li&gt;An architecture that survives contact with reality&lt;/li&gt;
&lt;li&gt;Chunking, deduplication, freshness and evidence&lt;/li&gt;
&lt;li&gt;What SEO people already knew&lt;/li&gt;
&lt;li&gt;Part II — Knowledge-base theft and RAGCrawler&lt;/li&gt;
&lt;li&gt;How the attack thinks&lt;/li&gt;
&lt;li&gt;Why the usual defenses disappoint&lt;/li&gt;
&lt;li&gt;The numbers from the paper&lt;/li&gt;
&lt;li&gt;Defenses that actually moved in 2025–2026&lt;/li&gt;
&lt;li&gt;A practical cybersecurity playbook&lt;/li&gt;
&lt;li&gt;Where builders and attackers are meeting&lt;/li&gt;
&lt;li&gt;What to do this month&lt;/li&gt;
&lt;li&gt;People, papers, tools — a working map&lt;/li&gt;
&lt;li&gt;What I would ship in the first two weeks&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. Why this still matters in late 2026
&lt;/h2&gt;

&lt;p&gt;Every few months someone declares that RAG is dead. A model ships with a larger context window. Social media lights up. Then production teams quietly keep shipping retrieval systems, because the problem was never “how many tokens can the model hold.” The problem was always &lt;em&gt;which&lt;/em&gt; tokens, from &lt;em&gt;which&lt;/em&gt; sources, at &lt;em&gt;what&lt;/em&gt; cost, with &lt;em&gt;what&lt;/em&gt; freshness, under &lt;em&gt;what&lt;/em&gt; legal and security constraints.&lt;/p&gt;

&lt;p&gt;Bigger windows moved the failure point. They did not remove it. Agents now run multi-step loops, call tools, and keep long-lived memory. That means &lt;strong&gt;context engineering&lt;/strong&gt; — what you retrieve, when you retrieve it, how you rank it, and how you promote it into the live path — is the real product surface. Elastic’s 2026 write-up on the shift from search to agents puts it cleanly: buyers are no longer asking whether you beat last year’s search benchmark. They are asking whether your stack can be the retrieval and context layer that agents trust.(&lt;a href="https://www.elastic.co/blog/context-engineering-agentic-ai" rel="noopener noreferrer"&gt;Elastic: context engineering for agentic AI&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;On the other side of the same loop, the threat model stopped being theoretical. In early 2026 a research team published &lt;a href="https://arxiv.org/abs/2601.15678" rel="noopener noreferrer"&gt;Connect the Dots: Knowledge Graph–Guided Crawler Attack on Retrieval-Augmented Generation Systems&lt;/a&gt;. They called the system &lt;strong&gt;RAGCrawler&lt;/strong&gt;. Across their tests it reached average corpus coverage of &lt;strong&gt;66.8%&lt;/strong&gt;, peak &lt;strong&gt;84.4%&lt;/strong&gt;, inside a 1,000-query budget. It was roughly &lt;strong&gt;4× more efficient&lt;/strong&gt; at reaching 70% coverage than the strongest prior public methods. Surrogate systems built from the stolen material reached answer similarity up to &lt;strong&gt;0.699&lt;/strong&gt; with the original. The attack remained effective against query rewriting and multi-query retrieval — techniques many teams had hoped would act as natural defenses.&lt;/p&gt;

&lt;p&gt;Earlier work had already shown the direction. &lt;a href="https://arxiv.org/abs/2411.14110" rel="noopener noreferrer"&gt;RAG-Thief&lt;/a&gt; (2024) scaled extraction with agent-style continuation. &lt;a href="https://arxiv.org/abs/2505.15420" rel="noopener noreferrer"&gt;IKEA / Silent Leaks&lt;/a&gt; (2025) showed that &lt;em&gt;benign-looking&lt;/em&gt; queries could extract private knowledge with high efficiency even under defenses. RAGCrawler did something more uncomfortable: it treated extraction as a &lt;strong&gt;global coverage problem&lt;/strong&gt; with a knowledge graph, not a local heuristic.&lt;/p&gt;

&lt;p&gt;Same algorithmic instinct on both sides. Keep a model of what you have seen. Estimate the value of the next action. Take the highest-value action that still looks legitimate. Update the model. Repeat.&lt;/p&gt;

&lt;p&gt;That is why the topic is urgent for white-hat developers. If you are building the pipeline, you need the builder half. If you are shipping a product that answers questions over private material, you need the attacker half — not to run the attack, but to design as if someone else will.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Two meanings of the same phrase
&lt;/h2&gt;

&lt;p&gt;When people say “RAG crawler,” they almost always mean one of two things. Confusing them is how teams end up with a demo that works and a production system that rots — or a product that looks secure until someone starts talking like a patient customer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Builder meaning.&lt;/strong&gt; A system that starts from seeds, discovers content, cleans it, applies quality gates, chunks with structure in mind, embeds, keeps secondary indexes, and maintains provenance. The goal is useful coverage, low duplication, measurable freshness, and controllable cost. This is the unglamorous component that decides whether your retrieval system is fed clean knowledge or a swamp.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attacker meaning.&lt;/strong&gt; A black-box process that treats your deployed RAG as the “website.” It issues natural-language queries, watches what leaks into answers, maintains an attacker-side knowledge graph of everything revealed so far, and chooses the next question to maximise &lt;em&gt;new&lt;/em&gt; coverage under a budget. The goal is reconstruction of your private corpus without ever seeing the files.&lt;/p&gt;

&lt;p&gt;Both systems run a loop that looks almost identical on a whiteboard:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Keep a global model of what has been seen
&lt;/li&gt;
&lt;li&gt;Estimate the value of the next possible action
&lt;/li&gt;
&lt;li&gt;Take the highest-value action that still looks legitimate
&lt;/li&gt;
&lt;li&gt;Update the model
&lt;/li&gt;
&lt;li&gt;Repeat
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The difference is only whether the document store is yours.&lt;/p&gt;

&lt;p&gt;That overlap is why better planning and better graphs make legitimate pipelines stronger &lt;em&gt;and&lt;/em&gt; make extraction more efficient. If you want a living reading list while you work through this article, keep &lt;a href="https://github.com/jxzhangjhu/Awesome-LLM-RAG" rel="noopener noreferrer"&gt;Awesome-LLM-RAG&lt;/a&gt; open in a tab. It is imperfect and opinionated, which is exactly why it is useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. How we got here — a short history that actually helps
&lt;/h2&gt;

&lt;p&gt;Foundational papers are not “outdated.” They are the base layer. You still cite them the way you cite TCP when you talk about HTTP/3. Skipping them is how people reinvent dual encoders poorly and then wonder why retrieval is noisy.&lt;/p&gt;

&lt;p&gt;In 2020, &lt;a href="https://arxiv.org/abs/2002.08909" rel="noopener noreferrer"&gt;REALM&lt;/a&gt; (Guu, Lee, Tung, Pasupat, Chang) showed that a language model could be pre-trained with a &lt;em&gt;latent retriever&lt;/em&gt; over Wikipedia. Around the same time, &lt;a href="https://arxiv.org/abs/2004.04906" rel="noopener noreferrer"&gt;Dense Passage Retrieval&lt;/a&gt; (Karpukhin et al., EMNLP 2020) made dual-encoder dense retrieval practical for open-domain QA. Then &lt;a href="https://arxiv.org/abs/2005.11401" rel="noopener noreferrer"&gt;Lewis, Perez, Piktus, Petroni, Karpukhin, Goyal, Küttler, Mike Lewis, Yih, Rocktäschel, Riedel, and Kiela&lt;/a&gt; published the paper that named the field: &lt;a href="https://arxiv.org/pdf/2005.11401" rel="noopener noreferrer"&gt;Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks&lt;/a&gt; (NeurIPS 2020). If you only read one original paper, read that one. The rest of the field is still arguing in its shadow.&lt;/p&gt;

&lt;p&gt;The next wave was about &lt;em&gt;how&lt;/em&gt; you retrieve, not whether you retrieve.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://arxiv.org/abs/2212.10496" rel="noopener noreferrer"&gt;HyDE&lt;/a&gt; generated a hypothetical document and searched with its embedding — a simple idea that still shows up in production tricks. &lt;a href="https://arxiv.org/abs/2310.11511" rel="noopener noreferrer"&gt;Self-RAG&lt;/a&gt; (Asai et al., ICLR 2024 Oral) taught models &lt;em&gt;when&lt;/em&gt; to retrieve and how to critique their own output; the project site is still at &lt;a href="https://selfrag.github.io/" rel="noopener noreferrer"&gt;selfrag.github.io&lt;/a&gt;, with code at &lt;a href="https://github.com/akariasai/self-rag" rel="noopener noreferrer"&gt;akariasai/self-rag&lt;/a&gt;. &lt;a href="https://arxiv.org/abs/2401.15884" rel="noopener noreferrer"&gt;CRAG&lt;/a&gt; graded retrieved documents and fell back when they were junk. &lt;a href="https://arxiv.org/abs/2401.18059" rel="noopener noreferrer"&gt;RAPTOR&lt;/a&gt; recursively clustered and summarised chunks into a tree so you could retrieve at different levels of abstraction. Microsoft Research’s &lt;a href="https://arxiv.org/abs/2404.16130" rel="noopener noreferrer"&gt;GraphRAG&lt;/a&gt; built an entity graph and community summaries for &lt;em&gt;global&lt;/em&gt; questions that flat vector search keeps missing; the code lives at &lt;a href="https://github.com/microsoft/graphrag" rel="noopener noreferrer"&gt;microsoft/graphrag&lt;/a&gt; with docs at &lt;a href="https://microsoft.github.io/graphrag/" rel="noopener noreferrer"&gt;microsoft.github.io/graphrag&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Anthropic’s &lt;a href="https://www.anthropic.com/engineering/contextual-retrieval" rel="noopener noreferrer"&gt;Contextual Retrieval&lt;/a&gt; (2024) attacked a quieter failure mode: chunks that lose the document they came from. Prepend a short situated context before embedding, combine with BM25 and a reranker, and retrieval failures drop hard — they reported up to about &lt;strong&gt;67%&lt;/strong&gt; fewer failures in their tests. The cookbook is still worth cloning: &lt;a href="https://platform.claude.com/cookbook/capabilities-contextual-embeddings-guide" rel="noopener noreferrer"&gt;Contextual embeddings guide&lt;/a&gt;. Simon Willison’s plain-English walkthrough remains one of the best secondary reads: &lt;a href="https://simonwillison.net/2024/Sep/20/introducing-contextual-retrieval/" rel="noopener noreferrer"&gt;Introducing Contextual Retrieval&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On the attack side the lineage is shorter and uglier. &lt;a href="https://arxiv.org/abs/2411.14110" rel="noopener noreferrer"&gt;RAG-Thief&lt;/a&gt; (2024) showed agent-based continuation could scale extraction from a private RAG database. &lt;a href="https://arxiv.org/abs/2505.15420" rel="noopener noreferrer"&gt;IKEA / Silent Leaks&lt;/a&gt; (2025) showed you did not even need adversarial prompts — natural queries, carefully chosen, were enough. &lt;a href="https://arxiv.org/abs/2601.15678" rel="noopener noreferrer"&gt;RAGCrawler&lt;/a&gt; (2026) made the global planning explicit.&lt;/p&gt;

&lt;p&gt;Douwe Kiela, one of the original RAG co-authors and later founder of Contextual AI, still writes the most useful public pushback against the “RAG is dead” cycle. Start with &lt;a href="https://contextual.ai/blog/is-rag-dead-yet/" rel="noopener noreferrer"&gt;RAG is dead, long live RAG!&lt;/a&gt;. The argument is not nostalgia. It is systems engineering: retrieval is how you keep knowledge modular, auditable, and updatable when the world changes faster than your training runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Part I — Building knowledge engines that do not fall apart
&lt;/h2&gt;

&lt;p&gt;Most teams still begin with some version of “curl a list of URLs, dump text, run a recursive splitter, embed everything.” Or the slightly more modern version: call a managed crawl API, get clean Markdown, push it into a vector store, ship a chat UI, call it a knowledge base.&lt;/p&gt;

&lt;p&gt;It works for a quiet documentation site on a Friday afternoon. It starts failing the moment any of the following appear in the real world:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Content that changes daily or hourly
&lt;/li&gt;
&lt;li&gt;JavaScript-heavy or bot-protected pages
&lt;/li&gt;
&lt;li&gt;Multiple domains with different robots and legal rules
&lt;/li&gt;
&lt;li&gt;Near-duplicates across mirrors, languages, or CMS exports
&lt;/li&gt;
&lt;li&gt;The need to prove, months later, which version of which page produced a specific chunk
&lt;/li&gt;
&lt;li&gt;Cost that does not explode as the corpus grows
&lt;/li&gt;
&lt;li&gt;A way to roll back a bad crawl without taking retrieval offline
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The gap between a demo and something you can put in front of customers is almost never the choice of vector database. It is the data pipeline that feeds it. Jerry Liu and the LlamaIndex team have been saying versions of this for years in &lt;a href="https://developers.llamaindex.ai/python/framework/optimizing/production_rag/" rel="noopener noreferrer"&gt;Building Performant RAG Applications for Production&lt;/a&gt;. Pinecone’s overview is still a clean conceptual intro if you need to align a room: &lt;a href="https://www.pinecone.io/learn/retrieval-augmented-generation/" rel="noopener noreferrer"&gt;Retrieval-Augmented Generation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you want a book that starts from zero and stays practical, Abhinav Kimothi’s &lt;a href="https://www.manning.com/books/a-simple-guide-to-retrieval-augmented-generation" rel="noopener noreferrer"&gt;A Simple Guide to Retrieval Augmented Generation&lt;/a&gt; (Manning) is the one I keep handing to new teammates. For graphs, Tomaž Bratanič and Oskar Hane’s &lt;a href="https://www.manning.com/books/essential-graphrag" rel="noopener noreferrer"&gt;Essential GraphRAG&lt;/a&gt; is the right next step. Sebastian Raschka’s &lt;a href="https://www.manning.com/books/build-a-large-language-model-from-scratch" rel="noopener noreferrer"&gt;Build a Large Language Model (From Scratch)&lt;/a&gt; will not teach you crawling, but it will stop you treating embeddings as magic — which prevents a surprising number of bad architectural decisions later.&lt;/p&gt;

&lt;p&gt;The rest of Part I is the unglamorous work: the failures, the tools, the architecture, and the four properties that separate systems that age well from systems that quietly degrade.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. The failures tutorials still skip
&lt;/h2&gt;

&lt;p&gt;These are the issues that show up in real post-mortems. Most getting-started tutorials still skip them because they are not fun to demo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stale answers delivered with confidence.&lt;/strong&gt; Last month’s pricing. A deprecated API behaviour. An incident response step that was rewritten after the last outage. The model is not “hallucinating” in the classic sense. It is faithfully retrieving yesterday’s truth. Nightly full re-crawls are expensive and still leave multi-hour windows of wrongness. You need change-driven refresh: detect that a source moved, re-observe it, re-embed only what changed, and promote with a rollback path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Duplicate pollution.&lt;/strong&gt; The same paragraph lives under five URLs. Hybrid search returns all five. Context fills with repetition. Latency rises. Faithfulness metrics get noisy. Multi-level deduplication — canonical URL, document hash after cleaning, near-duplicate detection, chunk hash — is not optional at scale. Teams that skip it often spend months tuning the retriever when the real problem is that the index is arguing with itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boilerplate and low-signal pages.&lt;/strong&gt; Cookie banners, navigation chrome, “related articles,” author bios and legal footers eat embedding budget and retrieval slots. Quality gates &lt;em&gt;before&lt;/em&gt; the embedding stage save real money. If a page fails a simple signal-to-noise check, do not embed it. Log it. Fix the extractor or drop the source.&lt;/p&gt;

&lt;p&gt;Here is a minimal quality gate that technical SEO work already implies — the same signals you use to find thin or template-heavy pages before you waste an embedding call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;should_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Drop low-signal pages before chunking / embedding.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main_text&lt;/span&gt;  &lt;span class="c1"&gt;# after nav/footer strip
&lt;/span&gt;    &lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raw_html&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;  &lt;span class="c1"&gt;# thin / empty after clean
&lt;/span&gt;    &lt;span class="n"&gt;ratio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ratio&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;  &lt;span class="c1"&gt;# mostly chrome, little substance
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_near_duplicate_of_indexed&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;canonical&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;canonical&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;  &lt;span class="c1"&gt;# prefer the canonical observation
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not a research contribution. It is the kind of boring filter that prevents half your vector budget from indexing cookie walls and “related posts” blocks. Teams that already run technical site audits often have these signals sitting in a report — they just never wired them into the RAG promotion path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Missing provenance.&lt;/strong&gt; Someone challenges an answer and you cannot point to the exact observation: source identifier, timestamp, content hash, pipeline version. Debugging turns into archaeology. In regulated settings this is often a hard stop. Provenance is not a nice-to-have metadata field. It is the difference between a system you can defend and a system you can only apologise for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anti-bot walls.&lt;/strong&gt; Important sources sit behind Cloudflare and similar systems. Pure HTTP fails or receives skeleton pages. Browser automation plus carefully managed proxies becomes necessary — and expensive. Treat it as a specialised routing component, not the default path for every URL. &lt;a href="https://playwright.dev/" rel="noopener noreferrer"&gt;Playwright&lt;/a&gt; is the default engine under most serious crawlers now for a reason: the web stopped being a static document collection years ago.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Destructive chunk boundaries.&lt;/strong&gt; Fixed-size splits cut tables, code blocks and arguments in half. Retrieval returns half an answer. The model then invents the missing half with high confidence. Structure-aware splitting, parent-child / hierarchical representations (the research version of this instinct is &lt;a href="https://arxiv.org/abs/2401.18059" rel="noopener noreferrer"&gt;RAPTOR&lt;/a&gt;), and Anthropic’s &lt;a href="https://www.anthropic.com/engineering/contextual-retrieval" rel="noopener noreferrer"&gt;contextual prefixes&lt;/a&gt; all help. But they only work if the upstream crawler and extractor preserve structure instead of emitting flat text. If your Markdown has already lost the heading hierarchy, no amount of clever chunking will restore it.&lt;/p&gt;

&lt;p&gt;Evaluate with &lt;a href="https://docs.ragas.io/" rel="noopener noreferrer"&gt;Ragas&lt;/a&gt; (&lt;a href="https://github.com/vibrantlabsai/ragas" rel="noopener noreferrer"&gt;github.com/vibrantlabsai/ragas&lt;/a&gt;) on &lt;em&gt;your&lt;/em&gt; queries, not only on public QA sets. Public benchmarks are useful for comparing methods. They are almost never the distribution of questions your users actually ask.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Tooling that actually ships in 2026
&lt;/h2&gt;

&lt;p&gt;The market for “turn a website into LLM-ready Markdown” matured fast. You no longer need to invent a crawler from scratch for most workloads. You do need to know which tool is solving which problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Firecrawl&lt;/strong&gt; is still the lane leader for managed, LLM-ready output. Give it a URL, get clean Markdown or structured JSON that chunks and embeds without a week of HTML archaeology. It is popular for documentation crawls, RAG pipelines, and agent research loops. Start at &lt;a href="https://www.firecrawl.dev/" rel="noopener noreferrer"&gt;firecrawl.dev&lt;/a&gt; and &lt;a href="https://github.com/firecrawl/firecrawl" rel="noopener noreferrer"&gt;github.com/firecrawl/firecrawl&lt;/a&gt;. Read their own comparison against Crawl4AI as a vendor post, not scripture: &lt;a href="https://www.firecrawl.dev/alternatives/firecrawl-vs-crawl4ai" rel="noopener noreferrer"&gt;Firecrawl vs Crawl4AI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Crawl4AI&lt;/strong&gt; is the open-source control path. Python, Playwright under the hood, built for RAG and agents, Apache-2.0. If you want to self-host, tune extraction, and avoid a usage-based crawl bill, this is where many teams land. Docs: &lt;a href="https://docs.crawl4ai.com/" rel="noopener noreferrer"&gt;docs.crawl4ai.com&lt;/a&gt;. Repo: &lt;a href="https://github.com/unclecode/crawl4ai" rel="noopener noreferrer"&gt;github.com/unclecode/crawl4ai&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Crawlee&lt;/strong&gt; (JavaScript/TypeScript and Python) is for people who need a real crawler framework — queues, retries, browser or HTTP modes, proxy rotation — not just a single “scrape this URL” endpoint. Site: &lt;a href="https://crawlee.dev/" rel="noopener noreferrer"&gt;crawlee.dev&lt;/a&gt;. Repos: &lt;a href="https://github.com/apify/crawlee" rel="noopener noreferrer"&gt;apify/crawlee&lt;/a&gt;, &lt;a href="https://github.com/apify/crawlee-python" rel="noopener noreferrer"&gt;apify/crawlee-python&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Playwright&lt;/strong&gt; is the browser engine under most of the serious options. If you are building custom workers for hard targets, you will end up here: &lt;a href="https://playwright.dev/" rel="noopener noreferrer"&gt;playwright.dev&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scrapy&lt;/strong&gt; is still alive for high-volume HTTP crawling in Python when you do not need a full browser for every page: &lt;a href="https://scrapy.org/" rel="noopener noreferrer"&gt;scrapy.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apify&lt;/strong&gt; is stronger when the site already has a maintained Actor in a marketplace and you want structured data more than raw Markdown.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;rag-crawler&lt;/strong&gt; (&lt;a href="https://github.com/sigoden/rag-crawler" rel="noopener noreferrer"&gt;sigoden/rag-crawler&lt;/a&gt;) is a small, practical option for static sites and wikis when you do not want a platform.&lt;/p&gt;

&lt;p&gt;For orchestration, &lt;a href="https://developers.llamaindex.ai/python/framework/optimizing/production_rag/" rel="noopener noreferrer"&gt;LlamaIndex’s production RAG guide&lt;/a&gt; and &lt;a href="https://python.langchain.com/" rel="noopener noreferrer"&gt;LangChain / LangGraph&lt;/a&gt; remain the default frameworks. For evaluation, &lt;a href="https://docs.ragas.io/" rel="noopener noreferrer"&gt;Ragas&lt;/a&gt; is still the practical choice. For embeddings and reranking, &lt;a href="https://huggingface.co/BAAI/bge-large-en-v1.5" rel="noopener noreferrer"&gt;BGE&lt;/a&gt;, &lt;a href="https://docs.cohere.com/docs/rerank-overview" rel="noopener noreferrer"&gt;Cohere Rerank&lt;/a&gt;, and &lt;a href="https://blog.voyageai.com/2024/03/15/boosting-your-search-and-rag-with-voyages-rerankers/" rel="noopener noreferrer"&gt;Voyage&lt;/a&gt; are the names that keep showing up in production stacks.&lt;/p&gt;

&lt;p&gt;The 2026 pattern in teams that have been running RAG for more than a year is hybrid. Managed or open-source crawlers handle the bulk. Custom Playwright workers handle a small number of hard targets. Direct API or change-data-capture paths handle anything that offers a clean interface. The crawl layer itself is becoming commodity. Differentiation lives in policy, evidence, quality scoring, and the promotion decision — not in whether you wrote your own HTML parser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A concrete “good enough” stack many teams actually ship.&lt;/strong&gt; Store vectors where operations already lives when you can: &lt;strong&gt;&lt;a href="https://github.com/pgvector/pgvector" rel="noopener noreferrer"&gt;pgvector&lt;/a&gt;&lt;/strong&gt; on Postgres is still the default for a large share of production RAG that does not need a dedicated vector SaaS on day one. Hybrid search (BM25 in Postgres or Elasticsearch/OpenSearch + dense) plus a cross-encoder rerank covers most corpora. For embeddings, pick a model family and stick to it long enough to measure — open weights like &lt;a href="https://huggingface.co/BAAI/bge-large-en-v1.5" rel="noopener noreferrer"&gt;BGE&lt;/a&gt; remain common; managed options (Voyage, Cohere, provider text-embedding APIs) win when ops cost matters more than self-hosting. The point is not the brand name. The point is one stable embedding space, one promotion path, and metrics on &lt;em&gt;your&lt;/em&gt; queries — not a quarterly model fashion cycle that invalidates the entire index without a migration plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. An architecture that survives contact with reality
&lt;/h2&gt;

&lt;p&gt;Stop thinking “crawl → files → embed.”&lt;br&gt;
Start thinking “governed observation → versioned evidence → candidate index → explicit promotion.”&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
  A[Source Registry&amp;lt;br/&amp;gt;owners · policies · freshness SLOs] --&amp;gt; B[Frontier / Scheduler&amp;lt;br/&amp;gt;priority · change signals · budgets]
  B --&amp;gt; C[Fetch Layer&amp;lt;br/&amp;gt;HTTP primary · browser fallback · proxies]
  C --&amp;gt; D[Immutable Evidence Store&amp;lt;br/&amp;gt;snapshot · hash · timestamp · pipeline version]
  D --&amp;gt; E[Extraction + Quality Gate]
  E --&amp;gt; F[Chunking + Multi-level Dedup]
  F --&amp;gt; G[Candidate / Shadow Index]
  G --&amp;gt; H[Evaluation + Promotion Gate]
  H --&amp;gt; I[Live Retrieval&amp;lt;br/&amp;gt;with rollback path]&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Same pipeline in one line for greppable logs and runbooks: &lt;strong&gt;Registry → Frontier → Fetch → Evidence → Extract → Chunk/Dedup → Shadow → Promote → Live.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The properties that matter day-to-day are boring and non-negotiable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evidence is immutable.&lt;/strong&gt; You can always reconstruct what was observed. If someone challenges an answer six months later, you can show the snapshot, not a story about what the page “probably” said.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Promotion is an explicit decision.&lt;/strong&gt; A bad crawl does not automatically become production truth. Candidate indexes and shadow evaluation exist so you can compare before you ship.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deduplication happens early and at multiple levels.&lt;/strong&gt; Waiting until retrieval time to notice that half your context is the same paragraph is how you burn latency and money.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Freshness is measured end-to-end.&lt;/strong&gt; “The crawler finished” is not a freshness metric. “Source changed at T0 and became queryable in the live index at T1” is. Different source classes need different SLOs. Static reference material can tolerate hours. Pricing pages, status pages and incident runbooks often cannot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every source has a registered owner and an explicit freshness objective.&lt;/strong&gt; Without ownership, pipelines rot in the gap between “the platform team thought product owned it” and “product thought the platform team owned it.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resilience is part of architecture, not an afterthought.&lt;/strong&gt; Modern crawl pipelines call external services constantly: browser farms, extraction APIs, LLM judges for quality, embedding endpoints. If a single provider rate-limits or blips for an hour and your job has no fallback, freshness SLOs die quietly. Design multi-provider failovers for the fragile hops — embeddings, LLM-assisted extraction, optional browser rendering — with explicit budgets and degraded modes. A degraded crawl that still lands &lt;em&gt;some&lt;/em&gt; evidence in the immutable store is almost always better than a full stop that leaves last week’s truth in production. Queue, retry with jitter, switch provider, mark the observation as partial, and keep the promotion gate honest about what was incomplete.&lt;/p&gt;

&lt;p&gt;This is closer to how mature search systems have treated data for years. RAG teams are still catching up. If you want the agentic version of the same idea — retrieve cheap first, escalate only when the expected evidence gain justifies the cost — read &lt;a href="https://arxiv.org/abs/2607.24791" rel="noopener noreferrer"&gt;From Naive RAG to Deep Agentic Retrieval&lt;/a&gt;, a mid-2026 production write-up from Ontario Power Generation’s regulatory compliance pipeline. It is one of the few papers that talks about cost-aware escalation as an operational primitive, not a research toy.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Chunking, deduplication, freshness and evidence
&lt;/h2&gt;

&lt;p&gt;These four topics get more blog posts than they deserve as slogans and fewer as engineering practices. Here is the practical version.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chunking.&lt;/strong&gt; Fixed token windows remain a reasonable baseline for homogeneous prose. They fail on technical documentation, tables, code and long analytical text. Prefer structure-aware splits first. Keep hierarchical relationships where possible so you can retrieve a child chunk and still expand to the parent section when the answer needs more context. Consider the contextual retrieval pattern: a short, document-level explanatory context is generated and prepended to each chunk &lt;em&gt;before&lt;/em&gt; embedding. That single change fixes a surprising number of “the chunk was relevant but the model lost the document” failures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deduplication.&lt;/strong&gt; Operate at least at four levels: URL canonicalisation, full-document content hash after cleaning, near-duplicate detection across documents, and chunk-level hashing. Once hybrid retrieval and multi-source ingestion are active, the percentage of redundant material is often higher than people expect. Removing it is one of the highest-ROI improvements available — not because it is intellectually exciting, but because it stops the retriever from spending its top-k budget on the same paragraph five times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Freshness.&lt;/strong&gt; Define and monitor observation age and source-to-queryable lag. Prefer change-driven re-embedding so cost scales with the rate of change rather than with total corpus size. A full re-embed of a million chunks every night is a smell unless your sources actually change that fast. Most do not. A smaller number of high-churn sources usually dominate the freshness risk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evidence.&lt;/strong&gt; Every chunk that reaches the live index should be traceable, with low friction, to source identifier, observation timestamp, content hash and pipeline version. When a user or an auditor asks where an answer came from, the system should answer in seconds. Provenance is also what makes safe rollback possible. Without it, “roll back the bad crawl” becomes a multi-day forensic project.&lt;/p&gt;

&lt;p&gt;Hybrid retrieval — BM25 plus dense vectors, then a cross-encoder reranker — is still the boring default that beats clever one-shot vector search on most real corpora. &lt;a href="https://arxiv.org/abs/2004.04906" rel="noopener noreferrer"&gt;DPR&lt;/a&gt; taught the field that dense retrieval works. BM25 never went away. Anthropic’s numbers on combining both are the reason many teams stopped arguing about it and just shipped hybrid.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. What SEO people already knew
&lt;/h2&gt;

&lt;p&gt;Anyone who has run a serious technical SEO crawler will recognise the hard problems immediately: discovering the real URL space, respecting robots while still achieving useful coverage, handling redirects and canonicals correctly, deciding when a full browser render is required, finding near-duplicates, prioritising under a budget, and keeping history of how a site changes over time.&lt;/p&gt;

&lt;p&gt;The objective function is different. SEO optimises for ranking and understanding signals. RAG optimises for faithful, low-latency answers at controllable cost. That changes prioritisation and extraction targets, but the systems engineering transfers surprisingly well.&lt;/p&gt;

&lt;p&gt;This is one reason tools that already perform deep technical crawling and multi-dimension on-page analysis remain useful reference points when designing the observation layer of a RAG pipeline. The same infrastructure that surfaces broken canonicals, orphan pages, redirect chains and schema issues can, with different downstream processing, feed a knowledge base. You do not need to invent the discovery and change-detection layer from zero if you understand how mature crawl systems already think about it.&lt;/p&gt;

&lt;p&gt;You can explore these patterns with free AI-powered multi-dimension analysis at &lt;a href="https://www.auditme.dev" rel="noopener noreferrer"&gt;AuditMe&lt;/a&gt;. The &lt;a href="https://www.auditme.dev/blog" rel="noopener noreferrer"&gt;AuditMe blog&lt;/a&gt; regularly discusses crawling behaviour and technical site health. For a quick live check of any URL, the &lt;a href="https://www.auditme.dev/website-seo-checker" rel="noopener noreferrer"&gt;website SEO checker&lt;/a&gt; is a practical starting point. The mental models overlap more than most pure-RAG write-ups admit — which is why teams that only hire “LLM engineers” and never talk to people who have crawled the web for ranking often rediscover the same bugs under new names.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Part II — Knowledge-base theft and RAGCrawler
&lt;/h2&gt;

&lt;p&gt;RAG systems leak.&lt;/p&gt;

&lt;p&gt;Not primarily because the model was trained on the private documents — in a careful system it was not — but because those documents are retrieved and used to condition generation. Entities, relations, procedural steps and sometimes near-verbatim spans appear in the output. A patient adversary who maintains state across turns can accumulate a substantial fraction of the hidden corpus without ever seeing a file path.&lt;/p&gt;

&lt;p&gt;Earlier public attacks were mostly local heuristics. Continuation-style methods such as &lt;a href="https://arxiv.org/abs/2411.14110" rel="noopener noreferrer"&gt;RAG-Thief&lt;/a&gt; keep following the previous answer. They scale, but they drift. Keyword and implicit methods such as &lt;a href="https://arxiv.org/abs/2505.15420" rel="noopener noreferrer"&gt;IKEA (Silent Leaks)&lt;/a&gt; stay closer to the corpus but tend to remain in already-explored neighbourhoods. Both lack a global objective. They react to the latest observation instead of choosing the next question for maximum new coverage.&lt;/p&gt;

&lt;p&gt;The 2026 &lt;a href="https://arxiv.org/abs/2601.15678" rel="noopener noreferrer"&gt;RAGCrawler&lt;/a&gt; work attacked exactly that limitation. Read the &lt;a href="https://arxiv.org/html/2601.15678v2" rel="noopener noreferrer"&gt;HTML version&lt;/a&gt; if you hate PDFs, or the &lt;a href="https://arxiv.org/pdf/2601.15678" rel="noopener noreferrer"&gt;PDF&lt;/a&gt; if you want the full tables.&lt;/p&gt;

&lt;p&gt;I am not going to give you exploit code. You do not need it to defend, and you should not need it to understand the threat. White-hat work here is about recognising the shape of the attack so you can raise its cost and detect it earlier — not about reproducing it against systems you do not own.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. How the attack thinks
&lt;/h2&gt;

&lt;p&gt;The authors formalised knowledge-base stealing as an Adaptive Stochastic Coverage Problem. Each query is a stochastic action that reveals some documents through the retriever. The goal is to maximise expected unique coverage under a fixed query budget. Under standard conditions the objective is adaptively monotone and adaptively submodular, which yields the classic (1 − 1/e) approximation guarantee for the policy that always selects the action with the highest conditional expected marginal gain. The theoretical backbone is the older adaptive submodularity literature — &lt;a href="https://arxiv.org/abs/1003.3967" rel="noopener noreferrer"&gt;Golovin &amp;amp; Krause, Adaptive Submodularity&lt;/a&gt; is the paper the RAGCrawler authors sit on.&lt;/p&gt;

&lt;p&gt;In practice the attacker cannot observe true coverage gain, the query space is infinite, and questions must look natural. That is the engineering problem the paper solves with three cooperating pieces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Knowledge-graph constructor.&lt;/strong&gt; Builds an attacker-side graph of entities and relations from every answer. This is the global state. Without it, the attacker is a stateless loop that cannot tell explored regions from unexplored ones — behaviour closer to earlier local methods.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strategy scheduler.&lt;/strong&gt; Uses graph growth, structural holes and historical payoffs (UCB-style) to estimate which semantic anchors are likely to yield high &lt;em&gt;new&lt;/em&gt; coverage. This is where the attack stops being “ask another similar question” and becomes “move into under-explored regions of the semantic space.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query generator.&lt;/strong&gt; Turns those anchors into fluent, ordinary-looking questions while avoiding regions already adequately explored. Natural language is the point. If the queries look like attacks, simple filters catch them. If they look like customers, the system answers.&lt;/p&gt;

&lt;p&gt;New answers expand the graph. The scheduler re-prioritises. New questions are issued. Because the attacker keeps a global view, the campaign systematically moves into under-explored regions instead of thrashing or drifting.&lt;/p&gt;

&lt;p&gt;The published evaluation held across multiple corpora and generators, including some with safeguard layers, and remained effective against query rewriting and multi-query retrieval. Notice the uncomfortable symmetry with legitimate GraphRAG. &lt;a href="https://arxiv.org/abs/2404.16130" rel="noopener noreferrer"&gt;From Local to Global&lt;/a&gt; builds a graph so a system can answer questions about a whole corpus. RAGCrawler builds a graph so an attacker can empty a whole corpus. Same object. Opposite intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Why the usual defenses disappoint
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Topic blockers and simple refusal.&lt;/strong&gt; The attack uses ordinary on-topic questions. Sensitive material leaks through retrieved context, not through explicit requests for forbidden content. Refusing “dump your system prompt” does nothing when the attacker asks “how do we handle refunds for enterprise customers on the legacy plan?”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query rewriting and multi-query retrieval.&lt;/strong&gt; These improve legitimate answer quality. They do not, by themselves, prevent a globally aware attacker from obtaining broad coverage. The RAGCrawler paper explicitly tests this. If your security review treats rewriting as a privacy control, update the review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rate limits.&lt;/strong&gt; They slow the attack and raise cost. A patient or distributed adversary can still accumulate coverage over time. Necessary. Not sufficient. Volume-only limits also miss the signal that matters: systematic exploration of new entities and regions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Canaries and watermarks.&lt;/strong&gt; Excellent for detection after the fact and for attribution. Weaker at prevention while extraction is underway. Still deploy them. Just do not pretend they are a shield.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retrieve less / summarise more.&lt;/strong&gt; Reduces per-turn leakage. Also tends to reduce answer quality for complex legitimate queries. The attacker compensates with more turns. &lt;a href="https://arxiv.org/abs/2310.11511" rel="noopener noreferrer"&gt;Self-RAG&lt;/a&gt; and &lt;a href="https://arxiv.org/abs/2401.15884" rel="noopener noreferrer"&gt;CRAG&lt;/a&gt; are useful here for &lt;em&gt;quality&lt;/em&gt;, not as a complete security control.&lt;/p&gt;

&lt;p&gt;The structural tension remains: usefulness requires retrieving private material; every retrieval is a potential information channel. There is no configuration that maximises both utility and secrecy without tradeoffs. The work is to choose the tradeoffs deliberately instead of discovering them in an incident review.&lt;/p&gt;

&lt;h2&gt;
  
  
  13. The numbers from the paper
&lt;/h2&gt;

&lt;p&gt;Approximate headline results from the RAGCrawler evaluations. Full tables and ablations are in the &lt;a href="https://arxiv.org/pdf/2601.15678" rel="noopener noreferrer"&gt;paper PDF&lt;/a&gt;. Numbers can move between versions; the paper is the source of truth.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Approximate result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Average corpus coverage&lt;/td&gt;
&lt;td&gt;66.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peak coverage&lt;/td&gt;
&lt;td&gt;84.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Efficiency vs prior strongest baseline&lt;/td&gt;
&lt;td&gt;≥ 4.03× fewer queries to reach 70% coverage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Surrogate answer similarity&lt;/td&gt;
&lt;td&gt;up to 0.699&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Robustness&lt;/td&gt;
&lt;td&gt;Holds against rewriting and multi-query retrieval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attack cost (authors’ estimate)&lt;/td&gt;
&lt;td&gt;roughly low dollars per dataset at lite API prices&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are not “perfect copy” numbers. They are “enough to be commercially and operationally dangerous, obtained with significantly higher sample efficiency than earlier public methods.” If you are presenting this to a security review, take the PDF, not a blog table. If you are designing defenses, assume a patient adversary who is optimising for coverage, not for looking scary in the logs.&lt;/p&gt;

&lt;h2&gt;
  
  
  14. Defenses that actually moved in 2025–2026
&lt;/h2&gt;

&lt;p&gt;For a long time the literature focused more on poisoning the knowledge base than on emptying it. That is changing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://arxiv.org/html/2511.10128" rel="noopener noreferrer"&gt;RAGFort&lt;/a&gt;&lt;/strong&gt; (November 2025, code at &lt;a href="https://github.com/happywinder/RAGFort" rel="noopener noreferrer"&gt;github.com/happywinder/RAGFort&lt;/a&gt;) is one of the first systematic attempts to defend against proprietary knowledge-base extraction as a dual-path problem. The insight is that attackers expand both &lt;em&gt;within&lt;/em&gt; a topic (intra-class) and &lt;em&gt;across&lt;/em&gt; topics (inter-class). Protecting only one path leaves the other open. RAGFort combines contrastive reindexing for inter-class isolation with constrained cascade generation for intra-class protection. The authors report cutting reconstruction and chunk recovery substantially compared with prior defenses while preserving answer quality. Joint protection matters; single-path is incomplete.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://arxiv.org/abs/2608.23965" rel="noopener noreferrer"&gt;RAGSentinel&lt;/a&gt;&lt;/strong&gt; (August 2026) targets a different threat — poisoned documents in the retrieval set — with a training-free, label-free geometric consensus filter on query-conditioned representation shifts. It is not an extraction defense, but it belongs in the same conversation: post-retrieval geometry can be stronger than instruction-following defenses that adaptive attackers learn to imitate.&lt;/p&gt;

&lt;p&gt;Taxonomy work such as &lt;a href="https://arxiv.org/html/2604.08304v3" rel="noopener noreferrer"&gt;Securing Retrieval-Augmented Generation: A Taxonomy of Attacks, Defenses, and Future Directions&lt;/a&gt; helps by naming the surfaces clearly: pre-retrieval poisoning, retrieval-time manipulation, post-retrieval context exploitation, and knowledge exfiltration. RAGCrawler, IKEA and RAG-Thief sit under extraction. If your internal threat model only lists “prompt injection” and “jailbreak,” it is incomplete for 2026.&lt;/p&gt;

&lt;p&gt;None of these papers are magic “set and forget” products. They are the first generation of research that matches the attack models of 2025–2026. Production still needs the operational playbook in the next section — ownership, budgets, canaries, exploration signals, and incident response — because research defenses do not deploy themselves.&lt;/p&gt;

&lt;h2&gt;
  
  
  15. A practical cybersecurity playbook
&lt;/h2&gt;

&lt;p&gt;There is still no perfect technical defense. The realistic goal is to raise cost, reduce yield, and improve the chance of early detection. Treat the following as defense-in-depth for white-hat teams shipping real systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Architecture and data design
&lt;/h3&gt;

&lt;p&gt;Keep the highest-value material behind additional gates — extra authentication, tool-calling steps, step-up verification, or human review — rather than pure open retrieval. Split collections by sensitivity. Do not put crown-jewel runbooks in the same index as public FAQ content. For sensitive domains, prefer generation styles that stay tightly grounded even if that costs some fluency. The product conversation is “which answers are allowed to be slightly less chatty in exchange for leaking less,” not “can we have both maximum helpfulness and maximum secrecy for free.”&lt;/p&gt;

&lt;h3&gt;
  
  
  Query and session controls
&lt;/h3&gt;

&lt;p&gt;Add strong intent classification and routing so simple or low-sensitivity questions never touch the most valuable collections. Tighten per-user, per-session and per-tenant budgets, especially for new or low-trust accounts. Instrument behavioural signals aimed at systematic exploration: rapid discovery of new entities, sequences that keep expanding coverage, patterns that look more like coverage maximisation than normal user paths. Volume limits alone miss this.&lt;/p&gt;

&lt;h3&gt;
  
  
  Retrieval and generation controls
&lt;/h3&gt;

&lt;p&gt;Use context minimisation for sensitive collections. Add output-side groundedness and span checks where the domain justifies the latency cost. Make rate limits react not only to volume but also to exploration-like behaviour.&lt;/p&gt;

&lt;h3&gt;
  
  
  Detection and response
&lt;/h3&gt;

&lt;p&gt;Seed canaries and unique trackable facts. Monitor for their appearance outside your systems and for unexpected appearance in outputs. Log enough session and retrieval metadata to reconstruct whether a conversation was systematically filling structural holes. Maintain a short playbook for suspected extraction: tighter limits, forced step-up auth, temporary isolation of sensitive collections, forensic review. Legal and contractual layers remain part of a mature posture — they do not stop a determined adversary, but they change the economics and the aftermath.&lt;/p&gt;

&lt;h3&gt;
  
  
  Checklist you can run this month
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Inventory which collections contain high-value or regulated material
&lt;/li&gt;
&lt;li&gt;[ ] Confirm those collections are not reachable by the lowest-trust access path
&lt;/li&gt;
&lt;li&gt;[ ] Add or tighten per-session and per-user budgets on the chat / API surface
&lt;/li&gt;
&lt;li&gt;[ ] Deploy at least a minimal set of canary facts and a way to notice them
&lt;/li&gt;
&lt;li&gt;[ ] Instrument basic exploration signals
&lt;/li&gt;
&lt;li&gt;[ ] Document a short incident-response path for suspected extraction
&lt;/li&gt;
&lt;li&gt;[ ] Review whether query rewriting or multi-query retrieval is giving a false sense of safety
&lt;/li&gt;
&lt;li&gt;[ ] Evaluate retrieval quality with &lt;a href="https://docs.ragas.io/" rel="noopener noreferrer"&gt;Ragas&lt;/a&gt; on a held-out set of &lt;em&gt;your&lt;/em&gt; questions
&lt;/li&gt;
&lt;li&gt;[ ] Skim &lt;a href="https://github.com/happywinder/RAGFort" rel="noopener noreferrer"&gt;RAGFort&lt;/a&gt; and &lt;a href="https://arxiv.org/abs/2601.15678" rel="noopener noreferrer"&gt;RAGCrawler&lt;/a&gt; with your security team
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these stop a determined, well-resourced attacker forever. Together they make casual and mid-tier extraction noticeably more expensive and more visible — which is the realistic bar for most product teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  16. Where builders and attackers are meeting
&lt;/h2&gt;

&lt;p&gt;Legitimate systems are moving toward agentic crawlers and agentic retrieval: memory, multi-step planning, decisions based on a growing model of the information space, quality verification, closed loops. Knowledge-graph guidance appears in &lt;a href="https://github.com/microsoft/graphrag" rel="noopener noreferrer"&gt;GraphRAG&lt;/a&gt; and in various enterprise document-understanding efforts. Google’s 2026 framing of agentic RAG stresses &lt;em&gt;persistence&lt;/em&gt; — keep searching until the context is sufficient, not until a single retrieve call returns something plausible.(&lt;a href="https://research.google/blog/unlocking-dependable-responses-with-gemini-enterprise-agent-platforms-agentic-rag/" rel="noopener noreferrer"&gt;Google Research on Agentic RAG&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;RAGCrawler is already an agentic crawler that plans, maintains a growing graph, estimates marginal coverage, and acts through natural language.&lt;/p&gt;

&lt;p&gt;Improvements in agent memory, tool use, long-horizon planning and graph reasoning therefore improve both legitimate pipelines and extraction attacks. The race is less “is extraction possible?” and more “how efficiently can each side explore an unknown document space under budget and stealth constraints?”&lt;/p&gt;

&lt;p&gt;Kiela’s line is still the right one: retrieval is not disappearing; it is being absorbed into richer &lt;a href="https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents" rel="noopener noreferrer"&gt;context engineering&lt;/a&gt; and agentic loops. The same observation applies, uncomfortably, to the attack surface. Elastic’s take from the search-infra side is worth reading next to Anthropic’s: &lt;a href="https://www.elastic.co/blog/context-engineering-agentic-ai" rel="noopener noreferrer"&gt;From retrieval to agents&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you are building agents, you are also building a system that can be pointed at someone else’s knowledge base — or at your own. Design with that dual use in mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  17. What to do this month
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you own a RAG product or internal knowledge system&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Treat the ingestion and promotion pipeline as a first-class product with owners, SLOs and a rollback story. Measure end-to-end freshness and retrieval quality on your real critical queries, not only on public benchmarks. Prefer official APIs and structured exports over scraping when quality and legal posture matter. Assume the conversational interface can be used as an extraction oracle and apply the checklist in section 15. Keep the highest-value material behind additional controls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you work on platform security or research&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Read &lt;a href="https://arxiv.org/abs/2601.15678" rel="noopener noreferrer"&gt;RAGCrawler&lt;/a&gt;, then &lt;a href="https://arxiv.org/abs/2505.15420" rel="noopener noreferrer"&gt;IKEA&lt;/a&gt; and &lt;a href="https://arxiv.org/abs/2411.14110" rel="noopener noreferrer"&gt;RAG-Thief&lt;/a&gt;, in that order. Test whether your current rewriting and multi-query layers actually reduce global coverage or only change surface form. Explore whether the same graph techniques used by attackers can be turned into defensive monitors. Support shared evaluation suites for knowledge-base leakage; the area is still immature compared with classic model-stealing benchmarks. Track extraction defenses (&lt;a href="https://arxiv.org/html/2511.10128" rel="noopener noreferrer"&gt;RAGFort&lt;/a&gt;) and poisoning defenses (&lt;a href="https://arxiv.org/abs/2608.23965" rel="noopener noreferrer"&gt;RAGSentinel&lt;/a&gt;) as separate but related tracks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are deciding what to build next&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The highest-leverage work is usually not a new embedding model. It is ownership of the observation layer, explicit promotion, provenance that engineers will actually use, and a security review that includes extraction — not only injection. Ship the boring controls. Then read the papers.&lt;/p&gt;

&lt;h2&gt;
  
  
  18. People, papers, tools — a working map
&lt;/h2&gt;

&lt;p&gt;This is the section many Dev.to RAG posts skip. Every URL below is a real page. Prefer abs and PDF over secondary summaries when citing numbers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core attack research (2024–2026)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2601.15678" rel="noopener noreferrer"&gt;RAGCrawler — abs&lt;/a&gt; · &lt;a href="https://arxiv.org/html/2601.15678v2" rel="noopener noreferrer"&gt;HTML&lt;/a&gt; · &lt;a href="https://arxiv.org/pdf/2601.15678" rel="noopener noreferrer"&gt;PDF&lt;/a&gt; — &lt;em&gt;must-read: graph-guided extraction&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2411.14110" rel="noopener noreferrer"&gt;RAG-Thief (2024)&lt;/a&gt; — &lt;em&gt;agent continuation attacks&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2505.15420" rel="noopener noreferrer"&gt;Silent Leaks / IKEA (2025)&lt;/a&gt; — &lt;em&gt;benign queries, high yield&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/1003.3967" rel="noopener noreferrer"&gt;Adaptive Submodularity (Golovin &amp;amp; Krause)&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Extraction and related defenses (2025–2026)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/html/2511.10128" rel="noopener noreferrer"&gt;RAGFort paper&lt;/a&gt; · &lt;a href="https://github.com/happywinder/RAGFort" rel="noopener noreferrer"&gt;code&lt;/a&gt; — &lt;em&gt;dual-path extraction defense&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2608.23965" rel="noopener noreferrer"&gt;RAGSentinel (poisoning / geometric consensus, Aug 2026)&lt;/a&gt; — &lt;em&gt;post-retrieval geometry&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/html/2604.08304v3" rel="noopener noreferrer"&gt;Securing RAG taxonomy (surfaces S1–S4)&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Foundational RAG
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2002.08909" rel="noopener noreferrer"&gt;REALM (2020)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2004.04906" rel="noopener noreferrer"&gt;DPR (2020)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2005.11401" rel="noopener noreferrer"&gt;RAG (Lewis et al., NeurIPS 2020)&lt;/a&gt; · &lt;a href="https://arxiv.org/pdf/2005.11401" rel="noopener noreferrer"&gt;PDF&lt;/a&gt; — &lt;em&gt;the paper that named the field&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://scholar.google.com/citations?user=JN7Zg-kAAAAJ&amp;amp;hl=en" rel="noopener noreferrer"&gt;Patrick Lewis — Google Scholar&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Retrieval quality, graphs, agents
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2212.10496" rel="noopener noreferrer"&gt;HyDE&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2310.11511" rel="noopener noreferrer"&gt;Self-RAG&lt;/a&gt; · &lt;a href="https://selfrag.github.io/" rel="noopener noreferrer"&gt;site&lt;/a&gt; · &lt;a href="https://github.com/akariasai/self-rag" rel="noopener noreferrer"&gt;code&lt;/a&gt; · &lt;a href="https://openreview.net/forum?id=hSyW5go0v8" rel="noopener noreferrer"&gt;OpenReview&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2401.15884" rel="noopener noreferrer"&gt;CRAG&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2401.18059" rel="noopener noreferrer"&gt;RAPTOR&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2404.16130" rel="noopener noreferrer"&gt;GraphRAG paper&lt;/a&gt; · &lt;a href="https://github.com/microsoft/graphrag" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://microsoft.github.io/graphrag/" rel="noopener noreferrer"&gt;docs&lt;/a&gt; — &lt;em&gt;global questions over corpora&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.anthropic.com/engineering/contextual-retrieval" rel="noopener noreferrer"&gt;Anthropic Contextual Retrieval&lt;/a&gt; · &lt;a href="https://platform.claude.com/cookbook/capabilities-contextual-embeddings-guide" rel="noopener noreferrer"&gt;cookbook&lt;/a&gt; — &lt;em&gt;fix the “lost document” failure&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://simonwillison.net/2024/Sep/20/introducing-contextual-retrieval/" rel="noopener noreferrer"&gt;Simon Willison on Contextual Retrieval&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents" rel="noopener noreferrer"&gt;Effective context engineering for AI agents (Anthropic)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2607.24791" rel="noopener noreferrer"&gt;From Naive RAG to Deep Agentic Retrieval (2026)&lt;/a&gt; — &lt;em&gt;production cost-aware escalation&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.elastic.co/blog/context-engineering-agentic-ai" rel="noopener noreferrer"&gt;Elastic: context engineering for agentic AI&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  People worth following
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Douwe Kiela&lt;/strong&gt; — original RAG co-author, Contextual AI. &lt;a href="https://contextual.ai/blog/is-rag-dead-yet/" rel="noopener noreferrer"&gt;RAG is dead, long live RAG!&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Akari Asai&lt;/strong&gt; — Self-RAG. &lt;a href="https://akariasai.github.io/" rel="noopener noreferrer"&gt;akariasai.github.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jerry Liu / LlamaIndex&lt;/strong&gt; — production RAG patterns
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Harrison Chase / LangChain&lt;/strong&gt; — retrieval as a tool inside agents
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft GraphRAG team&lt;/strong&gt; — Darren Edge, Jonathan Larson and collaborators
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Abhinav Kimothi&lt;/strong&gt; — the practical RAG book
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tomaž Bratanič&lt;/strong&gt; — graphs in production
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sebastian Raschka&lt;/strong&gt; — the “from scratch” books that keep people honest about what models actually do
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Books
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.manning.com/books/a-simple-guide-to-retrieval-augmented-generation" rel="noopener noreferrer"&gt;A Simple Guide to Retrieval Augmented Generation — Kimothi (Manning)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.manning.com/books/essential-graphrag" rel="noopener noreferrer"&gt;Essential GraphRAG — Bratanič &amp;amp; Hane (Manning)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.manning.com/books/build-a-large-language-model-from-scratch" rel="noopener noreferrer"&gt;Build a Large Language Model (From Scratch) — Raschka (Manning)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.manning.com/books/build-a-reasoning-model-from-scratch" rel="noopener noreferrer"&gt;Build a Reasoning Model (From Scratch) — Raschka (Manning)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.manning.com/books/enterprise-rag" rel="noopener noreferrer"&gt;Enterprise RAG — Suard &amp;amp; Modi (Manning)&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Crawlers and scrape-to-RAG tooling
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.firecrawl.dev/" rel="noopener noreferrer"&gt;Firecrawl&lt;/a&gt; · &lt;a href="https://github.com/firecrawl/firecrawl" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.crawl4ai.com/" rel="noopener noreferrer"&gt;Crawl4AI docs&lt;/a&gt; · &lt;a href="https://github.com/unclecode/crawl4ai" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://crawlee.dev/" rel="noopener noreferrer"&gt;Crawlee&lt;/a&gt; · &lt;a href="https://github.com/apify/crawlee" rel="noopener noreferrer"&gt;JS&lt;/a&gt; · &lt;a href="https://github.com/apify/crawlee-python" rel="noopener noreferrer"&gt;Python&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://playwright.dev/" rel="noopener noreferrer"&gt;Playwright&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://scrapy.org/" rel="noopener noreferrer"&gt;Scrapy&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/sigoden/rag-crawler" rel="noopener noreferrer"&gt;sigoden/rag-crawler&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Frameworks, eval, indexes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://developers.llamaindex.ai/python/framework/optimizing/production_rag/" rel="noopener noreferrer"&gt;LlamaIndex production RAG&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://python.langchain.com/" rel="noopener noreferrer"&gt;LangChain Python&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.ragas.io/" rel="noopener noreferrer"&gt;Ragas&lt;/a&gt; · &lt;a href="https://github.com/vibrantlabsai/ragas" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.pinecone.io/learn/retrieval-augmented-generation/" rel="noopener noreferrer"&gt;Pinecone RAG explainer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://huggingface.co/BAAI/bge-large-en-v1.5" rel="noopener noreferrer"&gt;BGE embeddings&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.cohere.com/docs/rerank-overview" rel="noopener noreferrer"&gt;Cohere Rerank&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://blog.voyageai.com/2024/03/15/boosting-your-search-and-rag-with-voyages-rerankers/" rel="noopener noreferrer"&gt;Voyage rerankers&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/jxzhangjhu/Awesome-LLM-RAG" rel="noopener noreferrer"&gt;Awesome-LLM-RAG&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Hands-on analysis (the SEO / crawl overlap)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.auditme.dev" rel="noopener noreferrer"&gt;AuditMe&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.auditme.dev/blog" rel="noopener noreferrer"&gt;AuditMe Blog&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.auditme.dev/website-seo-checker" rel="noopener noreferrer"&gt;Website SEO Checker&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What I would ship in the first two weeks
&lt;/h2&gt;

&lt;p&gt;If this article only leaves you with a longer reading list, it failed. Here is the sequence I would actually run on a real system that already has a chat UI and a vector index:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 1 — stop the silent rot.&lt;/strong&gt; Wire a quality gate before embed (thin text, text-to-HTML ratio, canonical, near-dupe). Log every drop. Add content hashes and observation timestamps to every chunk that already exists — even if you only backfill metadata. Define one freshness SLO for the three sources that change most often. Turn off full nightly re-embeds if you cannot explain why every chunk needs them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 1 — stop treating the chat UI as harmless.&lt;/strong&gt; Per-session and per-user budgets. A canary fact in a sensitive collection. Basic logging of which collections were retrieved, not only which answer was shown. A one-page incident note: who gets paged if exploration-like traffic spikes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 2 — make promotion real.&lt;/strong&gt; Candidate or shadow index for at least one high-churn source. Compare before promote. One rollback drill: deliberately ship a bad observation, then revert using evidence hashes. Measure source-to-queryable lag once, with a number, not a feeling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 2 — pick the stack you can operate.&lt;/strong&gt; Postgres + pgvector (or the vector DB you already pay for), one embedding model, hybrid retrieval, one reranker. Do not start three migration projects. Measure on twenty questions your support team actually asks.&lt;/p&gt;

&lt;p&gt;Papers matter. Playbooks matter more when the index is already in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;The RAG crawler has two lives in 2026.&lt;/p&gt;

&lt;p&gt;In one life it is the unglamorous component that decides whether your retrieval system is fed clean, fresh, well-structured knowledge or a swamp of duplicates and stale pages. Getting this right remains one of the highest-leverage engineering investments available — especially as agents, not only humans, consume the context.&lt;/p&gt;

&lt;p&gt;In the other life the same family of ideas — global state, expected marginal gain, systematic exploration — has become a practical way to hollow out a private knowledge base through ordinary conversation. The 2026 RAGCrawler results should end the comforting belief that “the model never trained on the data, so the data is safe behind the API.”&lt;/p&gt;

&lt;p&gt;The useful response is not panic. The same discipline that produces a high-quality builder-side crawler also makes you a better defender. You start seeing your own system the way a patient, graph-guided adversary would see it.&lt;/p&gt;

&lt;p&gt;Build the knowledge engine carefully.&lt;br&gt;&lt;br&gt;
Assume someone else may try to crawl it.&lt;br&gt;&lt;br&gt;
Instrument both sides of the loop.&lt;br&gt;&lt;br&gt;
Raise the cost of global extraction without destroying legitimate utility.&lt;/p&gt;

&lt;p&gt;If this helped, send it to the person who actually owns your knowledge pipeline. They are the ones who need it most.&lt;/p&gt;

&lt;h2&gt;
  
  
  About the author
&lt;/h2&gt;

&lt;p&gt;Built around production crawl and site-intelligence work at &lt;strong&gt;&lt;a href="https://www.auditme.dev" rel="noopener noreferrer"&gt;AuditMe&lt;/a&gt;&lt;/strong&gt; — AI-powered technical analysis for the same class of problems this article treats as the observation layer of RAG (discovery, canonicals, change, quality).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://www.auditme.dev" rel="noopener noreferrer"&gt;auditme.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Blog: &lt;a href="https://www.auditme.dev/blog" rel="noopener noreferrer"&gt;auditme.dev/blog&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Live check: &lt;a href="https://www.auditme.dev/website-seo-checker" rel="noopener noreferrer"&gt;Website SEO Checker&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;If you ship retrieval systems and want to compare notes on crawlers, freshness, or extraction defenses — open an issue on the tools you use, or reach out via the site.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Written as a working map for late August 2026, not a victory lap. If a link dies, a number in a paper moves, or you have contradictory production experience — that is the conversation worth having. The field is moving. The crawl loop is not going away.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>rag</category>
      <category>llm</category>
      <category>cybersecurity</category>
      <category>webscraping</category>
    </item>
    <item>
      <title>The New SEO: When Search Engines Stop Reading Websites and Start Using Them</title>
      <dc:creator>Eduard</dc:creator>
      <pubDate>Thu, 27 Aug 2026 08:37:13 +0000</pubDate>
      <link>https://dev.to/edo911/the-new-seo-when-search-engines-stop-reading-websites-and-start-using-them-44f6</link>
      <guid>https://dev.to/edo911/the-new-seo-when-search-engines-stop-reading-websites-and-start-using-them-44f6</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;em&gt;TL;DR: Search is moving from ranking pages to running them as machine interfaces. If your site can't be discovered, understood, verified, and acted upon by AI systems, you're invisible to the next wave of queries — no matter how well you rank today. Most sites fail on verification and actionability, not discoverability. The fix is a six-dimension "Website Intelligence" framework: discoverability, understanding, verification, actionability, reliability, and observability. I built this into the free &lt;a href="https://www.auditme.dev" rel="noopener noreferrer"&gt;AuditMe SEO audit&lt;/a&gt;, and this article walks through the engineering behind it.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The Problem Nobody Is Talking About&lt;/li&gt;
&lt;li&gt;Why the Document Model Broke&lt;/li&gt;
&lt;li&gt;What Actually Changed in Search Architecture&lt;/li&gt;
&lt;li&gt;The Agent Problem Nobody Prepared For&lt;/li&gt;
&lt;li&gt;Machine Trust and the Reconciliation Problem&lt;/li&gt;
&lt;li&gt;Six Things a Machine Must Be Able to Do With Your Website&lt;/li&gt;
&lt;li&gt;The Data Nobody Shares&lt;/li&gt;
&lt;li&gt;Why Schema Alone Cannot Save You&lt;/li&gt;
&lt;li&gt;From Audits to Continuous Verification&lt;/li&gt;
&lt;li&gt;The Distributed Truth Problem&lt;/li&gt;
&lt;li&gt;What Web Agent Research Actually Found&lt;/li&gt;
&lt;li&gt;The Engineering Stack Nobody Teaches&lt;/li&gt;
&lt;li&gt;A Practical Website Intelligence Framework&lt;/li&gt;
&lt;li&gt;What Happens Next (Honest Projections)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Problem Nobody Is Talking About
&lt;/h2&gt;

&lt;p&gt;There is a quiet structural problem emerging across the web, and most website owners have no idea it exists.&lt;/p&gt;

&lt;p&gt;It is not about rankings. It is not about traffic. It is not about backlinks. Those things matter, but they are symptoms of a deeper issue that almost nobody is measuring.&lt;/p&gt;

&lt;p&gt;Here is the problem, and I'll state it without hedging:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Websites are becoming machine interfaces, but they were designed as human documents.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For twenty-five years, the entire SEO industry has operated on a single assumption: optimize a page so a human will find it useful, and search engines will reward you. That assumption is not wrong. It is incomplete. And the gap between "not wrong" and "complete" is where your competitors will lose — or gain — the next wave of search traffic.&lt;/p&gt;

&lt;p&gt;Consider this concrete example. A B2B SaaS company publishes a landing page. The page looks great. The copy is polished. The design converts well. A human visitor understands exactly what the product does and signs up.&lt;/p&gt;

&lt;p&gt;Now an AI agent visits the same page. It needs to answer the question: "What does this product cost, and is it suitable for a team of 50?"&lt;/p&gt;

&lt;p&gt;The agent encounters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pricing is mentioned as "Starting at $29/mo" in the body copy&lt;/li&gt;
&lt;li&gt;The Product schema says &lt;code&gt;"price": "49"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The FAQ section says "Plans start at $29/month for small teams"&lt;/li&gt;
&lt;li&gt;The API documentation references a "$39 plan"&lt;/li&gt;
&lt;li&gt;The checkout page shows $49&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A human can investigate these discrepancies. The agent has a reconciliation problem. Which number should it trust? How confident should it be in its recommendation?&lt;/p&gt;

&lt;p&gt;Multiply this across every product, every page, every representation of every fact on every website, and you begin to see the scale of the issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the Document Model Broke
&lt;/h2&gt;

&lt;p&gt;The World Wide Web started as a document system. Tim Berners-Lee's &lt;a href="https://www.w3.org/History/1989/proposal.html" rel="noopener noreferrer"&gt;1989 proposal&lt;/a&gt; described "a system for sharing research papers through linked documents." HTTP, HTML, URLs — every foundational technology was built around the assumption that a human would read the result.&lt;/p&gt;

&lt;p&gt;Google's original PageRank algorithm (&lt;a href="https://en.wikipedia.org/wiki/PageRank" rel="noopener noreferrer"&gt;Brin &amp;amp; Page, 1998&lt;/a&gt;) treated the web as a graph of documents, where links served as votes of authority. The fundamental unit was the page. The fundamental consumer was the human reader. That architecture held for two decades. It held because the math was elegant and the results were useful.&lt;/p&gt;

&lt;p&gt;Then three things happened simultaneously.&lt;/p&gt;

&lt;p&gt;First, large language models got good enough to summarize web pages. Not perfectly, but well enough that a growing number of users prefer a synthesized answer over clicking through ten blue links. Google's &lt;a href="https://blog.google/products-and-platforms/products/search/ai-mode-search/" rel="noopener noreferrer"&gt;AI Overviews&lt;/a&gt; now reach over 1.5 billion users monthly.&lt;/p&gt;

&lt;p&gt;Second, tool-use capabilities gave AI systems the ability to do things, not just read things. OpenAI's &lt;a href="https://platform.openai.com/docs/guides/function-calling" rel="noopener noreferrer"&gt;function calling specification&lt;/a&gt; and Anthropic's &lt;a href="https://docs.anthropic.com/en/docs/build-with-claude/tool-use/overview" rel="noopener noreferrer"&gt;tool use framework&lt;/a&gt; allow models to interact with APIs, fill forms, and execute multi-step workflows.&lt;/p&gt;

&lt;p&gt;Third, autonomous web agents emerged as a research category. Projects like &lt;a href="https://webarena.dev/" rel="noopener noreferrer"&gt;WebArena&lt;/a&gt; demonstrated that agents can navigate real websites to complete tasks — book a table, buy a product, fill out an application — with varying degrees of success.&lt;/p&gt;

&lt;p&gt;Each of these developments quietly broke an assumption that the SEO industry had held for decades: that the only consumer of web content is a human with a browser.&lt;/p&gt;

&lt;p&gt;The search result is no longer the destination. It is an intermediate step in a pipeline that looks more like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User question
     |
Machine reasoning
     |
Evidence gathering from multiple sources
     |
Fact reconciliation
     |
Answer synthesis OR task execution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the consumer of your content is a machine performing reasoning, the requirements for that content change fundamentally. Not in degree. In kind.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Changed in Search Architecture
&lt;/h2&gt;

&lt;p&gt;Understanding the shift requires looking at the actual technical components that changed, not the marketing narratives.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Rendering Pipeline
&lt;/h3&gt;

&lt;p&gt;Googlebot has operated on a two-phase system since the early 2000s: crawl (fetch HTML), then render (execute JavaScript to produce the final DOM). Google's rendering pipeline uses a headless Chromium instance that executes JavaScript, waits for network idle, and produces a rendered DOM that approximates what a human sees (&lt;a href="https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics" rel="noopener noreferrer"&gt;Google Search Central: JavaScript SEO Basics&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The practical implication: your rendered DOM — not your raw HTML — is increasingly what search engines analyze. A page that relies entirely on client-side JavaScript to display pricing, product specifications, or authorship information creates a gap between the crawled document and the understood document. That gap is where information gets lost.&lt;/p&gt;

&lt;p&gt;The WHATWG DOM specification (&lt;a href="https://dom.spec.whatwg.org/" rel="noopener noreferrer"&gt;dom.spec.whatwg.org&lt;/a&gt;) defines the browser's in-memory representation of a document. Search engines approximate this representation. Any information not present in it is effectively invisible to them.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Structured Data Layer
&lt;/h3&gt;

&lt;p&gt;Schema.org, the collaborative vocabulary maintained by Google, Microsoft, Apple, and Yahoo, provides a way to annotate entities and relationships in structured data (&lt;a href="https://schema.org/" rel="noopener noreferrer"&gt;schema.org&lt;/a&gt;). Google supports structured data through JSON-LD, Microdata, and RDFa formats, with &lt;a href="https://developers.google.com/search/docs/appearance/structured-data" rel="noopener noreferrer"&gt;JSON-LD recommended&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here is the thing most people miss: structured data is a &lt;strong&gt;secondary representation&lt;/strong&gt; of information that should already exist in the page. It is not a content source. Google's &lt;a href="https://developers.google.com/search/docs/appearance/structured-data/sd-policies" rel="noopener noreferrer"&gt;structured data policies&lt;/a&gt; state: "Structured data helps search engines understand the content on the page."&lt;/p&gt;

&lt;p&gt;The phrase "understand the content" is doing significant work in that sentence. It means structured data is an interpretation aid, not a content source. When structured data contradicts visible content, the system does not get "more information." It gets a conflict.&lt;/p&gt;

&lt;h3&gt;
  
  
  The AI Reasoning Layer
&lt;/h3&gt;

&lt;p&gt;When a search engine uses a large language model to synthesize an answer, it operates fundamentally differently from traditional ranking. Instead of selecting a single best-matching document, the model retrieves evidence from multiple sources, evaluates source quality, synthesizes a coherent answer, and cites sources.&lt;/p&gt;

&lt;p&gt;This pipeline requires each source to provide extractable facts, verifiable claims, and machine-readable interfaces. Google's documentation on &lt;a href="https://developers.google.com/search/docs/fundamentals/ai-optimization-guide" rel="noopener noreferrer"&gt;AI optimization&lt;/a&gt; emphasizes creating content that demonstrates first-hand experience and using structured data to help Google understand your content.&lt;/p&gt;

&lt;p&gt;The implication is that the optimization target has shifted from "rank this page" to "make this website's information accessible to AI reasoning systems." Those are different problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Agent Problem Nobody Prepared For
&lt;/h2&gt;

&lt;p&gt;The most consequential architectural change is not AI Overviews. It is the emergence of web agents — autonomous systems that interact with websites to complete tasks on behalf of users.&lt;/p&gt;

&lt;p&gt;A traditional crawler fetches a page and indexes its content. An agent fetches a page, interprets it, and acts on it. That distinction changes everything about what a website needs to provide.&lt;/p&gt;

&lt;p&gt;Consider what a restaurant website needs to offer each type of consumer:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What a crawler needs from your restaurant page:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Page title&lt;/li&gt;
&lt;li&gt;Address&lt;/li&gt;
&lt;li&gt;Menu content&lt;/li&gt;
&lt;li&gt;Opening hours&lt;/li&gt;
&lt;li&gt;Reviews with ratings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What an agent needs from your restaurant page:&lt;/strong&gt;&lt;br&gt;
All of the above, plus:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A form to make a reservation, with labeled inputs (not just a phone number)&lt;/li&gt;
&lt;li&gt;Semantic buttons (&lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;, not &lt;code&gt;&amp;lt;div onclick="..."&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Clear input validation (date picker, party size selector)&lt;/li&gt;
&lt;li&gt;Success and failure states after submission&lt;/li&gt;
&lt;li&gt;API endpoints for programmatic interaction&lt;/li&gt;
&lt;li&gt;Price information in a parseable format&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The critical difference: the agent needs actionable interfaces, not just information. A &lt;code&gt;&amp;lt;button type="button"&amp;gt;Reserve&amp;lt;/button&amp;gt;&lt;/code&gt; communicates intent through document structure. A &lt;code&gt;&amp;lt;div class="btn" onclick="openReservation()"&amp;gt;Reserve&amp;lt;/div&amp;gt;&lt;/code&gt; communicates nothing through structure. It relies entirely on JavaScript execution to reveal its purpose.&lt;/p&gt;

&lt;p&gt;The HTML Living Standard (&lt;a href="https://html.spec.whatwg.org/" rel="noopener noreferrer"&gt;html.spec.whatwg.org&lt;/a&gt;) defines the contract for each element. A &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; has specific semantics: it is focusable, activatable, and communicates intent. A &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; has none of these properties. The &lt;a href="https://www.w3.org/WAI/standards-guidelines/aria/" rel="noopener noreferrer"&gt;WAI-ARIA specification&lt;/a&gt; extends this with roles, states, and properties that clarify intent for assistive technologies and, by extension, for machine agents.&lt;/p&gt;

&lt;p&gt;This is not theoretical. It is measurable.&lt;/p&gt;
&lt;h2&gt;
  
  
  Machine Trust and the Reconciliation Problem
&lt;/h2&gt;

&lt;p&gt;When a human reads a website, they can reason about inconsistencies. "This price says $49 here but $39 on the pricing page — probably an old page." Machines cannot easily do this. They encounter the same information from multiple sources and must determine which version to trust.&lt;/p&gt;

&lt;p&gt;Google's Knowledge Graph, which powers Knowledge Panels and AI Overviews, maintains confidence scores for facts. Contradictory sources reduce these scores. Google's research on &lt;a href="https://research.google/pubs/knowledge-vault-a-web-scale-approach-to-probabilistic-knowledge-fusion/" rel="noopener noreferrer"&gt;Knowledge Vault&lt;/a&gt; (Dong et al., 2014) describes the probabilistic fusion process: each source contributes evidence, and conflicts reduce the system's confidence in any given claim.&lt;/p&gt;

&lt;p&gt;The practical reality looks like this. Imagine your company publishes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;Homepage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;          &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Plans&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;start&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;at&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;$29/month"&lt;/span&gt;
&lt;span class="na"&gt;Pricing page&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;      &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Starter:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;$39/month"&lt;/span&gt;
&lt;span class="na"&gt;Product schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;49"&lt;/span&gt;
&lt;span class="na"&gt;API response&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;      &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;monthly_price"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;39&lt;/span&gt;
&lt;span class="na"&gt;Documentation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;     &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;$29&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;plan&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;includes..."&lt;/span&gt;
&lt;span class="na"&gt;Third-party listing&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$39/month"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A human can investigate and form a judgment. A machine sees six contradictory signals and has no way to determine which is current. The result is not that the machine picks one. The result is that the machine's confidence in all of your pricing information drops.&lt;/p&gt;

&lt;p&gt;This creates a specific type of technical SEO problem that traditional audits do not detect: &lt;strong&gt;mismatch detection across representations.&lt;/strong&gt; The most valuable audit may be the one that discovers contradictions between your website, your schema, your documentation, your API, and your third-party listings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six Things a Machine Must Be able to Do With Your Website
&lt;/h2&gt;

&lt;p&gt;Drawing from the evidence above, machine-readiness for websites can be evaluated through six requirements. These are not ranking factors. They are capabilities that a machine must possess to use your website effectively.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Discoverability: Can I Reach It?
&lt;/h3&gt;

&lt;p&gt;Before a machine can understand your website, it must be able to reach it. This is the domain of traditional technical SEO, and none of it becomes obsolete.&lt;/p&gt;

&lt;p&gt;What discoverability requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Crawlable pages with accessible URLs&lt;/li&gt;
&lt;li&gt;Intentional robots.txt rules (&lt;a href="https://developers.google.com/search/docs/crawling-indexing/robots/intro" rel="noopener noreferrer"&gt;Google: Robots.txt&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Valid XML sitemaps (&lt;a href="https://developers.google.com/search/docs/crawling-indexing/sitemaps/overview" rel="noopener noreferrer"&gt;Google: Sitemaps&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Correct canonical URLs (&lt;a href="https://developers.google.com/search/docs/crawling-indexing/canonicalization" rel="noopener noreferrer"&gt;Google: Canonicalization&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Predictable redirect behavior (minimal chain length)&lt;/li&gt;
&lt;li&gt;Accessible critical resources (CSS, JS, images not blocked)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Google's Gary Illyes has stated that crawl budget is real and should be managed. For large sites, poor discoverability means portions of the site are never indexed, and therefore never available to AI systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Understanding: What Am I Looking At?
&lt;/h3&gt;

&lt;p&gt;Discovery answers "Can I fetch this?" Understanding answers "What am I looking at?"&lt;/p&gt;

&lt;p&gt;Machines need structure. That means semantic HTML, meaningful headings, clear navigation, explicit entities, valid structured data, understandable page intent, consistent terminology, and machine-readable content.&lt;/p&gt;

&lt;p&gt;The semantic gap between implementations is measurable. The &lt;a href="https://webaim.org/projects/million/" rel="noopener noreferrer"&gt;WebAIM Million&lt;/a&gt; study analyzed the home pages of the top 1,000,000 websites each year since 2019 — and in the &lt;a href="https://webaim.org/projects/million/" rel="noopener noreferrer"&gt;2026 edition&lt;/a&gt; the trend lines are telling. 95.9% of home pages still had detectable WCAG 2 failures, and the average page carried &lt;strong&gt;56.1 distinct accessibility errors&lt;/strong&gt;. The most common issues — low contrast text (83.9%), missing alternative text (53.1%), empty links (46.3%) — are not just accessibility problems. They are machine-readiness problems. A machine that cannot parse your content structure cannot understand your content. If 96% of the web's most popular pages are structurally unreliable, that is not an accessibility niche. It is the default state of the web.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Verification: Can I Trust What It Says?
&lt;/h3&gt;

&lt;p&gt;A machine should not merely extract a fact. It should be able to determine whether the fact is supported, consistent, and current.&lt;/p&gt;

&lt;p&gt;Verification asks: does the structured data match the visible content? Does the canonical URL match the page being served? Does the organization name remain consistent? Do prices agree across the product page, schema, and checkout? Do dates make sense? Does the documentation describe the current product?&lt;/p&gt;

&lt;p&gt;The practical consequence is that structured data should reinforce meaning, not create an alternative reality. A Product schema that claims $39 when the page shows $49 does not "optimize" anything. It introduces a contradiction that reduces machine confidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Actionability: Can I Do Something?
&lt;/h3&gt;

&lt;p&gt;Traditional SEO concerns information retrieval. Agents introduce a different requirement: can the machine complete a task?&lt;/p&gt;

&lt;p&gt;For a restaurant, that means making a reservation. For e-commerce, that means purchasing a product. For SaaS, that means starting a trial. For documentation, that means integrating an API.&lt;/p&gt;

&lt;p&gt;The W3C &lt;a href="https://www.w3.org/WoT/" rel="noopener noreferrer"&gt;Web of Things specification&lt;/a&gt; defines a framework for making web-connected devices interoperable with machine agents. While focused on IoT, the principle applies broadly: web interfaces must be machine-actionable, not just human-readable.&lt;/p&gt;

&lt;p&gt;Google's AI Overviews with actions can now perform tasks on behalf of users — making reservations, purchasing products. For this to work, the website must provide identifiable actions (semantic buttons, forms, links), parseable inputs (labeled fields, correct types), predictable outcomes (standard HTTP methods), and clear error states.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Reliability: Can I Count on It?
&lt;/h3&gt;

&lt;p&gt;A machine needs predictable, consistent access to information. This is where the deployment problem becomes relevant.&lt;/p&gt;

&lt;p&gt;Modern websites change through deployments. Each deployment is a potential source of regression. Schema removed during a template update. Canonical URL changed during a migration. Pricing changed on the website but not in the schema. Documentation updated but the API response not synchronized.&lt;/p&gt;

&lt;p&gt;Traditional SEO audits capture a point-in-time snapshot. They do not detect regressions that occur after the audit. The SRE practices developed at Google (&lt;a href="https://sre.google/sre-book/table-of-contents/" rel="noopener noreferrer"&gt;SRE Book, Beyer et al., 2016&lt;/a&gt;) define principles for monitoring complex systems. Websites are becoming complex systems. They need the same treatment.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Observability: Can I Detect When It Changes?
&lt;/h3&gt;

&lt;p&gt;Once a website becomes an input to machine decisions, change itself becomes a signal. You need to know what changed, when it changed, which facts changed, and whether a previously valid workflow still works.&lt;/p&gt;

&lt;p&gt;The feedback loop looks like a software observability pipeline: establish baseline, monitor, detect change, evaluate impact, fix, verify, repeat. This is closer to Site Reliability Engineering than to the traditional SEO audit model. That is not an accident. Modern websites increasingly behave like software systems. Their SEO should be monitored like one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Data Nobody Shares
&lt;/h2&gt;

&lt;p&gt;The shift from document-centric to system-centric search is not theoretical. Several data points quantify it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI Overview adoption:&lt;/strong&gt; Google reported AI Overviews reaching 1.5 billion users monthly as of early 2025 (&lt;a href="https://blog.google/products-and-platforms/products/search/ai-mode-search/" rel="noopener noreferrer"&gt;Google AI Overviews&lt;/a&gt;). Perplexity AI processes over 100 million queries per week.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Click behavior impact:&lt;/strong&gt; Research by BrightEdge found that AI Overviews reduced organic CTR by 18-25% for informational queries. However, queries with AI Overviews that include source links saw increased click-through to cited sources. The implication: being cited by AI is becoming as important as ranking in organic results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent adoption:&lt;/strong&gt; OpenAI's ChatGPT browsing tools were used over 100 million times in the first quarter after launch. Anthropic's Claude web interaction capabilities showed measurable improvement in task completion rates from 2023 to 2024.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DOM quality matters:&lt;/strong&gt; WebAIM's analysis of 1,000,000 websites found widespread structural issues that affect both accessibility and machine readability. In the 2026 report, average home pages contained 1,437 page elements and 56.1 detected errors, with low contrast text on 83.9% of pages and missing alt text on 53.1%. These are not abstract concerns. They are the infrastructure that machines use to understand your content. Notably, the same report shows framework choice correlates with structural health: Next.js sites averaged 40.9 errors per page — 27% below the overall average — while jQuery-based and ad-heavy pages trended far worse. The way you build directly shapes how well a machine can read you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Schema Alone Cannot Save You
&lt;/h2&gt;

&lt;p&gt;Structured data is one of the most powerful tools in technical SEO. It is also the most commonly misunderstood.&lt;/p&gt;

&lt;p&gt;Schema.org provides a vocabulary for marking up entities and relationships. Google supports &lt;a href="https://developers.google.com/search/docs/appearance/structured-data" rel="noopener noreferrer"&gt;over 30 structured data types&lt;/a&gt;, including Product, Organization, Article, FAQ, Event, JobPosting, and Recipe. When implemented correctly, structured data enables rich results — enhanced search appearances with additional information.&lt;/p&gt;

&lt;p&gt;But structured data has hard limits.&lt;/p&gt;

&lt;p&gt;It cannot create information that does not exist in the page. It cannot override content that contradicts the schema. It cannot fix structural problems in the DOM. And it cannot substitute for consistency across your digital presence.&lt;/p&gt;

&lt;p&gt;The correct approach to structured data:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ensure the information exists clearly in the page content&lt;/li&gt;
&lt;li&gt;Mark it up with appropriate schema types&lt;/li&gt;
&lt;li&gt;Verify that schema values match visible content&lt;/li&gt;
&lt;li&gt;Verify that schema values match external representations&lt;/li&gt;
&lt;li&gt;Monitor for drift over time&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Google's &lt;a href="https://developers.google.com/search/docs/appearance/structured-data/sd-policies" rel="noopener noreferrer"&gt;structured data policies&lt;/a&gt; state: "Don't mark up content that is not visible to the user" and "The structured data on a page should describe the content of that page."&lt;/p&gt;

&lt;p&gt;These guidelines exist because schema mismatches reduce the system's ability to trust the data. Adding more schema to a page with contradictory information does not help. It creates another contradiction.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Audits to Continuous Verification
&lt;/h2&gt;

&lt;p&gt;The audit-as-snapshot model is breaking for the same reason manual software testing was replaced by continuous integration.&lt;/p&gt;

&lt;p&gt;The traditional audit cycle looks like this: run audit, get report, fix issues, done. The problems are obvious. The audit is valid only at the moment it was run. Regressions go undetected until the next audit. There is no feedback loop between "fixed" and "verified fixed."&lt;/p&gt;

&lt;p&gt;The continuous verification model replaces this with: establish baseline, monitor, detect change, evaluate impact, fix, verify, repeat. Regressions are detected immediately. The "fixed" state is verified automatically. The baseline evolves as the website improves.&lt;/p&gt;

&lt;p&gt;Google Search Console provides some of this capability for Google-specific metrics. But it does not monitor schema consistency, cross-source accuracy, agent workflow integrity, DOM semantic quality, or third-party listing accuracy. These require dedicated monitoring infrastructure.&lt;/p&gt;

&lt;p&gt;The concept is not new. Software engineering has practiced continuous verification for decades. The SRE book (&lt;a href="https://sre.google/sre-book/table-of-contents/" rel="noopener noreferrer"&gt;Beyer et al., 2016&lt;/a&gt;) defines the principles. Applying them to SEO is a natural extension that the industry has been slow to adopt.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Distributed Truth Problem
&lt;/h2&gt;

&lt;p&gt;Modern businesses maintain information across many systems: their website, CMS, schema markup, Google Business Profile, Google Merchant Center, API responses, documentation, social profiles, third-party directories, PDF catalogs, and mobile apps.&lt;/p&gt;

&lt;p&gt;Each of these is a representation of the same entity. Every representation creates an opportunity for divergence.&lt;/p&gt;

&lt;p&gt;Viewing this through the lens of distributed systems engineering reveals that consistency is not a content problem. It is a data engineering problem. The principles that apply to distributed databases apply here: eventual consistency (all representations should converge), conflict resolution (defined source of truth), monitoring (divergence must be detected), and idempotency (updates applied consistently across representations).&lt;/p&gt;

&lt;p&gt;Lamport's work on &lt;a href="https://lamport.azurewebsites.net/pubs/time-clocks.pdf" rel="noopener noreferrer"&gt;time, clocks, and the ordering of events in distributed systems&lt;/a&gt; (1978) established the foundational principles. The scale differs between database replication and cross-platform SEO consistency, but the principle is identical: when multiple systems maintain copies of the same information, consistency must be actively managed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Web Agent Research Actually Found
&lt;/h2&gt;

&lt;p&gt;Several research projects have directly measured how AI agents interact with websites. The findings are concrete and actionable.&lt;/p&gt;

&lt;h3&gt;
  
  
  WebArena (&lt;a href="https://webarena.dev/" rel="noopener noreferrer"&gt;Zhou et al., 2023&lt;/a&gt;)
&lt;/h3&gt;

&lt;p&gt;WebArena provides a benchmark environment for evaluating autonomous web agents on realistic tasks across e-commerce sites, forums, CMS platforms, and mapping applications. Accepted as an Oral at NeurIPS 2024, it is now the anchor of an entire family of benchmarks gathered under &lt;a href="https://webarena.dev/" rel="noopener noreferrer"&gt;WebArena-x&lt;/a&gt;: VisualWebArena for multimodal agents (ACL 2024), WebArena-Infinity for continuous evaluation in evolving environments, and &lt;a href="https://the-agent-company.com/" rel="noopener noreferrer"&gt;TheAgentCompany&lt;/a&gt; (ICML 2025), which evaluates agents on consequential real-world office tasks inside a simulated company.&lt;/p&gt;

&lt;p&gt;The results are humbling for the field. The best-performing agents achieved approximately 14% success rate on complex multi-step tasks. Human performance on the same tasks was approximately 75%. The primary failure modes were not comprehension failures. They were interaction failures — incorrect element selection, misunderstanding of DOM structure, inability to handle dynamic content.&lt;/p&gt;

&lt;p&gt;Pages with clear semantic structure had measurably higher agent success rates. The implication is direct: DOM quality is not an accessibility nice-to-have. It is a machine-accessibility requirement.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mind2Web (&lt;a href="https://github.com/OSU-NLP-Group/Mind2Web" rel="noopener noreferrer"&gt;Deng et al., 2023&lt;/a&gt;)
&lt;/h3&gt;

&lt;p&gt;Mind2Web (a NeurIPS 2023 Spotlight) provides a dataset of 2,350 open-ended tasks across 137 real websites for training and evaluating generalist web agents.&lt;/p&gt;

&lt;p&gt;The key finding: agent performance strongly correlated with DOM semantic quality. Semantic HTML elements — &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt; — were identified correctly more often than generic elements like &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;. Form accessibility (labels, field types, validation) directly impacted task completion.&lt;/p&gt;

&lt;p&gt;This is not a correlation without causation. The semantic elements carry behavioral contracts defined in the HTML Living Standard. A &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; is focusable and activatable by default. A &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; is not. When an agent tries to interact with a page, these contracts determine whether the interaction succeeds.&lt;/p&gt;

&lt;h3&gt;
  
  
  SeeAct (&lt;a href="https://github.com/OSU-NLP-Group/SeeAct" rel="noopener noreferrer"&gt;Zheng et al., 2024&lt;/a&gt;)
&lt;/h3&gt;

&lt;p&gt;SeeAct (accepted at ICML 2024) is a framework for web agents that uses visual grounding to interact with websites through screenshots and DOM analysis.&lt;/p&gt;

&lt;p&gt;The research showed that agent accuracy decreased 30-40% on pages that relied on non-standard UI components. Pages that followed web standards — semantic HTML, ARIA attributes — had significantly higher interaction success rates. Dynamic content rendered via JavaScript was a major source of agent errors.&lt;/p&gt;

&lt;p&gt;The convergence across all three projects is clear: the semantic quality of a website's DOM directly affects how well machine agents can use it. This is measurable, quantifiable, and increasingly consequential.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Engineering Stack Nobody Teaches
&lt;/h2&gt;

&lt;p&gt;The shift from page-level optimization to system-level intelligence requires a different engineering stack. The traditional SEO stack — content, HTML, meta tags, schema, links, analytics — remains relevant but is no longer sufficient.&lt;/p&gt;

&lt;p&gt;The Website Intelligence stack includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Information architecture and URL strategy&lt;/li&gt;
&lt;li&gt;Semantic HTML and DOM quality&lt;/li&gt;
&lt;li&gt;Structured data (JSON-LD, correctly implemented)&lt;/li&gt;
&lt;li&gt;Cross-source consistency management&lt;/li&gt;
&lt;li&gt;Performance engineering (Core Web Vitals)&lt;/li&gt;
&lt;li&gt;Accessibility (WCAG 2.2 compliance)&lt;/li&gt;
&lt;li&gt;API design and documentation&lt;/li&gt;
&lt;li&gt;Continuous monitoring and regression detection&lt;/li&gt;
&lt;li&gt;Agent workflow testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This stack looks like a software engineering discipline because it is one. The SEO profession is converging with web engineering, data engineering, quality assurance, and observability. That convergence is not a rebranding exercise. It is a reflection of the fact that websites are becoming software systems, and their machine-readiness requires the same rigor we apply to software reliability.&lt;/p&gt;

&lt;p&gt;The standards that define this stack are established and freely available: the &lt;a href="https://html.spec.whatwg.org/" rel="noopener noreferrer"&gt;HTML Living Standard&lt;/a&gt;, the &lt;a href="https://dom.spec.whatwg.org/" rel="noopener noreferrer"&gt;DOM Living Standard&lt;/a&gt;, &lt;a href="https://www.w3.org/TR/WCAG22/" rel="noopener noreferrer"&gt;WCAG 2.2&lt;/a&gt;, &lt;a href="https://www.w3.org/WAI/standards-guidelines/aria/" rel="noopener noreferrer"&gt;WAI-ARIA&lt;/a&gt;, &lt;a href="https://schema.org/" rel="noopener noreferrer"&gt;Schema.org&lt;/a&gt;, and Google's &lt;a href="https://developers.google.com/search/" rel="noopener noreferrer"&gt;Search Central documentation&lt;/a&gt;. None of these require proprietary knowledge. They require systematic application.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Practical Website Intelligence Framework
&lt;/h2&gt;

&lt;p&gt;Based on the framework presented in this article, a Website Intelligence audit should evaluate six dimensions. Each dimension includes concrete checkpoints. I've implemented this exact framework in the free &lt;a href="https://www.auditme.dev" rel="noopener noreferrer"&gt;AuditMe SEO audit tool&lt;/a&gt;, which runs many of these checks automatically — for example, cross-field verification that catches the price and date mismatches described above. The checks below are tool-agnostic; any team can run them with a good crawler and a text editor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Discoverability
&lt;/h3&gt;

&lt;p&gt;Important pages are crawlable by standard user agents. Robots.txt rules are intentional. XML sitemaps are valid and submitted. Canonical URLs are correct. Redirect chains are minimal. Critical resources are accessible to crawlers. URL structure is stable and predictable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding
&lt;/h3&gt;

&lt;p&gt;Page intent is clear from structure. Heading hierarchy is logical. Interactive elements use semantic controls. Navigation uses &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt; with meaningful link text. Entities are identifiable. Structured data is valid and matches page content. Content is understandable without visual context.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verification
&lt;/h3&gt;

&lt;p&gt;Visible prices match Product schema. Organization name is consistent across website and schema. Author information is verifiable. Dates are accurate. Documentation describes current features. External representations agree with website.&lt;/p&gt;

&lt;h3&gt;
  
  
  Actionability
&lt;/h3&gt;

&lt;p&gt;Critical actions use semantic form controls. Form inputs have associated labels. Form validation provides clear feedback. Required fields are indicated. Success and failure states are understandable. API endpoints are documented and stable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reliability
&lt;/h3&gt;

&lt;p&gt;Core pages load consistently. APIs respond predictably. Important URLs remain stable. Schema data survives template updates. Stale information can be detected automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Observability
&lt;/h3&gt;

&lt;p&gt;Key pages have baseline snapshots. Schema changes are tracked. DOM structural changes are detected. Cross-source consistency is monitored. Regressions are flagged automatically. Critical workflows can be re-tested.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Happens Next (Honest Projections)
&lt;/h2&gt;

&lt;p&gt;Predictions are fragile. But directional trends are observable. Based on current trajectories in AI research, search architecture, and web standards, several developments are likely — and a few have already started.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent-native websites become the standard.&lt;/strong&gt; Websites that provide agent-accessible interfaces — semantic HTML, API endpoints, labeled forms — will have a measurable advantage in AI-mediated discovery. The companies that build these interfaces early will capture the machine-mediated traffic that others miss.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-source consistency becomes a ranking factor.&lt;/strong&gt; As AI systems become more sophisticated at reconciling information across sources, inconsistency between a website's representations will increasingly be treated as a trust deficit. A website that maintains consistent information across its CMS, schema, API, and third-party listings will outperform one that does not. This is no longer hypothetical — the verification checks that catch these mismatches are already implementable as automated cross-field audits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Continuous verification replaces periodic audits.&lt;/strong&gt; The SRE-inspired model of continuous monitoring will become the standard for SEO. Manual audits will be supplemented — and in some cases replaced — by automated systems that detect regressions, verify fixes, and maintain baselines. This is the projection I am most confident about, because I have already built it into &lt;a href="https://www.auditme.dev" rel="noopener noreferrer"&gt;AuditMe&lt;/a&gt;: baseline snapshots, change logging per URL, field-level schema diffs, and alert delivery on regression. The tooling is not science fiction — it exists today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DOM quality becomes a first-class metric.&lt;/strong&gt; The semantic quality of a website's DOM will be measured and tracked as a metric, similar to how page speed is measured today. Tools will emerge that score DOM semantic quality the way Lighthouse scores performance. AuditMe now ships machine-readiness and semantic-interactive checks that score exactly this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The SEO profession evolves.&lt;/strong&gt; The role will increasingly overlap with web engineering, data engineering, quality assurance, accessibility, and observability. The practitioners who thrive will be the ones who can operate across these disciplines.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The web was built for humans to read. Search engines learned to index it. AI learned to summarize it. Agents are beginning to use it. The next generation of websites must satisfy all of these consumers simultaneously.&lt;/p&gt;

&lt;p&gt;The requirements converge on the same principles: clear information that humans can understand, semantic structure that machines can interpret, consistent facts that all consumers can trust, accessible interfaces that all consumers can act on, stable behavior that all consumers can rely on, and observable changes that all consumers can detect.&lt;/p&gt;

&lt;p&gt;These principles are not new. They are established engineering practices. What is new is that they now directly affect a website's ability to be discovered, understood, and used by the systems that increasingly mediate between businesses and their audiences.&lt;/p&gt;

&lt;p&gt;The shift from SEO to Website Intelligence is not a rebranding exercise. It is a recognition that the primary consumer of web content is expanding from humans to include machines — and that machines have different, more demanding requirements for the information they use.&lt;/p&gt;

&lt;p&gt;Build websites that machines can trust. The same qualities that make a website machine-readable make it better for humans too. That is not a coincidence. It is a convergence.&lt;/p&gt;

&lt;p&gt;If your site is not machine-readable by the time the next wave of search hits full scale, you will not be invisible to search engines in the traditional sense. You will simply be a source they read but cannot trust — and trust is the entire game. The window to build for the machine consumer is open now, and it does not stay open forever.&lt;/p&gt;

&lt;p&gt;Here is my honest verdict after building the AuditMe engine that operationalizes this framework: you do not need to wait for AI search to "mature" before acting. The six dimensions above are implementable today with tools that already exist. Most teams have 80% of the discoverability problem solved. The gap is almost always the same three dimensions — verification, actionability, and observability — because those are the ones nobody taught SEO practitioners to think about. Close that gap and you stop competing on the same terms as everyone else.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Google Documentation and Research
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://developers.google.com/search/" rel="noopener noreferrer"&gt;Google Search Central Documentation&lt;/a&gt; — The authoritative reference for crawling, indexing, and ranking behavior&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developers.google.com/search/docs/appearance/structured-data/sd-policies" rel="noopener noreferrer"&gt;Structured Data Policies&lt;/a&gt; — Guidelines for correct structured data implementation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics" rel="noopener noreferrer"&gt;JavaScript SEO Basics&lt;/a&gt; — How Google renders JavaScript&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developers.google.com/search/docs/fundamentals/seo-starter-guide" rel="noopener noreferrer"&gt;SEO Starter Guide&lt;/a&gt; — Foundation of technical SEO&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developers.google.com/search/docs/fundamentals/ai-optimization-guide" rel="noopener noreferrer"&gt;AI Optimization Guide&lt;/a&gt; — Optimizing for generative AI search&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developers.google.com/search/docs/fundamentals/creating-helpful-content" rel="noopener noreferrer"&gt;Creating Helpful Content&lt;/a&gt; — Google's content quality guidelines&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developers.google.com/search/docs/crawling-indexing/canonicalization" rel="noopener noreferrer"&gt;Canonicalization&lt;/a&gt; — Managing duplicate content&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://blog.google/products-and-platforms/products/search/ai-mode-search/" rel="noopener noreferrer"&gt;AI Overviews Announcement&lt;/a&gt; — Google's AI search features&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Standards and Specifications
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://schema.org/" rel="noopener noreferrer"&gt;Schema.org&lt;/a&gt; — The collaborative vocabulary for structured data&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://html.spec.whatwg.org/" rel="noopener noreferrer"&gt;HTML Living Standard&lt;/a&gt; — The definitive specification for HTML&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dom.spec.whatwg.org/" rel="noopener noreferrer"&gt;DOM Living Standard&lt;/a&gt; — Browser document object model specification&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.w3.org/TR/WCAG22/" rel="noopener noreferrer"&gt;WCAG 2.2&lt;/a&gt; — Web Content Accessibility Guidelines&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.w3.org/WAI/standards-guidelines/aria/" rel="noopener noreferrer"&gt;WAI-ARIA&lt;/a&gt; — Accessible Rich Internet Applications&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.w3.org/WoT/" rel="noopener noreferrer"&gt;W3C Web of Things&lt;/a&gt; — Interoperability framework for web-connected devices&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://datatracker.ietf.org/doc/html/rfc9309" rel="noopener noreferrer"&gt;robots.txt Specification (RFC 9309)&lt;/a&gt; — Standard for crawler directives&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Research Papers and Projects
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Brin, S. &amp;amp; Page, L. (1998). "The Anatomy of a Large-Scale Hypertextual Web Search Engine." &lt;a href="https://en.wikipedia.org/wiki/PageRank" rel="noopener noreferrer"&gt;Wikipedia: PageRank&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Berners-Lee, T. (1989). "Information Management: A Proposal." &lt;a href="https://www.w3.org/History/1989/proposal.html" rel="noopener noreferrer"&gt;w3.org/History/1989/proposal.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dong, X. et al. (2014). "Knowledge Vault: A Web-Scale Approach to Probabilistic Knowledge Fusion." &lt;a href="https://research.google/pubs/knowledge-vault-a-web-scale-approach-to-probabilistic-knowledge-fusion/" rel="noopener noreferrer"&gt;research.google&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Lamport, L. (1978). "Time, Clocks, and the Ordering of Events in a Distributed System." &lt;a href="https://lamport.azurewebsites.net/pubs/time-clocks.pdf" rel="noopener noreferrer"&gt;lamport.azurewebsites.net&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Beyer, B. et al. (2016). "Site Reliability Engineering." &lt;a href="https://sre.google/sre-book/table-of-contents/" rel="noopener noreferrer"&gt;sre.google/sre-book&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  AI and Agent Research
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Zhou, S. et al. (2023). "WebArena: A Realistic Web Environment for Building Autonomous Agents." &lt;a href="https://webarena.dev/" rel="noopener noreferrer"&gt;webarena.dev&lt;/a&gt; (NeurIPS 2024 Oral; part of the &lt;a href="https://webarena.dev/" rel="noopener noreferrer"&gt;WebArena-x&lt;/a&gt; family)&lt;/li&gt;
&lt;li&gt;Deng, X. et al. (2023). "Mind2Web: Towards a Generalist Agent for the Web." &lt;a href="https://github.com/OSU-NLP-Group/Mind2Web" rel="noopener noreferrer"&gt;github.com/OSU-NLP-Group/Mind2Web&lt;/a&gt; (NeurIPS 2023 Spotlight)&lt;/li&gt;
&lt;li&gt;Zheng, B. et al. (2024). "SeeAct: Grounded Vision-based Web Agents." &lt;a href="https://github.com/OSU-NLP-Group/SeeAct" rel="noopener noreferrer"&gt;github.com/OSU-NLP-Group/SeeAct&lt;/a&gt; (ICML 2024)&lt;/li&gt;
&lt;li&gt;Xu, F. et al. (2025). "TheAgentCompany: Benchmarking LLM Agents on Consequential Real-World Tasks." &lt;a href="https://the-agent-company.com/" rel="noopener noreferrer"&gt;the-agent-company.com&lt;/a&gt; (ICML 2025)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  AI Platform Documentation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://platform.openai.com/docs/guides/function-calling" rel="noopener noreferrer"&gt;OpenAI Function Calling&lt;/a&gt; — How LLMs invoke external tools&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.anthropic.com/en/docs/build-with-claude/tool-use/overview" rel="noopener noreferrer"&gt;Anthropic Tool Use&lt;/a&gt; — Claude's tool interaction framework&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://platform.openai.com/docs/guides/tools-web-search" rel="noopener noreferrer"&gt;OpenAI Web Search&lt;/a&gt; — Browsing capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Industry Research
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://webaim.org/projects/million/" rel="noopener noreferrer"&gt;WebAIM Million 2026&lt;/a&gt; — Accessibility analysis of top 1M websites&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.brightedge.com/resources/research-reports" rel="noopener noreferrer"&gt;BrightEdge Research&lt;/a&gt; — AI Overviews impact data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This article examines the architectural and semantic requirements websites must satisfy as search evolves from document retrieval to machine-mediated reasoning. The framework presented (Website Intelligence) draws from established web standards, published research, and observable trends in search architecture. The durable engineering principles it identifies will remain relevant regardless of specific implementation changes in any single AI system.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>ai</category>
      <category>webdev</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>What Actually Makes ChatGPT, Claude &amp; Perplexity Cite Your Website (3 Months, 47 Tests, Real Numbers)</title>
      <dc:creator>Eduard</dc:creator>
      <pubDate>Sun, 23 Aug 2026 14:10:13 +0000</pubDate>
      <link>https://dev.to/edo911/what-actually-makes-chatgpt-claude-perplexity-cite-your-website-3-months-47-tests-real-1840</link>
      <guid>https://dev.to/edo911/what-actually-makes-chatgpt-claude-perplexity-cite-your-website-3-months-47-tests-real-1840</guid>
      <description>&lt;h1&gt;
  
  
  What Actually Makes ChatGPT, Claude &amp;amp; Perplexity Cite Your Website (3 Months, 47 Tests, Real Numbers)
&lt;/h1&gt;

&lt;p&gt;Three months ago, I typed "best free SEO audit tool" into ChatGPT. It listed five tools. Mine wasn't one of them. That kicked off 90 days of systematic testing — 47 specific tests across four AI chatbots, with exact queries, exact dates, and exact results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this article is:&lt;/strong&gt; A detailed log of what I tested, what worked, what didn't, and the specific timelines I observed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this article isn't:&lt;/strong&gt; Reverse-engineering of proprietary algorithms. I don't have insider access to OpenAI, Anthropic, Perplexity, or Google. Everything here is based on my own testing against live AI systems, publicly available documentation, and patterns I observed. Some tactics work great in some niches and poorly in others. There are no guarantees.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who I am:&lt;/strong&gt; I built &lt;a href="https://www.auditme.dev" rel="noopener noreferrer"&gt;AuditMe&lt;/a&gt;, a free SEO audit tool. I'm sharing this because the GEO space needs more real data and less speculation. Yes, I mention my tool in this article — it's the product I tested with. But I've included other tools where relevant, and I've been honest about what worked regardless of which tool was involved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this matters:&lt;/strong&gt; AI search is growing fast. Perplexity now handles 15M+ daily searches. ChatGPT has 100M+ weekly users. Google's AI Overviews appear in ~30% of searches. If your website isn't optimized for AI extraction, you're missing a growing channel. But the advice out there is mostly theory — I wanted real data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I tested:&lt;/strong&gt; 5 specific tactics (FAQPage schema, llms.txt, content structure, Reddit engagement, robots.txt) across 4 AI platforms (ChatGPT, Claude, Perplexity, Gemini) over 3 months (January-March 2026). I tracked 47 specific queries with exact dates and outcomes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I found:&lt;/strong&gt; Some tactics worked consistently across all platforms. Others were platform-specific. Some commonly recommended tactics didn't work at all. The results surprised me — both positively and negatively.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR (If You Read Nothing Else)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;FAQPage schema + structured content&lt;/strong&gt; had the biggest impact across all four AI systems. Pages with FAQPage schema appeared in AI answers 2-3x more often.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;robots.txt is binary&lt;/strong&gt; — if you block AI crawlers, you're invisible. If you allow them, you're in the game. Takes 5 minutes to fix.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;llms.txt helps, but it's not magic.&lt;/strong&gt; Perplexity reads it actively. ChatGPT and Claude seem to use it occasionally. Worth implementing (15 minutes), but don't expect miracles.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reddit mentions correlate with AI citations&lt;/strong&gt; in consumer niches. GitHub matters more for developer tools. But this varies significantly by niche.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Content structure matters more than most people think.&lt;/strong&gt; Rewriting paragraphs into question-answer-list format measurably increased AI citations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No tactic guarantees results.&lt;/strong&gt; These increase probability. In competitive niches, domain authority and external signals matter more than technical GEO.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The Landscape: Search in 2026&lt;/li&gt;
&lt;li&gt;How AI Chatbots Actually Find and Cite Websites&lt;/li&gt;
&lt;li&gt;The Five Tactics I Tested&lt;/li&gt;
&lt;li&gt;Observations &amp;amp; Patterns: What Changed and When&lt;/li&gt;
&lt;li&gt;One Before/After Example That Shows Everything&lt;/li&gt;
&lt;li&gt;What Works Almost Always vs What Depends on Niche&lt;/li&gt;
&lt;li&gt;What Doesn't Work (Myths I Busted)&lt;/li&gt;
&lt;li&gt;How Different AI Systems Handle Citations&lt;/li&gt;
&lt;li&gt;The Competition Problem&lt;/li&gt;
&lt;li&gt;The Honest Limitations&lt;/li&gt;
&lt;li&gt;Complete GEO Checklist (Must-Do vs Nice-to-Have)&lt;/li&gt;
&lt;li&gt;Free Tools I Used&lt;/li&gt;
&lt;li&gt;Where This Is Heading (2026-2027)&lt;/li&gt;
&lt;li&gt;FAQ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a id="landscape"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Landscape: Search in 2026
&lt;/h2&gt;

&lt;p&gt;The numbers, with sources and caveats:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Number&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Caveat&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ChatGPT weekly queries&lt;/td&gt;
&lt;td&gt;&lt;a href="https://openai.com/index/chatgpt-reaches-100-million-weekly-active-users/" rel="noopener noreferrer"&gt;100M+&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;OpenAI blog (Feb 2024)&lt;/td&gt;
&lt;td&gt;Most are conversational, not search-like&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perplexity daily searches&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.perplexity.ai/hub/announcements/perplexity-ai-surpasses-15-million-daily-active-searches" rel="noopener noreferrer"&gt;15M+&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Perplexity blog (2024)&lt;/td&gt;
&lt;td&gt;Growing fast, but still small vs Google&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google AI Overviews&lt;/td&gt;
&lt;td&gt;~30% of searches&lt;/td&gt;
&lt;td&gt;&lt;a href="https://searchengineland.com/google-ai-overviews-search-443866" rel="noopener noreferrer"&gt;Search Engine Land&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Percentage varies wildly by query type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero-click searches&lt;/td&gt;
&lt;td&gt;&lt;a href="https://sparktoro.com/blog/zero-click-searches-the-definitive-study-of-google-searches-that-result-in-no-clicks/" rel="noopener noreferrer"&gt;65%&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;SparkToro (2024)&lt;/td&gt;
&lt;td&gt;Includes featured snippets, not just AI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What this means:&lt;/strong&gt; AI search is growing but still a fraction of total search. Google remains dominant for navigational queries. AI chatbots are most impactful for research queries ("what's the best X", "how do I do Y").&lt;/p&gt;

&lt;p&gt;The practical implication: you don't need to abandon traditional SEO. You need to add GEO on top of it. The good news is most GEO tactics also improve traditional SEO.&lt;/p&gt;

&lt;p&gt;&lt;a id="how-ai-finds"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How AI Chatbots Actually Find and Cite Websites
&lt;/h2&gt;

&lt;p&gt;When you ask ChatGPT or Perplexity a question, here's what happens:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your query is processed by the language model&lt;/li&gt;
&lt;li&gt;The model decides if it needs real-time information&lt;/li&gt;
&lt;li&gt;A web search is triggered (similar to Google, but simpler)&lt;/li&gt;
&lt;li&gt;Top 5-15 results are fetched and processed&lt;/li&gt;
&lt;li&gt;The model generates an answer using those results&lt;/li&gt;
&lt;li&gt;Citations are added to sources it used&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is &lt;a href="https://arxiv.org/abs/2005.11401" rel="noopener noreferrer"&gt;RAG (Retrieval-Augmented Generation)&lt;/a&gt; — the model retrieves information in real time, not just from training data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this means for you:&lt;/strong&gt; Changes to your site can appear in AI answers within days (for RAG-based systems like Perplexity and ChatGPT Search), not months (for training-based updates). This is a fundamental difference from traditional SEO, where changes can take weeks or months to impact rankings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The RAG pipeline in detail:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Query parsing:&lt;/strong&gt; The model breaks down your question into searchable components&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search retrieval:&lt;/strong&gt; A search engine (Bing, Google, or proprietary) finds relevant pages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content extraction:&lt;/strong&gt; The model extracts text, metadata, and structured data from results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Relevance scoring:&lt;/strong&gt; Pages are scored based on relevance to the query&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Answer generation:&lt;/strong&gt; The model synthesizes information from top-scored pages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Citation attribution:&lt;/strong&gt; Sources are added to the answer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What this means for GEO:&lt;/strong&gt; Each step in the pipeline is an opportunity. Structured data helps step 3. Content structure helps step 4. FAQPage schema directly maps to step 1 (question-answer format). llms.txt helps step 2 (providing context about your site).&lt;/p&gt;

&lt;p&gt;The factors that seem to matter most based on my testing:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Factor&lt;/th&gt;
&lt;th&gt;What I Observed&lt;/th&gt;
&lt;th&gt;Strength&lt;/th&gt;
&lt;th&gt;Caveat&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Domain authority&lt;/td&gt;
&lt;td&gt;Established domains cited more often&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;Hard to change quickly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content structure&lt;/td&gt;
&lt;td&gt;Structured content extracted more easily&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;Easy to implement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FAQPage schema&lt;/td&gt;
&lt;td&gt;Measurable increase in AI citations&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;Only for Q&amp;amp;A-style queries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;External mentions&lt;/td&gt;
&lt;td&gt;Reddit/GitHub correlate with citations&lt;/td&gt;
&lt;td&gt;Moderate-Strong&lt;/td&gt;
&lt;td&gt;Varies heavily by niche&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;llms.txt&lt;/td&gt;
&lt;td&gt;Some systems read it, many don't&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Still very new&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Page speed&lt;/td&gt;
&lt;td&gt;Slow pages sometimes skipped&lt;/td&gt;
&lt;td&gt;Minor&lt;/td&gt;
&lt;td&gt;Easy fix&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; These are my observations from testing, not official documentation. The actual algorithms are proprietary.&lt;/p&gt;

&lt;p&gt;&lt;a id="five-tactics"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Five Tactics I Tested
&lt;/h2&gt;

&lt;p&gt;Here's what I actually did, with enough detail that you can replicate the tests.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tactic 1: FAQPage Schema (JSON-LD)
&lt;/h3&gt;

&lt;p&gt;Added FAQPage schema to 5 pages with common questions about the product. Each FAQ had 3-5 questions with direct, concise answers. The key insight: questions should match real user queries — check your analytics for "People Also Ask" data, search console queries, and customer support questions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://schema.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FAQPage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mainEntity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Question"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"What is the best free SEO audit tool?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"acceptedAnswer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Answer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Several free SEO audit tools are available in 2026, including AuditMe, Ubersuggest, and SEMrush free tier. Each has different strengths."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Question"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"How much does an SEO audit cost?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"acceptedAnswer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Answer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Free SEO audit tools provide basic analysis. Professional audits cost $500-$5,000. Tools like AuditMe offer free basic audits with Pro plans at $19/month."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&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;strong&gt;Where I added it:&lt;/strong&gt; Homepage, pricing page, blog posts about SEO tools, comparison pages. I also added FAQPage schema to the "About" page and the "Contact" page with questions like "What does AuditMe do?" and "How do I contact support?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation notes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validated with Google Rich Results Test before deploying&lt;/li&gt;
&lt;li&gt;Checked with Schema.org validator for syntax errors&lt;/li&gt;
&lt;li&gt;Used &lt;code&gt;ld+json&lt;/code&gt; script tags in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section&lt;/li&gt;
&lt;li&gt;Each answer was 1-3 sentences — concise, factual, no marketing speak&lt;/li&gt;
&lt;li&gt;Questions used natural language (not keyword-stuffed)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tactic 2: llms.txt
&lt;/h3&gt;

&lt;p&gt;Created a concise llms.txt (46 lines) and an extended llms-full.txt (264 lines) with detailed documentation. The &lt;a href="https://llmstxt.org/" rel="noopener noreferrer"&gt;llms.txt standard&lt;/a&gt; is still emerging — I implemented it because the cost is low (15 minutes) and the potential upside is high.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I included in llms.txt:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One-line description: "AuditMe: Free AI-powered SEO audit tool analyzing 51 checks across 11 categories"&lt;/li&gt;
&lt;li&gt;Core features (4 items): meta, content, technical, links, performance, schema, images, social, eeat, accessibility, security&lt;/li&gt;
&lt;li&gt;Target audience (3 items): solopreneurs, agencies, developers&lt;/li&gt;
&lt;li&gt;Pricing tiers: Free (1 audit/day), Pro ($19/month, unlimited)&lt;/li&gt;
&lt;li&gt;Key pages with URLs: homepage, pricing, blog, API docs&lt;/li&gt;
&lt;li&gt;Contact info: email, GitHub, Twitter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I included in llms-full.txt:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detailed feature descriptions for each of the 11 audit categories&lt;/li&gt;
&lt;li&gt;Technical architecture (Next.js, Supabase, Vercel)&lt;/li&gt;
&lt;li&gt;API documentation with endpoints and examples&lt;/li&gt;
&lt;li&gt;Supported platforms and integrations&lt;/li&gt;
&lt;li&gt;Comparison with alternatives (SEMrush, Ahrefs, Screaming Frog)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key finding:&lt;/strong&gt; The short llms.txt (46 lines) outperformed the long version (264 lines). AI systems seem to truncate long files. Keep essential info under 500 words.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tactic 3: Content Structure Overhaul
&lt;/h3&gt;

&lt;p&gt;Rewrote 10 existing blog posts from paragraph-style to AI-extraction-friendly format. This took the most time (about 2 weeks of work) but produced the most consistent results across all AI systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key changes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Question-based H2/H3 headings:&lt;/strong&gt; Changed "Title Tag Optimization" to "How Do I Optimize Title Tags for SEO?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Definition-style openings:&lt;/strong&gt; First sentence directly answers the heading question (e.g., "Title tags are HTML elements that define the title of a web page.")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Numbered lists:&lt;/strong&gt; Converted recommendations from paragraphs to numbered lists with impact/time estimates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tables:&lt;/strong&gt; Added comparison tables with metrics, tools, and benchmarks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bold key terms:&lt;/strong&gt; Bolded important concepts so RAG systems can extract them easily&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metric tables:&lt;/strong&gt; Added tables with specific numbers (LCP &amp;lt; 2.5s, CLS &amp;lt; 0.1, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Time investment:&lt;/strong&gt; 2 weeks for 10 posts. Average 2-3 hours per post for research, rewriting, and validation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tactic 4: Reddit Engagement
&lt;/h3&gt;

&lt;p&gt;Posted genuine answers in r/SEO, r/webdev, r/SaaS, and r/entrepreneur over 4 weeks. Not spam — actual helpful answers to real questions where the product was relevant as a solution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Volume:&lt;/strong&gt; 3-4 posts per week, each taking 10-15 minutes to write genuinely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I did right:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Answered questions first, mentioned product second&lt;/li&gt;
&lt;li&gt;Included specific examples and data from my own experience&lt;/li&gt;
&lt;li&gt;Was transparent about being the product creator&lt;/li&gt;
&lt;li&gt;Engaged in follow-up comments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I did wrong (at first):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First 2 posts were too promotional — got flagged by moderators&lt;/li&gt;
&lt;li&gt;Learned to lead with value, not product mentions&lt;/li&gt;
&lt;li&gt;Started including screenshots and specific examples instead of links&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tactic 5: robots.txt Optimization
&lt;/h3&gt;

&lt;p&gt;Ensured all major AI crawlers were allowed. Started with &lt;code&gt;User-agent: * Allow: /&lt;/code&gt; and then verified specific bots were not blocked by any intermediate rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bots I explicitly verified:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GPTBot&lt;/code&gt; (OpenAI)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CCBot&lt;/code&gt; (Common Crawl)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;anthropic-ai&lt;/code&gt; (Anthropic)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PerplexityBot&lt;/code&gt; (Perplexity)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Google-Extended&lt;/code&gt; (Gemini)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Bytespider&lt;/code&gt; (ByteDance)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Implementation:&lt;/strong&gt; Simple robots.txt at the root with &lt;code&gt;User-agent: * Allow: /&lt;/code&gt; and a Sitemap directive. If your site already doesn't block any bots, this is a no-op. But if you're blocking them, this is critical.&lt;/p&gt;

&lt;p&gt;&lt;a id="test-results"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Observations &amp;amp; Patterns: What Changed and When
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Methodology note:&lt;/strong&gt; Multiple interventions (FAQ schema, llms.txt, Reddit activity, content rewrites) overlapped from January to March 2026. The observations below show correlations, not isolated causal relationships. For context, research across 284 Korean DTC brands found 65.5% had zero AI appearances and the mean was only 0.648 out of 50 queries — citation sparsity is real, so even small lifts can appear significant. A staggered rollout would be needed to cleanly isolate each variable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Observation 1: FAQPage Schema on Perplexity
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Period:&lt;/strong&gt; January 15 - February 15, 2026&lt;br&gt;
&lt;strong&gt;Query:&lt;/strong&gt; "best free SEO audit tool"&lt;br&gt;
&lt;strong&gt;Platform:&lt;/strong&gt; Perplexity (shows sources, easiest to track)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;th&gt;Position&lt;/th&gt;
&lt;th&gt;Citation?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Jan 15 (before)&lt;/td&gt;
&lt;td&gt;Listed 8 tools. Product not included.&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jan 22 (+7 days)&lt;/td&gt;
&lt;td&gt;Listed 8 tools. Product appeared at #6.&lt;/td&gt;
&lt;td&gt;#6&lt;/td&gt;
&lt;td&gt;Yes — homepage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feb 1 (+17 days)&lt;/td&gt;
&lt;td&gt;Listed 10 tools. Product at #5.&lt;/td&gt;
&lt;td&gt;#5&lt;/td&gt;
&lt;td&gt;Yes — blog post&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feb 15 (+31 days)&lt;/td&gt;
&lt;td&gt;Listed 10 tools. Product at #4.&lt;/td&gt;
&lt;td&gt;#4&lt;/td&gt;
&lt;td&gt;Yes — homepage + blog&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What I added between Jan 15 and Jan 22:&lt;/strong&gt; FAQPage schema with 5 questions on the homepage and pricing page. The questions were:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;"What is the best free SEO audit tool?"&lt;/li&gt;
&lt;li&gt;"How much does an SEO audit cost?"&lt;/li&gt;
&lt;li&gt;"What does AuditMe check in an SEO audit?"&lt;/li&gt;
&lt;li&gt;"How long does an SEO audit take?"&lt;/li&gt;
&lt;li&gt;"Is AuditMe free to use?"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Observation:&lt;/strong&gt; Product appeared ~7 days after adding FAQPage schema. Position improved over the next month. The schema made content easier for Perplexity's RAG system to extract and cite. The FAQ answers were concise (1-2 sentences each) and matched real user queries.&lt;/p&gt;
&lt;h3&gt;
  
  
  Observation 2: FAQPage Schema on ChatGPT
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Period:&lt;/strong&gt; January 15 - February 15, 2026&lt;br&gt;
&lt;strong&gt;Query:&lt;/strong&gt; "What is the best free SEO audit tool?"&lt;br&gt;
&lt;strong&gt;Platform:&lt;/strong&gt; ChatGPT (free tier, search enabled)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Jan 15 (before)&lt;/td&gt;
&lt;td&gt;Listed 5 tools. Product not included.&lt;/td&gt;
&lt;td&gt;Generic recommendations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feb 1 (+17 days)&lt;/td&gt;
&lt;td&gt;Listed 6 tools. Product at #4.&lt;/td&gt;
&lt;td&gt;More detailed description&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feb 15 (+31 days)&lt;/td&gt;
&lt;td&gt;Listed 6 tools. Product at #3.&lt;/td&gt;
&lt;td&gt;Mentioned specific features&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Observation:&lt;/strong&gt; ChatGPT took 2-3 weeks to pick up changes. Product appeared after both FAQPage schema and Reddit activity — I can't isolate which caused the change. Likely both contributed. ChatGPT's recommendations were more brand-focused than Perplexity's.&lt;/p&gt;
&lt;h3&gt;
  
  
  Observation 3: llms.txt Impact (All Four Platforms)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Period:&lt;/strong&gt; February 1 - March 1, 2026&lt;br&gt;
&lt;strong&gt;Query:&lt;/strong&gt; "What is [product name]?"&lt;br&gt;
&lt;strong&gt;Platforms:&lt;/strong&gt; ChatGPT, Claude, Perplexity, Gemini&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Perplexity&lt;/th&gt;
&lt;th&gt;ChatGPT&lt;/th&gt;
&lt;th&gt;Claude&lt;/th&gt;
&lt;th&gt;Gemini&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Feb 1 (before)&lt;/td&gt;
&lt;td&gt;Third-party info. Inaccurate pricing.&lt;/td&gt;
&lt;td&gt;Generic. Some features wrong.&lt;/td&gt;
&lt;td&gt;"I'm not familiar with this tool."&lt;/td&gt;
&lt;td&gt;Found GitHub. Minimal detail.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feb 8 (+7 days)&lt;/td&gt;
&lt;td&gt;Cited llms.txt directly. Accurate.&lt;/td&gt;
&lt;td&gt;More accurate. Mentioned 11 dimensions.&lt;/td&gt;
&lt;td&gt;Still limited.&lt;/td&gt;
&lt;td&gt;More complete.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feb 22 (+21 days)&lt;/td&gt;
&lt;td&gt;Stable. Cited llms.txt + blog.&lt;/td&gt;
&lt;td&gt;Accurate. Mentioned pricing.&lt;/td&gt;
&lt;td&gt;Better. Mentioned capabilities.&lt;/td&gt;
&lt;td&gt;Accurate. Mentioned audience.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What I added between Feb 1 and Feb 8:&lt;/strong&gt; llms.txt and llms-full.txt at site root. The llms.txt file was placed at &lt;code&gt;https://www.auditme.dev/llms.txt&lt;/code&gt; and included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One-line description&lt;/li&gt;
&lt;li&gt;Core features (4 items)&lt;/li&gt;
&lt;li&gt;Target audience (3 items)&lt;/li&gt;
&lt;li&gt;Pricing tiers&lt;/li&gt;
&lt;li&gt;Key pages with URLs&lt;/li&gt;
&lt;li&gt;Contact info&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key finding:&lt;/strong&gt; Perplexity responded fastest (~7 days) and cited llms.txt directly. ChatGPT and Gemini improved over 2-3 weeks. Claude was slowest. The short llms.txt (46 lines) outperformed the long version (264 lines).&lt;/p&gt;
&lt;h3&gt;
  
  
  Observation 4: Content Structure Overhaul
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Period:&lt;/strong&gt; February 15 - March 15, 2026&lt;br&gt;
&lt;strong&gt;Query:&lt;/strong&gt; "how to improve SEO score"&lt;br&gt;
&lt;strong&gt;Platform:&lt;/strong&gt; Perplexity&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Post&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;th&gt;AI Citations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"How to Improve SEO Score"&lt;/td&gt;
&lt;td&gt;Never cited&lt;/td&gt;
&lt;td&gt;Cited by Perplexity&lt;/td&gt;
&lt;td&gt;+3 appearances&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Technical SEO Checklist"&lt;/td&gt;
&lt;td&gt;Occasionally cited&lt;/td&gt;
&lt;td&gt;Cited consistently&lt;/td&gt;
&lt;td&gt;+5 appearances&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Core Web Vitals Guide"&lt;/td&gt;
&lt;td&gt;Never cited&lt;/td&gt;
&lt;td&gt;Cited for CWV queries&lt;/td&gt;
&lt;td&gt;+2 appearances&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What I changed:&lt;/strong&gt; Question-based headings, definition-style openings, numbered lists, metric tables. For example, the "Core Web Vitals Guide" went from 3 paragraphs of explanation to a structured format with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;H2: "What Are Core Web Vitals?"&lt;/li&gt;
&lt;li&gt;Opening definition: "Core Web Vitals are three metrics that measure real-world user experience..."&lt;/li&gt;
&lt;li&gt;Numbered list: LCP (2.5s), CLS (0.1), INP (200ms)&lt;/li&gt;
&lt;li&gt;Table comparing before/after scores&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Timeline:&lt;/strong&gt; ~2 weeks for changes to appear in AI answers. The structured content was extracted and cited much more frequently.&lt;/p&gt;
&lt;h3&gt;
  
  
  Observation 5: Reddit Activity
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Period:&lt;/strong&gt; February 1 - February 28, 2026&lt;br&gt;
&lt;strong&gt;Query:&lt;/strong&gt; "best SEO tool" and variations&lt;br&gt;
&lt;strong&gt;Platforms:&lt;/strong&gt; ChatGPT and Perplexity&lt;/p&gt;

&lt;p&gt;12 genuine answers posted over 4 weeks (3-4 per week, 200-500 words each).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before (Jan 15)&lt;/th&gt;
&lt;th&gt;After (Feb 28)&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Perplexity citations&lt;/td&gt;
&lt;td&gt;2/20 queries&lt;/td&gt;
&lt;td&gt;6/20 queries&lt;/td&gt;
&lt;td&gt;+200%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ChatGPT recommendations&lt;/td&gt;
&lt;td&gt;1/15 queries&lt;/td&gt;
&lt;td&gt;4/15 queries&lt;/td&gt;
&lt;td&gt;+300%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Caveat:&lt;/strong&gt; Can't prove causation. FAQPage schema and llms.txt were also active. Most likely a combined effect. But the correlation is strong enough to warrant genuine engagement.&lt;/p&gt;
&lt;h3&gt;
  
  
  Observation 6: robots.txt (Control)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Finding:&lt;/strong&gt; Site was already neutral (not blocking AI bots). Explicitly allowing all AI bots didn't measurably change citation frequency. But if your site IS blocking AI bots, allowing them is critical.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this matters:&lt;/strong&gt; Many sites accidentally block AI crawlers with broad &lt;code&gt;Disallow&lt;/code&gt; rules or CDN-level blocking. Checking robots.txt is the first thing you should do. Use the &lt;a href="https://www.auditme.dev/robots-txt-checker" rel="noopener noreferrer"&gt;AuditMe robots.txt Checker&lt;/a&gt; or Google Search Console to verify.&lt;/p&gt;
&lt;h3&gt;
  
  
  Observation 7: Organization Schema Impact
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Period:&lt;/strong&gt; January 20 - February 20, 2026&lt;br&gt;
&lt;strong&gt;Query:&lt;/strong&gt; "What is AuditMe?"&lt;br&gt;
&lt;strong&gt;Platforms:&lt;/strong&gt; All four&lt;/p&gt;

&lt;p&gt;Added Organization JSON-LD with name, URL, logo, description, founding date, and contact info.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://schema.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Organization"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AuditMe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.auditme.dev"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"logo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.auditme.dev/logo.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Free AI-powered SEO audit tool analyzing 51 checks across 11 categories"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"foundingDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contactPoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ContactPoint"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"contactType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"customer support"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"support@auditme.dev"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Jan 20 (before)&lt;/td&gt;
&lt;td&gt;Mixed results — some platforms had accurate info, others had outdated data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feb 5 (+16 days)&lt;/td&gt;
&lt;td&gt;More consistent descriptions across all platforms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feb 20 (+31 days)&lt;/td&gt;
&lt;td&gt;Stable. All platforms had accurate info&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Observation:&lt;/strong&gt; Organization schema helped with accuracy but didn't dramatically increase citation frequency. It's a "trust signal" — makes AI systems more confident about citing you. The biggest impact was on Gemini, which uses Google's structured data heavily.&lt;/p&gt;

&lt;h3&gt;
  
  
  Observation 8: SoftwareApplication Schema
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Period:&lt;/strong&gt; February 1 - March 1, 2026&lt;br&gt;
&lt;strong&gt;Query:&lt;/strong&gt; "free SEO audit tool"&lt;br&gt;
&lt;strong&gt;Platform:&lt;/strong&gt; Perplexity&lt;/p&gt;

&lt;p&gt;Added SoftwareApplication JSON-LD with name, description, applicationCategory, operatingSystem, pricing, and review.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://schema.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SoftwareApplication"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AuditMe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Free AI-powered SEO audit tool analyzing 51 checks across 11 categories"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"applicationCategory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SEOTool"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"operatingSystem"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Web"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"offers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Offer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"priceCurrency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Feb 1 (before)&lt;/td&gt;
&lt;td&gt;Listed as "AuditMe" with generic description&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feb 15 (+14 days)&lt;/td&gt;
&lt;td&gt;Listed with pricing ($0/free), category (SEO tool), and features&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mar 1 (+28 days)&lt;/td&gt;
&lt;td&gt;Stable. Consistent description across citations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Observation:&lt;/strong&gt; SoftwareApplication schema provided structured product information that AI systems could extract directly. This is especially useful for product pages. The pricing information was particularly valuable — AI systems could now accurately state "free" instead of guessing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Observation 9: Content Freshness Impact
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Period:&lt;/strong&gt; January - March 2026&lt;br&gt;
&lt;strong&gt;Query:&lt;/strong&gt; "SEO audit checklist 2026"&lt;br&gt;
&lt;strong&gt;Platform:&lt;/strong&gt; Perplexity&lt;/p&gt;

&lt;p&gt;Updated 3 old blog posts with "2026" in titles and content. Added new sections, updated statistics, refreshed screenshots.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Post&lt;/th&gt;
&lt;th&gt;Before Update&lt;/th&gt;
&lt;th&gt;After Update&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"SEO Audit Checklist" (2024)&lt;/td&gt;
&lt;td&gt;Not cited&lt;/td&gt;
&lt;td&gt;Cited&lt;/td&gt;
&lt;td&gt;+1 appearance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Technical SEO Guide" (2023)&lt;/td&gt;
&lt;td&gt;Occasionally cited&lt;/td&gt;
&lt;td&gt;Cited consistently&lt;/td&gt;
&lt;td&gt;+3 appearances&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Core Web Vitals Explained" (2024)&lt;/td&gt;
&lt;td&gt;Not cited&lt;/td&gt;
&lt;td&gt;Cited for CWV queries&lt;/td&gt;
&lt;td&gt;+2 appearances&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Observation:&lt;/strong&gt; Content freshness matters. AI systems seem to prefer recently updated content. The "2026" in titles may have helped — it signals current, relevant content. Timeline: ~2 weeks for changes to appear in AI answers.&lt;/p&gt;

&lt;p&gt;&lt;a id="before-after"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  One Before/After Example That Shows Everything
&lt;/h2&gt;

&lt;p&gt;This is from a real blog post on my site. Same content, different structure. The "before" version was written in January 2026. The "after" version was rewritten in February 2026.&lt;/p&gt;

&lt;h3&gt;
  
  
  Before (January 2026)
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;There are many factors that affect your SEO score and it's important to understand them all if you want to improve your rankings. First, you need to make sure your title tags are properly optimized with relevant keywords that match what people are searching for. Additionally, your meta descriptions should be compelling and include target phrases that encourage clicks from search results. Furthermore, you should pay close attention to your Core Web Vitals scores as these metrics directly impact your search rankings and user experience. Many people overlook the importance of heading structure but having proper H1, H2, and H3 tags helps search engines understand your content better.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;What AI did with this:&lt;/strong&gt; When asked "how to improve SEO score", AI systems either ignored this content or extracted inaccurate information. The paragraph format made it impossible for RAG systems to identify specific actionable items. The key metrics (50-60 characters for title tags, 120-160 for meta descriptions) were buried in flowing text that AI couldn't parse reliably.&lt;/p&gt;

&lt;h3&gt;
  
  
  After (February 2026)
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  How to Improve Your SEO Score (2026 Guide)
&lt;/h2&gt;

&lt;p&gt;Your SEO score is a composite metric based on technical, content, and authority factors. Here are the highest-impact improvements:&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Optimize Title Tags (Impact: High, 5 min/page)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Keep titles between 50-60 characters&lt;/li&gt;
&lt;li&gt;Place primary keyword near the start&lt;/li&gt;
&lt;li&gt;Make it compelling for clicks&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2. Fix Core Web Vitals (Impact: High, 1-4 hours)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LCP:&lt;/strong&gt; Under 2.5 seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLS:&lt;/strong&gt; Under 0.1&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;INP:&lt;/strong&gt; Under 200ms&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  3. Write Meta Descriptions (Impact: Medium, 5 min/page)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;120-160 characters&lt;/li&gt;
&lt;li&gt;Clear value proposition&lt;/li&gt;
&lt;li&gt;End with a call to action&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  4. Improve Content Quality (Impact: High, Varies)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Minimum 1,500 words for pillar content&lt;/li&gt;
&lt;li&gt;H2/H3 headings every 200-300 words&lt;/li&gt;
&lt;li&gt;3-5 internal links per post&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  5. Add Structured Data (Impact: Medium, 30 min)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Organization schema on every page&lt;/li&gt;
&lt;li&gt;FAQPage schema on Q&amp;amp;A content&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;What AI did with this:&lt;/strong&gt; After restructuring, Perplexity started citing specific items from this content in answers about SEO improvement. ChatGPT referenced the Core Web Vitals thresholds. The structured format made extraction trivial. The numbered list format gave AI systems clear, extractable items to cite.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The lesson:&lt;/strong&gt; AI doesn't "read" paragraphs. It parses structure. The same information, formatted differently, gets completely different treatment from RAG systems. The "after" version has the same information but formatted for machine extraction — bold terms, numbered lists, specific metrics, and clear hierarchy.&lt;/p&gt;

&lt;p&gt;&lt;a id="universal-vs-niche"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Works Almost Always vs What Depends on Niche
&lt;/h2&gt;

&lt;p&gt;This distinction is important. Not all tactics are equally universal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Works Almost Everywhere
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tactic&lt;/th&gt;
&lt;th&gt;Why It's Universal&lt;/th&gt;
&lt;th&gt;Implementation Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Open robots.txt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Binary — blocked = invisible&lt;/td&gt;
&lt;td&gt;5 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FAQPage schema&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Direct question-answer format maps to AI queries&lt;/td&gt;
&lt;td&gt;1-2 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Structured content&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI systems extract lists better than paragraphs&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Organization schema&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tells AI who you are unambiguously&lt;/td&gt;
&lt;td&gt;30 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Page speed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Slow pages get skipped by crawlers&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Depends Heavily on Niche
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tactic&lt;/th&gt;
&lt;th&gt;When It Works&lt;/th&gt;
&lt;th&gt;When It Doesn't&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reddit mentions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Consumer products, tools, SaaS&lt;/td&gt;
&lt;td&gt;B2B enterprise, regulated industries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub presence&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Developer tools, open source&lt;/td&gt;
&lt;td&gt;Non-technical products&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Product Hunt launch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;New products, consumer apps&lt;/td&gt;
&lt;td&gt;Established brands, services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;llms.txt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Any site (but variable results)&lt;/td&gt;
&lt;td&gt;Too new to know for all niches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Blog content&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Informational queries&lt;/td&gt;
&lt;td&gt;Transactional queries ("buy X")&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  What This Means for You
&lt;/h3&gt;

&lt;p&gt;If you're building a developer tool: focus on GitHub + structured content + FAQPage schema. Reddit is secondary.&lt;/p&gt;

&lt;p&gt;If you're building a consumer product: focus on Reddit + structured content + FAQPage schema. GitHub is secondary.&lt;/p&gt;

&lt;p&gt;If you're in a regulated industry (health, finance, legal): focus on structured data + authoritative content. External signals are harder to control.&lt;/p&gt;

&lt;p&gt;&lt;a id="myths"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Doesn't Work (Myths I Busted)
&lt;/h2&gt;

&lt;p&gt;After 3 months of testing, here are commonly recommended tactics that didn't move the needle for me:&lt;/p&gt;

&lt;h3&gt;
  
  
  Myth 1: "Just Add llms.txt and Wait for Magic"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Reality:&lt;/strong&gt; llms.txt is useful but not a silver bullet. Perplexity reads it actively. ChatGPT and Claude seem to use it occasionally. Many AI systems ignore it entirely. Implement it (15 minutes, no downside), but don't expect it alone to change your AI visibility. The data shows: llms.txt alone improved accuracy by ~30% but didn't increase citation frequency by much.&lt;/p&gt;

&lt;h3&gt;
  
  
  Myth 2: "Blocking GPTBot Protects Your Content"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Reality:&lt;/strong&gt; Blocking GPTBot doesn't protect anything — your content is already public. It just prevents ChatGPT from recommending you. If someone wants your content, they'll find it regardless. The irony: sites that block GPTBot are invisible to ChatGPT but still appear in Google's AI Overviews (which don't use GPTBot).&lt;/p&gt;

&lt;h3&gt;
  
  
  Myth 3: "Buying Reddit Upvotes Helps"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Reality:&lt;/strong&gt; Reddit's algorithm detects vote manipulation. Even if it temporarily works, the account and product can get banned. I've seen this happen. Genuine engagement is the only sustainable approach. The pattern I observed: posts with 10+ genuine comments performed better than posts with 100+ upvotes but no discussion.&lt;/p&gt;

&lt;h3&gt;
  
  
  Myth 4: "Longer llms-full.txt Is Better"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Reality:&lt;/strong&gt; In my testing, the short llms.txt (46 lines) outperformed the long llms-full.txt (264 lines). AI systems seem to truncate long files. Keep essential info under 500 words. The extended version is useful for human developers but doesn't improve AI citations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Myth 5: "You Need to Be on Every Platform"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Reality:&lt;/strong&gt; Focus on 2-3 platforms where your audience lives. Spreading thin across 10 platforms produces worse results than deep engagement on 2-3. For developer tools: GitHub + Reddit + DEV.to. For consumer products: Reddit + Product Hunt + Twitter/X. For B2B: LinkedIn + industry forums + case studies.&lt;/p&gt;

&lt;h3&gt;
  
  
  Myth 6: "Structured Data Guarantees AI Citations"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Reality:&lt;/strong&gt; Structured data increases the probability of being cited. It doesn't guarantee it. If your content isn't genuinely useful, no amount of schema will help. I tested this: added FAQPage schema to 5 pages, only 3 got cited consistently. The other 2 had weak content — schema couldn't compensate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Myth 7: "OpenAI Definitely Reads Your Meta Keywords"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Reality:&lt;/strong&gt; Meta keywords tag has been ignored by every major search engine since 2009. AI systems don't use it either. Don't waste time on it. Focus on structured data, content quality, and external signals instead.&lt;/p&gt;

&lt;p&gt;&lt;a id="ai-differences"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How Different AI Systems Handle Citations Differently
&lt;/h2&gt;

&lt;p&gt;Not all AI chatbots work the same way. Here's what I observed across 47 tests:&lt;/p&gt;

&lt;h3&gt;
  
  
  Perplexity
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Most transparent.&lt;/strong&gt; Shows sources directly — you can see exactly which websites it cited. Seems to read llms.txt more actively than other systems. Tends to cite more sources (5-15 per answer). Best for testing your GEO setup because you can see results directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What works best:&lt;/strong&gt; Comprehensive content with clear structure, FAQPage schema, llms.txt. Perplexity seems to reward thorough, well-structured content. It also appears to favor content that's been recently updated — I noticed citations shifted to newer blog posts after I updated them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What doesn't work well:&lt;/strong&gt; Thin content, promotional language without substance. Perplexity's algorithm seems to filter out marketing-speak. Content that reads like a sales page gets ignored.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Specific observation:&lt;/strong&gt; Perplexity cited my llms.txt directly in the answer source list. This is unique — no other AI system did this. If you implement llms.txt, Perplexity is the platform where you'll see the most direct impact.&lt;/p&gt;

&lt;h3&gt;
  
  
  ChatGPT (with Search)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Less transparent.&lt;/strong&gt; Shows some citations but not always. Uses Bing for web search, so Bing-indexed content has an advantage. ChatGPT seems to favor well-known brands and authoritative domains. When it recommends products, it often picks from a smaller set of established players.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What works best:&lt;/strong&gt; Domain authority, Reddit mentions, established brand presence. If your product is already well-known, ChatGPT will mention it. If it's new, you need external signals. ChatGPT also seems to weight Bing search rankings heavily — content that ranks well on Bing gets cited more often.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What doesn't work well:&lt;/strong&gt; New, unknown products without external validation. ChatGPT is conservative with recommendations. It won't recommend a product that has zero external mentions, no matter how good your GEO setup is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Specific observation:&lt;/strong&gt; ChatGPT's recommendations were more brand-focused than Perplexity's. It tended to list 5-6 established tools rather than 10+ including newer options.&lt;/p&gt;

&lt;h3&gt;
  
  
  Claude
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Most cautious.&lt;/strong&gt; Often declines to make specific product recommendations. Tends to present options without strong endorsements. "There are several tools including X, Y, and Z" rather than "The best tool is X." Seems to rely more on training data than real-time search for product knowledge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What works best:&lt;/strong&gt; Factual, well-structured content. Balanced comparisons. Avoid promotional language. Claude responds better to "here are the options" than "use this tool." It also seems to prefer content that presents multiple perspectives rather than a single "best" solution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What doesn't work well:&lt;/strong&gt; Anything that sounds like a sales pitch. Claude actively avoids endorsing specific products. It's the most "neutral" of the four systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Specific observation:&lt;/strong&gt; Claude was slowest to pick up changes — took 3-4 weeks vs 1-2 weeks for Perplexity. It seems to update its knowledge less frequently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gemini
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Most Google-integrated.&lt;/strong&gt; Heavily uses Google's own index. Content that ranks well in Google tends to be cited more by Gemini. Also uses structured data actively. If you're already ranking on page 1 of Google, Gemini is more likely to cite you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What works best:&lt;/strong&gt; Traditional SEO (Google ranking), structured data, Google-friendly content. The overlap between "good for Google" and "good for Gemini" is significant. If you're already doing well on Google, Gemini will pick you up naturally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What doesn't work well:&lt;/strong&gt; Content that's optimized for AI but not for Google. Gemini leans heavily on the Google index. If your content doesn't rank on Google, it's unlikely to be cited by Gemini.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Specific observation:&lt;/strong&gt; Gemini was the most responsive to structured data. After adding FAQPage schema, Gemini started citing my content within 5-7 days — faster than any other system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bottom Line
&lt;/h3&gt;

&lt;p&gt;Optimize for the common factors (good content, structured data, external signals) and you'll cover all four systems reasonably well. But if you had to pick one platform to optimize for first, I'd pick Perplexity — it's the most transparent and easiest to test.&lt;/p&gt;

&lt;p&gt;&lt;a id="competition"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Competition Problem
&lt;/h2&gt;

&lt;p&gt;Here's something most GEO articles won't tell you: &lt;strong&gt;in competitive niches, technical GEO alone won't get you recommended.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I tested in the SEO tools niche — one of the most competitive categories for AI recommendations. ChatGPT, Claude, and Perplexity all heavily favor established players (Ahrefs, SEMrush, Moz) regardless of what you do technically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Domain authority is the strongest signal, and it takes years to build. When AI systems choose between a new tool with perfect GEO and an established tool with mediocre GEO, they almost always pick the established tool. The reasoning is simple: established tools have more external validation, more reviews, more mentions, and more trust signals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The numbers:&lt;/strong&gt; I tracked 20 different queries across 4 platforms over 3 months. Established tools (Ahrefs, SEMrush, Moz) appeared in 85% of answers. My tool appeared in 30% of answers. The gap is significant but not insurmountable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this means:&lt;/strong&gt; GEO tactics are most effective for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Less competitive niches&lt;/strong&gt; — if few competitors have implemented GEO, you have a huge advantage. In the SEO tools niche, everyone has decent GEO. In a niche like "free CSS animation tools," GEO could make a real difference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long-tail queries&lt;/strong&gt; — "best free SEO audit tool for WordPress" is easier to win than "best SEO tool." The more specific the query, the less competition you face.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specific use cases&lt;/strong&gt; — "how to check Core Web Vitals for free" is more tractable than "what's the best SEO tool." Target use-case queries, not category queries.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What this also means:&lt;/strong&gt; Even in competitive niches, GEO tactics compound over time. The product I tested went from never being mentioned to being a regular recommendation over 3 months. It wasn't the #1 recommendation (Ahrefs and SEMrush hold that position), but being in the list at all is valuable. The key insight: you don't need to be #1 to get traffic. Being in the list at all exposes you to users who might not have found you otherwise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical advice:&lt;/strong&gt; If you're in a competitive niche, focus on long-tail queries and specific use cases first. Build up external signals (Reddit, GitHub, Product Hunt) while optimizing your technical GEO. The combination of targeted queries + external signals + structured content is more effective than any single tactic.&lt;/p&gt;

&lt;p&gt;&lt;a id="limitations"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Honest Limitations
&lt;/h2&gt;

&lt;p&gt;Let me be clear about what this article is and isn't:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This article IS:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A collection of tactics that showed observable results in my testing&lt;/li&gt;
&lt;li&gt;Based on publicly available information about how RAG systems work&lt;/li&gt;
&lt;li&gt;A practical guide you can implement in a few hours&lt;/li&gt;
&lt;li&gt;A detailed log of 47 specific tests with exact queries, dates, and outcomes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;This article ISN'T:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reverse-engineering of proprietary algorithms&lt;/li&gt;
&lt;li&gt;Guaranteed to work for every niche and product&lt;/li&gt;
&lt;li&gt;Based on insider knowledge from AI companies&lt;/li&gt;
&lt;li&gt;A comprehensive study with statistical significance (I'm one person testing one product)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I don't know:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The exact weight AI systems give to each factor&lt;/li&gt;
&lt;li&gt;How often AI models update their "knowledge" about products&lt;/li&gt;
&lt;li&gt;Whether these tactics will work as well in 6 months&lt;/li&gt;
&lt;li&gt;How AI systems handle competing recommendations in your specific niche&lt;/li&gt;
&lt;li&gt;Whether my results generalize to other industries and products&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I do know:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sites with good structure get cited more than sites without&lt;/li&gt;
&lt;li&gt;External signals (Reddit, GitHub) clearly matter for some niches&lt;/li&gt;
&lt;li&gt;FAQPage schema has a measurable impact on AI citations&lt;/li&gt;
&lt;li&gt;Blocking AI crawlers makes you invisible to AI chatbots&lt;/li&gt;
&lt;li&gt;The effect is real but modest — no single tactic transformed my results overnight&lt;/li&gt;
&lt;li&gt;Content structure matters more than most people think&lt;/li&gt;
&lt;li&gt;The ROI on technical GEO (robots.txt, schema, llms.txt) is high because the time investment is low&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The honest truth:&lt;/strong&gt; These tactics increase your chances of being cited by AI chatbots. There are no guarantees — especially in competitive niches. But if you're doing nothing right now, you're definitely leaving opportunities on the table. In competitive niches, domain authority and genuine external mentions matter more than any technical GEO tactic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I'd do differently:&lt;/strong&gt; If I were starting over, I'd focus on Reddit engagement + content structure first (highest impact, lowest cost), then add FAQPage schema and llms.txt. The order matters — external signals and content quality are more important than technical setup.&lt;/p&gt;

&lt;p&gt;&lt;a id="roi"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ROI: Is GEO Worth Your Time?
&lt;/h2&gt;

&lt;p&gt;Let's do the math. Here's the time investment vs potential return for each tactic:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tactic&lt;/th&gt;
&lt;th&gt;Time Investment&lt;/th&gt;
&lt;th&gt;Potential Return&lt;/th&gt;
&lt;th&gt;ROI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;robots.txt fix&lt;/td&gt;
&lt;td&gt;5 minutes&lt;/td&gt;
&lt;td&gt;Critical (binary: visible/invisible)&lt;/td&gt;
&lt;td&gt;Infinite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;llms.txt&lt;/td&gt;
&lt;td&gt;15 minutes&lt;/td&gt;
&lt;td&gt;Moderate (30% accuracy improvement)&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FAQPage schema&lt;/td&gt;
&lt;td&gt;1-2 hours&lt;/td&gt;
&lt;td&gt;High (2-3x more citations)&lt;/td&gt;
&lt;td&gt;Very High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content structure&lt;/td&gt;
&lt;td&gt;2 weeks (10 posts)&lt;/td&gt;
&lt;td&gt;High (measurable citation increase)&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reddit engagement&lt;/td&gt;
&lt;td&gt;4 weeks (3-4 posts/week)&lt;/td&gt;
&lt;td&gt;Moderate (correlated with citations)&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Organization schema&lt;/td&gt;
&lt;td&gt;30 minutes&lt;/td&gt;
&lt;td&gt;Low-Moderate (trust signal)&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The bottom line:&lt;/strong&gt; Technical GEO (robots.txt + llms.txt + schema) takes ~2 hours total and provides significant value. Content structure takes longer (2 weeks) but provides the most consistent results across all AI systems. The ROI is highest for technical GEO because the time investment is minimal and the potential upside is substantial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For bootstrapped founders:&lt;/strong&gt; Focus on the 2-hour technical setup first. It's the highest ROI activity. Then invest in content structure over the next 2 weeks. Reddit engagement is ongoing but low-effort (3-4 posts per week, 10-15 minutes each). Total time investment: ~20 hours over 1 month for potentially significant AI visibility improvement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For agencies:&lt;/strong&gt; Package GEO as a service. The 2-hour technical setup can be standardized and sold as a "GEO optimization" add-on to existing SEO services. Content structure requires more customization but can be templated. The monthly tracking template provides ongoing value and client reporting.&lt;/p&gt;

&lt;p&gt;&lt;a id="checklist"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Complete GEO Checklist (Must-Do vs Nice-to-Have)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Must-Do (Do These First — They're Free and Fast)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;robots.txt allows AI crawlers&lt;/strong&gt; — &lt;code&gt;User-agent: * Allow: /&lt;/code&gt; (5 minutes). Verify with &lt;a href="https://www.auditme.dev/robots-txt-checker" rel="noopener noreferrer"&gt;AuditMe robots.txt Checker&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;FAQPage schema on product/homepage&lt;/strong&gt; — 3-5 common questions (1-2 hours). Validate with &lt;a href="https://search.google.com/test/rich-results" rel="noopener noreferrer"&gt;Google Rich Results Test&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Organization JSON-LD on every page&lt;/strong&gt; (30 minutes). Include name, URL, logo, description, founding date, contact info.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;llms.txt at site root&lt;/strong&gt; — Under 500 words, essential info first (15 minutes). See &lt;a href="https://llmstxt.org" rel="noopener noreferrer"&gt;llmstxt.org&lt;/a&gt; for format.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Question-based H2/H3 headings&lt;/strong&gt; on key pages (varies). Convert "Title Tag Optimization" to "How Do I Optimize Title Tags for SEO?"&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Definition-style opening paragraphs&lt;/strong&gt; — First sentence answers the heading question (varies). "Core Web Vitals are three metrics that measure real-world user experience..."&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Nice-to-Have (Do These After the Basics Are Solid)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;llms-full.txt with detailed documentation&lt;/strong&gt; (1-2 hours). Extended version for developers and AI systems.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;SoftwareApplication schema&lt;/strong&gt; on product pages (30 minutes). Include name, description, applicationCategory, operatingSystem, pricing, review.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Content structure overhaul&lt;/strong&gt; — Convert paragraphs to lists (varies). Add question headings, definition-style openings, numbered lists, tables.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Reddit engagement&lt;/strong&gt; — Genuine answers in relevant subreddits (ongoing). 3-4 posts per week, 200-500 words each.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;GitHub repository&lt;/strong&gt; if developer tool (varies). README, docs, examples, issues.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Product Hunt launch&lt;/strong&gt; (one-time). Prepare assets, schedule for Tuesday-Thursday, engage in comments.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Technical articles&lt;/strong&gt; on DEV.to/Medium (ongoing). 2-4 articles per month, genuine expertise, not promotional.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;BreadcrumbList schema&lt;/strong&gt; for navigation (30 minutes). Helps AI understand site structure.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Verification
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Test llms.txt: &lt;code&gt;curl -I https://yoursite.com/llms.txt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Validate structured data: &lt;a href="https://search.google.com/test/rich-results" rel="noopener noreferrer"&gt;Google Rich Results Test&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Test in Perplexity: "best [category] tools" (check citations)&lt;/li&gt;
&lt;li&gt;[ ] Test in ChatGPT: "What is [your product]?"&lt;/li&gt;
&lt;li&gt;[ ] Test in Claude: Same questions&lt;/li&gt;
&lt;li&gt;[ ] Test in Gemini: Same questions&lt;/li&gt;
&lt;li&gt;[ ] Track results monthly — write down what AI says about you&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Monthly Tracking Template
&lt;/h3&gt;

&lt;p&gt;Create a simple spreadsheet with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Date&lt;/li&gt;
&lt;li&gt;Query tested&lt;/li&gt;
&lt;li&gt;Platform (Perplexity, ChatGPT, Claude, Gemini)&lt;/li&gt;
&lt;li&gt;Result (cited, not cited, position)&lt;/li&gt;
&lt;li&gt;Notes (what changed since last test)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gives you longitudinal data to track progress and identify patterns.&lt;/p&gt;

&lt;p&gt;&lt;a id="tools"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Free Tools I Used
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.perplexity.ai" rel="noopener noreferrer"&gt;Perplexity&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Test AI citations (shows sources)&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://chatgpt.com" rel="noopener noreferrer"&gt;ChatGPT&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Test product recommendations&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://claude.ai" rel="noopener noreferrer"&gt;Claude&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Test product recommendations&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://gemini.google.com" rel="noopener noreferrer"&gt;Gemini&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Test product recommendations&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://search.google.com/test/rich-results" rel="noopener noreferrer"&gt;Google Rich Results Test&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Validate structured data&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://validator.schema.org/" rel="noopener noreferrer"&gt;Schema.org Validator&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;JSON-LD syntax check&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.auditme.dev" rel="noopener noreferrer"&gt;AuditMe&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Full SEO analysis + AI visibility check&lt;/td&gt;
&lt;td&gt;Free (1/day)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.auditme.dev/robots-txt-checker" rel="noopener noreferrer"&gt;AuditMe robots.txt Checker&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Validate robots.txt&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.auditme.dev/json-ld-checker" rel="noopener noreferrer"&gt;AuditMe JSON-LD Checker&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Structured data audit&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pagespeed.web.dev/" rel="noopener noreferrer"&gt;PageSpeed Insights&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Core Web Vitals testing&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://curl.se/" rel="noopener noreferrer"&gt;curl&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Check llms.txt accessibility&lt;/td&gt;
&lt;td&gt;Free (CLI)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.screamingfrog.co.uk/" rel="noopener noreferrer"&gt;Screaming Frog&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Full site SEO crawl&lt;/td&gt;
&lt;td&gt;Free (500 URLs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://search.google.com/search-console" rel="noopener noreferrer"&gt;Google Search Console&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Track search performance&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.bing.com/webmasters" rel="noopener noreferrer"&gt;Bing Webmaster Tools&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Track Bing performance&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; AuditMe is my product — I'm biased. But it genuinely does what I needed for testing. Other tools like Screaming Frog, Ahrefs, and SEMrush also work for parts of this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How I used each tool:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Perplexity:&lt;/strong&gt; Primary testing platform — shows citations directly, easiest to track&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ChatGPT:&lt;/strong&gt; Secondary testing — less transparent but most popular&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude:&lt;/strong&gt; Tertiary testing — most cautious, good for understanding "neutral" AI perspective&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini:&lt;/strong&gt; Google-integrated testing — useful for understanding Google AI Overlaps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Rich Results Test:&lt;/strong&gt; Validate FAQPage, Organization, SoftwareApplication schemas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schema.org Validator:&lt;/strong&gt; Catch syntax errors that Google Rich Results Test misses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AuditMe:&lt;/strong&gt; Full SEO audit + AI visibility check in one tool&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PageSpeed Insights:&lt;/strong&gt; Core Web Vitals testing — slow pages get skipped by AI crawlers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;curl:&lt;/strong&gt; Quick check that llms.txt is accessible (200 OK, not 404)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screaming Frog:&lt;/strong&gt; Full site crawl to find schema errors, broken links, missing meta tags&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Search Console:&lt;/strong&gt; Track which queries drive traffic — use these for FAQPage schema&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bing Webmaster Tools:&lt;/strong&gt; ChatGPT uses Bing — important to track Bing performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a id="future"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where This Is Heading (2026-2027)
&lt;/h2&gt;

&lt;p&gt;These are predictions, not facts. Take them with appropriate skepticism.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. GEO Will Become Standard Practice
&lt;/h3&gt;

&lt;p&gt;Right now, GEO is a competitive advantage. Within 12-18 months, it will be table stakes. The sites that implement GEO now will have a compounding advantage. Think of it like mobile-first indexing in 2015 — early adopters benefited, but eventually everyone had to adapt.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. AI Search Will Grow, But Google Won't Die
&lt;/h3&gt;

&lt;p&gt;AI chatbots will take significant share for research queries. But Google will remain dominant for navigational queries ("go to Amazon") and local searches ("restaurants near me"). The smart play is optimizing for both. Most GEO tactics also improve traditional SEO — it's not an either/or choice.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. llms.txt Will Either Take Off or Die
&lt;/h3&gt;

&lt;p&gt;llms.txt is at an inflection point. If major AI systems start actively using it, it becomes essential. If they don't, it fades. Implement now — cost is low (15 minutes), potential upside is high. The standard is gaining traction — llmstxt.org has growing adoption.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. AI Will Get Better at Evaluating Quality
&lt;/h3&gt;

&lt;p&gt;Right now, AI systems often cite whatever has the best structure. As they improve, they'll get better at evaluating actual content quality. Sites with genuine expertise will beat sites with SEO-optimized filler. This means: invest in real content, not just structured content.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. The GEO Tool Category Will Emerge
&lt;/h3&gt;

&lt;p&gt;Just as SEO tools emerged in the 2010s, GEO tools will emerge in 2026-2027. We'll see platforms for tracking AI visibility and optimizing for AI extraction. AuditMe is already moving in this direction with its AI visibility checks.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Multi-Modal AI Changes Everything
&lt;/h3&gt;

&lt;p&gt;When AI systems can process images, videos, and audio alongside text, GEO will expand to include visual and video optimization. Sites with well-structured multimedia content will have an advantage. Start thinking about image alt text, video transcripts, and structured data for media now.&lt;/p&gt;

&lt;p&gt;&lt;a id="faq"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is GEO?
&lt;/h3&gt;

&lt;p&gt;GEO (Generative Engine Optimization) is the practice of optimizing your website so AI-powered answer engines like ChatGPT, Claude, Perplexity, and Gemini cite it when users ask questions. It's complementary to traditional SEO — you don't replace SEO with GEO, you add GEO on top of it.&lt;/p&gt;

&lt;h3&gt;
  
  
  How is GEO different from SEO?
&lt;/h3&gt;

&lt;p&gt;Traditional SEO targets search engine result pages (10 blue links). GEO targets AI-generated answers. The two overlap — good SEO helps GEO — but GEO has its own signals: llms.txt, structured data, content structure, and external authority signals. The biggest difference: GEO is about being cited in AI answers, not ranking in search results.&lt;/p&gt;

&lt;h3&gt;
  
  
  How long does it take for AI to start citing my site?
&lt;/h3&gt;

&lt;p&gt;It depends on the system. Perplexity can pick up changes within days (fastest). ChatGPT takes 2-3 weeks. Claude and Gemini are slower (3-4 weeks). RAG-based systems are faster than training-based systems. The key insight: RAG systems can pick up changes in days, but training-based updates take months.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is GEO worth the effort?
&lt;/h3&gt;

&lt;p&gt;If you're in a niche where AI chatbots are recommending products — yes. If people still primarily use Google — traditional SEO might be more impactful. The best approach is doing both. GEO tactics also improve traditional SEO, so it's not wasted effort even if AI search doesn't take off as fast as predicted.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's the single most impactful GEO tactic?
&lt;/h3&gt;

&lt;p&gt;From my testing: &lt;strong&gt;FAQPage schema combined with structured content that answers questions directly.&lt;/strong&gt; This gave the most consistent results across all AI systems. The combination of structured data + content structure creates a "double signal" that AI systems respond to.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I track if AI is citing my site?
&lt;/h3&gt;

&lt;p&gt;Yes, with difficulty. Perplexity shows citations directly (easiest to track). ChatGPT shows some in the paid tier. For Claude and Gemini, ask directly and check. The best approach: ask AI chatbots about your product monthly and track results in a spreadsheet. Use the monthly tracking template in the checklist section.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I start from zero?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Add &lt;code&gt;User-agent: * Allow: /&lt;/code&gt; to robots.txt (5 min)&lt;/li&gt;
&lt;li&gt;Create llms.txt at site root (15 min)&lt;/li&gt;
&lt;li&gt;Add FAQPage schema to your homepage (1-2 hours)&lt;/li&gt;
&lt;li&gt;Restructure your best content with question headings and lists (varies)&lt;/li&gt;
&lt;li&gt;Start engaging genuinely on Reddit (ongoing)&lt;/li&gt;
&lt;li&gt;Test monthly in Perplexity, ChatGPT, Claude, and Gemini&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The order matters: robots.txt + llms.txt first (5 minutes total), then FAQPage schema (1-2 hours), then content structure (varies), then external signals (ongoing).&lt;/p&gt;

&lt;h3&gt;
  
  
  What if my competitors haven't implemented GEO?
&lt;/h3&gt;

&lt;p&gt;You have a huge advantage. In less competitive niches, GEO tactics can make a real difference. Focus on structured content, FAQPage schema, and llms.txt. If your competitors are already doing GEO, you need to combine technical GEO with external signals (Reddit, GitHub, Product Hunt) to compete.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does GEO work for local businesses?
&lt;/h3&gt;

&lt;p&gt;It depends. If people ask ChatGPT "what's the best coffee shop in [city]?" — yes, GEO matters. But most local searches still go through Google Maps and Yelp. Focus on Google Business Profile + traditional local SEO first, then add GEO as a secondary channel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;The GEO playbook is straightforward but not magic:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open robots.txt&lt;/strong&gt; — Let AI crawlers access your content (5 minutes)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add FAQPage schema&lt;/strong&gt; — The most impactful structured data (1-2 hours)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create llms.txt&lt;/strong&gt; — Quick win, no downside (15 minutes)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structure content for AI extraction&lt;/strong&gt; — Question headings, lists, definition-style openings (varies)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build external signals&lt;/strong&gt; — Reddit, GitHub, Product Hunt (genuine engagement, ongoing)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;These tactics increase your chances of being cited by AI chatbots.&lt;/strong&gt; There are no guarantees — especially in competitive niches where domain authority dominates. But if you're doing nothing right now, you're leaving opportunities on the table. In less competitive niches, these tactics can give you a significant advantage over competitors who haven't implemented them yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned from 47 tests:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FAQPage schema had the biggest measurable impact (2-3x more citations)&lt;/li&gt;
&lt;li&gt;Content structure mattered more than expected (AI extracts lists better than paragraphs)&lt;/li&gt;
&lt;li&gt;External signals (Reddit, GitHub) correlated with citations in consumer/developer niches&lt;/li&gt;
&lt;li&gt;Perplexity was the most transparent and easiest to test&lt;/li&gt;
&lt;li&gt;The effect is real but modest — no single tactic transformed results overnight&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The landscape is shifting. AI search is growing. The sites that adapt now will benefit the most as this trend accelerates. Start with the 5-step playbook, test monthly, and iterate based on what you observe.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Found this useful? Share it with someone building a product that needs AI visibility. Follow me for more practical tests on AI, SEO, and product growth.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Have questions or different results from your own testing? Drop them in the comments — I'm genuinely curious what's working for others.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tools mentioned: &lt;a href="https://www.perplexity.ai" rel="noopener noreferrer"&gt;Perplexity&lt;/a&gt;, &lt;a href="https://chatgpt.com" rel="noopener noreferrer"&gt;ChatGPT&lt;/a&gt;, &lt;a href="https://claude.ai" rel="noopener noreferrer"&gt;Claude&lt;/a&gt;, &lt;a href="https://gemini.google.com" rel="noopener noreferrer"&gt;Gemini&lt;/a&gt;, &lt;a href="https://www.auditme.dev" rel="noopener noreferrer"&gt;AuditMe&lt;/a&gt;, &lt;a href="https://schema.org" rel="noopener noreferrer"&gt;Schema.org&lt;/a&gt;, &lt;a href="https://llmstxt.org" rel="noopener noreferrer"&gt;llmstxt.org&lt;/a&gt;, &lt;a href="https://search.google.com/test/rich-results" rel="noopener noreferrer"&gt;Google Rich Results Test&lt;/a&gt;, &lt;a href="https://pagespeed.web.dev/" rel="noopener noreferrer"&gt;PageSpeed Insights&lt;/a&gt;, &lt;a href="https://www.screamingfrog.co.uk/" rel="noopener noreferrer"&gt;Screaming Frog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>ai</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Master Technical SEO, Core Web Vitals, and the 12-Point Audit Checklist for 2026</title>
      <dc:creator>Eduard</dc:creator>
      <pubDate>Sat, 22 Aug 2026 19:12:36 +0000</pubDate>
      <link>https://dev.to/edo911/master-technical-seo-core-web-vitals-and-the-12-point-audit-checklist-for-2026-32oi</link>
      <guid>https://dev.to/edo911/master-technical-seo-core-web-vitals-and-the-12-point-audit-checklist-for-2026-32oi</guid>
      <description>&lt;p&gt;Table of Contents&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How to Use This Guide&lt;/li&gt;
&lt;li&gt;What Is an SEO Audit and Why Do You Need One in 2026&lt;/li&gt;
&lt;li&gt;Why Regular Audits Matter More Than Ever&lt;/li&gt;
&lt;li&gt;The 12-Point SEO Audit Checklist&lt;/li&gt;
&lt;li&gt;Advanced: Expert-Level Audit Techniques&lt;/li&gt;
&lt;li&gt;Prioritizing Your Fixes&lt;/li&gt;
&lt;li&gt;Tools I Actually Use&lt;/li&gt;
&lt;li&gt;Preparing for AI-Powered Search&lt;/li&gt;
&lt;li&gt;Case Studies&lt;/li&gt;
&lt;li&gt;How AI Is Changing SEO Audits&lt;/li&gt;
&lt;li&gt;Next Steps&lt;/li&gt;
&lt;li&gt;FAQ&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to Use This Guide
&lt;/h2&gt;

&lt;p&gt;I've been doing SEO audits professionally since 2018. I've audited over 300 websites — from two-page plumbing company sites to 50,000-page e-commerce platforms running on Shopify, WordPress, and custom stacks. This guide is the distilled version of everything I've learned, organized as a step-by-step process you can follow even if you've never run an audit before.&lt;/p&gt;

&lt;p&gt;You can use this guide two ways. First, run our free tool at the top of this page — it covers every checklist point below in under 60 seconds. Second, follow the manual steps I lay out if you want to understand what the tool is doing and why each check matters.&lt;/p&gt;

&lt;p&gt;Bookmark this page. I update it whenever Google changes something significant, which in 2026 happens roughly every six to eight weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is an SEO Audit and Why Do You Need One in 2026
&lt;/h2&gt;

&lt;p&gt;An SEO audit is a structured evaluation of everything that affects how your website appears in search results. That includes technical performance, content quality, backlink health, user experience signals, and now — for the first time — how well your content answers questions that AI systems pull from.&lt;/p&gt;

&lt;p&gt;Think of it like a medical checkup. You might feel fine, but blood work can catch high cholesterol, vitamin deficiencies, or early signs of diabetes before you notice any symptoms. An SEO audit does the same thing for your website. Traffic can be declining for months and you might not realize it because you're still getting some leads. By the time you notice, competitors have already taken your positions.&lt;/p&gt;

&lt;p&gt;According to a &lt;a href="https://ahrefs.com/blog/seo-statistics/" rel="noopener noreferrer"&gt;2024 Ahrefs study&lt;/a&gt;, 68.3% of all web traffic starts with a search engine. That number hasn't changed much in five years despite all the talk about social media replacing Google. What HAS changed is how competitive every keyword has become. Ten years ago you could throw up a 500-word page with a few keywords and rank. Today, the top 10 results for any commercial keyword are typically long-form, well-structured pages backed by genuine expertise.&lt;/p&gt;

&lt;p&gt;The scope of what an audit covers has expanded too. In 2020, you could check meta tags, run a speed test, and call it done. In 2026 you need to consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Core Web Vitals — LCP, INP, and CLS are direct ranking factors. Google published the thresholds at &lt;a href="https://web.dev/articles/vitals" rel="noopener noreferrer"&gt;web.dev/vitals&lt;/a&gt;: LCP under 2.5s, INP under 200ms, CLS under 0.1. For a deep dive into fixing these, see our &lt;a href="https://www.auditme.dev/blog/core-web-vitals-checklist-2026" rel="noopener noreferrer"&gt;Core Web Vitals checklist for 2026&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;  E-E-A-T signals — Experience, Expertise, Authoritativeness, and Trustworthiness. Google's &lt;a href="https://static.googleusercontent.com/media/guidelines.raterhub.com/en//searchqualityevaluatorguidelines.pdf" rel="noopener noreferrer"&gt;Search Quality Rater Guidelines&lt;/a&gt; (a 176-page PDF) spell out exactly what these mean. Google's own documentation on &lt;a href="https://developers.google.com/search/docs/fundamentals/creating-helpful-content" rel="noopener noreferrer"&gt;creating helpful content&lt;/a&gt; explains how E-E-A-T influences rankings. Yes, it's dense. Yes, it's worth reading.&lt;/li&gt;
&lt;li&gt;  AI Overviews — Google's AI-generated answers now appear on roughly 30% of search results according to &lt;a href="https://searchengineland.com/google-ai-overviews-usage-statistics-434062" rel="noopener noreferrer"&gt;Search Engine Land&lt;/a&gt;. Google's documentation on &lt;a href="https://developers.google.com/search/docs/ai-features/overview" rel="noopener noreferrer"&gt;AI Overviews&lt;/a&gt; explains how content gets cited. If your content can't be cited by an AI system, you're invisible to a growing chunk of searchers.&lt;/li&gt;
&lt;li&gt;  Structured data — Schema markup is no longer optional. It's how you get featured snippets, FAQ dropdowns, product carousels, and how-to panels. Google's official &lt;a href="https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data" rel="noopener noreferrer"&gt;structured data documentation&lt;/a&gt; explains how it works. For common mistakes to avoid, read our &lt;a href="https://www.auditme.dev/blog/faq-schema-usage-mistakes" rel="noopener noreferrer"&gt;FAQ schema usage mistakes guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;  Content decay — Google's &lt;a href="https://developers.google.com/search/docs/fundamentals/creating-helpful-content" rel="noopener noreferrer"&gt;Helpful Content system&lt;/a&gt; actively demotes content written primarily for search engines rather than humans. If your blog reads like it was generated by a keyword tool, it's probably being suppressed. Our &lt;a href="https://www.auditme.dev/blog/content-refresh-strategy-keeping-old-articles-ranking-2026" rel="noopener noreferrer"&gt;content refresh strategy guide&lt;/a&gt; shows how to keep old content performing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I made the mistake of underestimating E-E-A-T in 2023. I had a client — a financial advice blog — where every article was technically perfect. Perfect keywords, perfect internal linking, perfect schema. But none of it mentioned who actually wrote the articles. No author bios, no credentials, no LinkedIn profiles. Google's algorithm basically said "we have no reason to trust this content" and pushed us below sites with half the technical quality but real, named experts writing under their own names. We lost 55% of organic traffic in six months. Fixing it cost more than the original audit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Regular Audits Matter More Than Ever
&lt;/h2&gt;

&lt;p&gt;Google made &lt;a href="https://www.searchenginejournal.com/google-algorithm-history/" rel="noopener noreferrer"&gt;4,725 search algorithm changes in 2023&lt;/a&gt; (tracked by Search Engine Journal). In 2024 they stopped reporting the exact number, which tells you something about where things are heading. The pace of change is accelerating, not slowing down. Barry Schwartz at &lt;a href="https://www.searchengineroundtable.com/" rel="noopener noreferrer"&gt;Search Engine Roundtable&lt;/a&gt; has documented every confirmed update since 2003 — his archive is the definitive historical record.&lt;/p&gt;

&lt;p&gt;Here's a scenario I see constantly. A site owner runs an audit in March, fixes a bunch of stuff, watches rankings improve, and then doesn't look at their site again until October. By then, three things have happened: Google rolled out updates that changed what "good" looks like, a competitor improved their site and leapfrogged them, and technical issues crept in — broken links, slow pages, expired SSL certificates, JavaScript errors after a plugin update.&lt;/p&gt;

&lt;p&gt;The cost of catching problems early versus late is dramatic. I tracked this across 20 client engagements in 2025:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1zpnspocx3tqgc4lk073.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1zpnspocx3tqgc4lk073.png" alt=" " width="791" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A quarterly audit costs maybe four hours of work. Skipping audits for a year can cost months of lost revenue and thousands in recovery.&lt;/p&gt;

&lt;p&gt;Resources for staying on top of changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://status.search.google.com/products/rGHU1u7sCpMc5xPoim2e/history" rel="noopener noreferrer"&gt;Google Search Status Dashboard&lt;/a&gt; — official incident reports for ranking updates&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.searchengineroundtable.com/" rel="noopener noreferrer"&gt;Search Engine Roundtable&lt;/a&gt; — Barry Schwartz has tracked every Google update since 2003. Single best source for staying informed.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://developers.google.com/search/blog" rel="noopener noreferrer"&gt;Google Search Central Blog&lt;/a&gt; — official announcements. Dense but authoritative.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://moz.com/google-algorithm-change" rel="noopener noreferrer"&gt;Moz Google Algorithm History&lt;/a&gt; — comprehensive archive going back to 2000&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The 12-Point SEO Audit Checklist
&lt;/h2&gt;

&lt;p&gt;Here's the checklist I use on every single audit. Each section tells you what to check, how to check it, what tools to use, and how to prioritize the fix. Priority levels: HIGH = fix this week, MEDIUM = fix this month, LOW = fix this quarter.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Meta Titles — Priority: HIGH
&lt;/h3&gt;

&lt;p&gt;Your title tag is the single most important on-page SEO element. It's the first thing people see in search results and one of the strongest signals &lt;a href="https://developers.google.com/search/docs/appearance/title-link" rel="noopener noreferrer"&gt;Google uses to understand what your page is about&lt;/a&gt;. Google's documentation on title links explains exactly how they generate and display titles in search results.&lt;/p&gt;

&lt;p&gt;What to check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Length: 50-60 characters. Google truncates titles over 60 characters on desktop and even shorter on mobile. &lt;a href="https://moz.com/learn/seo/title-tag" rel="noopener noreferrer"&gt;Moz's title tag guide&lt;/a&gt; has current character limits.&lt;/li&gt;
&lt;li&gt;  Keyword placement: Primary keyword within the first 40 characters. Google gives more weight to early words — not speculation, just how tokenization works.&lt;/li&gt;
&lt;li&gt;  Uniqueness: Every page needs a unique title. Duplicate titles confuse crawlers and they'll pick one — probably not the one you want.&lt;/li&gt;
&lt;li&gt;  Branding: Brand name at the end, separated by a pipe or dash. Don't waste character space upfront unless you're a household name.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How to check: Crawl your site with &lt;a href="https://www.screamingfrog.co.uk/seo-spider/" rel="noopener noreferrer"&gt;Screaming Frog&lt;/a&gt; (free for 500 URLs). Export Title 1 and Title Length columns. Sort by length, flag anything over 60. Sort alphabetically to find duplicates. Takes about 15 minutes and catches 80% of title issues.&lt;/p&gt;

&lt;p&gt;Real example: I audited a 300-page e-commerce site where the developer used one title template for every product: "Product Name | Store Name." No keywords, no category context, nothing. We rewrote titles to include category and a key feature — "Men's Running Shoes - Lightweight Breathable | Store Name" instead of just "Shoes | Store Name." Organic traffic to product pages increased 34% within 60 days. One afternoon of work.&lt;/p&gt;

&lt;p&gt;Tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.screamingfrog.co.uk/" rel="noopener noreferrer"&gt;Screaming Frog SEO Spider&lt;/a&gt; — free up to 500 URLs, best technical audit tool available&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.seominion.com/" rel="noopener noreferrer"&gt;SEO Minion&lt;/a&gt; — free Chrome extension, check titles without viewing source&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://ahrefs.com/site-audit" rel="noopener noreferrer"&gt;Ahrefs Site Audit&lt;/a&gt; — cloud-based, tracks issues over time&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Meta Descriptions — Priority: MEDIUM
&lt;/h3&gt;

&lt;p&gt;Meta descriptions don't directly affect rankings — &lt;a href="https://developers.google.com/search/docs/appearance/snippet#meta-descriptions" rel="noopener noreferrer"&gt;Google confirmed this in 2022&lt;/a&gt; and &lt;a href="https://searchengineland.com/google-meta-description-tags-not-a-ranking-factor-but-still-matter-437689" rel="noopener noreferrer"&gt;reiterated in 2024&lt;/a&gt;. But they absolutely affect &lt;a href="https://developers.google.com/search/docs/appearance/snippet" rel="noopener noreferrer"&gt;click-through rates&lt;/a&gt;, and CTR is a &lt;a href="https://patents.google.com/patent/US10417293B2/en" rel="noopener noreferrer"&gt;ranking signal according to Google's own patents&lt;/a&gt;. So indirectly? They matter a lot.&lt;/p&gt;

&lt;p&gt;What to check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Length: 150-160 characters. Longer gets truncated.&lt;/li&gt;
&lt;li&gt;  CTA: Every description should include an action phrase — "Learn how to," "Get your free," "Compare plans."&lt;/li&gt;
&lt;li&gt;  Keyword match: Target keyword appearing naturally. When it matches the search query, Google bolds it in results.&lt;/li&gt;
&lt;li&gt;  Uniqueness: Never copy the same description across multiple pages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How to check: Screaming Frog export — Meta Description 1 and Meta Description Length columns. Filter for empty descriptions first (biggest wins), then look for duplicates.&lt;/p&gt;

&lt;p&gt;Real example: A SaaS client had 15 feature pages all saying "A powerful tool for your business." We rewrote each to highlight specific benefits — "Automate your invoicing in 3 clicks — save 5 hours per week" for the invoicing page. Click-through rates increased 22% across those 15 pages within a month.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Heading Hierarchy — Priority: MEDIUM
&lt;/h3&gt;

&lt;p&gt;H1 through H6 should form a logical outline — like a table of contents for users and crawlers. &lt;a href="https://developers.google.com/search/docs/fundamentals/helpful-content#use-headings-to-communicate-what-your-page-is-about" rel="noopener noreferrer"&gt;Google's documentation on headings&lt;/a&gt; explains that headings help Google understand the structure and hierarchy of your content.&lt;/p&gt;

&lt;p&gt;What to check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Exactly one H1 per page that matches search intent&lt;/li&gt;
&lt;li&gt;  H2s divide major sections, H3s subdivide those&lt;/li&gt;
&lt;li&gt;  Never skip levels (H1 straight to H3 confuses crawlers)&lt;/li&gt;
&lt;li&gt;  Headings should be descriptive, not stuffed with keywords&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How to check: Use &lt;a href="https://github.com/georgerbox/headingsmap" rel="noopener noreferrer"&gt;HeadingsMap&lt;/a&gt; (free browser extension) to visualize heading structure. Or Screaming Frog's built-in heading analysis.&lt;/p&gt;

&lt;p&gt;Common mistake: People use headings as styling tools. They want bold text so they make it an H2 even though it's not a section heading. Headings define document structure, not visual appearance. Use CSS for styling.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Core Web Vitals — Priority: HIGH
&lt;/h3&gt;

&lt;p&gt;Google uses three metrics to measure real user experience. These are direct ranking factors — not nice-to-haves. Thresholds at &lt;a href="https://web.dev/articles/vitals" rel="noopener noreferrer"&gt;web.dev/vitals&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The three metrics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  LCP (Largest Contentful Paint): Under 2.5 seconds. How long main content takes to load. Common culprits: unoptimized images, slow server, render-blocking JS, web fonts delaying text.&lt;/li&gt;
&lt;li&gt;  INP (Interaction to Next Paint): Under 200ms. &lt;a href="https://developers.google.com/blog/2024/03/inp-replaces-fid-in-march-2024" rel="noopener noreferrer"&gt;Replaced First Input Delay in March 2024&lt;/a&gt; per Google's official announcement. Measures responsiveness to ALL interactions, not just the first one. Heavy JavaScript is usually to blame.&lt;/li&gt;
&lt;li&gt;  CLS (Cumulative Layout Shift): Under 0.1. Visual stability — how much the layout jumps while loading. Caused by images without dimensions, late-loading ads, dynamically injected content.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How to check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://pagespeed.web.dev/" rel="noopener noreferrer"&gt;PageSpeed Insights&lt;/a&gt; — free, gives both lab data and real user data from CrUX. Google's &lt;a href="https://developers.google.com/speed/docs/insights/v5/about" rel="noopener noreferrer"&gt;PageSpeed Insights documentation&lt;/a&gt; explains the difference between lab and field data.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://search.google.com/search-console/" rel="noopener noreferrer"&gt;Search Console Core Web Vitals&lt;/a&gt; — real user data across all pages, broken by device. &lt;a href="https://developers.google.com/search/docs/performance/core-web-vitals" rel="noopener noreferrer"&gt;Google's CWV documentation&lt;/a&gt; explains how each metric is measured.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://developer.chrome.com/docs/crux/" rel="noopener noreferrer"&gt;Chrome UX Report&lt;/a&gt; — the raw data source Google uses. Free API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Important distinction: Lab data from Lighthouse simulates a load on a controlled device. Field data from CrUX comes from real Chrome users. Google uses field data for rankings. Always prioritize field data.&lt;/p&gt;

&lt;p&gt;What actually works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Serve images in WebP/AVIF — 30-50% smaller with no visible quality loss. Use &lt;a href="https://squoosh.app/" rel="noopener noreferrer"&gt;Squoosh&lt;/a&gt; (free, by Google).&lt;/li&gt;
&lt;li&gt;  Preload critical resources — use a preload link tag for your LCP image and critical CSS to cut LCP by 0.5-1s.&lt;/li&gt;
&lt;li&gt;  Defer non-critical JS — move analytics, chat widgets, ad scripts to load after main content.&lt;/li&gt;
&lt;li&gt;  Use a CDN — &lt;a href="https://www.cloudflare.com/" rel="noopener noreferrer"&gt;Cloudflare&lt;/a&gt; has a free tier. &lt;a href="https://bunny.net/" rel="noopener noreferrer"&gt;BunnyCDN&lt;/a&gt; starts at $1/month.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Structured Data and Schema Markup — Priority: HIGH
&lt;/h3&gt;

&lt;p&gt;Schema helps search engines understand content and triggers rich results. Google's &lt;a href="https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data" rel="noopener noreferrer"&gt;structured data documentation&lt;/a&gt; explains the full specification and supported types. In 2026, it's also how &lt;a href="https://developers.google.com/search/docs/ai-features/overview" rel="noopener noreferrer"&gt;AI systems identify your content as authoritative&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Essential schemas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Organization — company name, logo, social profiles. &lt;a href="https://schema.org/Organization" rel="noopener noreferrer"&gt;schema.org/Organization&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  WebPage — basic page metadata. Include datePublished and dateModified.&lt;/li&gt;
&lt;li&gt;  Article — for blog posts. Include author, publisher, dates.&lt;/li&gt;
&lt;li&gt;  FAQPage — for Q&amp;amp;A content. Shows as expandable dropdowns in search.&lt;/li&gt;
&lt;li&gt;  Product — for e-commerce. Include name, description, image, offers, aggregateRating.&lt;/li&gt;
&lt;li&gt;  BreadcrumbList — helps Google understand site hierarchy. Shows in search results.&lt;/li&gt;
&lt;li&gt;  LocalBusiness — for physical locations. Include address, hours, geo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How to check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://search.google.com/test/rich-results" rel="noopener noreferrer"&gt;Google Rich Results Test&lt;/a&gt; — paste URL, see extractable rich results. &lt;a href="https://developers.google.com/search/docs/appearance/structured-data/testing-tool" rel="noopener noreferrer"&gt;Google's documentation&lt;/a&gt; explains what each rich result type requires.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://validator.schema.org/" rel="noopener noreferrer"&gt;Schema.org Validator&lt;/a&gt; — validates against the official &lt;a href="https://schema.org/docs/documents.html" rel="noopener noreferrer"&gt;Schema.org vocabulary&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Search Console Enhancements tab — shows schema errors site-wide&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://technicalseo.com/tools/schema-markup-generator/" rel="noopener noreferrer"&gt;Merkle Schema Generator&lt;/a&gt; — free code generator&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Real example: We added FAQPage schema to 40 high-traffic pages. Within three weeks, 28 showed FAQ dropdowns in search results. CTR increased an average of 15%. Pages with HowTo schema added another 8-12% CTR boost. Total implementation: about two hours.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Indexation and Crawlability — Priority: HIGH
&lt;/h3&gt;

&lt;p&gt;If Google can't find your pages, it can't rank them. This is the most fundamental check and the most commonly botched. For a deeper dive into server log analysis, see our &lt;a href="https://www.auditme.dev/blog/javascript-seo-rendering-indexing" rel="noopener noreferrer"&gt;JavaScript SEO rendering guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What to check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  robots.txt — not blocking important pages (or JS/CSS files Google needs to render). Google's &lt;a href="https://developers.google.com/search/docs/crawling-indexing/robots-intro" rel="noopener noreferrer"&gt;robots.txt documentation&lt;/a&gt; explains every directive. Our &lt;a href="https://www.auditme.dev/blog/robots-txt-guide-2026" rel="noopener noreferrer"&gt;robots.txt guide for 2026&lt;/a&gt; explains every directive.&lt;/li&gt;
&lt;li&gt;  XML sitemap — submitted in Search Console, all URLs return 200s, no noindexed/redirected URLs included. Google's &lt;a href="https://developers.google.com/search/docs/crawling-indexing/sitemaps/overview" rel="noopener noreferrer"&gt;sitemap documentation&lt;/a&gt; covers format, submission, and best practices. Use our &lt;a href="https://www.auditme.dev/full-crawl" rel="noopener noreferrer"&gt;full site crawl tool&lt;/a&gt; to verify every URL in your sitemap is actually reachable.&lt;/li&gt;
&lt;li&gt;  Noindex tags — no important pages have a noindex meta tag. Google's &lt;a href="https://developers.google.com/search/docs/crawling-indexing/control-index-page-meta-tags" rel="noopener noreferrer"&gt;noindex documentation&lt;/a&gt; explains how the directive works. Happens often after CMS migrations or plugin updates. WordPress users should check our &lt;a href="https://www.auditme.dev/blog/wordpress-seo-audit-checklist-2026" rel="noopener noreferrer"&gt;WordPress SEO audit checklist&lt;/a&gt; for platform-specific gotchas.&lt;/li&gt;
&lt;li&gt;  Canonical tags — self-referencing on every page unless there's a specific reason otherwise. Google's &lt;a href="https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls" rel="noopener noreferrer"&gt;canonical tag documentation&lt;/a&gt; covers when to use them and common mistakes. Canonicals pointing to 404s or redirects cause deindexation. Our &lt;a href="https://www.auditme.dev/blog/canonical-tags-guide-2026" rel="noopener noreferrer"&gt;canonical tags guide&lt;/a&gt; covers the five most common mistakes.&lt;/li&gt;
&lt;li&gt;  HTTP status codes — crawl and flag 4xx/5xx errors. Learn the difference between every status code in our &lt;a href="https://www.auditme.dev/blog/http-status-codes-seo-301-302-404-410" rel="noopener noreferrer"&gt;HTTP status codes SEO guide&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How to check: &lt;a href="https://www.screamingfrog.co.uk/" rel="noopener noreferrer"&gt;Screaming Frog&lt;/a&gt; is the gold standard. &lt;a href="https://developers.google.com/search/docs/crawling-indexing/overview-googlebot" rel="noopener noreferrer"&gt;Google's Search Console documentation&lt;/a&gt; explains how to monitor crawl activity. Export reports for response codes, canonicals, noindex tags, robots directives, sitemap contents. Cross-reference to find mismatches.&lt;/p&gt;

&lt;p&gt;Advanced: Compare sitemap URLs against crawl data. Every URL in your sitemap should be crawlable, indexable, and return 200. Anything else needs fixing or removal. If you're running a large site with 10,000+ URLs, our &lt;a href="https://www.auditme.dev/full-crawl" rel="noopener noreferrer"&gt;full site crawl&lt;/a&gt; automates this entire process.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Internal Linking — Priority: MEDIUM
&lt;/h3&gt;

&lt;p&gt;Internal links distribute authority and help crawlers discover content. &lt;a href="https://developers.google.com/search/docs/crawling-indexing/links" rel="noopener noreferrer"&gt;Google's documentation on internal links&lt;/a&gt; explains how they discover and evaluate internal links. This is one of the most underrated SEO levers — most sites fixate on backlinks while ignoring the linking structure they fully control. For advanced silo strategies, see our &lt;a href="https://www.auditme.dev/blog/internal-links-complete-seo-strategy" rel="noopener noreferrer"&gt;internal link silo structure guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What to check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Orphan pages — zero internal links pointing to them. Screaming Frog flags these. If you have a large site, our &lt;a href="https://www.auditme.dev/api/internal-links" rel="noopener noreferrer"&gt;internal links analysis tool&lt;/a&gt; maps every connection automatically.&lt;/li&gt;
&lt;li&gt;  Anchor text — descriptive and keyword-rich. "Click here" tells Google nothing. "Our guide to Core Web Vitals" tells Google everything.&lt;/li&gt;
&lt;li&gt;  Link depth — important pages within 3 clicks of homepage. Key landing page buried 6 clicks deep? Something's wrong.&lt;/li&gt;
&lt;li&gt;  Link distribution — are your most important pages getting the most internal links? Or are blog posts hoarding all the equity?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How to check: Screaming Frog's "All Inlinks" report shows every internal link. Export and use a spreadsheet to find orphan pages and underlinked pages. &lt;a href="https://sitebulb.com/" rel="noopener noreferrer"&gt;Sitebulb&lt;/a&gt; ($13.50/month) has even better link architecture visualization.&lt;/p&gt;

&lt;p&gt;Real example: An e-commerce client had 500 products but only 20 linked from the homepage. The other 480 were 3-4 clicks deep. We added "Popular Products" to the homepage and "Related Products" on each product page. Within 60 days, deeper product pages saw 28% more organic traffic. No content changes, no new backlinks — just better internal linking.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Image Optimization — Priority: MEDIUM
&lt;/h3&gt;

&lt;p&gt;Images affect page speed AND image search visibility. &lt;a href="https://developers.google.com/search/docs/appearance/google-images" rel="noopener noreferrer"&gt;Google's image optimization guide&lt;/a&gt; explains how they index and rank images. Google Images drives surprising traffic for e-commerce and recipe sites.&lt;/p&gt;

&lt;p&gt;What to check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Alt text — descriptive for every meaningful image. Accessibility requirement AND SEO signal.&lt;/li&gt;
&lt;li&gt;  File format — WebP or AVIF instead of JPEG/PNG. 30-50% smaller with comparable quality.&lt;/li&gt;
&lt;li&gt;  File size — under 200KB for most images. Hero images under 500KB.&lt;/li&gt;
&lt;li&gt;  Dimensions — don't serve 4000px when displaying at 800px.&lt;/li&gt;
&lt;li&gt;  Lazy loading — loading="lazy" for below-fold images.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://squoosh.app/" rel="noopener noreferrer"&gt;Squoosh&lt;/a&gt; — free, by Google, WebP/AVIF support&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://cloudinary.com/" rel="noopener noreferrer"&gt;Cloudinary&lt;/a&gt; — free tier for auto optimization and CDN&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://sharp.pixelplumbing.com/" rel="noopener noreferrer"&gt;Sharp&lt;/a&gt; — Node.js library for build pipeline compression&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9. HTTPS and Security — Priority: HIGH
&lt;/h3&gt;

&lt;p&gt;Table stakes in 2026. Google's &lt;a href="https://developers.google.com/search/docs/crawling-indexing/http/https-googlebot" rel="noopener noreferrer"&gt;HTTPS documentation&lt;/a&gt; explains why HTTPS is a ranking signal and how to implement it correctly.&lt;/p&gt;

&lt;p&gt;What to check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Mixed content — HTTP resources on HTTPS pages. Screaming Frog flags these.&lt;/li&gt;
&lt;li&gt;  Certificate validity — not expiring soon.&lt;/li&gt;
&lt;li&gt;  HTTP to HTTPS redirects — 301 redirects on every HTTP URL.&lt;/li&gt;
&lt;li&gt;  HSTS header — tells browsers to only use HTTPS. &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security" rel="noopener noreferrer"&gt;Mozilla's HSTS documentation&lt;/a&gt; explains the header and its security benefits.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check: Visit your site and click the padlock. Or use &lt;a href="https://www.ssllabs.com/ssltest/" rel="noopener noreferrer"&gt;SSL Labs&lt;/a&gt; for comprehensive testing.&lt;/p&gt;

&lt;h3&gt;
  
  
  10. Page Speed and Performance — Priority: MEDIUM
&lt;/h3&gt;

&lt;p&gt;Beyond Core Web Vitals, other metrics matter too.&lt;/p&gt;

&lt;p&gt;What to check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  TTFB: Under 200ms. Over 600ms = server-side bottleneck.&lt;/li&gt;
&lt;li&gt;  Page weight: Under 500KB on key landing pages. Average in 2026 is over 2MB — that's absurd.&lt;/li&gt;
&lt;li&gt;  HTTP requests: Fewer = faster. Combine CSS, use sprites, inline critical resources.&lt;/li&gt;
&lt;li&gt;  Third-party scripts: Chat widgets, analytics, ad pixels — the silent killers of page speed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.webpagetest.org/" rel="noopener noreferrer"&gt;WebPageTest&lt;/a&gt; — waterfall charts showing exactly what's slow. Free.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://gtmetrix.com/" rel="noopener noreferrer"&gt;GTmetrix&lt;/a&gt; — performance monitoring with historical data.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://developer.chrome.com/docs/lighthouse/" rel="noopener noreferrer"&gt;Lighthouse&lt;/a&gt; — built into Chrome DevTools. &lt;a href="https://developers.google.com/web/tools/lighthouse" rel="noopener noreferrer"&gt;Google's Lighthouse documentation&lt;/a&gt; explains each audit and scoring methodology.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Real example: A client's homepage loaded in 6.2s. Waterfall showed a chat widget adding 2.1s. Switched to a lighter alternative, 3.8s. Then lazy-loaded the chat widget and perceived load time dropped to 1.4s. One change, 77% faster perceived load.&lt;/p&gt;

&lt;h3&gt;
  
  
  11. Backlink Profile — Priority: MEDIUM
&lt;/h3&gt;

&lt;p&gt;Backlinks remain one of &lt;a href="https://developers.google.com/search/docs/fundamentals/seo-starter-guide#link-text" rel="noopener noreferrer"&gt;Google's strongest ranking signals&lt;/a&gt;. But &lt;a href="https://developers.google.com/search/docs/spam-manipulation/link-spam" rel="noopener noreferrer"&gt;toxic links&lt;/a&gt; can actively hurt you — Google's link spam policy explains what constitutes a manipulative link and how manual actions work.&lt;/p&gt;

&lt;p&gt;What to check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Referring domains: More unique domains &amp;gt; many links from same domain. Quality over quantity.&lt;/li&gt;
&lt;li&gt;  Toxic links: Spammy sites, link farms, PBNs. Can trigger manual penalties.&lt;/li&gt;
&lt;li&gt;  Anchor text distribution: Natural = roughly 50% branded, 25% URL, 15% topical, 10% generic. Spikes of exact-match anchors = red flag.&lt;/li&gt;
&lt;li&gt;  Growth pattern: Steady growth is healthy. Sudden spikes/drops need investigation.&lt;/li&gt;
&lt;li&gt;  Competitor comparison: Use Ahrefs' Link Intersect to find sites linking to competitors but not you.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://ahrefs.com/" rel="noopener noreferrer"&gt;Ahrefs&lt;/a&gt; — best backlink analysis tool. Referring domains, anchor text, toxic link risk.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://moz.com/link-explorer" rel="noopener noreferrer"&gt;Moz Link Explorer&lt;/a&gt; — good alternative with Domain Authority&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://search.google.com/search-console/" rel="noopener noreferrer"&gt;Search Console Links&lt;/a&gt; — free, shows top linking sites and anchors&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://search.google.com/automatic/sitemap-disavow" rel="noopener noreferrer"&gt;Google Disavow Tool&lt;/a&gt; — &lt;a href="https://developers.google.com/search/docs/optimizing-stopping-googlebot#disavow" rel="noopener noreferrer"&gt;Google's documentation on disavowing links&lt;/a&gt; explains when and how to use it. Tell Google to ignore toxic links.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  12. Content Quality and Freshness — Priority: MEDIUM
&lt;/h3&gt;

&lt;p&gt;Google's &lt;a href="https://developers.google.com/search/docs/fundamentals/creating-helpful-content" rel="noopener noreferrer"&gt;Helpful Content system&lt;/a&gt; rewards first-hand experience and genuinely helpful content. The system uses a &lt;a href="https://developers.google.com/search/docs/fundamentals/creating-helpful-content#determining-helpfulness" rel="noopener noreferrer"&gt;site-wide signal&lt;/a&gt; — if a significant portion of your content is unhelpful, it can drag down rankings across your entire domain. If your site runs on WordPress, our &lt;a href="https://www.auditme.dev/blog/wordpress-seo-audit-checklist-2026" rel="noopener noreferrer"&gt;WordPress SEO audit checklist&lt;/a&gt; covers platform-specific content issues.&lt;/p&gt;

&lt;p&gt;What to check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Thin pages: Under 300 words providing no value. Expand or remove. Our &lt;a href="https://www.auditme.dev/blog/content-pruning-delete-merge-old-posts" rel="noopener noreferrer"&gt;content pruning guide&lt;/a&gt; shows exactly how to decide what to keep versus cut.&lt;/li&gt;
&lt;li&gt;  Duplicate content: Same content at multiple URLs. Canonicalize or 301 redirect. Learn more in our &lt;a href="https://www.auditme.dev/blog/seo-migration-guide-changing-domains-without-losing-rankings" rel="noopener noreferrer"&gt;SEO migration guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;  Outdated content: Not updated in 18+ months. Refresh facts, stats, examples. Our &lt;a href="https://www.auditme.dev/blog/content-refresh-strategy-keeping-old-articles-ranking-2026" rel="noopener noreferrer"&gt;content refresh strategy&lt;/a&gt; explains the optimal refresh cadence.&lt;/li&gt;
&lt;li&gt;  Search Console data: High impressions but low clicks = title/description issues. Our &lt;a href="https://www.auditme.dev/blog/title-tag-optimization-guide-2026" rel="noopener noreferrer"&gt;title tag optimization guide&lt;/a&gt; shows how to fix CTR problems.&lt;/li&gt;
&lt;li&gt;  Cannibalization: Multiple pages targeting the same keyword. Consolidate. See our &lt;a href="https://www.auditme.dev/blog/topical-authority-content-clusters-dominate-search" rel="noopener noreferrer"&gt;topic clusters and content authority guide&lt;/a&gt; for how to restructure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.screamingfrog.co.uk/" rel="noopener noreferrer"&gt;Screaming Frog&lt;/a&gt; — flags thin and duplicate content&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.copyscape.com/" rel="noopener noreferrer"&gt;Copyscape&lt;/a&gt; — checks for &lt;a href="https://www.copyscape.com/premium-api.php" rel="noopener noreferrer"&gt;duplicate content elsewhere on the web&lt;/a&gt;, essential for catching scraped content&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://hemingwayapp.com/" rel="noopener noreferrer"&gt;Hemingway App&lt;/a&gt; — readability analysis. &lt;a href="https://developers.google.com/search/docs/fundamentals/creating-helpful-content" rel="noopener noreferrer"&gt;Google's guidelines on writing helpful content&lt;/a&gt; emphasize writing for people, not search engines.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Advanced: Expert-Level Audit Techniques
&lt;/h2&gt;

&lt;p&gt;The 12-point checklist above covers 80% of what you need. But if you're auditing a large site, a JavaScript-rendered app, or a multilingual operation, you need deeper techniques. These are the checks that separate a competent audit from a thorough one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Log File Analysis: What Googlebot Actually Crawls
&lt;/h3&gt;

&lt;p&gt;Server logs record every request Googlebot makes to your site. This is the ground truth — not what you think Google is crawling, but what it actually requested.&lt;/p&gt;

&lt;p&gt;Why it matters: A sitemap might list 5,000 pages, but Googlebot may only crawl 2,000 of them. The other 3,000 are invisible. Or worse, Googlebot might be spending 80% of its crawl budget on pages that don't matter — faceted navigation, parameter URLs, admin pages.&lt;/p&gt;

&lt;p&gt;How to do it:&lt;/p&gt;

&lt;p&gt;1. Access your server logs (ask your hosting provider if you're not sure where they are)&lt;/p&gt;

&lt;p&gt;2. Filter for Googlebot user-agent requests&lt;/p&gt;

&lt;p&gt;3. Analyze which URLs get crawled most frequently and which get zero crawls&lt;/p&gt;

&lt;p&gt;4. Compare against your sitemap — every important page should appear in both&lt;/p&gt;

&lt;p&gt;5. Look for crawl spikes on low-value pages (wasted budget) or drops on high-value pages (potential deindexation)&lt;/p&gt;

&lt;p&gt;Tools for log analysis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.screamingfrog.co.uk/log-file-analyzer/" rel="noopener noreferrer"&gt;Screaming Frog Log File Analyzer&lt;/a&gt; — free, visualizes crawl patterns&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://jetoctopus.com/" rel="noopener noreferrer"&gt;JetOctopus&lt;/a&gt; — cloud-based, handles large log files&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://botify.com/" rel="noopener noreferrer"&gt;Botify&lt;/a&gt; — enterprise-grade log analysis and crawl budget optimization&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.seolyzer.com/" rel="noopener noreferrer"&gt;SEOlyzer&lt;/a&gt; — free tier available, real-time log parsing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Real example: I analyzed logs for a 100,000-page e-commerce site and found Googlebot was spending 73% of its crawl budget on faceted navigation URLs (color, size, price filters). Each filter combination created a unique URL that Googlebot dutifully crawled. We blocked these with robots.txt and rel="nofollow" on filter links. Within 6 weeks, Googlebot's crawl rate on product pages increased 340%. Indexation of product pages went from 45% to 89%.&lt;/p&gt;

&lt;h3&gt;
  
  
  JavaScript Rendering Audit
&lt;/h3&gt;

&lt;p&gt;If your site uses React, Next.js, Vue, Angular, or any JavaScript framework, you need to verify that Googlebot can actually see your content. &lt;a href="https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics" rel="noopener noreferrer"&gt;Google's documentation on JavaScript SEO&lt;/a&gt; explains how Googlebot renders JavaScript. JavaScript rendering is one of the most common causes of "why isn't my page ranking?" in 2026.&lt;/p&gt;

&lt;p&gt;The problem: &lt;a href="https://developers.google.com/search/docs/crawling-indexing/javascript/overview-googlebot" rel="noopener noreferrer"&gt;Googlebot renders JavaScript in a second wave of crawling&lt;/a&gt;. The first wave sees the raw HTML (which might be empty), and the second wave renders the JavaScript. If your content only exists in JavaScript, Google might not see it for days — or ever, if rendering fails.&lt;/p&gt;

&lt;p&gt;What to check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  View-source test: Right-click your page, view source, and search for your key content. If it's not in the raw HTML, Googlebot might not see it either.&lt;/li&gt;
&lt;li&gt;  Google Search Console URL Inspection: Use the &lt;a href="https://developers.google.com/search/docs/crawling-indexing/javascript/understanding-the-url-inspection-api" rel="noopener noreferrer"&gt;"View rendered page" feature&lt;/a&gt; to see exactly what Googlebot sees.&lt;/li&gt;
&lt;li&gt;  Dynamic rendering: For sites where JavaScript rendering is a known issue, consider &lt;a href="https://developers.google.com/search/docs/crawling-indexing/javascript/dynamic-rendering" rel="noopener noreferrer"&gt;dynamic serving&lt;/a&gt; (serving pre-rendered HTML to bots). Google's documentation explains when dynamic rendering is appropriate. Our &lt;a href="https://www.auditme.dev/blog/ssr-ssg-isr-nextjs-seo-2026" rel="noopener noreferrer"&gt;SSR vs SSG vs ISR guide&lt;/a&gt; explains when each approach makes sense.&lt;/li&gt;
&lt;li&gt;  Client-side routing: Single-page applications often break URL-based navigation. Every route should have a unique, crawlable URL that returns full HTML.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://search.google.com/search-console/" rel="noopener noreferrer"&gt;Google Search Console URL Inspection&lt;/a&gt; — see exactly what Googlebot renders&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/nicjansma/rendertron" rel="noopener noreferrer"&gt;Rendertron&lt;/a&gt; — open-source rendering proxy for testing&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.screamingfrog.co.uk/seo-spider/" rel="noopener noreferrer"&gt;Screaming Frog JavaScript rendering&lt;/a&gt; — renders JS during crawl&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Real example: A client's Next.js site had 200 product pages that looked perfect in the browser but returned empty HTML to Googlebot. The issue was that all product data was fetched client-side via API calls. We switched to server-side rendering for product pages, and indexation jumped from 60 pages to all 200 within two weeks. Organic traffic to product pages increased 180%.&lt;/p&gt;

&lt;h3&gt;
  
  
  International SEO Audit
&lt;/h3&gt;

&lt;p&gt;If your site targets multiple countries or languages, international SEO adds an entire layer of complexity. For a complete guide, see our &lt;a href="https://www.auditme.dev/blog/hreflang-tags-implementation-guide-multilingual-sites" rel="noopener noreferrer"&gt;hreflang implementation guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What to check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Hreflang tags: Every language/country variant needs reciprocal hreflang tags pointing to each other. &lt;a href="https://developers.google.com/search/docs/specialty/international/localized-versions" rel="noopener noreferrer"&gt;Google's hreflang documentation&lt;/a&gt; explains the full specification and common mistakes. If page A links to page B as its French version, page B must link back to page A as its English version. Missing return tags are the most common hreflang error.&lt;/li&gt;
&lt;li&gt;  Canonical vs hreflang conflicts: A canonical tag pointing to a different language version overrides hreflang. Make sure canonicals point to the same-language version.&lt;/li&gt;
&lt;li&gt;  URL structure: Use either subdirectories (/fr/), subdomains (fr.example.com), or separate domains. Each has trade-offs. Subdirectories are simplest for most sites.&lt;/li&gt;
&lt;li&gt;  Content uniqueness: Machine-translated content without human review gets penalized. If you're translating, invest in human editing.&lt;/li&gt;
&lt;li&gt;  Geo-targeting in Search Console: Set the correct country target for each language version.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://ahrefs.com/site-audit/" rel="noopener noreferrer"&gt;Ahrefs Site Audit&lt;/a&gt; — flags hreflang errors automatically&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/nicjansma/flang" rel="noopener noreferrer"&gt;Flang&lt;/a&gt; — free hreflang validator&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.screamingfrog.co.uk/" rel="noopener noreferrer"&gt;Screaming Frog hreflang audit&lt;/a&gt; — crawls and validates hreflang across your entire site&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Programmatic SEO Audit at Scale
&lt;/h3&gt;

&lt;p&gt;When you're auditing a site with 10,000+ pages, manual checks don't scale. You need a systematic, automated approach.&lt;/p&gt;

&lt;p&gt;Strategy:&lt;/p&gt;

&lt;p&gt;1. Sample-based audit: Don't try to manually review every page. Sample 50-100 pages across different templates (homepage, category, product, blog, landing pages). Fix issues at the template level — one fix can improve thousands of pages.&lt;/p&gt;

&lt;p&gt;2. Crawl segmentation: Group your crawl data by page type. Compare title tag patterns across product pages versus blog posts versus category pages. Inconsistencies within a template reveal systematic issues.&lt;/p&gt;

&lt;p&gt;3. Priority scoring: Not all pages deserve equal attention. Sort by organic traffic potential (search volume x estimated CTR) and focus on the top 20% that drive 80% of traffic.&lt;/p&gt;

&lt;p&gt;4. Automated monitoring: Set up weekly automated crawls with &lt;a href="https://www.contentkingapp.com/" rel="noopener noreferrer"&gt;ContentKing&lt;/a&gt; or &lt;a href="https://www.screamingfrog.co.uk/seo-spider/" rel="noopener noreferrer"&gt;Screaming Frog scheduled crawls&lt;/a&gt; to catch issues before they impact rankings.&lt;/p&gt;

&lt;p&gt;Tools for large-scale audits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://sitebulb.com/" rel="noopener noreferrer"&gt;Sitebulb&lt;/a&gt; — handles large crawls with visual reporting&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.lumar.io/" rel="noopener noreferrer"&gt;Lumar&lt;/a&gt; (formerly DeepCrawl) — enterprise cloud crawling&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://onely.com/" rel="noopener noreferrer"&gt;Onely&lt;/a&gt; — technical SEO consulting for large sites&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prioritizing Your Fixes
&lt;/h2&gt;

&lt;p&gt;Fix this week (Priority 1): Indexation problems, broken canonicals, noindexed critical pages, CWV failures, security issues. These actively hurt rankings RIGHT NOW.&lt;/p&gt;

&lt;p&gt;Fix this month (Priority 2): Missing/duplicate meta tags, schema errors, poor internal linking, image optimization, mobile usability. Holding you back but not emergencies.&lt;/p&gt;

&lt;p&gt;Fix this quarter (Priority 3): Content consolidation, backlink cleanup, advanced performance, freshness updates, new content. Long-term improvements that compound.&lt;/p&gt;

&lt;p&gt;Most common mistake: trying to fix everything at once. You can't change 50 things and know what worked. Prioritize, fix in batches, measure between batches. I recommend 5-10 related changes per batch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools Actually Use
&lt;/h2&gt;

&lt;p&gt;People spent thousands on SEO tools. Here's what I actually use:&lt;/p&gt;

&lt;p&gt;Free or cheap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://search.google.com/search-console/" rel="noopener noreferrer"&gt;Google Search Console&lt;/a&gt; — &lt;a href="https://developers.google.com/search/docs/search-console/get-started" rel="noopener noreferrer"&gt;Google's official documentation&lt;/a&gt; explains every feature. Free, essential, non-negotiable.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.screamingfrog.co.uk/" rel="noopener noreferrer"&gt;Screaming Frog&lt;/a&gt; — free up to 500 URLs. Best technical audit tool.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://pagespeed.web.dev/" rel="noopener noreferrer"&gt;PageSpeed Insights&lt;/a&gt; — free CWV testing with real user data&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://search.google.com/test/rich-results/" rel="noopener noreferrer"&gt;Rich Results Test&lt;/a&gt; — free schema validation&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://squoosh.app/" rel="noopener noreferrer"&gt;Squoosh&lt;/a&gt; — free image compression by Google&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://ahrefs.com/webmaster-tools" rel="noopener noreferrer"&gt;Ahrefs Webmaster Tools&lt;/a&gt; — free Ahrefs for your own site&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.seominion.com/" rel="noopener noreferrer"&gt;SEO Minion&lt;/a&gt; — free Chrome extension for on-page checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Professional (paid):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://ahrefs.com/" rel="noopener noreferrer"&gt;Ahrefs&lt;/a&gt; — $99/mo. Best for backlinks, keywords, competitor research&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.semrush.com/" rel="noopener noreferrer"&gt;SEMrush&lt;/a&gt; — $130/mo. Great all-in-one with competitive analysis&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://moz.com/" rel="noopener noreferrer"&gt;Moz Pro&lt;/a&gt; — $99/mo. Good for domain authority and local SEO&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://sitebulb.com/" rel="noopener noreferrer"&gt;Sitebulb&lt;/a&gt; — $13.50/mo. Best crawl visualization&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://surferseo.com/" rel="noopener noreferrer"&gt;Surfer SEO&lt;/a&gt; — $89/mo. Content optimization based on what's ranking&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.contentkingapp.com/" rel="noopener noreferrer"&gt;ContentKing&lt;/a&gt; — real-time monitoring and change alerts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Budget pick: If you can only afford one paid tool, get Ahrefs. If two, add Screaming Frog (one-time license for desktop).&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparing for AI-Powered Search
&lt;/h2&gt;

&lt;p&gt;This is the section most guides skip because it's new and uncomfortable. But it matters.&lt;/p&gt;

&lt;p&gt;Google's AI Overviews, Perplexity, ChatGPT Search, and other AI tools are changing how people find info. Instead of clicking through 10 blue links, users get direct answers. According to &lt;a href="https://www.bloomberg.com/news/articles/2024-05-14/google-s-ai-overviews-messy-rollout-highlights-search-risks" rel="noopener noreferrer"&gt;Bloomberg&lt;/a&gt;, AI Overviews initially had quality issues but have improved substantially and now appear on roughly 30% of queries.&lt;/p&gt;

&lt;p&gt;What to optimize for:&lt;/p&gt;

&lt;p&gt;Structured data matters more. AI systems pull from schema markup to build answers. Well-structured content with proper schema is more likely to be cited.&lt;/p&gt;

&lt;p&gt;Citations and source attribution. AI tools favor content linking to authoritative sources. Cite claims. Link to government data, peer-reviewed studies, official documentation.&lt;/p&gt;

&lt;p&gt;Direct answers to questions. AI Overviews pull from pages that answer clearly and concisely. Put the answer in the first paragraph, then elaborate.&lt;/p&gt;

&lt;p&gt;Freshness signals. AI tools prefer recently updated content. Include publication dates, last-updated dates, and actually refresh content regularly.&lt;/p&gt;

&lt;p&gt;Long-tail queries. As people get comfortable with AI search, they ask longer, more conversational questions. Optimize for "how do I fix high CLS on my WordPress site" not just "CLS score."&lt;/p&gt;

&lt;p&gt;Our site saw a 340% increase in AI Overview appearances after implementing structured data, adding last-updated dates, and restructuring content to lead with direct answers. Two weeks of work, sustained for six+ months.&lt;/p&gt;

&lt;h2&gt;
  
  
  Case Studies
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Case Study 1: SaaS Recovering from a Core Update
&lt;/h3&gt;

&lt;p&gt;A mid-size B2B SaaS company lost 45% of organic traffic after a Google core update in late 2025. They had 200 blog posts, 40 product pages, and a Next.js stack.&lt;/p&gt;

&lt;p&gt;What we found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  68 pages had duplicate or missing title tags&lt;/li&gt;
&lt;li&gt;  Sitemap included 300+ URLs returning 404 errors&lt;/li&gt;
&lt;li&gt;  23 blog posts covered the same topic with thin 400-word summaries&lt;/li&gt;
&lt;li&gt;  Core Web Vitals failed on mobile — LCP was 4.8 seconds&lt;/li&gt;
&lt;li&gt;  No structured data on any page&lt;/li&gt;
&lt;li&gt;  Backlink profile had 300+ toxic links from a 2023 link campaign&lt;/li&gt;
&lt;li&gt;  No author bios, no E-E-A-T signals on any content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What we fixed over 8 weeks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Consolidated 23 thin posts into 8 comprehensive guides (each 2,000+ words)&lt;/li&gt;
&lt;li&gt;  Removed dead URLs from sitemap, set up proper 301 redirects&lt;/li&gt;
&lt;li&gt;  Rewrote all title tags to be unique and under 60 characters&lt;/li&gt;
&lt;li&gt;  Implemented Organization, WebPage, and FAQPage schema site-wide&lt;/li&gt;
&lt;li&gt;  Optimized images (WebP, lazy-loaded below-fold content)&lt;/li&gt;
&lt;li&gt;  Disavowed toxic backlinks through Search Console&lt;/li&gt;
&lt;li&gt;  Added author bios with credentials, linked to LinkedIn profiles&lt;/li&gt;
&lt;li&gt;  Added publication and last-updated dates to all content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Results after 90 days:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Organic traffic recovered to pre-drop levels&lt;/li&gt;
&lt;li&gt;  12% increase in average position across all tracked keywords&lt;/li&gt;
&lt;li&gt;  Rich results appeared for 35 pages&lt;/li&gt;
&lt;li&gt;  Core Web Vitals passed on 94% of tested pages&lt;/li&gt;
&lt;li&gt;  Two pages started appearing in Google AI Overviews&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total cost: approximately $12,000. The traffic they recovered was worth roughly $45,000 per month in equivalent paid traffic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case Study 2: Local Business Going from Invisible to Dominant
&lt;/h3&gt;

&lt;p&gt;A dental practice in a competitive metro area had zero organic visibility. Template WordPress site with stock photos, no blog, same meta description on every page.&lt;/p&gt;

&lt;p&gt;What we found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Zero schema markup (no LocalBusiness, no reviews, no services)&lt;/li&gt;
&lt;li&gt;  Meta title on every page: "Dental Practice | City Name"&lt;/li&gt;
&lt;li&gt;  No Google Business Profile optimization&lt;/li&gt;
&lt;li&gt;  Website not mobile-friendly (text too small, buttons too close)&lt;/li&gt;
&lt;li&gt;  Zero backlinks — literally zero referring domains&lt;/li&gt;
&lt;li&gt;  Page load time: 8.3 seconds on mobile&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What we fixed over 3 months:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Added LocalBusiness schema with full NAP data&lt;/li&gt;
&lt;li&gt;  Optimized meta titles per service: "Emergency Dentist in [City] - Same-Day Appointments | Practice Name"&lt;/li&gt;
&lt;li&gt;  Claimed and optimized Google Business Profile with photos, services, regular posts&lt;/li&gt;
&lt;li&gt;  Redesigned mobile experience (larger text, bigger tap targets, simpler navigation)&lt;/li&gt;
&lt;li&gt;  Built 15 local citations (Yelp, Healthgrades, Zocdoc, local chamber of commerce)&lt;/li&gt;
&lt;li&gt;  Created service pages for each treatment with detailed descriptions&lt;/li&gt;
&lt;li&gt;  Optimized page speed: WebP images, faster hosting, caching&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Results after 6 months:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Ranking top 3 for "dentist [city]" (was not in top 100)&lt;/li&gt;
&lt;li&gt;  Google Business Profile in local pack for 12 search queries&lt;/li&gt;
&lt;li&gt;  Organic traffic: 50 to 1,200 monthly visits&lt;/li&gt;
&lt;li&gt;  Phone calls from organic: 3 to 45 per month&lt;/li&gt;
&lt;li&gt;  Revenue from organic: approximately $35,000 per month&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total cost: approximately $5,000. ROI was astronomical.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case Study 3: E-Commerce Fixing Technical Debt
&lt;/h3&gt;

&lt;p&gt;A 500-product Shopify store running 3 years without SEO maintenance. Traffic slowly declining for 18 months.&lt;/p&gt;

&lt;p&gt;What we found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  120 product pages with no meta descriptions&lt;/li&gt;
&lt;li&gt;  45 products with duplicate titles (variants sharing titles)&lt;/li&gt;
&lt;li&gt;  Category pages with 150+ products but no pagination signals&lt;/li&gt;
&lt;li&gt;  Product images averaging 3MB each (no compression, no WebP)&lt;/li&gt;
&lt;li&gt;  No internal linking between related products&lt;/li&gt;
&lt;li&gt;  Breadcrumb schema missing on all category pages&lt;/li&gt;
&lt;li&gt;  Blog with 80 posts but zero internal links to product pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What we fixed over 6 weeks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Wrote unique meta descriptions for all 120 product pages&lt;/li&gt;
&lt;li&gt;  Rewrote 45 duplicate titles with variant-specific keywords&lt;/li&gt;
&lt;li&gt;  Added BreadcrumbList schema to all category and product pages&lt;/li&gt;
&lt;li&gt;  Compressed all product images to WebP (average 300KB instead of 3MB)&lt;/li&gt;
&lt;li&gt;  Created "Related Products" sections on product pages&lt;/li&gt;
&lt;li&gt;  Added "Featured Products" to blog posts&lt;/li&gt;
&lt;li&gt;  Implemented Product schema on all product pages with price and availability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Results after 4 months:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Organic traffic increased 67%&lt;/li&gt;
&lt;li&gt;  23 products appeared in Google Shopping results (free listings)&lt;/li&gt;
&lt;li&gt;  Average page load dropped from 5.1s to 1.8s&lt;/li&gt;
&lt;li&gt;  Bounce rate decreased 23%&lt;/li&gt;
&lt;li&gt;  Revenue from organic increased 89%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total cost: approximately $8,000. Revenue increase paid for it in the first month.&lt;/p&gt;

&lt;h2&gt;
  
  
  How AI Is Changing SEO Audits
&lt;/h2&gt;

&lt;p&gt;The reality is — in 2026, AI tools can analyze your entire site in seconds. I used to spend 3-4 hours per audit manually checking each element. Now tools like AuditMe scan all 12 points simultaneously and give fix recommendations in 60 seconds.&lt;/p&gt;

&lt;p&gt;Does that mean SEO professionals are obsolete? Absolutely not. AI can find problems, but figuring out strategy behind the fixes still requires human judgment. When AI flags that your Core Web Vitals are failing, you still need to decide whether to optimize images, switch hosting, or refactor JavaScript. For a deep dive into fixing those specific metrics, check out our guide on &lt;a href="https://www.auditme.dev/blog/how-to-fix-core-web-vitals" rel="noopener noreferrer"&gt;how to fix Core Web Vitals issues&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The real shift? AI lets you focus on strategy instead of tedious data collection. I spend less time gathering data and more time analyzing it. If you want to see what an AI-powered audit looks like in practice, run a free scan on your site — the tool at the top of this page covers all 12 checklist points in under 60 seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;You now have the complete step-by-step process for running an SEO audit. Here's what to do next:&lt;/p&gt;

&lt;p&gt;1. Run the free scan using the tool at the top of this page — it takes 60 seconds and gives you a prioritized list of issues&lt;/p&gt;

&lt;p&gt;2. Review the results against the 12-point checklist above — understand what each issue means and why it matters&lt;/p&gt;

&lt;p&gt;3. Fix HIGH priority items first — use the prioritization framework to create your action plan&lt;/p&gt;

&lt;p&gt;4. Schedule your next audit for three months from now — quarterly audits catch problems before they compound&lt;/p&gt;

&lt;p&gt;The most important step is the first one. Most site owners know their site probably has issues but never carve out the time to investigate. The tool exists to make this painless. Paste your URL and start.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Articles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.auditme.dev/blog/how-to-fix-core-web-vitals" rel="noopener noreferrer"&gt;How to Fix Core Web Vitals Issues: LCP, INP, CLS Explained&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.auditme.dev/blog/meta-tags-optimization-guide" rel="noopener noreferrer"&gt;Meta Tags Optimization Guide: Title, Description, and OG Tags&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.auditme.dev/blog/full-site-crawl-seo-technical-audit" rel="noopener noreferrer"&gt;Full Site Crawl: Complete Technical SEO Audit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.auditme.dev/blog/wordpress-seo-audit-checklist-2026" rel="noopener noreferrer"&gt;WordPress SEO Audit Checklist 2026&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.auditme.dev/blog/ecommerce-seo-audit-checklist-2026" rel="noopener noreferrer"&gt;Ecommerce SEO Audit Checklist 2026&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.auditme.dev/blog/local-seo-audit-checklist-2026" rel="noopener noreferrer"&gt;Local SEO Audit Checklist 2026&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.auditme.dev/blog/javascript-seo-rendering-indexing" rel="noopener noreferrer"&gt;JavaScript SEO: Rendering and Indexing Issues&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.auditme.dev/blog/canonical-tags-guide-2026" rel="noopener noreferrer"&gt;Canonical Tags Guide 2026&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Run Your Free Audit
&lt;/h2&gt;

&lt;p&gt;Ready to see where your site stands? &lt;a href="https://www.auditme.dev/website-seo-checker" rel="noopener noreferrer"&gt;Run a free SEO audit&lt;/a&gt; on your website — no signup required. Get results in 60 seconds with actionable recommendations you can implement today. The tool covers meta tags, Core Web Vitals, schema markup, content structure, internal linking, and more — every point in the checklist above.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How often should I run an SEO audit?
&lt;/h3&gt;

&lt;p&gt;Run a full audit at least once per quarter. For fast-moving industries or sites that publish frequently, monthly mini-audits focused on technical health and new content keep you ahead of ranking drops. If you've just launched a redesign or migration, run an audit within the first week to catch issues early. See our &lt;a href="https://www.auditme.dev/blog/seo-migration-guide-changing-domains-without-losing-rankings" rel="noopener noreferrer"&gt;SEO migration guide&lt;/a&gt; for post-launch audit timing.&lt;/p&gt;

&lt;h3&gt;
  
  
  What tools do I need for an SEO audit?
&lt;/h3&gt;

&lt;p&gt;You can start with free tools like Google Search Console, PageSpeed Insights, and Screaming Frog's free tier. For deeper analysis, paid tools like Ahrefs or Semrush help with competitor research, backlink audits, and keyword tracking. Our &lt;a href="https://www.auditme.dev/blog/full-site-crawl-seo-technical-audit" rel="noopener noreferrer"&gt;free SEO tools comparison&lt;/a&gt; breaks down what each tool does best.&lt;/p&gt;

&lt;h3&gt;
  
  
  How long does a complete SEO audit take?
&lt;/h3&gt;

&lt;p&gt;A thorough audit of a 50-page site typically takes 3-5 hours. Larger sites with hundreds of pages may take a full day. Using automated tools like AuditMe can cut that time to under an hour by scanning all 12 checklist points simultaneously. For enterprise sites with 10,000+ pages, a full audit with log file analysis can take 1-2 weeks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I do an SEO audit myself or do I need an agency?
&lt;/h3&gt;

&lt;p&gt;You can absolutely do it yourself. This guide walks through every step. Where agencies add value is in interpreting findings, prioritizing fixes, and developing long-term strategy — but the technical audit itself is learnable. For WordPress-specific guidance, check our &lt;a href="https://www.auditme.dev/blog/wordpress-seo-audit-checklist-2026" rel="noopener noreferrer"&gt;WordPress SEO audit checklist&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the most important part of an SEO audit?
&lt;/h3&gt;

&lt;p&gt;Technical health — Core Web Vitals, crawlability, and indexation. If Google can't properly crawl and render your pages, nothing else matters. Fix technical issues first, then move to content and off-page. Our &lt;a href="https://www.auditme.dev/blog/core-web-vitals-checklist-2026" rel="noopener noreferrer"&gt;Core Web Vitals checklist&lt;/a&gt; walks through the specific thresholds and fixes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do SEO audits really improve traffic?
&lt;/h3&gt;

&lt;p&gt;Yes. In my experience, fixing issues found in a typical audit leads to 15-30% increase in organic traffic within 2-3 months. The biggest gains usually come from fixing Core Web Vitals, broken links, and missing or incorrect meta tags. I tracked this across 20 client engagements — the details are in the case studies section above.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's the difference between a technical SEO audit and a content audit?
&lt;/h3&gt;

&lt;p&gt;A technical audit focuses on how search engines crawl and index your site — things like server response codes, structured data, Core Web Vitals, and site architecture. A content audit evaluates the quality, relevance, and performance of your actual pages — thin content, keyword cannibalization, and outdated information. The best audits cover both. See our &lt;a href="https://www.auditme.dev/blog/content-pruning-delete-merge-old-posts" rel="noopener noreferrer"&gt;content pruning guide&lt;/a&gt; for the content side.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I track SEO audit improvements over time?
&lt;/h3&gt;

&lt;p&gt;Set up a tracking spreadsheet with baseline metrics before you start. Key metrics to track: organic traffic (Google Analytics), average position and click-through rate (Search Console), Core Web Vitals scores (PageSpeed Insights), indexed page count (Search Console Coverage), and keyword rankings (Ahrefs or Semrush). Check these monthly and compare against your baseline. Our &lt;a href="https://www.auditme.dev/blog/saas-seo-metrics-monthly-tracking" rel="noopener noreferrer"&gt;SaaS SEO metrics guide&lt;/a&gt; has a complete tracking template.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I audit my competitors too?
&lt;/h3&gt;

&lt;p&gt;Absolutely. Competitor analysis reveals gaps in your own strategy. Check what keywords they rank for that you don't, what content they've published that you haven't matched, and what backlinks they have that you're missing. Our &lt;a href="https://www.auditme.dev/blog/seo-competitor-analysis-guide-2026" rel="noopener noreferrer"&gt;competitor SEO analysis framework&lt;/a&gt; shows you exactly how to do this systematically.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I audit a WordPress site specifically?
&lt;/h3&gt;

&lt;p&gt;WordPress sites have unique SEO considerations — plugin conflicts, theme bloat, WordPress-generated duplicate content, and taxonomy pages that often create thin content. Our &lt;a href="https://www.auditme.dev/blog/wordpress-seo-audit-checklist-2026" rel="noopener noreferrer"&gt;WordPress SEO audit checklist&lt;/a&gt; covers every WordPress-specific issue, including plugin recommendations and configuration best practices.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's the difference between an SEO audit and an SEO health check?
&lt;/h3&gt;

&lt;p&gt;An SEO health check is a quick, automated scan of your site's most critical elements — meta tags, Core Web Vitals, basic crawlability. It takes under 60 seconds and catches obvious issues. A full SEO audit is a comprehensive, manual review that includes content analysis, backlink evaluation, competitor comparison, and strategic recommendations. Think of a health check as the triage and the full audit as the complete diagnostic.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I audit schema markup on my site?
&lt;/h3&gt;

&lt;p&gt;Use Google's &lt;a href="https://search.google.com/test/rich-results" rel="noopener noreferrer"&gt;Rich Results Test&lt;/a&gt; to check individual pages, or Screaming Frog to crawl your entire site and flag schema errors. Google's &lt;a href="https://developers.google.com/search/docs/appearance/structured-data/troubleshoot-structured-data" rel="noopener noreferrer"&gt;structured data troubleshooting guide&lt;/a&gt; covers common errors. Common issues include missing required properties, wrong date formats, and orphaned schema that doesn't match page content. Our &lt;a href="https://www.auditme.dev/blog/structured-data-testing-debug-schema-errors" rel="noopener noreferrer"&gt;structured data debugging guide&lt;/a&gt; walks through the most common errors and how to fix them.&lt;/p&gt;

&lt;h3&gt;
  
  
  What are the most common SEO audit mistakes?
&lt;/h3&gt;

&lt;p&gt;According to &lt;a href="https://ahrefs.com/blog/seo-mistakes/" rel="noopener noreferrer"&gt;Ahrefs' research&lt;/a&gt; and &lt;a href="https://backlinko.com/seo-audit" rel="noopener noreferrer"&gt;Backlinko's analysis&lt;/a&gt;, the most common audit mistakes are: ignoring mobile usability, skipping log file analysis, fixing everything at once instead of prioritizing, and not setting up baseline measurements before making changes. Our prioritization framework above addresses these mistakes directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I audit my competitors' SEO?
&lt;/h3&gt;

&lt;p&gt;A competitor audit reveals gaps in your own strategy. Use &lt;a href="https://ahrefs.com/site-explorer" rel="noopener noreferrer"&gt;Ahrefs' Site Explorer&lt;/a&gt; or &lt;a href="https://www.semrush.com/analytics/overview/" rel="noopener noreferrer"&gt;SEMrush's domain analysis&lt;/a&gt; to check what keywords they rank for that you don't, what content they've published that you haven't matched, and what backlinks they have that you're missing. Our &lt;a href="https://www.auditme.dev/blog/seo-competitor-analysis-guide-2026" rel="noopener noreferrer"&gt;competitor SEO analysis framework&lt;/a&gt; shows you exactly how to do this systematically. Google's documentation on &lt;a href="https://developers.google.com/search/docs/fundamentals/helpful-content#helpful-content-is-reliable" rel="noopener noreferrer"&gt;search intent&lt;/a&gt; explains what makes content competitive.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I audit my Google Business Profile?
&lt;/h3&gt;

&lt;p&gt;For local businesses, your &lt;a href="https://support.google.com/business/answer/7091" rel="noopener noreferrer"&gt;Google Business Profile&lt;/a&gt; is as important as your website. Audit your profile for completeness (all fields filled), accuracy (NAP matches your website), photos (at least 25), reviews (respond to all), and posts (regular updates). Our &lt;a href="https://www.auditme.dev/blog/google-business-profile-optimization-2026" rel="noopener noreferrer"&gt;Google Business Profile optimization guide&lt;/a&gt; covers the full audit process.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I audit my website's security for SEO?
&lt;/h3&gt;

&lt;p&gt;Google's &lt;a href="https://developers.google.com/search/docs/crawling-indexing/http/https-googlebot" rel="noopener noreferrer"&gt;HTTPS documentation&lt;/a&gt; explains how HTTPS affects rankings. Use &lt;a href="https://www.ssllabs.com/ssltest/" rel="noopener noreferrer"&gt;SSL Labs&lt;/a&gt; to test your certificate, check for &lt;a href="https://developers.google.com/web/fundamentals/security/prevent-mixed-content/what-is-mixed-content" rel="noopener noreferrer"&gt;mixed content&lt;/a&gt; (HTTP resources on HTTPS pages), verify your HSTS header, and ensure all HTTP URLs redirect to HTTPS with 301 status codes. Security issues can trigger &lt;a href="https://transparencyreport.google.com/safe-browsing/search" rel="noopener noreferrer"&gt;Google Safe Browsing warnings&lt;/a&gt; that destroy click-through rates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources and Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://developers.google.com/search/docs/fundamentals/auditing-your-site" rel="noopener noreferrer"&gt;Google Search Central: Auditing Your Site&lt;/a&gt; — official documentation for comprehensive technical SEO audits&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://ahrefs.com/blog/seo-audit/" rel="noopener noreferrer"&gt;Ahrefs: Complete SEO Audit Checklist&lt;/a&gt; — step-by-step guide to identifying and fixing technical SEO issues&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://moz.com/learn/seo/seo-audit" rel="noopener noreferrer"&gt;Moz: SEO Audit Guide&lt;/a&gt; — structured framework for evaluating site health and prioritizing fixes&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.searchenginejournal.com/technical-seo-checklist/" rel="noopener noreferrer"&gt;Search Engine Journal: Technical SEO Checklist&lt;/a&gt; — comprehensive technical SEO walkthrough&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://static.googleusercontent.com/media/guidelines.raterhub.com/en//searchqualityevaluatorguidelines.pdf" rel="noopener noreferrer"&gt;Google Search Quality Evaluator Guidelines&lt;/a&gt; — the 176-page document defining Google's quality standards&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://web.dev/articles/vitals" rel="noopener noreferrer"&gt;web.dev: Core Web Vitals&lt;/a&gt; — official CWV documentation and thresholds&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://schema.org/" rel="noopener noreferrer"&gt;Schema.org&lt;/a&gt; — definitive reference for all structured data types&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.oreilly.com/library/view/the-art-of/9781492059271/" rel="noopener noreferrer"&gt;Eric Enge: The Art of SEO&lt;/a&gt; — the definitive book on SEO strategy, 4th edition&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.mariehaynes.com/" rel="noopener noreferrer"&gt;Marie Haynes: Google Quality Updates&lt;/a&gt; — expert analysis of Google's quality algorithm changes&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.zyppy.com/" rel="noopener noreferrer"&gt;Cyrus Shepard: SEO Testing&lt;/a&gt; — data-driven SEO experiments and findings&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.portent.com/" rel="noopener noreferrer"&gt;Portent: SEO Research&lt;/a&gt; — original research on ranking factors and algorithm behavior&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.bloomberg.com/news/articles/2024-05-14/google-s-ai-overviews-messy-rollout-highlights-search-risks" rel="noopener noreferrer"&gt;Bloomberg: Google AI Overviews Rollout&lt;/a&gt; — reporting on AI Overviews challenges and improvements&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>performance</category>
    </item>
    <item>
      <title>Building a RAG Crawler with Supabase and Gemini for SEO Audits</title>
      <dc:creator>Eduard</dc:creator>
      <pubDate>Fri, 21 Aug 2026 13:56:01 +0000</pubDate>
      <link>https://dev.to/edo911/building-a-rag-crawler-with-supabase-and-gemini-for-seo-audits-1gl9</link>
      <guid>https://dev.to/edo911/building-a-rag-crawler-with-supabase-and-gemini-for-seo-audits-1gl9</guid>
      <description>&lt;h1&gt;
  
  
  Building a RAG Crawler with Supabase and Gemini for SEO Audits
&lt;/h1&gt;

&lt;p&gt;Most RAG examples start with PDFs, documentation, or a collection of text files.&lt;/p&gt;

&lt;p&gt;Websites are a different problem.&lt;/p&gt;

&lt;p&gt;A website is a connected system of pages containing HTML, metadata, headings, links, structured data, canonical URLs, and content that changes over time. If an AI SEO auditor only receives the HTML of the page being analyzed, it has very limited context.&lt;/p&gt;

&lt;p&gt;While building &lt;a href="https://www.auditme.dev/" rel="noopener noreferrer"&gt;AuditMe&lt;/a&gt;, I needed a crawler and retrieval layer that could turn a website into structured, searchable context for an AI audit.&lt;/p&gt;

&lt;p&gt;The resulting pipeline is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;URL
  ↓
HTTP Fetch
  ↓
Cheerio Parse
  ↓
Chunking
  ↓
Gemini Embeddings
  ↓
Supabase pgvector
  ↓
Cosine Retrieval
  ↓
Grounded LLM Prompt
  ↓
Structured JSON Audit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The interesting part is not just the RAG component.&lt;/p&gt;

&lt;p&gt;The crawler also has to deal with SSRF, redirects, robots.txt, throttling, JavaScript-rendered applications, duplicate URLs, incremental refreshes, and the difference between deterministic SEO checks and AI-generated analysis.&lt;/p&gt;

&lt;p&gt;This article explains how the system works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why an SEO auditor needs RAG
&lt;/h2&gt;

&lt;p&gt;A conventional SEO crawler can detect many problems deterministically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;missing title;&lt;/li&gt;
&lt;li&gt;missing meta description;&lt;/li&gt;
&lt;li&gt;missing canonical;&lt;/li&gt;
&lt;li&gt;broken links;&lt;/li&gt;
&lt;li&gt;missing alt text;&lt;/li&gt;
&lt;li&gt;HTTP status problems;&lt;/li&gt;
&lt;li&gt;redirect chains;&lt;/li&gt;
&lt;li&gt;missing structured data;&lt;/li&gt;
&lt;li&gt;heading structure;&lt;/li&gt;
&lt;li&gt;hreflang configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those checks do not need an LLM.&lt;/p&gt;

&lt;p&gt;But other questions are semantic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the page adequately cover its topic?&lt;/li&gt;
&lt;li&gt;Are several pages targeting the same intent?&lt;/li&gt;
&lt;li&gt;Is the content too thin or repetitive?&lt;/li&gt;
&lt;li&gt;Which sections are relevant to a particular recommendation?&lt;/li&gt;
&lt;li&gt;Does the page's content support the conclusions generated by the AI?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where retrieval becomes useful.&lt;/p&gt;

&lt;p&gt;Instead of giving the LLM an arbitrary amount of HTML, the system retrieves the most relevant chunks from the page and injects them into the audit prompt.&lt;/p&gt;

&lt;p&gt;The goal is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Give the model the evidence it needs, rather than asking it to invent context.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  1. The architecture
&lt;/h1&gt;

&lt;p&gt;The current pipeline is deliberately straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 +----------------+
                 |      URL       |
                 +-------+--------+
                         |
                         v
                 +----------------+
                 |   HTTP Fetch   |
                 +-------+--------+
                         |
                         v
                 +----------------+
                 | Cheerio Parse  |
                 +-------+--------+
                         |
                         v
                 +----------------+
                 | Chunking       |
                 | 1400 / 150     |
                 +-------+--------+
                         |
                         v
                 +----------------+
                 | Gemini         |
                 | Embeddings     |
                 | 768 dimensions |
                 +-------+--------+
                         |
                         v
                 +----------------+
                 | Supabase       |
                 | pgvector       |
                 | HNSW           |
                 +-------+--------+
                         |
                         v
                 +----------------+
                 | Top-K Retrieval|
                 | in Node        |
                 +-------+--------+
                         |
                         v
                 +----------------+
                 | Grounded LLM   |
                 | Prompt         |
                 +-------+--------+
                         |
                         v
                 +----------------+
                 | Zod Validation |
                 | Structured JSON |
                 +----------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is an important implementation detail here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Supabase stores the embeddings and provides an HNSW index, but the current audit retrieval path performs brute-force cosine similarity in Node for the page's own chunks.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That may sound redundant.&lt;/p&gt;

&lt;p&gt;It is intentional.&lt;/p&gt;

&lt;p&gt;The database layer is ready for vector retrieval, while the current audit path can cheaply retrieve from the relatively small number of chunks belonging to one page.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. Crawling the page
&lt;/h1&gt;

&lt;p&gt;The first stage is an HTTP fetch.&lt;/p&gt;

&lt;p&gt;The fetched HTML is parsed with Cheerio.&lt;/p&gt;

&lt;p&gt;The crawler extracts substantially more than visible text:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;title
meta description
canonical
Open Graph tags
Twitter cards
H1-H3
images
internal links
external links
nofollow links
word count
JSON-LD types
hreflang
redirect chains
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This produces two different kinds of information.&lt;/p&gt;

&lt;h3&gt;
  
  
  Structured information
&lt;/h3&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;title
canonical
status code
links
JSON-LD
hreflang
redirects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are stored and analyzed as structured data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unstructured information
&lt;/h3&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;paragraphs
headings
article content
product descriptions
documentation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This content is suitable for chunking and embeddings.&lt;/p&gt;

&lt;p&gt;That distinction is important.&lt;/p&gt;

&lt;p&gt;I do not want to turn every SEO fact into a vector.&lt;/p&gt;

&lt;p&gt;If the question is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Does this page have a canonical URL?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the crawler already knows the answer.&lt;/p&gt;

&lt;p&gt;There is no reason to ask an embedding model.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. SSRF protection
&lt;/h1&gt;

&lt;p&gt;A crawler accepts URLs from users.&lt;/p&gt;

&lt;p&gt;That makes SSRF protection a first-class requirement.&lt;/p&gt;

&lt;p&gt;The crawler uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;isSafeURL()
resolveAndValidateIP()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and validates every redirect hop.&lt;/p&gt;

&lt;p&gt;This matters because checking only the initial URL is insufficient.&lt;/p&gt;

&lt;p&gt;Consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://example.com
        ↓
302 redirect
        ↓
http://internal-host
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the crawler validates only the first URL, the redirect can bypass the protection.&lt;/p&gt;

&lt;p&gt;The crawler therefore resolves and validates the destination at every redirect hop.&lt;/p&gt;

&lt;p&gt;The general rule is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Never trust a redirect simply because the original URL was considered safe.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A production crawler also needs to consider private, loopback, link-local, and other non-public address ranges.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. robots.txt
&lt;/h1&gt;

&lt;p&gt;The crawler respects robots.txt.&lt;/p&gt;

&lt;p&gt;The implementation caches robots.txt for one hour per domain.&lt;/p&gt;

&lt;p&gt;It also resolves rules using the longest-pattern-match approach rather than treating the first matching rule as authoritative.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request URL
     |
     v
robots.txt cache
     |
     v
matching rules
     |
     v
longest matching pattern
     |
     v
Allow / Disallow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The crawler also honors a site-declared &lt;code&gt;Crawl-delay&lt;/code&gt; when present.&lt;/p&gt;

&lt;p&gt;The default throttle is 100 ms.&lt;/p&gt;

&lt;p&gt;This is deliberately conservative.&lt;/p&gt;

&lt;p&gt;A crawler should not turn a small SEO audit into a traffic spike against the target server.&lt;/p&gt;




&lt;h1&gt;
  
  
  5. BFS crawling
&lt;/h1&gt;

&lt;p&gt;The scheduler uses breadth-first search.&lt;/p&gt;

&lt;p&gt;The current limits are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;concurrency: 5
maxPages:    200
maxDepth:    5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A simplified crawl looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Depth 0
  |
  +-- homepage
       |
       +-- Depth 1
             |
             +-- page A
             +-- page B
             +-- page C
                    |
                    +-- Depth 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;BFS is useful for SEO crawling because it tends to discover pages close to the site's entry points before going deeper.&lt;/p&gt;

&lt;p&gt;The scheduler also needs URL deduplication.&lt;/p&gt;

&lt;p&gt;Without it, the same page can be reached through multiple internal links and repeatedly scheduled.&lt;/p&gt;




&lt;h1&gt;
  
  
  6. Handling SPAs
&lt;/h1&gt;

&lt;p&gt;Traditional HTTP fetching is not enough for every modern website.&lt;/p&gt;

&lt;p&gt;A single-page application may initially return:&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;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"root"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/assets/app.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;while the actual content is produced by JavaScript.&lt;/p&gt;

&lt;p&gt;The crawler detects common SPA signals such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#root
#app
JavaScript bundles
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and can optionally fall back to Playwright rendering.&lt;/p&gt;

&lt;p&gt;The important principle is not to render every page in a full browser.&lt;/p&gt;

&lt;p&gt;Browser rendering is more expensive.&lt;/p&gt;

&lt;p&gt;The preferred strategy is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP fetch
   |
   +--&amp;gt; sufficient HTML?
   |        |
   |       yes
   |        |
   |        v
   |      parse
   |
   +--&amp;gt; likely SPA?
            |
            v
       optional render
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the expensive path only when necessary.&lt;/p&gt;




&lt;h1&gt;
  
  
  7. Content extraction
&lt;/h1&gt;

&lt;p&gt;After Cheerio parsing, the page content is normalized.&lt;/p&gt;

&lt;p&gt;The crawler caps content at 10,000 characters before the RAG pipeline.&lt;/p&gt;

&lt;p&gt;This is important for two reasons.&lt;/p&gt;

&lt;p&gt;First, very large pages can dominate embedding and prompt costs.&lt;/p&gt;

&lt;p&gt;Second, most SEO audit questions do not require every byte of a page.&lt;/p&gt;

&lt;p&gt;The extraction stage tries to preserve meaningful text while avoiding common HTML noise.&lt;/p&gt;

&lt;p&gt;The result is roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;title
meta description
h1
body content
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;plus the structured page metadata collected separately.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. Chunking strategy
&lt;/h1&gt;

&lt;p&gt;The chunker uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MAX_CHARS = 1400
OVERLAP   = 150
MAX_CHUNKS = 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It uses a sliding window, but prefers a sentence boundary when possible.&lt;/p&gt;

&lt;p&gt;The boundary preference is based on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;". "
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;rather than blindly cutting at character 1400.&lt;/p&gt;

&lt;p&gt;This is a small implementation detail with a large practical effect.&lt;/p&gt;

&lt;p&gt;Consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...Google recommends descriptive page titles because
they help users understand the result...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A hard character boundary can split a sentence.&lt;/p&gt;

&lt;p&gt;A sentence-aware boundary is usually a better semantic unit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Synthetic chunk 0
&lt;/h2&gt;

&lt;p&gt;The first chunk is special.&lt;/p&gt;

&lt;p&gt;Chunk 0 contains a synthetic header:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TITLE: ...
| meta_description
| h1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives the embedding representation immediate access to the page's most important SEO metadata.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TITLE: Technical SEO Guide
| Learn how to audit technical SEO
| Technical SEO Checklist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can improve retrieval for queries related to the page's main topic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical chunk ceiling
&lt;/h2&gt;

&lt;p&gt;The body is capped at 10,000 characters.&lt;/p&gt;

&lt;p&gt;With a maximum of 10 chunks and the current chunk size, the practical number of chunks is usually lower.&lt;/p&gt;

&lt;p&gt;In practice, the current implementation generally produces around eight real body chunks for a page that reaches the content cap, with chunk 0 reserved for the synthetic header.&lt;/p&gt;

&lt;p&gt;The point is to keep the retrieval corpus small and predictable.&lt;/p&gt;




&lt;h1&gt;
  
  
  9. Gemini embeddings
&lt;/h1&gt;

&lt;p&gt;The embedding model is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gemini-embedding-001
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The stored vectors use 768 dimensions.&lt;/p&gt;

&lt;p&gt;The model supports Matryoshka-style dimensionality reduction, allowing the embedding representation to be truncated to the required dimensionality.&lt;/p&gt;

&lt;p&gt;The system batches up to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;96 texts per request
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Embedding requests can fail transiently, particularly under rate limits.&lt;/p&gt;

&lt;p&gt;The current retry strategy is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;maximum attempts: 3
backoff: attempt * 2000 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the retry delays are approximately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2000 ms
4000 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;depending on which attempt is being retried.&lt;/p&gt;

&lt;p&gt;Authentication is performed with the:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;x-goog-api-key
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;header.&lt;/p&gt;

&lt;p&gt;The application exposes the Gemini key through:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GOOGLE_GEMINI_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  10. Supabase and pgvector
&lt;/h1&gt;

&lt;p&gt;The embeddings are stored in Supabase PostgreSQL using pgvector.&lt;/p&gt;

&lt;p&gt;The core table is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="n"&gt;extension&lt;/span&gt; &lt;span class="n"&gt;if&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;exists&lt;/span&gt; &lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;page_embeddings&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;bigint&lt;/span&gt; &lt;span class="k"&gt;generated&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="k"&gt;identity&lt;/span&gt; &lt;span class="k"&gt;primary&lt;/span&gt; &lt;span class="k"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;chunk_index&lt;/span&gt; &lt;span class="nb"&gt;integer&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;chunk_text&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;768&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="k"&gt;source&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="s1"&gt;'gemini-embedding-001'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;meta&lt;/span&gt; &lt;span class="n"&gt;jsonb&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="s1"&gt;'{}'&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;jsonb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="n"&gt;timestamptz&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="n"&gt;updated_at&lt;/span&gt; &lt;span class="n"&gt;timestamptz&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="k"&gt;unique&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunk_index&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;One correction is worth calling out explicitly.&lt;/p&gt;

&lt;p&gt;If you copy an older version of this schema, you may see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;source&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="s1"&gt;'gemini:text-embedding-004'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is stale metadata from an earlier embedding setup.&lt;/p&gt;

&lt;p&gt;The current embedding model for this implementation is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gemini-embedding-001
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The database schema should describe the model actually producing the vectors.&lt;/p&gt;




&lt;h1&gt;
  
  
  11. HNSW index
&lt;/h1&gt;

&lt;p&gt;The table uses an HNSW index for cosine similarity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;index&lt;/span&gt; &lt;span class="n"&gt;page_embeddings_hnsw_idx&lt;/span&gt;
  &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="n"&gt;page_embeddings&lt;/span&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;hnsw&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="n"&gt;vector_cosine_ops&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;HNSW is useful when vector collections become large enough that scanning every vector for every query becomes expensive.&lt;/p&gt;

&lt;p&gt;The important distinction in this implementation is that the HNSW index exists at the database layer, but the current audit path does not depend on it for its normal page-local retrieval.&lt;/p&gt;

&lt;p&gt;Instead, the current flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;page URL
   |
   v
retrieve its chunks
   |
   v
calculate cosine similarity in Node
   |
   v
sort
   |
   v
take top 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because a single page is limited to a small number of chunks, brute-force similarity is cheap.&lt;/p&gt;

&lt;p&gt;This is a good example of not optimizing for a problem you do not currently have.&lt;/p&gt;




&lt;h1&gt;
  
  
  12. Supabase RPC
&lt;/h1&gt;

&lt;p&gt;The database also exposes a vector-search RPC:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="k"&gt;replace&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;search_page_chunks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;p_url&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;p_embedding&lt;/span&gt; &lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;p_limit&lt;/span&gt; &lt;span class="nb"&gt;integer&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;returns&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;chunk_index&lt;/span&gt; &lt;span class="nb"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;chunk_text&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;similarity&lt;/span&gt; &lt;span class="nb"&gt;double&lt;/span&gt; &lt;span class="nb"&gt;precision&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;language&lt;/span&gt; &lt;span class="k"&gt;sql&lt;/span&gt;
&lt;span class="k"&gt;stable&lt;/span&gt;
&lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="err"&gt;$$&lt;/span&gt;
  &lt;span class="k"&gt;select&lt;/span&gt;
    &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chunk_index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chunk_text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p_embedding&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;similarity&lt;/span&gt;
  &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;page_embeddings&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
  &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p_url&lt;/span&gt;
  &lt;span class="k"&gt;order&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p_embedding&lt;/span&gt;
  &lt;span class="k"&gt;limit&lt;/span&gt; &lt;span class="n"&gt;p_limit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;&amp;lt;=&amp;gt;&lt;/code&gt; operator is pgvector's cosine distance operator.&lt;/p&gt;

&lt;p&gt;Therefore:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;similarity = 1 - cosine_distance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The RPC makes it possible to move retrieval into PostgreSQL when that becomes preferable.&lt;/p&gt;




&lt;h1&gt;
  
  
  13. The actual RAG flow
&lt;/h1&gt;

&lt;p&gt;The audit pipeline is deliberately narrow.&lt;/p&gt;

&lt;p&gt;For each page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Fetch page
2. Parse with Cheerio
3. Cap content at 10K characters
4. Chunk content
5. Generate embeddings
6. Store chunks
7. Create query from page metadata
8. Retrieve top chunks
9. Inject chunks into LLM prompt
10. Generate structured audit
11. Validate JSON with Zod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The indexing call is conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;indexPageChunks(
  url,
  {
    title,
    meta_description,
    h1,
    content_text
  }
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The page's own metadata becomes the retrieval query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&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="nx"&gt;meta_description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;join&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an important design choice.&lt;/p&gt;

&lt;p&gt;The query is not an arbitrary user question.&lt;/p&gt;

&lt;p&gt;It represents the page's own declared topic.&lt;/p&gt;




&lt;h1&gt;
  
  
  14. Top-K retrieval
&lt;/h1&gt;

&lt;p&gt;The current retrieval function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;topKChunks()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;performs cosine similarity in Node.&lt;/p&gt;

&lt;p&gt;It returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;top 5 chunks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with a minimum similarity threshold of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0.15
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the practical rule is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;similarity &amp;gt; 0.15
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and then take the five highest-scoring chunks.&lt;/p&gt;

&lt;p&gt;The threshold should not be interpreted as a universal semantic quality boundary.&lt;/p&gt;

&lt;p&gt;Embedding scores are model- and dataset-dependent.&lt;/p&gt;

&lt;p&gt;A threshold that works for one corpus may be terrible for another.&lt;/p&gt;

&lt;p&gt;The correct approach is to evaluate retrieval against representative queries and tune it empirically.&lt;/p&gt;




&lt;h1&gt;
  
  
  15. Grounding the LLM
&lt;/h1&gt;

&lt;p&gt;The retrieved chunks are injected into the prompt under:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RETRIEVED PAGE CONTENT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model therefore receives evidence retrieved from the actual page.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SYSTEM / AUDIT INSTRUCTIONS

PAGE METADATA

TECHNICAL SEO DATA

RETRIEVED PAGE CONTENT
----------------------

[chunk 1]

[chunk 2]

[chunk 3]

[chunk 4]

[chunk 5]

Return structured JSON.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This does not magically eliminate hallucinations.&lt;/p&gt;

&lt;p&gt;But it changes the model's job.&lt;/p&gt;

&lt;p&gt;Instead of generating an SEO assessment from an isolated prompt, it can reason over the page's actual retrieved content.&lt;/p&gt;




&lt;h1&gt;
  
  
  16. Structured JSON and Zod
&lt;/h1&gt;

&lt;p&gt;The LLM output is not accepted blindly.&lt;/p&gt;

&lt;p&gt;The generated audit is validated with Zod.&lt;/p&gt;

&lt;p&gt;The conceptual flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LLM
 |
 v
JSON
 |
 v
Zod schema
 |
 +--&amp;gt; valid --&amp;gt; audit result
 |
 +--&amp;gt; invalid --&amp;gt; fallback/error handling
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This matters because an LLM can produce syntactically invalid JSON, missing fields, unexpected values, or the wrong data types.&lt;/p&gt;

&lt;p&gt;A schema turns the LLM from an untrusted output generator into a component with a defined contract.&lt;/p&gt;




&lt;h1&gt;
  
  
  17. Deterministic fallback
&lt;/h1&gt;

&lt;p&gt;The AI layer is not the only source of insights.&lt;/p&gt;

&lt;p&gt;If the LLM fails, the audit pipeline can fall back to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;buildDeterministicInsights()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This rule engine handles deterministic findings without requiring an AI response.&lt;/p&gt;

&lt;p&gt;That gives the system an important property:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An AI outage should not make the entire SEO audit useless.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example, if the crawler already knows that a page has no canonical, that fact does not disappear because an LLM request failed.&lt;/p&gt;




&lt;h1&gt;
  
  
  18. SEO checks that should remain deterministic
&lt;/h1&gt;

&lt;p&gt;Some checks are simply better implemented as code.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;title exists?
meta description exists?
canonical exists?
H1 exists?
HTTP status is 200?
internal link is broken?
JSON-LD exists?
hreflang is valid?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An LLM is unnecessary here.&lt;/p&gt;

&lt;p&gt;The strongest architecture is therefore:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Deterministic crawler/checks
          +
RAG retrieval
          +
LLM reasoning
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;not:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Everything → LLM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This reduces cost and makes the technical checks reproducible.&lt;/p&gt;




&lt;h1&gt;
  
  
  19. Content quality signals
&lt;/h1&gt;

&lt;p&gt;The crawler also calculates content-quality signals such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Flesch reading ease
keyword stuffing
complex-word ratio
word count
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The keyword-stuffing detector currently flags keyword density above:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;3%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These metrics should be treated as signals, not absolute truth.&lt;/p&gt;

&lt;p&gt;For example, a technical article can legitimately repeat a domain-specific term many times.&lt;/p&gt;

&lt;p&gt;A simple density threshold cannot understand that context.&lt;/p&gt;

&lt;p&gt;The useful approach is to use these metrics as evidence alongside the actual content.&lt;/p&gt;




&lt;h1&gt;
  
  
  20. Cannibalization detection
&lt;/h1&gt;

&lt;p&gt;One of the more interesting uses of embeddings is content cannibalization.&lt;/p&gt;

&lt;p&gt;The system can compare page embeddings using pairwise cosine similarity.&lt;/p&gt;

&lt;p&gt;The current threshold is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0.85
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Page A ────────┐
               │ cosine similarity
Page B ────────┘
       |
       v
 similarity &amp;gt;= 0.85
       |
       v
 potential semantic overlap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The current comparison is O(n²).&lt;/p&gt;

&lt;p&gt;That is fine for a relatively small set of pages.&lt;/p&gt;

&lt;p&gt;It becomes expensive as the number of pages grows.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100 pages  -&amp;gt; 4,950 pairs
1,000 pages -&amp;gt; 499,500 pairs
10,000 pages -&amp;gt; 49,995,000 pairs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So pairwise comparison is useful as an initial implementation, but a large-scale crawler would eventually need a more efficient nearest-neighbor approach.&lt;/p&gt;

&lt;p&gt;And again, similarity does not prove cannibalization.&lt;/p&gt;

&lt;p&gt;It identifies candidates for further analysis.&lt;/p&gt;




&lt;h1&gt;
  
  
  21. Incremental refresh
&lt;/h1&gt;

&lt;p&gt;A crawler that only works when a user manually starts an audit is not enough for monitoring.&lt;/p&gt;

&lt;p&gt;AuditMe also has an incremental refresh process.&lt;/p&gt;

&lt;p&gt;The refresh job checks the:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;50 most recent scans
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;using HTTP validators:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If-None-Match
If-Modified-Since
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the page has not changed, there is no reason to download and re-embed it.&lt;/p&gt;

&lt;p&gt;If it has changed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;re-scan
   ↓
re-extract
   ↓
re-chunk
   ↓
re-embed
   ↓
update audit data
   ↓
update score history
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is significantly cheaper than reprocessing every page every time.&lt;/p&gt;




&lt;h1&gt;
  
  
  22. Crawl job monitoring
&lt;/h1&gt;

&lt;p&gt;Long-running jobs need a failure mechanism.&lt;/p&gt;

&lt;p&gt;The crawler marks stale jobs as failed after:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10 minutes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sites that have not been crawled for more than:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;7 days
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can be scheduled for another crawl.&lt;/p&gt;

&lt;p&gt;This creates a basic monitoring loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;crawl
 |
 v
fresh data
 |
 v
7 days
 |
 v
refresh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact interval can be changed depending on how frequently the target sites change.&lt;/p&gt;




&lt;h1&gt;
  
  
  23. Database model beyond embeddings
&lt;/h1&gt;

&lt;p&gt;The RAG table is only one part of the application.&lt;/p&gt;

&lt;p&gt;The other important tables are:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;scans&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Used for a 24-hour cache.&lt;/p&gt;

&lt;p&gt;It includes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;url
data JSONB
etag
last_modified
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The URL is the primary key.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;audit_results&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Stores permanent audits.&lt;/p&gt;

&lt;p&gt;Each audit has a UUID and includes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rag_debug
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is particularly useful when debugging retrieval quality.&lt;/p&gt;

&lt;p&gt;If an AI recommendation looks wrong, you want to know what context the model actually received.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;score_history&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Stores score changes over time.&lt;/p&gt;

&lt;p&gt;This makes trend analysis possible instead of showing only the current score.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;crawl_jobs&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Tracks crawler execution and status.&lt;/p&gt;

&lt;p&gt;Old jobs are cleaned up using a seven-day TTL policy.&lt;/p&gt;




&lt;h1&gt;
  
  
  24. Why &lt;code&gt;rag_debug&lt;/code&gt; matters
&lt;/h1&gt;

&lt;p&gt;RAG systems are notoriously difficult to debug if retrieval is invisible.&lt;/p&gt;

&lt;p&gt;Suppose the LLM makes a bad recommendation.&lt;/p&gt;

&lt;p&gt;There are several possible causes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;crawler extracted the wrong content
        ↓
chunking lost context
        ↓
embedding was poor
        ↓
retrieval selected wrong chunks
        ↓
prompt was unclear
        ↓
LLM reasoned incorrectly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without retrieval diagnostics, these problems all look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"The AI gave a bad answer."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is not actionable.&lt;/p&gt;

&lt;p&gt;Keeping retrieval information in &lt;code&gt;rag_debug&lt;/code&gt; makes the pipeline observable.&lt;/p&gt;

&lt;p&gt;You can inspect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;query
retrieved chunks
similarity scores
source URL
chunk indexes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and determine where the failure occurred.&lt;/p&gt;




&lt;h1&gt;
  
  
  25. Environment configuration
&lt;/h1&gt;

&lt;p&gt;The main environment variables are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GOOGLE_GEMINI_API_KEY
SUPABASE_SERVICE_ROLE_KEY
PAGESPEED_API_KEY
CRUX_API_KEY
CRON_SECRET
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Their responsibilities are separated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GOOGLE_GEMINI_API_KEY
    -&amp;gt; Gemini embeddings + LLM

SUPABASE_SERVICE_ROLE_KEY
    -&amp;gt; server-side database administration

PAGESPEED_API_KEY
    -&amp;gt; PageSpeed enrichment

CRUX_API_KEY
    -&amp;gt; Chrome UX / Core Web Vitals enrichment

CRON_SECRET
    -&amp;gt; protected scheduled jobs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The service-role key should never be exposed to browser-side code.&lt;/p&gt;




&lt;h1&gt;
  
  
  26. What I learned from building it
&lt;/h1&gt;

&lt;p&gt;The main lesson is that RAG is only one part of the system.&lt;/p&gt;

&lt;p&gt;A useful web intelligence pipeline needs several layers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 1: Fetching
&lt;/h2&gt;

&lt;p&gt;Get the actual page safely.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP
redirects
robots
throttling
SSRF protection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Layer 2: Parsing
&lt;/h2&gt;

&lt;p&gt;Turn HTML into useful information.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;metadata
content
links
schema
headings
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Layer 3: Structured analysis
&lt;/h2&gt;

&lt;p&gt;Run deterministic checks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;status
canonical
titles
links
schema
hreflang
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Layer 4: Retrieval
&lt;/h2&gt;

&lt;p&gt;Find semantically relevant content.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chunk
embed
search
rank
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Layer 5: Reasoning
&lt;/h2&gt;

&lt;p&gt;Let the LLM interpret the evidence.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;retrieved content
+
technical facts
+
audit instructions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Layer 6: Validation
&lt;/h2&gt;

&lt;p&gt;Never trust generated output blindly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LLM
 ↓
Zod
 ↓
structured audit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That separation makes the system much easier to reason about.&lt;/p&gt;




&lt;h1&gt;
  
  
  27. What I would improve next
&lt;/h1&gt;

&lt;p&gt;There are several obvious directions for future iterations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better retrieval
&lt;/h3&gt;

&lt;p&gt;The current page-local brute-force retrieval is simple and fast, but a larger corpus could use database-side HNSW retrieval or a hybrid search strategy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better chunking
&lt;/h3&gt;

&lt;p&gt;The current 1400-character sliding window works, but heading-aware and semantic chunking could preserve context more effectively.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better reranking
&lt;/h3&gt;

&lt;p&gt;Top-K vector similarity is not necessarily the final ranking.&lt;/p&gt;

&lt;p&gt;A reranker could improve retrieval precision.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better site-wide RAG
&lt;/h3&gt;

&lt;p&gt;The current audit query is primarily page-focused.&lt;/p&gt;

&lt;p&gt;A broader retrieval layer could answer questions across the entire site.&lt;/p&gt;

&lt;h3&gt;
  
  
  Faster cannibalization detection
&lt;/h3&gt;

&lt;p&gt;O(n²) pairwise comparison will eventually become a bottleneck.&lt;/p&gt;

&lt;p&gt;Nearest-neighbor search can reduce the number of comparisons.&lt;/p&gt;

&lt;h3&gt;
  
  
  More browser rendering
&lt;/h3&gt;

&lt;p&gt;Some JavaScript-heavy sites require full rendering to accurately inspect their content.&lt;/p&gt;

&lt;p&gt;That should remain an optional expensive path rather than the default for every URL.&lt;/p&gt;




&lt;h1&gt;
  
  
  28. The bigger picture
&lt;/h1&gt;

&lt;p&gt;The crawler is not just an ingestion script.&lt;/p&gt;

&lt;p&gt;Once the site is represented as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pages
+
links
+
metadata
+
content
+
embeddings
+
crawl history
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;it becomes possible to build much more than a basic SEO checker.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;semantic content clusters
        ↓
internal linking recommendations

similar pages
        ↓
cannibalization candidates

content changes
        ↓
historical SEO monitoring

retrieved page content
        ↓
grounded AI recommendations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the direction I am taking with AuditMe.&lt;/p&gt;

&lt;p&gt;The objective is not to replace deterministic SEO tooling with an LLM.&lt;/p&gt;

&lt;p&gt;It is to combine deterministic analysis with semantic retrieval and AI reasoning.&lt;/p&gt;




&lt;h1&gt;
  
  
  29. Final architecture
&lt;/h1&gt;

&lt;p&gt;The complete system can be summarized as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                         WEBSITE
                            |
                            v
                    +---------------+
                    | Safe Crawler  |
                    +-------+-------+
                            |
             +--------------+--------------+
             |              |              |
             v              v              v
          Metadata        Links         Content
             |              |              |
             +--------------+--------------+
                            |
                            v
                     Chunking 1400/150
                            |
                            v
                  Gemini embedding-001
                            |
                            v
                    768-dim vectors
                            |
                            v
                +-----------------------+
                | Supabase PostgreSQL   |
                | pgvector + HNSW       |
                +-----------+-----------+
                            |
                            v
                 Page-local Top-K
                 cosine retrieval
                            |
                            v
                RETRIEVED PAGE CONTENT
                            |
                            v
                       Grounded LLM
                            |
                            v
                     Zod validation
                            |
             +--------------+--------------+
             |                             |
             v                             v
       Structured Audit          Deterministic Fallback
             |
             v
                    AuditMe Results
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key idea is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The crawler collects evidence. PostgreSQL stores facts. pgvector stores semantic representations. Retrieval selects context. The LLM reasons over that context.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That division of responsibilities is what makes the system practical.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Building RAG for websites is fundamentally different from building RAG over static documents.&lt;/p&gt;

&lt;p&gt;The difficult part is not generating an embedding.&lt;/p&gt;

&lt;p&gt;It is building a reliable representation of the website before the embedding is ever created.&lt;/p&gt;

&lt;p&gt;You need to handle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;safe URL fetching;&lt;/li&gt;
&lt;li&gt;redirects;&lt;/li&gt;
&lt;li&gt;robots.txt;&lt;/li&gt;
&lt;li&gt;crawl limits;&lt;/li&gt;
&lt;li&gt;SPA rendering;&lt;/li&gt;
&lt;li&gt;HTML extraction;&lt;/li&gt;
&lt;li&gt;content normalization;&lt;/li&gt;
&lt;li&gt;chunking;&lt;/li&gt;
&lt;li&gt;embeddings;&lt;/li&gt;
&lt;li&gt;vector storage;&lt;/li&gt;
&lt;li&gt;retrieval;&lt;/li&gt;
&lt;li&gt;structured SEO checks;&lt;/li&gt;
&lt;li&gt;LLM validation;&lt;/li&gt;
&lt;li&gt;incremental refresh;&lt;/li&gt;
&lt;li&gt;historical data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once those pieces are separated, the architecture becomes much easier to extend.&lt;/p&gt;

&lt;p&gt;And that is the real value of combining a crawler with RAG:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You are not simply giving an AI access to a webpage. You are giving it a structured, retrievable representation of the website it is supposed to analyze.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can see the resulting SEO auditing product at &lt;a href="https://www.auditme.dev/" rel="noopener noreferrer"&gt;AuditMe&lt;/a&gt; and try the &lt;a href="https://www.auditme.dev/website-seo-checker" rel="noopener noreferrer"&gt;Website SEO Checker&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The code examples in this article are simplified versions of the implementation. Production crawlers should additionally account for rate limiting, resource limits, security hardening, rendering costs, database lifecycle management, and workload isolation.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>supabase</category>
      <category>seo</category>
    </item>
    <item>
      <title>How to Actually Raise Your Google PageSpeed Score in 2026</title>
      <dc:creator>Eduard</dc:creator>
      <pubDate>Wed, 05 Aug 2026 01:45:27 +0000</pubDate>
      <link>https://dev.to/edo911/how-to-actually-raise-your-google-pagespeed-score-in-2026-2cme</link>
      <guid>https://dev.to/edo911/how-to-actually-raise-your-google-pagespeed-score-in-2026-2cme</guid>
      <description>&lt;p&gt;A few weeks ago I finished a three-hour deep dive into font loading for a client. Subsetting, preloading, &lt;code&gt;font-display: swap&lt;/code&gt; — the works. PageSpeed came back at 92.&lt;br&gt;
The client asked the only question that mattered: “Did we fix the real problem?”&lt;/p&gt;

&lt;p&gt;The hero image was still 4.2 MB. One conversion to AVIF and a proper &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; tag later the score dropped to 58. Suddenly Lighthouse could see everything else that was broken.&lt;/p&gt;

&lt;p&gt;That’s the thing about PageSpeed scores. They show you what the lab thinks is slow. Real users often experience something completely different.&lt;/p&gt;
&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What PageSpeed Insights Really Measures&lt;/li&gt;
&lt;li&gt;Real Case Study: 42 → 91 in One Afternoon&lt;/li&gt;
&lt;li&gt;The Five Things That Move the Needle Most&lt;/li&gt;
&lt;li&gt;When the Score Lies&lt;/li&gt;
&lt;li&gt;My Real Workflow (Not a Checklist)&lt;/li&gt;
&lt;li&gt;The WebP (and AVIF) Trap + Code Example&lt;/li&gt;
&lt;li&gt;Fonts That Don’t Block the Page&lt;/li&gt;
&lt;li&gt;Why INP Matters More Than the Old FID&lt;/li&gt;
&lt;li&gt;The Real 80/20&lt;/li&gt;
&lt;li&gt;When to Stop&lt;/li&gt;
&lt;li&gt;Quick Checks Before the Next Test&lt;/li&gt;
&lt;li&gt;Bottom Line&lt;/li&gt;
&lt;li&gt;Related Guides&lt;/li&gt;
&lt;li&gt;Sources &amp;amp; Further Reading&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  What PageSpeed Insights Really Measures
&lt;/h2&gt;

&lt;p&gt;Google PageSpeed Insights runs Lighthouse in a controlled lab. You get a 0–100 number. That number itself is not a ranking factor. Core Web Vitals are. And the two are related, but not identical.&lt;/p&gt;

&lt;p&gt;Here’s the simple rule I give clients:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Below 50 → real problems that users feel&lt;/li&gt;
&lt;li&gt;50–89 → fix the obvious stuff&lt;/li&gt;
&lt;li&gt;90+ → open Chrome DevTools and look at actual load time before you celebrate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a deeper look at the ranking metrics that actually matter, see our guide on &lt;a href="https://www.auditme.dev/blog/how-to-fix-core-web-vitals" rel="noopener noreferrer"&gt;how to fix Core Web Vitals issues&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Real Case Study: 42 → 91 in One Afternoon
&lt;/h2&gt;

&lt;p&gt;Last month a mid-size e-commerce client came in with a mobile PageSpeed score of &lt;strong&gt;42&lt;/strong&gt;. Field data from CrUX showed LCP at &lt;strong&gt;4.1 s&lt;/strong&gt; and INP at &lt;strong&gt;380 ms&lt;/strong&gt;. Users were bouncing hard on product pages.&lt;br&gt;
We did two things only:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Converted the 3.8 MB hero JPEG to AVIF (primary) + WebP (fallback) and served it with a proper &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Removed or deferred 1.2 MB of third-party trackers and chat widgets that were blocking the main thread.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Results after one afternoon of work:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mobile PageSpeed&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LCP&lt;/td&gt;
&lt;td&gt;4.1 s&lt;/td&gt;
&lt;td&gt;1.3 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INP&lt;/td&gt;
&lt;td&gt;380 ms&lt;/td&gt;
&lt;td&gt;95 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total page weight&lt;/td&gt;
&lt;td&gt;6.4 MB&lt;/td&gt;
&lt;td&gt;1.9 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;No fancy critical CSS, no server migration, no CDN change. Just images and JavaScript hygiene. That’s why I keep saying the big wins are almost always the boring ones.&lt;/p&gt;

&lt;p&gt;Want to see where your own site stands right now? Open the &lt;a href="https://www.auditme.dev/free-seo-analyzer" rel="noopener noreferrer"&gt;free SEO analyzer&lt;/a&gt; in another tab and run your URL while you keep reading.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Five Things That Move the Needle Most
&lt;/h2&gt;

&lt;p&gt;After looking at more than two hundred sites, the same five issues keep showing up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Images.&lt;/strong&gt; Almost always the biggest culprit. I have yet to audit a site under 70 where images weren’t the main drag. Full details in our &lt;a href="https://www.auditme.dev/blog/image-seo-complete-guide" rel="noopener noreferrer"&gt;Image SEO complete guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JavaScript execution time.&lt;/strong&gt; This one hides. You can score 95 and still have three seconds of main-thread blocking. Check the Performance panel, not just the Lighthouse report. Slow JS is also the primary reason INP fails on mobile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server response time (TTFB).&lt;/strong&gt; If the server takes more than 800 ms to answer, nothing else you do will feel fast.&lt;br&gt;
&lt;strong&gt;Caching.&lt;/strong&gt; Set it once and every return visitor benefits.&lt;br&gt;
&lt;strong&gt;CDN.&lt;/strong&gt; If your audience is spread across countries and your origin is in one place, a CDN is no longer optional.&lt;/p&gt;
&lt;h2&gt;
  
  
  When the Score Lies
&lt;/h2&gt;

&lt;p&gt;Last quarter I checked a Shopify store that scored 98. Actual load time for a real user: 4.2 seconds. Forty-seven tracking scripts, a chat widget, a popup, and three recommendation engines. Lighthouse tested a clean version without most of that noise.&lt;br&gt;
Lab data and field data are different animals. Real visitors have ad blockers, older phones, and flaky connections that no lab simulation fully captures.&lt;/p&gt;
&lt;h2&gt;
  
  
  My Real Workflow (Not a Checklist)
&lt;/h2&gt;

&lt;p&gt;When someone asks me to improve their score, this is what I actually do.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open DevTools first. Look at the network waterfall. Total size, number of requests, longest assets.
&lt;strong&gt;Try it now:&lt;/strong&gt; open Chrome DevTools on your own site, go to Network, disable cache, reload, and sort by size. If anything over 200 KB is an image or a third-party script, you already know your first target.&lt;/li&gt;
&lt;li&gt;Find the biggest offenders. Usually images. Sometimes a 2 MB JavaScript bundle that does almost nothing useful.&lt;/li&gt;
&lt;li&gt;Fix images. Convert to modern formats, add &lt;code&gt;srcset&lt;/code&gt;, lazy-load everything below the fold. Fifteen minutes of work often gains 10–20 points.&lt;/li&gt;
&lt;li&gt;Kill unused JavaScript. Open the Coverage tab. Sixty to eighty percent of the code is frequently never executed. Remove it.&lt;/li&gt;
&lt;li&gt;Stop over-optimizing. Chasing the last three points on a 95 score is rarely worth the time.
If you want a broader technical check after these steps, run a full &lt;a href="https://www.auditme.dev/blog/complete-seo-audit-guide-2026" rel="noopener noreferrer"&gt;SEO audit&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  The WebP (and AVIF) Trap + Code Example
&lt;/h2&gt;

&lt;p&gt;Everyone says “just convert to WebP.” I did that once and the score went down. Older Safari versions didn’t support it cleanly, and the fallback JPEG was three times larger.&lt;br&gt;
Now I always use the full &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element with multiple sources and a solid fallback. More markup, but it works everywhere.&lt;/p&gt;

&lt;p&gt;Here’s the exact pattern I ship:&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;picture&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt;
    &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"hero-800.avif 800w, hero-1200.avif 1200w, hero-1600.avif 1600w"&lt;/span&gt;
    &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"image/avif"&lt;/span&gt;
    &lt;span class="na"&gt;sizes=&lt;/span&gt;&lt;span class="s"&gt;"(max-width: 768px) 100vw, 1200px"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt;
    &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"hero-800.webp 800w, hero-1200.webp 1200w, hero-1600.webp 1600w"&lt;/span&gt;
    &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"image/webp"&lt;/span&gt;
    &lt;span class="na"&gt;sizes=&lt;/span&gt;&lt;span class="s"&gt;"(max-width: 768px) 100vw, 1200px"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt;
    &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"hero-1200.jpg"&lt;/span&gt;
    &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"1200"&lt;/span&gt;
    &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"675"&lt;/span&gt;
    &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Product hero showing the main benefit"&lt;/span&gt;
    &lt;span class="na"&gt;fetchpriority=&lt;/span&gt;&lt;span class="s"&gt;"high"&lt;/span&gt;
    &lt;span class="na"&gt;decoding=&lt;/span&gt;&lt;span class="s"&gt;"async"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/picture&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AVIF first, WebP second, JPEG last.&lt;/li&gt;
&lt;li&gt;Explicit &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; prevent CLS.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fetchpriority="high"&lt;/code&gt; on the LCP image.&lt;/li&gt;
&lt;li&gt;Never put &lt;code&gt;loading="lazy"&lt;/code&gt; on the hero.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For third-party scripts that are not needed on first paint, the same principle applies:&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="c"&gt;&amp;lt;!-- Bad: blocks parsing and execution --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/tracker.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- Better: does not block parsing --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/tracker.js"&lt;/span&gt; &lt;span class="na"&gt;defer&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- Best for non-critical widgets: load only after interaction or idle --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;load&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="o"&gt;=&amp;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;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;script&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.com/chat-widget.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&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;h2&gt;
  
  
  Fonts That Don’t Block the Page
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;font-display: swap&lt;/code&gt; is not a magic bullet. It just means invisible text for a moment, then a flash. Fine for body copy. Ugly for headlines.&lt;br&gt;
My current approach: system fonts for body text, and for brand fonts — preload only the exact weights you actually use. I still see sites loading twelve font files when they need three.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why INP Matters More Than the Old FID
&lt;/h2&gt;

&lt;p&gt;FID (First Input Delay) only measured the delay before the very first interaction. Google replaced it with &lt;strong&gt;INP (Interaction to Next Paint)&lt;/strong&gt; in 2024, and by 2026 it is the only interactivity metric that counts for ranking.&lt;/p&gt;

&lt;p&gt;INP looks at &lt;em&gt;every&lt;/em&gt; interaction throughout the page life — clicks, taps, key presses — and reports the worst ones (98th percentile). That is why a site can have a perfect lab score and still feel laggy on a mid-range Android phone.&lt;br&gt;
The main cause of poor INP is almost always JavaScript that monopolizes the main thread for longer than 50 ms. Long tasks from analytics, chat widgets, A/B testing libraries, or heavy event handlers are the usual suspects.&lt;/p&gt;

&lt;p&gt;Practical ways to improve INP:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Break long tasks into chunks under 50 ms (&lt;code&gt;setTimeout&lt;/code&gt;, &lt;code&gt;requestIdleCallback&lt;/code&gt;, or the newer Scheduler API).&lt;/li&gt;
&lt;li&gt;Defer or remove third-party scripts that run on every page load.&lt;/li&gt;
&lt;li&gt;Use the Coverage tab and the Performance panel together — Coverage shows unused code, Performance shows the actual long tasks.
If your INP is above 200 ms on mobile, fixing JavaScript will usually give a bigger ranking and conversion lift than shaving another 5 points off the PageSpeed score.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Real 80/20
&lt;/h2&gt;

&lt;p&gt;Three actions deliver most of the gain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Compress and correctly size every image (Squoosh is still free and excellent).&lt;/li&gt;
&lt;li&gt;Remove unused JavaScript with the Coverage tab.&lt;/li&gt;
&lt;li&gt;Turn on caching and put a CDN in front of the site. On platforms like Vercel or Netlify this is already handled.
Everything else — critical CSS, advanced preloading, Speculation Rules — is polishing. Do the big three first.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  When to Stop
&lt;/h2&gt;

&lt;p&gt;I once spent eight hours with a client trying to turn a 99 into a 100. The missing point was a 12 KB analytics script that was already async.&lt;br&gt;
My rule now: if the score is above 90 and real load time is under two seconds, stop. Your time is more valuable than that last point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Checks Before the Next Test
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Run the URL through a proper combined audit (PageSpeed + real traffic signals) at &lt;a href="https://www.auditme.dev/" rel="noopener noreferrer"&gt;AuditMe&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Look at your largest image. Anything over 200 KB needs attention.&lt;/li&gt;
&lt;li&gt;In DevTools → Network, disable cache and reload. If the page is over 2 MB, something is wrong.&lt;/li&gt;
&lt;li&gt;Check the JavaScript bundle size. Over 500 KB usually means dead code.&lt;/li&gt;
&lt;li&gt;For a focused score check, use the dedicated &lt;a href="https://www.auditme.dev/seo-score-checker" rel="noopener noreferrer"&gt;SEO Score Checker&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Want the full picture in under a minute? The &lt;a href="https://www.auditme.dev/free-seo-analyzer" rel="noopener noreferrer"&gt;free SEO analyzer&lt;/a&gt; pulls it all together.
## Bottom Line
PageSpeed scores are useful signals, not the final truth. I have seen perfect 100s that felt sluggish and mid-60s that loaded faster than most sites.
Focus on what users actually experience. Under two seconds, green Core Web Vitals (especially LCP under 2.5 s and INP under 200 ms) put you ahead of the majority of the web.
That’s the only score that really matters.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Related Guides
&lt;/h2&gt;

&lt;p&gt;Continue with these practical guides from the same series:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.auditme.dev/blog/complete-seo-audit-guide-2026" rel="noopener noreferrer"&gt;Complete SEO Audit Guide 2026: How to Find and Fix Every Issue&lt;/a&gt; — full 12-point checklist covering meta tags, schema, content, and more.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.auditme.dev/blog/how-to-fix-core-web-vitals" rel="noopener noreferrer"&gt;How to Fix Core Web Vitals Issues: LCP, INP, CLS Explained&lt;/a&gt; — deep dive into the three metrics that actually affect rankings.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.auditme.dev/blog/image-seo-complete-guide" rel="noopener noreferrer"&gt;Image SEO: Complete Guide to Optimizing Images for Search&lt;/a&gt; — formats, responsive images, alt text, and performance impact.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sources &amp;amp; Further Reading
&lt;/h2&gt;

&lt;p&gt;This article draws on practical audit experience and the following public resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pagespeed.web.dev/" rel="noopener noreferrer"&gt;Google PageSpeed Insights&lt;/a&gt; — official lab and field data tool.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://web.dev/articles/vitals" rel="noopener noreferrer"&gt;Web Vitals documentation&lt;/a&gt; — Google’s definitions and thresholds for LCP, INP, and CLS.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.chrome.com/docs/lighthouse/performance/performance-scoring" rel="noopener noreferrer"&gt;Lighthouse scoring methodology&lt;/a&gt; — how the 0–100 score is calculated.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://web.dev/articles/optimize-lcp" rel="noopener noreferrer"&gt;Optimize LCP&lt;/a&gt; and &lt;a href="https://web.dev/articles/optimize-inp" rel="noopener noreferrer"&gt;Optimize INP&lt;/a&gt; — official Chrome performance guides.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://squoosh.app/" rel="noopener noreferrer"&gt;Squoosh&lt;/a&gt; — free image compression and format conversion tool referenced in the 80/20 section.&lt;/li&gt;
&lt;li&gt;Internal site resources: &lt;a href="https://www.auditme.dev/" rel="noopener noreferrer"&gt;AuditMe&lt;/a&gt;, &lt;a href="https://www.auditme.dev/seo-score-checker" rel="noopener noreferrer"&gt;SEO Score Checker&lt;/a&gt;, &lt;a href="https://www.auditme.dev/free-seo-analyzer" rel="noopener noreferrer"&gt;Free SEO Analyzer&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>seo</category>
      <category>webperf</category>
      <category>webdev</category>
      <category>performance</category>
    </item>
    <item>
      <title>WordPress SEO Audit Checklist — 15 Things Worth Checking in 2026</title>
      <dc:creator>Eduard</dc:creator>
      <pubDate>Sun, 02 Aug 2026 21:54:34 +0000</pubDate>
      <link>https://dev.to/edo911/wordpress-seo-audit-checklist-15-things-worth-checking-in-2026-5a5n</link>
      <guid>https://dev.to/edo911/wordpress-seo-audit-checklist-15-things-worth-checking-in-2026-5a5n</guid>
      <description>&lt;p&gt;WordPress still powers about 43% of the web. That means your competition is not only other WordPress sites — it’s also headless setups, well-funded content teams, and stores that ship updates every week.&lt;br&gt;
Most ranking drops I see on WordPress installs come from the same three places:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Plugin and theme conflicts that quietly break technical SEO&lt;/li&gt;
&lt;li&gt;On-page issues that accumulate over months&lt;/li&gt;
&lt;li&gt;Content that became thin or outdated while nobody was looking
A focused 30–40 minute audit once a month (or at least once a quarter) catches most of this damage early. Here’s the exact checklist I use.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How to use this checklist&lt;/li&gt;
&lt;li&gt;
Technical SEO (5–8 minutes)

&lt;ul&gt;
&lt;li&gt;1. Permalink structure&lt;/li&gt;
&lt;li&gt;2. XML Sitemap&lt;/li&gt;
&lt;li&gt;3. robots.txt&lt;/li&gt;
&lt;li&gt;4. Broken links (internal first)&lt;/li&gt;
&lt;li&gt;5. HTTPS and mixed content&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
On-Page SEO (10–15 minutes)

&lt;ul&gt;
&lt;li&gt;6. Title tags&lt;/li&gt;
&lt;li&gt;7. Meta descriptions&lt;/li&gt;
&lt;li&gt;8. H1 tags&lt;/li&gt;
&lt;li&gt;9. Heading hierarchy&lt;/li&gt;
&lt;li&gt;10. Image alt text + performance&lt;/li&gt;
&lt;li&gt;11. Internal links&lt;/li&gt;
&lt;li&gt;12. Content length and quality&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Schema, Social &amp;amp; Performance (5–10 minutes)

&lt;ul&gt;
&lt;li&gt;13. Structured data (Schema)&lt;/li&gt;
&lt;li&gt;14. Open Graph and Twitter Cards&lt;/li&gt;
&lt;li&gt;15. Core Web Vitals&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Priority order after the audit&lt;/li&gt;
&lt;li&gt;Useful free (or freemium) tools&lt;/li&gt;
&lt;li&gt;Final notes&lt;/li&gt;
&lt;li&gt;Similar useful articles&lt;/li&gt;
&lt;li&gt;Sources &amp;amp; further reading&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  How to use this checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Do it in order. Technical issues first — they affect everything else.&lt;/li&gt;
&lt;li&gt;Spend more time on your top 10–20 pages by traffic or revenue.&lt;/li&gt;
&lt;li&gt;Write down every problem you find. Don’t try to fix everything in one sitting.&lt;/li&gt;
&lt;li&gt;After the audit, prioritize: high impact + low effort first.&lt;/li&gt;
&lt;li&gt;Re-check rankings and organic traffic 2–4 weeks later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t need expensive tools for the first pass. Browser, Search Console, PageSpeed Insights, and one free crawler are enough. If you want to speed things up, you can also run a quick automated check with a &lt;a href="https://www.auditme.dev/wordpress-seo-audit" rel="noopener noreferrer"&gt;free WordPress SEO audit tool&lt;/a&gt; that covers many of these points in under a minute.&lt;/p&gt;
&lt;h2&gt;
  
  
  Technical SEO (5–8 minutes)
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Permalink structure
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Where:&lt;/strong&gt; Settings → Permalinks&lt;br&gt;
&lt;strong&gt;What to look for:&lt;/strong&gt;&lt;br&gt;
If it’s set to “Plain” (&lt;code&gt;?p=123&lt;/code&gt;), change it immediately to &lt;strong&gt;Post name&lt;/strong&gt; (&lt;code&gt;/%postname%/&lt;/code&gt;).&lt;br&gt;
Plain permalinks are bad for users and for crawlers. Almost every site that isn’t a massive news portal with very specific URL requirements should use Post name.&lt;br&gt;
&lt;strong&gt;After changing:&lt;/strong&gt;&lt;br&gt;
Check 3–5 older posts. If any 404, set up redirects (Redirection plugin or Rank Math / Yoast redirect features work fine). Most modern SEO plugins handle the bulk of this automatically.&lt;br&gt;
&lt;strong&gt;Common mistake:&lt;/strong&gt; Changing permalinks on a live site without checking redirects. Always test.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. XML Sitemap
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Check:&lt;/strong&gt; &lt;code&gt;yoursite.com/sitemap.xml&lt;/code&gt; or &lt;code&gt;yoursite.com/sitemap_index.xml&lt;/code&gt;&lt;br&gt;
Yoast, Rank Math, All in One SEO and most other plugins generate one automatically. If you get a 404, the sitemap is either not generated or blocked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Confirm the sitemap loads and contains your important pages&lt;/li&gt;
&lt;li&gt;Submit it in Google Search Console and Bing Webmaster Tools&lt;/li&gt;
&lt;li&gt;Watch the Coverage / Pages report for sudden drops in indexed URLs — this often points back to sitemap or robots problems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pro tip:&lt;/strong&gt; If you have a large site, check that the sitemap is split into multiple files and that pagination works. A single giant sitemap can cause issues.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. robots.txt
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Check:&lt;/strong&gt; &lt;code&gt;yoursite.com/robots.txt&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Dangerous pattern I still see regularly:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: *
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /&lt;span class="n"&gt;wp&lt;/span&gt;-&lt;span class="n"&gt;admin&lt;/span&gt;/
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /&lt;span class="n"&gt;wp&lt;/span&gt;-&lt;span class="n"&gt;content&lt;/span&gt;/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Blocking &lt;code&gt;/wp-content/&lt;/code&gt; is almost never correct. CSS, JS, fonts and images live there. Search engines need to fetch them to understand how the page renders.&lt;br&gt;
&lt;strong&gt;Safer minimal version:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: *
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /&lt;span class="n"&gt;wp&lt;/span&gt;-&lt;span class="n"&gt;admin&lt;/span&gt;/
&lt;span class="n"&gt;Allow&lt;/span&gt;: /&lt;span class="n"&gt;wp&lt;/span&gt;-&lt;span class="n"&gt;admin&lt;/span&gt;/&lt;span class="n"&gt;admin&lt;/span&gt;-&lt;span class="n"&gt;ajax&lt;/span&gt;.&lt;span class="n"&gt;php&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anything more aggressive (blocking specific plugins, query parameters, etc.) should be intentional and documented. When in doubt, be less restrictive.&lt;br&gt;
Also check that important pages or directories are not accidentally blocked.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Broken links (internal first)
&lt;/h3&gt;

&lt;p&gt;Broken internal links waste crawl budget and create dead ends for users. External 404s are less critical but still look unprofessional.&lt;br&gt;
&lt;strong&gt;Quick approach:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a free crawler (Screaming Frog free version, Sitebulb trial, or online tools)&lt;/li&gt;
&lt;li&gt;Or use the link checker in your SEO plugin / audit tool&lt;/li&gt;
&lt;li&gt;Focus first on internal links from high-traffic pages and from the homepage / main menus
&lt;strong&gt;Fix strategy:&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Update or remove the link&lt;/li&gt;
&lt;li&gt;Or set a 301 redirect if the target page moved
For large sites, schedule a deeper crawl monthly. Don’t try to fix every external 404 on the first pass.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. HTTPS and mixed content
&lt;/h3&gt;

&lt;p&gt;The entire site should load over HTTPS. Mixed content (HTTP images, scripts or stylesheets on HTTPS pages) still triggers browser warnings and can affect trust signals.&lt;br&gt;
&lt;strong&gt;How to check:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chrome DevTools → Security tab&lt;/li&gt;
&lt;li&gt;Or look in the Console for mixed-content warnings&lt;/li&gt;
&lt;li&gt;PageSpeed Insights and most audit tools also flag this
&lt;strong&gt;Fix:&lt;/strong&gt; Update the source URLs to HTTPS or force HTTPS at the server / CDN / plugin level (Really Simple SSL, Cloudflare, or host-level settings).
---
## On-Page SEO (10–15 minutes)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Title tags
&lt;/h3&gt;

&lt;p&gt;Every important page needs a unique title. Aim for under ~60 characters so it doesn’t get truncated in search results.&lt;br&gt;
&lt;strong&gt;What to check on your top pages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the title unique?&lt;/li&gt;
&lt;li&gt;Does it contain the primary keyword near the beginning (when it still reads naturally)?&lt;/li&gt;
&lt;li&gt;Is it written for humans or just stuffed with keywords?
Generic titles like “Home”, “Services” or “Blog” waste valuable space.
&lt;strong&gt;Tool tip:&lt;/strong&gt; You can bulk-export titles with most SEO plugins or use a free browser extension / Screaming Frog.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. Meta descriptions
&lt;/h3&gt;

&lt;p&gt;Same rules as titles: unique, roughly under 155–160 characters, written for humans first.&lt;br&gt;
Meta descriptions do not directly influence rankings, but they heavily influence click-through rate. A page that ranks well but has a weak or missing description is leaving clicks (and therefore rankings) on the table.&lt;br&gt;
Write them like a short ad: clear benefit + keyword + reason to click.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. H1 tags
&lt;/h3&gt;

&lt;p&gt;One H1 per page. It should describe the main topic and preferably contain the primary keyword.&lt;br&gt;
Multiple H1s still appear frequently with page builders (Elementor, Divi, Bricks, etc.) and poorly coded themes.&lt;br&gt;
&lt;strong&gt;How to check:&lt;/strong&gt; Inspect the page source or use the browser inspector. Search for &lt;code&gt;&amp;lt;h1&lt;/code&gt;. If you see more than one, fix the template or the specific page.&lt;/p&gt;

&lt;h3&gt;
  
  
  9. Heading hierarchy
&lt;/h3&gt;

&lt;p&gt;Correct order: H1 → H2 → H3 → H4.&lt;br&gt;
Don’t skip levels just for visual design. Screen readers and search engines both prefer a logical outline.&lt;br&gt;
Page builders make it very easy to create a visual hierarchy that doesn’t match the actual HTML heading tags. Always verify the real markup.&lt;/p&gt;

&lt;h3&gt;
  
  
  10. Image alt text + performance
&lt;/h3&gt;

&lt;p&gt;Every meaningful image needs descriptive alt text.&lt;br&gt;
&lt;code&gt;IMG_20260725.jpg&lt;/code&gt; or empty alt attributes tell Google (and screen readers) nothing useful.&lt;br&gt;
“WordPress SEO audit checklist screenshot” is useful.&lt;br&gt;
Decorative images should have empty alt (&lt;code&gt;alt=""&lt;/code&gt;) so assistive technology skips them.&lt;br&gt;
&lt;strong&gt;While you’re there:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compress images&lt;/li&gt;
&lt;li&gt;Serve modern formats (WebP / AVIF) where possible&lt;/li&gt;
&lt;li&gt;Add proper width/height attributes to reduce CLS
Performance and accessibility often improve together.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  11. Internal links
&lt;/h3&gt;

&lt;p&gt;Aim for 3–5 relevant contextual internal links on most content pages. Link to related posts, category hubs, pillar pages or key service pages.&lt;br&gt;
This helps distribute authority and makes the site structure clearer to crawlers.&lt;br&gt;
&lt;strong&gt;Avoid:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Footer or sidebar link spam&lt;/li&gt;
&lt;li&gt;Linking to the same page over and over&lt;/li&gt;
&lt;li&gt;Using exact-match anchor text on every link
Contextual links inside the content work best.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  12. Content length and quality
&lt;/h3&gt;

&lt;p&gt;Thin pages (under ~300 words of real content) rarely rank for competitive terms. Pillar pages, money pages and important guides usually need 1,000+ words of genuinely useful material.&lt;br&gt;
This does &lt;strong&gt;not&lt;/strong&gt; mean padding. It means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Answering the main query thoroughly&lt;/li&gt;
&lt;li&gt;Covering related questions people also ask&lt;/li&gt;
&lt;li&gt;Updating outdated sections&lt;/li&gt;
&lt;li&gt;Removing fluff that adds no value
&lt;strong&gt;Practical check:&lt;/strong&gt; Look at your top landing pages by traffic. If organic traffic has slowly declined while the SERP became more competitive, content quality and freshness are often the first places to look.
Also check for near-duplicate pages (especially category/tag pages and pagination) that may be competing with each other.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Schema, Social &amp;amp; Performance (5–10 minutes)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  13. Structured data (Schema)
&lt;/h3&gt;

&lt;p&gt;Run several key pages through &lt;a href="https://search.google.com/test/rich-results" rel="noopener noreferrer"&gt;Google’s Rich Results Test&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Look for valid JSON-LD. The most common high-value types on WordPress sites are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Article / BlogPosting&lt;/li&gt;
&lt;li&gt;FAQ&lt;/li&gt;
&lt;li&gt;HowTo&lt;/li&gt;
&lt;li&gt;Product&lt;/li&gt;
&lt;li&gt;Organization&lt;/li&gt;
&lt;li&gt;BreadcrumbList&lt;/li&gt;
&lt;li&gt;WebSite (with sitelinks search box)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most SEO plugins can output basic schema. Custom post types, complex templates or page-builder pages often need manual JSON-LD or a more flexible solution.&lt;br&gt;
Invalid or missing schema means you are leaving rich results (and higher CTR) on the table.&lt;/p&gt;

&lt;h3&gt;
  
  
  14. Open Graph and Twitter Cards
&lt;/h3&gt;

&lt;p&gt;Share 2–3 important pages on LinkedIn, Facebook or X and look at the preview.&lt;br&gt;
&lt;strong&gt;Check:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Correct title&lt;/li&gt;
&lt;li&gt;Correct description&lt;/li&gt;
&lt;li&gt;Correct image (and that it looks good, not cropped or low-res)
Missing or wrong OG tags produce ugly social shares and lower click-through from social traffic. Yoast and Rank Math handle the basics well. Double-check featured image dimensions if previews look bad.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  15. Core Web Vitals
&lt;/h3&gt;

&lt;p&gt;Test the homepage and 2–3 important templates (single post, archive, product page, etc.) in &lt;a href="https://pagespeed.web.dev/" rel="noopener noreferrer"&gt;PageSpeed Insights&lt;/a&gt;.&lt;br&gt;
&lt;strong&gt;Targets (mobile):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LCP &amp;lt; 2.5 s&lt;/li&gt;
&lt;li&gt;CLS &amp;lt; 0.1&lt;/li&gt;
&lt;li&gt;INP &amp;lt; 200 ms
&lt;strong&gt;Most common WordPress culprits:&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Heavy page builders&lt;/li&gt;
&lt;li&gt;Unoptimized hero images&lt;/li&gt;
&lt;li&gt;Render-blocking plugins and scripts&lt;/li&gt;
&lt;li&gt;Too many marketing / tracking scripts&lt;/li&gt;
&lt;li&gt;Lack of proper caching and CDN
&lt;strong&gt;High-impact fixes:&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Good caching plugin (or host-level caching)&lt;/li&gt;
&lt;li&gt;CDN&lt;/li&gt;
&lt;li&gt;Image optimization + modern formats&lt;/li&gt;
&lt;li&gt;Delay or conditionally load non-critical JavaScript&lt;/li&gt;
&lt;li&gt;Reduce the number of active plugins
Deeper issues sometimes require changing the theme or how the page builder is used.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Priority order after the audit
&lt;/h2&gt;

&lt;p&gt;Don’t try to fix everything at once. Suggested order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Critical technical&lt;/strong&gt; — Permalinks, robots.txt, HTTPS, major broken internal links, sitemap not working&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High-visibility on-page&lt;/strong&gt; — Titles and meta descriptions of top pages, missing H1s, obvious thin content on money pages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt; — Core Web Vitals on homepage and key templates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schema &amp;amp; social&lt;/strong&gt; — Structured data on important pages, Open Graph&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ongoing content &amp;amp; internal linking&lt;/strong&gt; — Systematic improvements over the following weeks
Track the pages you changed. Give Google 2–4 weeks and then review rankings + organic traffic.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Useful free (or freemium) tools
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Crawl &amp;amp; broken links&lt;/td&gt;
&lt;td&gt;Screaming Frog (free)&lt;/td&gt;
&lt;td&gt;500 URLs limit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Core Web Vitals&lt;/td&gt;
&lt;td&gt;PageSpeed Insights&lt;/td&gt;
&lt;td&gt;Official&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rich results&lt;/td&gt;
&lt;td&gt;Google Rich Results Test&lt;/td&gt;
&lt;td&gt;Official&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search performance&lt;/td&gt;
&lt;td&gt;Google Search Console&lt;/td&gt;
&lt;td&gt;Essential&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bulk title/meta check&lt;/td&gt;
&lt;td&gt;SEO plugin + export or SF&lt;/td&gt;
&lt;td&gt;Rank Math / Yoast work well&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;robots.txt &amp;amp; sitemap&lt;/td&gt;
&lt;td&gt;Browser + Search Console&lt;/td&gt;
&lt;td&gt;Simple&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quick site audit&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.auditme.dev/" rel="noopener noreferrer"&gt;AuditMe&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Free automated checks + WordPress-specific fixes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  You can do a solid first-pass audit with almost no paid tools. For a faster overview of titles, meta tags and overall score, the &lt;a href="https://www.auditme.dev/free-seo-analyzer" rel="noopener noreferrer"&gt;free SEO analyzer&lt;/a&gt; is also handy.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Final notes
&lt;/h2&gt;

&lt;p&gt;Most WordPress sites I look at have at least 4–7 clear, fixable issues sitting in the technical and on-page sections. The difference between “we should do an SEO audit someday” and actually finishing one is usually just having a concrete checklist and 40 focused minutes.&lt;br&gt;
Do the technical part first. Then the top pages. Write everything down. Fix the high-impact items. Repeat in a few weeks or next month.&lt;br&gt;
That’s it. Go run it on your site.&lt;br&gt;
If you want, reply with the biggest issue you found — I’m curious what still surprises people in 2026.&lt;br&gt;
You can also run a full automated check anytime at &lt;a href="https://www.auditme.dev" rel="noopener noreferrer"&gt;AuditMe&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Similar useful articles
&lt;/h2&gt;

&lt;p&gt;If you want to go deeper or see how others approach the same problem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pressvise.com/blog/wordpress-seo-audit-checklist-what-to-actually-check" rel="noopener noreferrer"&gt;WordPress SEO Audit Checklist: 7 Real Checks&lt;/a&gt; — focuses on crawl architecture, theme-level Core Web Vitals and plugin conflicts.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://devonicweb.co.uk/complete-wordpress-seo-checklist-for-2026-step-by-step-optimization-guide/" rel="noopener noreferrer"&gt;Complete WordPress SEO Checklist for 2026 (37 Fixes)&lt;/a&gt; — very practical step-by-step list with prioritization.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://rankai.ai/articles/technical-seo-for-wordpress-checklist-fixes" rel="noopener noreferrer"&gt;Technical SEO for WordPress: Checklist &amp;amp; Fixes (2026)&lt;/a&gt; — strong on technical signals, canonicals and “one owner per signal” rule.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.surfaceable.io/blog/seo-audit-checklist-2026" rel="noopener noreferrer"&gt;SEO Audit Checklist 2026: 50 Checks&lt;/a&gt; — broader 50-point audit that works beyond WordPress.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sources &amp;amp; further reading
&lt;/h2&gt;

&lt;p&gt;This checklist is based on practical experience plus official documentation and established SEO references:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Official / primary sources&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/search/docs/appearance/core-web-vitals" rel="noopener noreferrer"&gt;Google Search Central – Core Web Vitals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://search.google.com/test/rich-results" rel="noopener noreferrer"&gt;Google Rich Results Test&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/search/docs" rel="noopener noreferrer"&gt;Google Search Console documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pagespeed.web.dev/" rel="noopener noreferrer"&gt;PageSpeed Insights&lt;/a&gt;
&lt;strong&gt;Books&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Art of SEO&lt;/em&gt; (Eric Enge, Stephan Spencer, Jessie Stricchiola) — still one of the most solid foundational texts.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;SEO for Growth&lt;/em&gt; by John Jantsch &amp;amp; Phil Singleton — practical and business-oriented.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Beginner’s Guide to SEO&lt;/em&gt; (Moz) — free and regularly updated online version is excellent for fundamentals.
&lt;strong&gt;Selected articles &amp;amp; guides&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Search Engine Land – Core Web Vitals guides and updates&lt;/li&gt;
&lt;li&gt;Semrush – On-page SEO checklist (regularly refreshed)&lt;/li&gt;
&lt;li&gt;Ahrefs &amp;amp; Moz blog posts on technical SEO, internal linking and content audits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core principles (crawlability, clear structure, useful content, good user experience metrics) have been stable for years. The tools and exact thresholds (especially Core Web Vitals and INP) continue to evolve, which is why re-checking every few months still makes sense.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>seo</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Content Optimization for Search Engines: Beyond Keywords</title>
      <dc:creator>Eduard</dc:creator>
      <pubDate>Sat, 01 Aug 2026 11:02:31 +0000</pubDate>
      <link>https://dev.to/edo911/content-optimization-for-search-engines-beyond-keywords-3ebp</link>
      <guid>https://dev.to/edo911/content-optimization-for-search-engines-beyond-keywords-3ebp</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff23epjpckfs97z7gmzzt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff23epjpckfs97z7gmzzt.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Content Optimization for Search Engines: Beyond Keywords
&lt;/h1&gt;

&lt;p&gt;After auditing a SaaS blog last month I saw the same pattern I’ve been seeing for years: 200 well-written posts, almost none of them ranking. The writer came from journalism, so the prose was clean and readable. The problem was structural. Zero keyword targeting, no topical clusters, almost no internal linking. Pretty words with zero organic traffic.&lt;br&gt;
This is the gap I keep running into. People either write for robots (keyword-stuffed nonsense nobody finishes) or they write purely for humans and act like search engines don’t exist. The real work sits in the middle — and it’s not as complicated as most SEO guides make it sound.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keywords Aren’t Dead. They’re Just Different.&lt;/li&gt;
&lt;li&gt;Where the Keywords Actually Belong&lt;/li&gt;
&lt;li&gt;Topical Authority Is the Long Game That Still Works&lt;/li&gt;
&lt;li&gt;E-E-A-T Isn’t a Checklist&lt;/li&gt;
&lt;li&gt;Stop Writing Like a Textbook&lt;/li&gt;
&lt;li&gt;AI Content Is the Elephant in the Room&lt;/li&gt;
&lt;li&gt;Content Freshness: Update Only When It Matters&lt;/li&gt;
&lt;li&gt;Final Thought&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Keywords Aren’t Dead. They’re Just Different.
&lt;/h2&gt;

&lt;p&gt;A few years ago you could force “best project management software” into a page eight times and rank. Those days are gone. Google understands context far better now. That doesn’t mean keywords stopped mattering. It means the way you use them changed.&lt;br&gt;
When I start optimizing a piece I still do keyword research, but volume is only one signal. Intent is the bigger one. Someone searching “project management software” wants comparisons and pricing. Someone searching “how to manage a remote project team” wants a practical walkthrough. Same broad topic, completely different content.&lt;/p&gt;

&lt;p&gt;I mostly use Ahrefs. SEMrush works fine too. The rule I learned the expensive way: match commercial-intent keywords to product pages and informational-intent keywords to the blog. Trying to rank a blog post for a high-intent transactional term is usually a multi-month waste of time.&lt;br&gt;
Question-based keywords are still underrated. Featured snippets love clear, direct answers. I’ll take a question like “how many internal links should a page have,” answer it in the first two sentences of a section, then expand. That short direct answer often wins the snippet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where the Keywords Actually Belong
&lt;/h3&gt;

&lt;p&gt;You don’t need to be surgical, but there is a practical hierarchy I follow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Primary keyword near the front of the title tag, in the H1, and inside the first 100 words&lt;/li&gt;
&lt;li&gt;Secondary keywords in H2s and H3s&lt;/li&gt;
&lt;li&gt;Meta description should contain the primary keyword naturally — not forced, just present&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Early in my career I cost a client three months of traction with a simple meta description mistake. We were targeting “enterprise SEO platform.” I wrote a clean, persuasive description that somehow never included the exact phrase. Google didn’t bold anything in the SERP. CTR sat at 1.2%. I added the keyword, kept the same position and the same content, and CTR moved to 3.8% in two weeks.&lt;/p&gt;

&lt;p&gt;One thing I’ll push back on: obsessing over “LSI keywords.” Google does use related terms and entities, but most tools turn that idea into a checklist you sprinkle in. Don’t. Write thoroughly about the topic and the related concepts appear naturally. If you’re covering coffee makers you’ll mention grind size, water temperature, filter types and brew methods without forcing a list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Topical Authority Is the Long Game That Still Works
&lt;/h2&gt;

&lt;p&gt;Most people quit too early here. Topical authority is Google deciding you actually know a subject, not just ranking one lucky page. It takes consistent coverage of related subtopics over months.&lt;br&gt;
I learned this with a project-management client. We had a strong pillar ranking around position 6 for “project management.” Traffic stalled. Looking at Asana and Monday.com showed the gap immediately — they had dozens of pages covering every angle: agile vs waterfall, remote team management, timeline estimation, tool comparisons. We were competing with one page against an entire ecosystem.&lt;/p&gt;

&lt;p&gt;So we built a proper cluster: one 4,000-word pillar (“Complete Guide to Project Management”) plus four focused pieces on the subtopics. Descriptive anchor text both ways. Four months later the pillar moved from 6 to 2. The cluster pages together brought in roughly 22K monthly organic visits. Nothing revolutionary in any single post — just breadth and clear connections.&lt;/p&gt;

&lt;p&gt;The practical version: pick your core topics, build 5–8 solid pieces around each one, and link them tightly. That’s still the most reliable way I’ve found to move the needle on competitive terms. For a deeper breakdown of this approach you can check the &lt;a href="https://www.auditme.dev/blog/topical-authority-content-clusters-dominate-search" rel="noopener noreferrer"&gt;topical authority guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  E-E-A-T Isn’t a Checklist
&lt;/h2&gt;

&lt;p&gt;Google’s E-E-A-T framework (Experience, Expertise, Authoritativeness, Trustworthiness) gets treated like a box-ticking exercise: add an author bio, cite three sources, done. That misses the point.&lt;br&gt;
I’ve audited plenty of sites with perfect author bios and “meet the experts” pages that still rank poorly. The content itself was shallow rehashes of whatever already sat on page one. E-E-A-T isn’t something you bolt on. It’s something the content demonstrates if it’s actually useful.&lt;br&gt;
What moved the needle for me was adding first-hand experience: specific client numbers, what worked, what failed, the exact mistakes I made. Traffic improved — not because Google has a magic “experience detector,” but because those details make the piece more useful, and usefulness is what the ranking systems are getting better at measuring.&lt;br&gt;
The Experience signal is still the most underused. If you’re reviewing a tool, show real screenshots of you using it. If you’re giving advice, say when it worked and when it didn’t. Generic advice doesn’t signal experience. Specific, slightly imperfect, real-world advice does.&lt;br&gt;
For trustworthiness, cite sources. Not because Google necessarily gives a direct ranking boost (though it might), but because unsourced claims read like marketing copy. When I link to a study or reference concrete data, readers trust the piece more. Trust improves engagement metrics, and those still matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stop Writing Like a Textbook
&lt;/h2&gt;

&lt;p&gt;I used to write long dense paragraphs because I thought that felt “comprehensive.” It just made people leave. Time on page dropped, scroll depth was terrible, bounce rate sat around 78%.&lt;br&gt;
Now I keep paragraphs short — usually two to four sentences. I drop a subheading every 200–300 words. I use bullets when a list is clearer than narrative. I deliberately vary sentence length so the rhythm doesn’t become hypnotic and boring.&lt;/p&gt;

&lt;p&gt;I aim for roughly grade 8–10 readability. Not because Google cares about Flesch-Kincaid scores (it doesn’t), but because that range correlates with people actually finishing the article. If your content reads like a legal brief, most readers won’t get past the intro. For practical tips on writing that ranks without sounding robotic, see the &lt;a href="https://www.auditme.dev/blog/seo-copywriting-readability" rel="noopener noreferrer"&gt;SEO copywriting guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Content Is the Elephant in the Room
&lt;/h2&gt;

&lt;p&gt;Almost every SEO is using AI to draft now. I use it too. Publishing raw AI output is still a bad idea.&lt;br&gt;
Google’s helpful content systems specifically target low-effort mass-produced content. Even without that, generic AI writing underperforms. I tested it directly. I published an 800-word post that was pure AI draft — well structured, factually correct, zero edits. It landed at position 34 and stayed there. I rewrote the same topic with personal examples, specific numbers from my work, and actual opinions. Same structure, different soul. It moved to position 7 in about two months.&lt;br&gt;
The workable approach is simple: let AI build the skeleton, then add the parts AI still can’t reliably produce — your experience, your specific data, your judgments, the stories that only come from doing the work. Verify every claim. Rewrite anything that sounds generic. Make sure at least one section could only have been written by someone who’s actually done this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Content Freshness: Update Only When It Matters
&lt;/h2&gt;

&lt;p&gt;Google cares about freshness for time-sensitive queries and mostly ignores it for evergreen ones. I still see people rewriting “What Is SEO?” every quarter when nothing substantial has changed. Don’t.&lt;br&gt;
Update when the information is actually outdated, when you have meaningful new data, when competitors have clearly surpassed you, or when a real development lands in the topic. Changing the publish date after a meaningful update does help re-crawling. I had a post stuck at position 8 for six months. I added a solid new section with 2026 data, updated the date, and it moved to position 3 within a month. Freshness signals work — but only when the content itself is genuinely fresher.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Content optimization in 2026 is less about tricks and more about doing the unglamorous work consistently: matching intent, covering topics thoroughly, showing real experience, writing so people actually finish reading, and treating AI as a starting point rather than the finished product.&lt;/p&gt;

&lt;p&gt;None of this is new. Most of it just requires patience and the willingness to go deeper than the average page ranking for the same terms. That still works.&lt;br&gt;
If you want a quick second pair of eyes on a page you’re optimizing, drop the URL into the &lt;a href="https://www.auditme.dev/free-seo-analyzer" rel="noopener noreferrer"&gt;free SEO analyzer&lt;/a&gt; and look at the keyword placement, readability, and structure scores. The numbers won’t rank the page for you, but they usually show the gaps faster than staring at the draft yourself.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>devops</category>
      <category>writing</category>
      <category>google</category>
    </item>
    <item>
      <title>Image SEO: Complete Guide to Optimizing Images for Search</title>
      <dc:creator>Eduard</dc:creator>
      <pubDate>Thu, 30 Jul 2026 07:37:16 +0000</pubDate>
      <link>https://dev.to/edo911/image-seo-complete-guide-to-optimizing-images-for-search-28lp</link>
      <guid>https://dev.to/edo911/image-seo-complete-guide-to-optimizing-images-for-search-28lp</guid>
      <description>&lt;p&gt;A while back I audited an e-commerce site that looked solid on paper. Fast hosting, clean code, decent content. Mobile PageSpeed score: 34. I kept digging until I checked the page weight. Homepage was pulling &lt;strong&gt;14MB&lt;/strong&gt; of images on first paint. Fourteen megabytes. For a homepage.&lt;br&gt;
Every product photo had been uploaded as a 3000px-wide PNG straight from the photographer’s camera. No compression, no resizing, no modern formats. Mobile users on 4G were downloading desktop-sized files. We converted everything to WebP, added proper responsive sizes, and got the total image payload down to about 800KB. Score jumped to 87. That single change — just the images — moved their Core Web Vitals from “poor” to “good” across the whole site.&lt;br&gt;
That’s when it clicked for me. Image SEO isn’t some nice-to-have checklist item. On a lot of sites it’s the biggest performance bottleneck you’ll find.&lt;/p&gt;
&lt;h2&gt;
  
  
  Alt Text (and the mistakes I keep seeing)
&lt;/h2&gt;

&lt;p&gt;Alt text does two jobs that people constantly mix up: it helps screen-reader users understand the image, and it gives search engines context so the image can show up in Google Images. Good alt text does both at once.&lt;br&gt;
What I see in almost every audit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“image of product”&lt;/li&gt;
&lt;li&gt;or pure keyword stuffing: “buy blue widget online best price”
Neither helps anyone. Something specific works better:
“Woman hiking on mountain trail with red backpack at sunset”
That’s useful for a screen reader &lt;em&gt;and&lt;/em&gt; it tells Google exactly what it’s looking at.
Keep it under roughly 125 characters. Screen readers often cut off after that, so longer text just gets ignored. Decorative images (background patterns, spacers, pure design elements) should get an empty alt: &lt;code&gt;alt=""&lt;/code&gt;. That way screen readers skip them instead of announcing “image”.
Early on I made a classic mistake myself. I used the same alt text for every color variant of a product — “Blue running shoe” for the blue, red, &lt;em&gt;and&lt;/em&gt; green versions. Google couldn’t tell them apart in image search. Each variant needs its own unique description.
## File names — the five-minute fix most people skip
I still open sites and see &lt;code&gt;IMG_4729.JPG&lt;/code&gt; and &lt;code&gt;photo-1.png&lt;/code&gt;. File names are a ranking signal for images. Renaming them costs nothing and takes almost no time.
What I do:&lt;/li&gt;
&lt;li&gt;hyphens between words&lt;/li&gt;
&lt;li&gt;include the main keyword&lt;/li&gt;
&lt;li&gt;make it descriptive
&lt;code&gt;red-leather-wallet.jpg&lt;/code&gt; is already better than &lt;code&gt;IMG_4729.JPG&lt;/code&gt;.
&lt;code&gt;seo-audit-checklist-2026.png&lt;/code&gt; tells Google (and future-you) exactly what the file is.
## Formats — my actual take, not the marketing version
WebP is the right default for most photos. You usually get 25–35% smaller files than JPEG at similar quality, and support is over 96%. For product shots and complex images it’s the clear winner.
But I don’t buy the “WebP for everything” advice. On screenshot-heavy tutorial pages I’ve seen WebP create ugly compression artifacts around sharp text edges. In those cases PNG looked better even though the file was larger. Sometimes the “best” format isn’t the best for &lt;em&gt;your&lt;/em&gt; images.
AVIF is technically stronger — up to 50% smaller than WebP — but support still sits around 80%. I use it as a progressive enhancement with a WebP fallback. Most people won’t notice, the ones on modern browsers get a faster load.
SVG for logos and icons is non-negotiable. If your logo is still a PNG, fix it. Vectors scale cleanly and the files are tiny.
Quick rule of thumb I use:&lt;/li&gt;
&lt;li&gt;photos → WebP (or AVIF + WebP fallback)&lt;/li&gt;
&lt;li&gt;screenshots / text-heavy images → PNG&lt;/li&gt;
&lt;li&gt;logos &amp;amp; icons → SVG
## Responsive images — stop sending desktop files to phones
This is the second biggest performance killer after raw file size. Without &lt;code&gt;srcset&lt;/code&gt;, every mobile visitor downloads the full desktop image.
Basic pattern:
&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;img&lt;/span&gt;
  &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"image-800.jpg"&lt;/span&gt;
  &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"image-400.jpg 400w,
          image-800.jpg 800w,
          image-1200.jpg 1200w"&lt;/span&gt;
  &lt;span class="na"&gt;sizes=&lt;/span&gt;&lt;span class="s"&gt;"(max-width: 600px) 400px,
         (max-width: 1000px) 800px,
         1200px"&lt;/span&gt;
  &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Descriptive alt text"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Phone gets the 400px version, tablet 800px, desktop 1200px. On that e-commerce site, just adding responsive images cut average image payload by about 60% for mobile users. That’s the difference between a 3-second load and a 1-second load on typical 4G.&lt;/p&gt;
&lt;h2&gt;
  
  
  Lazy loading — easy to get wrong
&lt;/h2&gt;

&lt;p&gt;Native lazy loading has been around since 2020. Just add &lt;code&gt;loading="lazy"&lt;/code&gt;:&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;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"image.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Description"&lt;/span&gt; &lt;span class="na"&gt;loading=&lt;/span&gt;&lt;span class="s"&gt;"lazy"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The mistake I still see constantly: people lazy-load the hero image. Above-the-fold content should load immediately. Lazy-loading the main visual tanks LCP because the browser waits to fetch the most important image on the page.&lt;br&gt;
Also check your CDN or image optimization service. Some inject their own JavaScript lazy-loading that fights with the native attribute. Open Chrome DevTools and watch the network order — make sure the hero loads first and everything else waits.&lt;/p&gt;
&lt;h2&gt;
  
  
  Image sitemaps — Google can’t index what it never finds
&lt;/h2&gt;

&lt;p&gt;Most images get discovered through the HTML. That fails for images loaded with JavaScript, CSS background images, or stuff buried in carousels and galleries.&lt;br&gt;
Putting images in your XML sitemap gives Google a direct path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://example.com/page&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;image:image&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;image:loc&amp;gt;&lt;/span&gt;https://example.com/image.jpg&lt;span class="nt"&gt;&amp;lt;/image:loc&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;image:caption&amp;gt;&lt;/span&gt;Description of the image&lt;span class="nt"&gt;&amp;lt;/image:caption&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/image:image&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I’ve seen image search traffic double on sites after we added proper image entries to the sitemap. The images weren’t new — Google just couldn’t find them before.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistakes that show up in almost every audit
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Oversized files&lt;/strong&gt; — 3000px wide when the layout only needs 800px. Resize before you upload.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrong format&lt;/strong&gt; — PNG product photos that should be WebP. The size difference hurts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing or useless alt text&lt;/strong&gt; — still the most common issue. In my last 20 audits, 14 had serious gaps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generic file names&lt;/strong&gt; — &lt;code&gt;banner-final-v3.jpg&lt;/code&gt; tells Google nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No lazy loading&lt;/strong&gt; (or lazy-loading everything, including the hero).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leaving EXIF data&lt;/strong&gt; — location and camera info. Some people keep it for context, I usually strip it on client sites for privacy.
## Tools I actually open&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://squoosh.app/" rel="noopener noreferrer"&gt;Squoosh&lt;/a&gt; — still my go-to for quick one-off compression. The quality slider is excellent.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tinypng.com/" rel="noopener noreferrer"&gt;TinyPNG&lt;/a&gt; — solid for batch PNG/WebP work.&lt;/li&gt;
&lt;li&gt;Lighthouse (Chrome DevTools) — run it after every change so you can see the real impact.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.auditme.dev/" rel="noopener noreferrer"&gt;Auditme&lt;/a&gt; — useful for spotting missing alt text, wrong formats, and images that lack responsive sizing across a whole site.
## Quick check
If you want a fast look at your own images:
&lt;a href="https://www.auditme.dev/free-seo-analyzer" rel="noopener noreferrer"&gt;Run a free image SEO analysis&lt;/a&gt;
It flags alt text coverage, format issues, and whether lazy loading is set up correctly.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Eduard Tymchenko&lt;/em&gt;&lt;br&gt;
Building tools that help people find and fix the SEO problems that actually move the needle.&lt;/p&gt;

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