<?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: faikidine</title>
    <description>The latest articles on DEV Community by faikidine (@faikidine).</description>
    <link>https://dev.to/faikidine</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4023707%2F0c2e11bc-c918-4f04-aabc-116585886abf.png</url>
      <title>DEV Community: faikidine</title>
      <link>https://dev.to/faikidine</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/faikidine"/>
    <language>en</language>
    <item>
      <title>Stop optimizing your site for humans, they don't read it anymore</title>
      <dc:creator>faikidine</dc:creator>
      <pubDate>Sat, 15 Aug 2026 18:22:42 +0000</pubDate>
      <link>https://dev.to/faikidine/stop-optimizing-your-site-for-humans-they-dont-read-it-anymore-3bcm</link>
      <guid>https://dev.to/faikidine/stop-optimizing-your-site-for-humans-they-dont-read-it-anymore-3bcm</guid>
      <description>&lt;p&gt;I'm a computer science student. I work on side projects, and these days I'm building a small platform to help content creators. And like others before me, I noticed something: what we publish on the Internet isn't really read by humans anymore. It gets read by AIs, digested, then served back to a human as a recap. Since then, I've been optimizing everything I put online for them. Here's why.&lt;/p&gt;

&lt;p&gt;Look at Google: ask a question, and the first thing you see is no longer a list of links — it's an "AI Overview" that answers you directly. Most of the time, that's enough: you leave without visiting a single site. The numbers back it up: when an AI Overview shows, only 8% of people still click a result, versus 15% without one (Pew Research, 68,879 real searches). As for me, sometimes I don't even type keywords anymore: I ask full questions, because I know an LLM will answer.&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%2F8kpri0xyc0ciy8s5h7mv.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%2F8kpri0xyc0ciy8s5h7mv.png" alt=" " width="800" height="994"&gt;&lt;/a&gt;&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%2F4g88nvuwgi93yn0xt7c4.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%2F4g88nvuwgi93yn0xt7c4.png" alt=" " width="760" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The new visitor doesn't click, it reads
&lt;/h2&gt;

&lt;p&gt;In the human's place arrives a new kind of visitor: the AI agent. ChatGPT, Claude or Perplexity visit the page on their behalf, keep the essentials and hand back a summary. The volume is still modest — around 1% of web traffic (Conductor) — but it's climbing fast (+357% in a year, Similarweb) and it converts hard: 15.9% for traffic coming from ChatGPT, versus 1.76% for Google organic (Seer Interactive). Low volume, huge intent: now is when there's a head start to be had.&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%2Fmj1s53fwu3l9jx1r4u2j.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%2Fmj1s53fwu3l9jx1r4u2j.png" alt=" " width="760" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  LLMO, and what it isn't
&lt;/h2&gt;

&lt;p&gt;The SEO community has a name for this: LLMO, Large Language Model Optimization. In one sentence: SEO optimizes for ranking; LLMO optimizes for meaning, structure, and extractability by AIs.&lt;/p&gt;

&lt;p&gt;The key point for developers: an LLM doesn't "browse". It sees neither your hero section, nor your animations, nor your dark mode. It receives text, splits it into tokens, and every token has a cost. Your beautiful interface is, from its point of view: useless noise, billed by the token, stretching the context; zero benefit.&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%2F2ds8ua6er7ti378fm1lk.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%2F2ds8ua6er7ti378fm1lk.png" alt=" " width="700" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The real cost: tokens
&lt;/h2&gt;

&lt;p&gt;I ran the test on a real page of my own platform — dunga.io/midwiq — with OpenAI's tokenizer. The same information, three representations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full page (HTML + UI/UX): 1,904 tokens — and nearly 2,900 on the legacy GPT-4 tokenizer&lt;/li&gt;
&lt;li&gt;Minimal semantic HTML: 521 tokens&lt;/li&gt;
&lt;li&gt;Clean Markdown: 283 tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's 85% fewer tokens — up to ×10 depending on the tokenizer. Which makes sense: navigation, CSS, JavaScript artifacts… none of it carries any information, but the agent pays for it anyway. Clean Markdown removes all of it.&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%2Fvl4e95i07j6uneevnw7q.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%2Fvl4e95i07j6uneevnw7q.png" alt=" " width="800" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  llms.txt: the obvious fix that isn't
&lt;/h2&gt;

&lt;p&gt;The fashionable answer is called llms.txt: a Markdown file at the root of your site, meant to guide AIs. On paper, appealing. In the data, it doesn't hold up.&lt;/p&gt;

&lt;p&gt;SE Ranking (300,000 domains analyzed): no measurable effect on citations — of the 50 domains most cited by AI, only one had the file. Limy: out of 500 million AI bot visits over 90 days, 408 requested llms.txt; bots crawl the HTML directly. And Google has ruled: no support — John Mueller even compared it to the old meta keywords tag.&lt;/p&gt;

&lt;p&gt;The problem isn't the intention, it's the architecture: agents don't go looking for a side file, they read the URL you hand them. That's where the right representation needs to be served.&lt;/p&gt;

&lt;p&gt;And yet, I have one on my site — and I stand by it, for two reasons. First: when a convention emerges on the web, I'd rather follow it; that's how conventions end up becoming standards. Second: mine isn't trying to get cited, it serves as the README of the machine interface — it's where an agent learns that every page exists as &lt;code&gt;.md&lt;/code&gt;, and how to ask for it. Let's be honest: according to the numbers, right now, it does nothing. But it's one static file, zero maintenance — if the standard takes off, we're ready; if it dies, we've lost nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it looks like in practice (e.g. dunga.io)
&lt;/h2&gt;

&lt;p&gt;That's what I did on &lt;a href="https://dunga.io" rel="noopener noreferrer"&gt;dunga.io&lt;/a&gt;, the small smart-links platform (fanlinks, link-in-bio, deeplinks) I'm building for creators and artists. A link page is the textbook case: a name, some links, a bio — three useful pieces of information drowned in design.&lt;/p&gt;

&lt;p&gt;Every link page exists as a semantic HTML version and a Markdown version, generated on the fly at request time — always up to date, nothing to store. And it's not even the server doing the work: an edge middleware (a few dozen lines running on the CDN, before everything else) looks at the User-Agent. A human gets the design, a social crawler gets its Open Graph card, an AI agent gets the stripped-down version. Same URL, three representations — 100% of the information, ~15% of the tokens. You can see it for yourself: add &lt;code&gt;.md&lt;/code&gt; or &lt;code&gt;?format=md&lt;/code&gt; to any public dunga.io page. And the creator didn't have to lift a finger. That's the part I care about: LLMO shouldn't be one more chore for creators — it's a platform's responsibility.&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%2F5i2obvrj8pl6kbq2ga5g.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%2F5i2obvrj8pl6kbq2ga5g.png" alt=" " width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;I don't know whether the term "LLMO" will survive past 2027. But the gap between a 2,000-token DOM and 300 tokens of Markdown isn't going anywhere. Three simple things to try this week:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check your logs: filter by AI User-Agent (GPTBot, ClaudeBot, PerplexityBot, OAI-SearchBot) and measure that traffic.&lt;/li&gt;
&lt;li&gt;Tokenize one of your pages: run the raw HTML through a tokenizer and compute the useful-tokens / total-tokens ratio.&lt;/li&gt;
&lt;li&gt;Serve an alternative representation on the same URL: content negotiation on the User-Agent fits in a few lines of middleware.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And the trap I only discovered by testing with real agents: the Content-Type. Serving &lt;code&gt;text/markdown&lt;/code&gt; is clean on paper — except some LLM fetchers refuse any response that isn't HTML. And the reverse is worse: raw Markdown labeled &lt;code&gt;text/html&lt;/code&gt; gets flattened by their HTML parser — line breaks swallowed, the whole content on a single line. What ended up working for me: convert the Markdown into minimal semantic HTML (headings, lists, links — zero CSS, zero scripts) served by default, and only return true &lt;code&gt;text/markdown&lt;/code&gt; to clients that ask for it (&lt;code&gt;Accept: text/markdown&lt;/code&gt;, or an explicit &lt;code&gt;.md&lt;/code&gt; in the URL). Two details that go with it: a &lt;code&gt;Vary: User-Agent, Accept&lt;/code&gt; header, without which your CDN will eventually serve the robot version to a human; and check that your own anti-bot layer isn't quietly strangling the non-human readers of your public pages — mine was, and I found out late.&lt;/p&gt;

&lt;p&gt;Here's the gist:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// middleware.ts — Vercel Edge (same logic on Cloudflare Workers, Nginx, etc.)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AI_UA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/GPTBot|ChatGPT-User|OAI-SearchBot|ClaudeBot|Claude-User|PerplexityBot|CCBot/i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&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;wantsMd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.md&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
    &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;searchParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;format&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;md&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
    &lt;span class="sr"&gt;/text&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="sr"&gt;markdown/i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;accept&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&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;isAgent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;AI_UA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user-agent&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;wantsMd&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isAgent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// human → the app, as before&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;md&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;buildMarkdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// your content, stripped down&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wantsMd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;respond&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;md&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text/markdown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// explicit ask: real Markdown&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;respond&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;mdToMinimalHtml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;md&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text/html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// agents: minimal semantic HTML&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;respond&lt;/span&gt; &lt;span class="o"&gt;=&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="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&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="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;; charset=utf-8`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;Vary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User-Agent, Accept&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// NEVER mix human/robot caches&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;&lt;code&gt;buildMarkdown&lt;/code&gt; and &lt;code&gt;mdToMinimalHtml&lt;/code&gt; are the part that depends on your product: the first builds the Markdown from your data (served by your backend, &lt;strong&gt;not from your DOM&lt;/strong&gt;), the second converts it into basic HTML — headings, lists, links, nothing else.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>webscraping</category>
      <category>performance</category>
    </item>
    <item>
      <title>Arrêtez d'optimiser votre site pour les humains (ils ne le lisent plus)</title>
      <dc:creator>faikidine</dc:creator>
      <pubDate>Sat, 15 Aug 2026 18:10:28 +0000</pubDate>
      <link>https://dev.to/faikidine/arretez-doptimiser-votre-site-pour-les-humains-ils-ne-le-lisent-plus-2266</link>
      <guid>https://dev.to/faikidine/arretez-doptimiser-votre-site-pour-les-humains-ils-ne-le-lisent-plus-2266</guid>
      <description>&lt;p&gt;Je suis étudiant en informatique. Je bricole des projets des fois et en ce moment je monte une petite plateforme pour aider des créateurs de contenus. Et comme d’autres avant moi, j'ai remarqué un truc : ce qu'on publie sur Internet n'est plus vraiment lu par des humains. C'est lu par des IA, digéré, puis resservi à un humain sous forme de récap'. Depuis, j'optimise tout ce que je mets en ligne pour elles. Voici pourquoi.&lt;/p&gt;

&lt;p&gt;Regardez Google : posez une question, et la première chose qui s'affiche n'est plus une liste de liens, c'est un « Aperçu IA » qui vous répond directement. La plupart du temps, ça suffit — vous repartez sans visiter un seul site. Les chiffres le confirment d’ailleurs : quand un Aperçu IA s'affiche, seuls 8 % des gens cliquent encore sur un résultat, contre 15 % sans (Pew Research, 68 879 recherches réelles). Moi parfois, je ne tape même plus des mots-clés : je pose des questions entières, parce que je sais qu'un LLM va me répondre.&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%2F4k5wu1gjemkjzvt8miud.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%2F4k5wu1gjemkjzvt8miud.png" alt=" " width="800" height="994"&gt;&lt;/a&gt;&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%2F9bhfow2wka7q1ugo3gua.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%2F9bhfow2wka7q1ugo3gua.png" alt=" " width="760" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Le nouveau visiteur ne clique pas, il lit
&lt;/h2&gt;

&lt;p&gt;À la place de l'humain débarque un nouveau genre de visiteur : l'agent IA. ChatGPT, Claude ou Perplexity visitent la page à sa place, gardent l'essentiel et lui en font le résumé. Le volume reste modeste — autour de 1 % du trafic web (Conductor) — mais il grimpe vite (+357 % en un an, Similarweb) et il convertit très fort : 15,9 % pour le trafic venu de ChatGPT, contre 1,76 % pour l'organique Google (Seer Interactive). Peu de volume, énormément d'intention : c'est maintenant qu'il y a une avance à prendre.&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%2Flcuf7ungomutrwbu5x8c.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%2Flcuf7ungomutrwbu5x8c.png" alt=" " width="760" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Le LLMO, ce que ce n'est pas
&lt;/h2&gt;

&lt;p&gt;La communauté SEO a un nom pour ça : LLMO, Large Language Model Optimization. En une phrase : le SEO optimise pour le classement ; le LLMO optimise pour le sens, la structure et l'extractibilité par des IA.&lt;/p&gt;

&lt;p&gt;Le point clé pour les développeurs : un LLM ne « navigue » pas. Il ne voit ni votre hero section, ni vos animations, ni votre dark mode. Il reçoit du texte, le découpe en tokens, et chaque token a un coût. Votre magnifique interface est, de son point de vue : du bruit inutile, facturé et qui allonge le contexte ; aucun avantage.&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%2Fgjch0bszm6wteuo7k8s5.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%2Fgjch0bszm6wteuo7k8s5.png" alt=" " width="700" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Le vrai coût, les tokens
&lt;/h2&gt;

&lt;p&gt;J'ai fait le test sur une page réelle de ma propre plateforme : dunga.io/midwiq , avec le tokenizer d'OpenAI. La même information, trois représentations :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Page complète (HTML + UI/UX) : 1 904 tokens — et près de 2 900 sur le tokenizer GPT-4 legacy&lt;/li&gt;
&lt;li&gt;HTML sémantique minimal : 521 tokens&lt;/li&gt;
&lt;li&gt;Markdown épuré : 283 tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Soit 85 % de tokens en moins — jusqu'à ×10 selon le tokenizer. Logique : navigation, CSS, artefacts JavaScript… tout ça ne porte aucune information, mais l'agent le paie quand même. Un Markdown propre supprime tout.&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%2Ft4vmpklh5ri13bfdahxi.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%2Ft4vmpklh5ri13bfdahxi.png" alt=" " width="800" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  llms.txt : la fausse bonne solution
&lt;/h2&gt;

&lt;p&gt;La réponse à la mode s'appelle llms.txt : un fichier Markdown à la racine du site, censé guider les IA. Sur le papier, séduisant. Dans les données, ça ne tient pas.&lt;/p&gt;

&lt;p&gt;SE Ranking (300 000 domaines analysés) : aucun effet mesurable sur les citations — sur les 50 domaines les plus cités par l'IA, un seul avait le fichier. Limy : sur 500 millions de visites de bots IA en 90 jours, 408 ont demandé llms.txt ; les bots crawlent le HTML directement. Et Google a tranché : pas de support, John Mueller l'a même comparé à la vieille balise meta keywords.&lt;/p&gt;

&lt;p&gt;Le problème n'est pas l'intention, c'est l'architecture : les agents ne vont pas chercher un fichier annexe, ils lisent l'URL qu'on leur donne. C'est donc là qu'il faut servir la bonne représentation.&lt;/p&gt;

&lt;p&gt;Et pourtant, j'en ai un sur mon site — et je l'assume, pour deux raisons. La première : quand une convention émerge sur le web, je préfère la suivre ; c'est comme ça que les standards finissent par en devenir. La seconde : le mien ne cherche pas à être cité, il sert de README de l'interface machine — c'est là qu'un agent apprend que chaque page existe en &lt;code&gt;.md&lt;/code&gt;, et comment la demander. Soyons honnêtes : d'après les chiffres, aujourd'hui, ça ne sert à rien. Mais c'est un fichier statique, zéro entretien — si le standard décolle, soyons prêts ; s'il meurt, on n'a rien perdu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ce que ça donne en pratique (ex : dunga.io)
&lt;/h2&gt;

&lt;p&gt;C'est ce que j'ai fait sur &lt;a href="https://dunga.io" rel="noopener noreferrer"&gt;dunga.io&lt;/a&gt;, la petite plateforme de smart-links (fanlinks, link-in-bio, deeplinks) que je crée pour des créateurs et artistes. Une page de lien, c'est le cas d'école : un nom, des liens, une bio — trois infos utiles noyées dans du design.&lt;/p&gt;

&lt;p&gt;Chaque page de lien existe en version HTML sémantique et en version Markdown, générées à la volée au moment de la requête — toujours à jour, rien à stocker. Et ce n'est même pas le serveur qui s'en occupe : un middleware edge (quelques dizaines de lignes exécutées sur le CDN, avant tout le reste) regarde le User-Agent. Un humain reçoit le design, un crawler de réseau social reçoit sa carte Open Graph, un agent IA reçoit la version épurée. Même URL, trois représentations — 100 % de l'information, ~15 % des tokens. Vous pouvez le voir vous-même : ajoutez &lt;code&gt;.md&lt;/code&gt; ou &lt;code&gt;?format=md&lt;/code&gt; à n'importe quelle page publique dunga.io. Et le créateur n'a rien eu à faire. C'est le point auquel je tiens : le LLMO ne devrait pas être une tâche de plus pour les créateurs, c'est une responsabilité de plateforme.&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%2F8a1wu2jlh8wb1ix05s31.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%2F8a1wu2jlh8wb1ix05s31.png" alt=" " width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  À vous de jouer
&lt;/h2&gt;

&lt;p&gt;Je ne sais pas si le terme « LLMO » survivra à 2027. Mais l'écart entre un DOM de 2 000 tokens et 300 tokens de Markdown, lui, ne bougera pas. Trois choses simples à tester cette semaine :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Regardez vos logs : filtrez par User-Agent IA (GPTBot, ClaudeBot, PerplexityBot, OAI-SearchBot) et mesurez ce trafic.&lt;/li&gt;
&lt;li&gt;Tokenizez une de vos pages : passez le HTML brut dans un tokenizer et calculez le ratio tokens utiles / tokens totaux.&lt;/li&gt;
&lt;li&gt;Servez une représentation alternative sur la même URL : une négociation de contenu sur le User-Agent tient en quelques lignes de middleware.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Et le piège que je n'ai découvert qu'en testant avec de vrais agents : le Content-Type. Servir du &lt;code&gt;text/markdown&lt;/code&gt;, c'est propre sur le papier — sauf que certains fetchers LLM refusent toute réponse qui n'est pas du HTML. Et l'inverse est pire : du Markdown brut étiqueté &lt;code&gt;text/html&lt;/code&gt; se fait aplatir par leur parseur HTML — sauts de ligne avalés, tout le contenu sur une seule ligne. Ce qui a fini par marcher chez moi : convertir le Markdown en HTML sémantique minimal (titres, listes, liens — zéro CSS, zéro script) servi par défaut, et ne renvoyer le vrai &lt;code&gt;text/markdown&lt;/code&gt; qu'aux clients qui l'annoncent (&lt;code&gt;Accept: text/markdown&lt;/code&gt;, ou &lt;code&gt;.md&lt;/code&gt; explicite dans l'URL). Deux détails qui vont avec : un en-tête &lt;code&gt;Vary: User-Agent, Accept&lt;/code&gt;, sans quoi votre CDN finira par servir la version robot à un humain ; et vérifiez que votre propre anti-bot n'étrangle pas en douce les lecteurs non humains de vos pages publiques — le mien le faisait, je l'ai découvert tard.&lt;/p&gt;

&lt;p&gt;Voilà l'essentiel :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// middleware.ts — Vercel Edge (même logique sur Cloudflare Workers, Nginx, etc.)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AI_UA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/GPTBot|ChatGPT-User|OAI-SearchBot|ClaudeBot|Claude-User|PerplexityBot|CCBot/i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&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;wantsMd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.md&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
    &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;searchParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;format&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;md&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
    &lt;span class="sr"&gt;/text&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="sr"&gt;markdown/i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;accept&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&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;isAgent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;AI_UA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user-agent&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;wantsMd&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isAgent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// humain → l'app, comme avant&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;md&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;buildMarkdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// votre contenu, épuré&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wantsMd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;respond&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;md&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text/markdown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// demande explicite : vrai Markdown&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;respond&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;mdToMinimalHtml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;md&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text/html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// agents : HTML sémantique minimal&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;respond&lt;/span&gt; &lt;span class="o"&gt;=&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="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&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="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;; charset=utf-8`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;Vary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User-Agent, Accept&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// ne JAMAIS mélanger les caches humain/robot&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;&lt;code&gt;buildMarkdown&lt;/code&gt; et &lt;code&gt;mdToMinimalHtml&lt;/code&gt;, c'est la partie qui dépend de votre produit : le premier construit le Markdown depuis vos données (servis par votre backend, &lt;strong&gt;pas depuis votre DOM&lt;/strong&gt;), le second le convertit en HTML basique — titres, listes, liens, rien d'autre.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>webscraping</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
