<?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: carlosortet</title>
    <description>The latest articles on DEV Community by carlosortet (@carlosortet).</description>
    <link>https://dev.to/carlosortet</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%2F3731777%2F134ab90c-169c-476a-8ce9-83665d0c706b.png</url>
      <title>DEV Community: carlosortet</title>
      <link>https://dev.to/carlosortet</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/carlosortet"/>
    <language>en</language>
    <item>
      <title>How LLMs search, retrieve and answer with real-time web data</title>
      <dc:creator>carlosortet</dc:creator>
      <pubDate>Fri, 10 Jul 2026 07:07:48 +0000</pubDate>
      <link>https://dev.to/carlosortet/how-llms-search-retrieve-and-answer-with-real-time-web-data-29hg</link>
      <guid>https://dev.to/carlosortet/how-llms-search-retrieve-and-answer-with-real-time-web-data-29hg</guid>
      <description>&lt;p&gt;When a user asks something that requires recent information, an LLM does not answer only from its internal memory. It can activate search systems, retrieve web fragments, compare them semantically, validate sources and build an answer grounded in up-to-date information.&lt;/p&gt;

&lt;p&gt;The technical question is: how does an LLM move from a user's prompt to an answer based on documents, search results and retrieved fragments in real time?&lt;/p&gt;

&lt;p&gt;This article explains that flow. It helps explain why ChatGPT, Gemini, Claude, Copilot and Perplexity may answer the same question differently, why they do not value the same sources in the same way, and why optimization for LLMs is not about publishing more. It is about understanding which fragments the models retrieve, for what intent, and inside which context.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://carlosortet.com/llm-retrieval-geo-flow-tiempo-real.png" rel="noopener noreferrer"&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%2Ffvcl018bta4x7dteegq1.png" alt="Diagram of the LLM search, retrieval, semantic matching, source validation and answer construction flow" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;High-resolution diagram: prompt, query planning, retrieval, vectorization, semantic matching, source validation and answer construction.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Core idea
&lt;/h2&gt;

&lt;p&gt;An LLM rarely answers a complex question in a single jump. First it does something close to clearing the table: it interprets what is being asked, detects entities, looks at conversational context and decides whether it can answer from what it already knows or whether it needs to search.&lt;/p&gt;

&lt;p&gt;When it needs current data, another machine starts working: search, crawling, fragment retrieval, semantic comparison, source validation and, finally, response composition.&lt;/p&gt;

&lt;p&gt;This is the important part for GEO. Many answers do not come only from the model's pre-trained knowledge. They come from a mix of reasoning, retrieval, discovered sources and internal composition criteria. OpenAI documents, for example, that ChatGPT Search can decide to search the web depending on the user's question, or allow the user to trigger search manually.&lt;/p&gt;

&lt;p&gt;In any category where freshness, comparison or decision-making matters, this changes the rules. An answer about "best banks for young people", "phones with the best after-sales service" or "reliable fashion brands in Spain" may be shaped by fragments retrieved from media, official websites, comparisons, forums, technical documentation, marketplaces or user reviews.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens when the user asks
&lt;/h2&gt;

&lt;p&gt;If someone writes &lt;code&gt;best mobile phones 2026&lt;/code&gt;, the model is not reading only four words. It is reading a purchase intent. There is comparison, freshness, risk of obsolescence, candidate brands, possible price ranges and a fairly clear expectation: the user wants a recommendation, not a definition of what a phone is.&lt;/p&gt;

&lt;p&gt;The system analyzes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;response objective;&lt;/li&gt;
&lt;li&gt;mentioned or implicit entities;&lt;/li&gt;
&lt;li&gt;conversational context;&lt;/li&gt;
&lt;li&gt;market, language and date;&lt;/li&gt;
&lt;li&gt;explicit constraints;&lt;/li&gt;
&lt;li&gt;implicit value criteria;&lt;/li&gt;
&lt;li&gt;purchase factors;&lt;/li&gt;
&lt;li&gt;relevant brand attributes;&lt;/li&gt;
&lt;li&gt;required freshness level.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That nuance changes everything that follows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Search decision
&lt;/h2&gt;

&lt;p&gt;The model, or the orchestration layer around it, decides whether it can answer from internal knowledge or whether it needs external information. For current, comparative, transactional, reputational or market-specific questions, some form of retrieval is usually activated: web search, index lookup, connectors or structured sources.&lt;/p&gt;

&lt;p&gt;The decision may depend on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;freshness of the question;&lt;/li&gt;
&lt;li&gt;presence of dates such as &lt;code&gt;2026&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;need for prices, availability or new information;&lt;/li&gt;
&lt;li&gt;risk of outdated information;&lt;/li&gt;
&lt;li&gt;need to compare brands;&lt;/li&gt;
&lt;li&gt;need to cite or validate sources;&lt;/li&gt;
&lt;li&gt;likelihood that the user expects recent data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If search is activated, the original prompt becomes a set of subquestions.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;best smartphones 2026;&lt;/li&gt;
&lt;li&gt;phones with the best camera;&lt;/li&gt;
&lt;li&gt;iPhone Samsung Xiaomi comparison;&lt;/li&gt;
&lt;li&gt;user opinions about battery life;&lt;/li&gt;
&lt;li&gt;best phones to buy in Spain;&lt;/li&gt;
&lt;li&gt;frequent problems by model;&lt;/li&gt;
&lt;li&gt;most recommended brands by price segment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In a reputational or commercial query, that decomposition may include searches such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;user ratings for a brand;&lt;/li&gt;
&lt;li&gt;frequent service complaints;&lt;/li&gt;
&lt;li&gt;average rating on review platforms;&lt;/li&gt;
&lt;li&gt;user experience in forums;&lt;/li&gt;
&lt;li&gt;comparisons with competitors;&lt;/li&gt;
&lt;li&gt;verified reviews on specialized platforms.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Search engines and grounding by model
&lt;/h2&gt;

&lt;p&gt;There is a common misunderstanding: assuming that if an LLM uses Bing, Google Search or another retrieval system, then it behaves like that search engine. It does not.&lt;/p&gt;

&lt;p&gt;The search engine may provide URLs, snippets, documents or passages. Then the model does something else: it reinterprets, compresses, compares, discards and turns all of that into a conversational answer.&lt;/p&gt;

&lt;p&gt;That is why two systems can consult similar sources and still generate different answers.&lt;/p&gt;

&lt;h3&gt;
  
  
  ChatGPT
&lt;/h3&gt;

&lt;p&gt;OpenAI documents that ChatGPT Search can use external search providers, including Bing, together with other partners and retrieved content. But ChatGPT is not Bing with a conversational interface on top.&lt;/p&gt;

&lt;p&gt;Search finds candidates. ChatGPT decides what to consult, how to reformulate the question, which fragments to use, how to synthesize them and how to respond according to its instructions, conversational context and policies.&lt;/p&gt;

&lt;p&gt;In real use, ChatGPT may:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;decide whether to search;&lt;/li&gt;
&lt;li&gt;generate one or more queries;&lt;/li&gt;
&lt;li&gt;retrieve web results;&lt;/li&gt;
&lt;li&gt;open or synthesize sources;&lt;/li&gt;
&lt;li&gt;combine passages;&lt;/li&gt;
&lt;li&gt;cite results when the product supports it;&lt;/li&gt;
&lt;li&gt;compose a conversational answer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is not a Bing ranking pasted onto the screen. It is a generative answer conditioned by search.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gemini
&lt;/h3&gt;

&lt;p&gt;Google documents &lt;code&gt;Grounding with Google Search&lt;/code&gt; for Gemini. This means Gemini can ground an answer with Google Search results. But it does not turn Gemini into classic Google Search either.&lt;/p&gt;

&lt;p&gt;Google Search may act as retrieval infrastructure. Gemini still applies its own prompt interpretation, context system, grounding mechanisms, filters and final generation.&lt;/p&gt;

&lt;p&gt;There is a trap here for SEO teams: a page can rank well in Google Search and still not be the fragment Gemini chooses for a generative answer. To enter the answer, the page must be retrievable, clear, structured and useful for that specific conversational objective.&lt;/p&gt;

&lt;h3&gt;
  
  
  Microsoft Copilot
&lt;/h3&gt;

&lt;p&gt;Microsoft Copilot naturally relies on the Bing and Microsoft ecosystem. In enterprise environments it may combine the web, Microsoft Graph, corporate documents, connectors and the user's permissions.&lt;/p&gt;

&lt;p&gt;Microsoft documents agents and grounding experiences with Bing Search, but the final result is not a SERP either. Copilot transforms the prompt into queries, retrieves information, applies corporate context when available and generates an answer.&lt;/p&gt;

&lt;p&gt;For GEO this matters a lot. The same content can behave differently in Copilot if it is evaluated in open web mode, inside a corporate tenant, with Microsoft Graph available or with internal connectors active.&lt;/p&gt;

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

&lt;p&gt;Anthropic documents web search capabilities for Claude, with current information retrieval and citations. Unlike ChatGPT/Bing or Gemini/Google Search, public sources do not let us reduce Claude to a single external search engine.&lt;/p&gt;

&lt;p&gt;What we do know is enough to measure it separately: Claude has its own system for search, source selection, citations, document reasoning and response policies.&lt;/p&gt;

&lt;p&gt;It is often especially sensitive to context quality, documentary clarity, source consistency and the way evidence is presented. In a GEO study, inferring Claude from ChatGPT or Gemini is a mistake.&lt;/p&gt;

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

&lt;p&gt;Perplexity presents itself as an answer-first and search-native system. Its Sonar and Search API products work with web search, retrieval and citations. The experience is designed to answer with visible sources, although that does not mean it selects or weights the same sources as Google, Bing, ChatGPT or Gemini.&lt;/p&gt;

&lt;p&gt;In Perplexity, a source gains value when it is direct, current, verifiable and citable. For GEO, that gives weight to clean, updated, well-titled pages with explicit information and little ambiguity.&lt;/p&gt;

&lt;h3&gt;
  
  
  What matters for GEO
&lt;/h3&gt;

&lt;p&gt;Each model has a different architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;different search engine or retrieval provider;&lt;/li&gt;
&lt;li&gt;different query generation;&lt;/li&gt;
&lt;li&gt;different tokenization system;&lt;/li&gt;
&lt;li&gt;different embedding model;&lt;/li&gt;
&lt;li&gt;different chunking policy;&lt;/li&gt;
&lt;li&gt;different context window;&lt;/li&gt;
&lt;li&gt;different reranking;&lt;/li&gt;
&lt;li&gt;different tolerance for contradictory sources;&lt;/li&gt;
&lt;li&gt;different citation behavior;&lt;/li&gt;
&lt;li&gt;different synthesis style;&lt;/li&gt;
&lt;li&gt;different safety and brand policies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The operational takeaway is simple: asking one LLM once is not enough. A serious GEO audit measures each model, market and customer persona separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Search, crawling and retrieval
&lt;/h2&gt;

&lt;p&gt;The system does not read the internet as a person would. It does not read it like Google Search does when it returns a SERP either. It queries search engines, proprietary indexes, crawlers, document stores, structured sources or specific connectors.&lt;/p&gt;

&lt;p&gt;And each LLM solves this layer differently. ChatGPT, Gemini, Claude, Copilot and Perplexity do not index, retrieve or weight results in the same way.&lt;/p&gt;

&lt;p&gt;The process usually has four parts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Query planning&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The prompt becomes several queries designed to solve different parts of the problem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Crawling or index lookup&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Crawlers and engines retrieve candidate pages, documents, tables, reviews, FAQs, product sheets, media, forums, official documentation or structured data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fragment extraction&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The system does not mainly work with whole domains. It extracts pieces of content: titles, paragraphs, lists, tables, product blocks, review fragments, FAQ answers, schema markup, dates, authors, entities, language and localization signals.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Chunking and normalization&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Content is cleaned and split into chunks: manageable fragments that preserve meaning. A chunk can be a review paragraph, a pricing table, a technical specification, a comparison or a block of user opinions.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Tokenization: why each LLM represents information differently
&lt;/h2&gt;

&lt;p&gt;Before vectorizing or generating an answer, the model splits text into internal units: tokens. Sometimes a token is a word. Sometimes it is half a word, a sign, a frequent sequence or a sublexical piece.&lt;/p&gt;

&lt;p&gt;Here a less visible but very important difference appears: each model family tokenizes in its own way. OpenAI uses tokenizers such as those in the &lt;code&gt;tiktoken&lt;/code&gt; family. Google provides token-counting tools for Gemini. Anthropic documents its own token counting for Claude. Each system has its own vocabulary, context limits and text-splitting behavior.&lt;/p&gt;

&lt;p&gt;So the model does not exactly see "words". It sees token sequences.&lt;/p&gt;

&lt;p&gt;Conceptual example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;best mobile phones 2026&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;One model may split it roughly as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;best&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mobile&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;phones&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2026&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another may split it more granularly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;best&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;phone&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;s&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mobile&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2026&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another may treat accents, capitalization, brands, hyphens or symbols differently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;iPhone&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;15&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pro&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Max&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;256&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GB&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;or:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;i&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Phone&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;15&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pro&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Max&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;256GB&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It looks minor. It is not. It can affect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how the context window is consumed;&lt;/li&gt;
&lt;li&gt;how entities are detected;&lt;/li&gt;
&lt;li&gt;how brands and product names are preserved;&lt;/li&gt;
&lt;li&gt;how variants with or without accents are compared;&lt;/li&gt;
&lt;li&gt;how acronyms, models, technical references or prices are represented;&lt;/li&gt;
&lt;li&gt;how long documents are cut into chunks;&lt;/li&gt;
&lt;li&gt;which fragments stay together or get separated;&lt;/li&gt;
&lt;li&gt;which terms carry more weight in the semantic representation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For GEO this matters a great deal. A brand, product or attribute may tokenize differently depending on the model. &lt;code&gt;GEOdoctor&lt;/code&gt;, &lt;code&gt;S.A.M.&lt;/code&gt;, &lt;code&gt;iPhone 16 Pro&lt;/code&gt;, &lt;code&gt;B2C&lt;/code&gt;, &lt;code&gt;CX&lt;/code&gt;, &lt;code&gt;ISO 27001&lt;/code&gt;, &lt;code&gt;A++&lt;/code&gt;, &lt;code&gt;Madrid&lt;/code&gt;, &lt;code&gt;Mexico&lt;/code&gt; or &lt;code&gt;llms.txt&lt;/code&gt; may occupy different numbers of tokens and generate non-identical internal representations.&lt;/p&gt;

&lt;p&gt;The practical consequence: the same content does not always "fit" equally well in every LLM. A text may be transparent to one model and less legible to another if entities, attributes, structured data or business phrases are not explicit enough. That is why a GEO strategy should not assume that one optimization works identically for ChatGPT, Gemini, Claude, Copilot and Perplexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vectorizing the question and the documents
&lt;/h2&gt;

&lt;p&gt;Next comes the step that makes it possible to compare questions and documents. The user's question and the retrieved fragments are transformed into the same kind of mathematical representation.&lt;/p&gt;

&lt;p&gt;The question becomes an embedding:&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 -&amp;gt; vector q
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each retrieved fragment also becomes an embedding:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;document fragment -&amp;gt; vector d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both vectors live in a shared semantic space. Thanks to that, the system can compare meaning, not only literal word overlap.&lt;/p&gt;

&lt;p&gt;The comparison can be expressed 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;score = cos(q,d)
semantic distance = 1 - score
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A fragment that does not literally repeat "best phones 2026" can still be highly useful if it discusses performance, camera, battery, price, local availability, user satisfaction or common problems. Matching does not depend only on repeating the keyword. It depends on semantic proximity between the user's need and the retrieved content.&lt;/p&gt;

&lt;h2&gt;
  
  
  Semantic matching and chunk selection
&lt;/h2&gt;

&lt;p&gt;Once chunks are vectorized, the system searches for the fragments closest to the query using techniques such as ANN or kNN. Then it may apply:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reranking;&lt;/li&gt;
&lt;li&gt;threshold filters;&lt;/li&gt;
&lt;li&gt;deduplication;&lt;/li&gt;
&lt;li&gt;source diversity;&lt;/li&gt;
&lt;li&gt;date filters;&lt;/li&gt;
&lt;li&gt;language filters;&lt;/li&gt;
&lt;li&gt;consistency validation;&lt;/li&gt;
&lt;li&gt;selection of &lt;code&gt;top-k chunks&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The system is trying to give the model compact, useful and sufficiently diverse context to build an answer.&lt;/p&gt;

&lt;p&gt;The LLM does not receive "the whole internet". It receives a limited selection of fragments. That selection shapes the final answer far more than it usually appears from the outside.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measuring whether a chunk is a good match for a prompt
&lt;/h2&gt;

&lt;p&gt;This is where a more technical evaluation layer is useful. A crawler may find a page, but that does not mean the model will use it. The sharper question is: once that page is split into fragments, which chunks actually match the prompt well enough to become useful context?&lt;/p&gt;

&lt;p&gt;The metrics used to evaluate embedding models offer a practical clue. They do not reveal the internal algorithm of ChatGPT, Gemini, Claude, Copilot or Perplexity. Those systems are proprietary and combine many signals. But they do give us reproducible ways to test whether an embedding model works well for retrieval, semantic similarity, thematic classification and candidate ranking.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;KPI&lt;/th&gt;
&lt;th&gt;What it measures&lt;/th&gt;
&lt;th&gt;GEO reading&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;XQuAD nDCG@10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Question-context retrieval: a question is vectorized, contexts are ranked by similarity and the metric checks whether relevant contexts appear in the top 10.&lt;/td&gt;
&lt;td&gt;Measures whether the system retrieves the chunks that could actually answer the prompt near the top. It is the closest metric to the retrieval problem.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;STS-ca Sp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Semantic textual similarity: model similarity between sentence pairs is compared with human scores using Spearman correlation.&lt;/td&gt;
&lt;td&gt;Measures whether the semantic map understands that two texts can answer the same intent without sharing keywords.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TeCla F1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Catalan thematic classification: embeddings are used to separate topic classes and evaluated with F1.&lt;/td&gt;
&lt;td&gt;Indicates whether embeddings preserve signals that help classify intent, sector, attribute, purchase factor or product line.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Dim&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Embedding vector dimensionality.&lt;/td&gt;
&lt;td&gt;More dimensions may capture more nuance, but increase memory, index cost and latency. The best model is not always the largest one.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Composite score&lt;/td&gt;
&lt;td&gt;Average or combination across tasks.&lt;/td&gt;
&lt;td&gt;Useful for comparing models, but never a substitute for testing with real prompts, markets, sources and customer personas.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;nDCG@10&lt;/code&gt; matters because it evaluates ranking, not abstract similarity alone. In generative retrieval, appearing in position 1, 2 or 3 is not the same as appearing in position 37. The LLM works with a limited context window; if the right chunk does not make it into the top-k passed to the model, it effectively does not exist for that answer.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;STS-ca Sp&lt;/code&gt; covers another angle: the quality of the semantic map. If the user asks about "reliable brands for buying phones in 2026", a good system should bring closer fragments about warranty, after-sales service, user satisfaction, recurring problems, local availability or value for money even when they do not literally repeat the prompt.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;TeCla F1&lt;/code&gt; helps us understand whether embeddings separate themes and categories well. In GEO, the same logic can be adapted to a business taxonomy: informational, comparative or transactional intent; market; language; product line; purchase factor; brand attribute; competitor; funnel stage.&lt;/p&gt;

&lt;p&gt;In practice, a serious GEO evaluation cannot stop at &lt;code&gt;cos(q,d)&lt;/code&gt;. It needs a composite score closer to real usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;prompt-source fit =
  semantic similarity
+ intent coverage
+ entity coverage
+ market and customer-persona fit
+ freshness
+ chunk specificity
+ source citability
+ factual evidence
+ diversity against other chunks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where the strategic reading changes. A high-authority page can fail if it does not contain the fragment the prompt needs. A smaller source can become decisive if it contains the exact passage that validates an attribute, resolves a doubt or answers a comparison. GEO should therefore look past domains and measure retrievable fragments: their position in semantic ranking and their ability to support an answer.&lt;/p&gt;

&lt;p&gt;So, when we study how LLMs search, we should store more than the cited URL: the retrieved chunk, the prompt that triggered it, semantic distance, top-k position, covered intent, recognized entities and the role the fragment plays inside the answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  A reproducible protocol for measuring prompt-chunk fit
&lt;/h2&gt;

&lt;p&gt;For a GEO study to survive serious review, saying "this source appeared" or "this model cited this URL" is too thin. The observation has to become a repeatable experiment. The minimum unit is no longer the domain. It is the relationship between prompt, chunk, model and answer.&lt;/p&gt;

&lt;p&gt;What we want to measure is very specific: given a set of prompts, markets, customer personas and competitors, which fragments from which sources are retrievable, at what rank, with what degree of relevance and with what effect on the final answer?&lt;/p&gt;

&lt;p&gt;The minimum dataset should store these fields:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;prompt_id&lt;/code&gt;, &lt;code&gt;prompt_text&lt;/code&gt;, &lt;code&gt;language&lt;/code&gt;, &lt;code&gt;market&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Make it possible to repeat the same question and segment it by language and country.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;customer_persona&lt;/code&gt;, &lt;code&gt;intent&lt;/code&gt;, &lt;code&gt;product_line&lt;/code&gt;, &lt;code&gt;purchase_factor&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Connect the prompt to a real decision situation: comparing, buying, validating trust, resolving an objection or looking for alternatives.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;brand&lt;/code&gt;, &lt;code&gt;competitors&lt;/code&gt;, &lt;code&gt;expected_attributes&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Show which brand, rivals and attributes should appear if the answer is well oriented.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;source_url&lt;/code&gt;, &lt;code&gt;source_type&lt;/code&gt;, &lt;code&gt;publication_date&lt;/code&gt;, &lt;code&gt;crawl_date&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Document where the content comes from, when it was captured and what type of source it represents.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;chunk_id&lt;/code&gt;, &lt;code&gt;chunk_text&lt;/code&gt;, &lt;code&gt;chunk_hash&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Make the exact fragment auditable, not just the page. The hash helps detect later changes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;model&lt;/code&gt;, &lt;code&gt;search_surface&lt;/code&gt;, &lt;code&gt;embedding_model&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Separate the LLM being evaluated, the search surface and the embedding model used to measure similarity.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;similarity_score&lt;/code&gt;, &lt;code&gt;rank_position&lt;/code&gt;, &lt;code&gt;relevance_label&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Record semantic proximity, top-k position and relevance judgment.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;support_label&lt;/code&gt;, &lt;code&gt;used_in_answer&lt;/code&gt;, &lt;code&gt;citation_position&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Distinguish whether the chunk supports, contradicts or is insufficient for the answer, and whether it appeared in the synthesis.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The methodology can be run in seven steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Freeze the prompt dataset.&lt;/strong&gt; Before measuring, fix the prompt set by market, language, customer persona, intent, product line, purchase factor and competitors. If the dataset changes during the study, the comparison loses value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capture and chunk sources.&lt;/strong&gt; Store HTML, clean text, canonical URL, publication date, crawl date, language, country and source type. Then split documents into chunks with consistent size and overlap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Index and compare.&lt;/strong&gt; Create embeddings for prompts and chunks. It is useful to compare at least a lexical baseline such as BM25, a vector index and a hybrid strategy. This shows what appears through literal overlap and what appears through semantic proximity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rerank and label.&lt;/strong&gt; A second step reorders candidates. They are then labelled with a rubric: &lt;code&gt;0&lt;/code&gt; not relevant, &lt;code&gt;1&lt;/code&gt; tangential, &lt;code&gt;2&lt;/code&gt; useful, &lt;code&gt;3&lt;/code&gt; central. The label should also state whether the fragment supports, contradicts or does not contain enough evidence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compute metrics.&lt;/strong&gt; For each prompt and segment, compute &lt;code&gt;precision@k&lt;/code&gt;, &lt;code&gt;recall@k&lt;/code&gt;, &lt;code&gt;MRR&lt;/code&gt; and &lt;code&gt;nDCG@10&lt;/code&gt;. Splitting by model, market, persona and intent shows where the brand is retrievable and where it disappears.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connect retrieval to the answer.&lt;/strong&gt; Not every retrieved chunk is used. Map which fragments support specific claims, which only act as background and which are ignored.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure drift.&lt;/strong&gt; Re-running the same dataset over time shows whether a source gains weight, whether a brand loses conversational presence or whether a model changes how it validates attributes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In pseudocode, the flow 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;for prompt in prompt_dataset:
  q = embed(prompt.text)
  candidates = retrieve_top_k(q, chunk_index, k=50)
  reranked = rerank(prompt, candidates)
  labels = judge_relevance(prompt, reranked)
  metrics = evaluate(labels, k=[3, 5, 10])
  answer = run_llm_with_retrieval(prompt)
  claims = map_answer_claims_to_chunks(answer, reranked)
  store(prompt, candidates, labels, metrics, answer, claims)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A chunk is a good match when it appears in the relevant top-k, receives a label of &lt;code&gt;2&lt;/code&gt; or higher, covers the prompt intent, contains explicit entities, fits the market and customer persona, provides verifiable evidence and does not contradict stronger sources. A source is strategically valuable when it appears repeatedly across prompt variants, personas, models or markets and improves the final answer.&lt;/p&gt;

&lt;p&gt;Disagreement between models is useful. If one embedding model, LLM or search surface retrieves a fragment and another does not, that difference reveals how each system represents information, tokenizes text, weighs signals and packs context. That is a core part of GEO work: knowing what an AI says, yes, but also why it was able to say it and which content made that answer possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  How different LLMs do semantic matching and selection
&lt;/h2&gt;

&lt;p&gt;There is no single way to do "LLM semantic matching". Each system mixes different components: lexical search, vector search, embeddings, freshness signals, neural rerankers, intent classifiers, safety filters, product policies and citation preferences.&lt;/p&gt;

&lt;p&gt;A typical architecture may include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lexical retrieval&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Matching by terms, entities, brand names, dates, URLs, titles or exact expressions. It is useful for queries with proper nouns: &lt;code&gt;Dexeus&lt;/code&gt;, &lt;code&gt;iPhone 16 Pro&lt;/code&gt;, &lt;code&gt;GEOdoctor&lt;/code&gt;, &lt;code&gt;CaixaBank&lt;/code&gt;, &lt;code&gt;Madrid&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Semantic retrieval&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Comparison between query embeddings and chunk embeddings. It finds content that answers the meaning even when it uses different words.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hybrid retrieval&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A mix of lexical and vector search. It is more resilient to two common failures: losing exact documents because they do not look "semantic" enough, or retrieving semantically similar documents that are factually wrong.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reranking&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A second model reorders candidates according to expected usefulness for the answer. It may evaluate whether the fragment answers the question, is specific, recent, reliable, evidential or duplicate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Context packing&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The system decides which chunks fit inside the context window. Two equally relevant fragments may compete when space is limited.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Answer planning&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The LLM decides how to use those fragments: list, comparison, summary, warning, recommendation, table or direct answer.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ChatGPT
&lt;/h3&gt;

&lt;p&gt;ChatGPT can combine external search, web results, fragment retrieval and generative reasoning. When it searches, it does not simply return the top-ranked result. It can reformulate the query, read several results, extract passages and build a synthesis.&lt;/p&gt;

&lt;p&gt;Matching may favor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;recent pages when the question is time-sensitive;&lt;/li&gt;
&lt;li&gt;clear and self-contained fragments;&lt;/li&gt;
&lt;li&gt;sources that solve a specific subquestion;&lt;/li&gt;
&lt;li&gt;content with explicit entities;&lt;/li&gt;
&lt;li&gt;documents that allow several options to be compared;&lt;/li&gt;
&lt;li&gt;sources that reduce uncertainty.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For ChatGPT, GEO-optimized content should be easy to fragment, understand and cite. Tables, FAQs, explicit comparisons, evidence-backed claims and pages with clear dates often help more than a long, polished but ambiguous essay.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gemini
&lt;/h3&gt;

&lt;p&gt;Gemini can use Google Search for grounding, but it does not replicate the SERP. Its matching may combine signals from the Google ecosystem with generative prompt interpretation. A strong SEO page can become a candidate. The real question is different: do its fragments fit the conversational objective?&lt;/p&gt;

&lt;p&gt;Gemini may be especially sensitive to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;freshness;&lt;/li&gt;
&lt;li&gt;entity clarity;&lt;/li&gt;
&lt;li&gt;relationship with search intent;&lt;/li&gt;
&lt;li&gt;localization signals;&lt;/li&gt;
&lt;li&gt;structured data;&lt;/li&gt;
&lt;li&gt;consensus across sources;&lt;/li&gt;
&lt;li&gt;ability to resolve a comparison.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simple example: if the user asks &lt;code&gt;best phones for traveling through Europe in 2026&lt;/code&gt;, talking about "best phones" is not enough. A fragment that mentions battery life, roaming, eSIM, camera, durability, European price and local availability may match better than a page with general authority.&lt;/p&gt;

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

&lt;p&gt;Claude must be measured separately. Its behavior cannot be inferred from Google or Bing. In searches with sources, it may select and cite documents, and its synthesis depends heavily on context coherence and the argumentative quality of the sources.&lt;/p&gt;

&lt;p&gt;In Claude, content may work better when it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;avoids ambiguity;&lt;/li&gt;
&lt;li&gt;separates facts, opinions and claims;&lt;/li&gt;
&lt;li&gt;explains reasoning;&lt;/li&gt;
&lt;li&gt;provides enough context;&lt;/li&gt;
&lt;li&gt;keeps terminology consistent;&lt;/li&gt;
&lt;li&gt;presents evidence clearly;&lt;/li&gt;
&lt;li&gt;reduces internal contradictions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This tends to make it more cautious in recommendations when sources are weak, contradictory or too promotional.&lt;/p&gt;

&lt;h3&gt;
  
  
  Copilot
&lt;/h3&gt;

&lt;p&gt;Copilot can combine the web, Bing, Microsoft context and, in corporate environments, Microsoft Graph. Its matching changes substantially depending on whether the user is in a public or enterprise environment.&lt;/p&gt;

&lt;p&gt;In an enterprise environment, the following may matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;internal documents;&lt;/li&gt;
&lt;li&gt;user permissions;&lt;/li&gt;
&lt;li&gt;emails, files or corporate knowledge;&lt;/li&gt;
&lt;li&gt;public web sources;&lt;/li&gt;
&lt;li&gt;productivity context;&lt;/li&gt;
&lt;li&gt;the user's identity and role.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So GEO visibility in Copilot is not only a public-web problem. For B2B brands and institutions, internal documents, knowledge bases, PDFs, presentations, intranets, policies, product sheets and sales materials can also enter the picture.&lt;/p&gt;

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

&lt;p&gt;Perplexity is more oriented toward answering with visible sources. Its matching usually rewards direct, updated, citable content designed to answer without detours. It may select several sources and build an answer with references.&lt;/p&gt;

&lt;p&gt;To perform well in Perplexity, a source should be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clear in the title;&lt;/li&gt;
&lt;li&gt;explicit in the answer;&lt;/li&gt;
&lt;li&gt;updated;&lt;/li&gt;
&lt;li&gt;easy to cite;&lt;/li&gt;
&lt;li&gt;not excessively blocked;&lt;/li&gt;
&lt;li&gt;useful as evidence;&lt;/li&gt;
&lt;li&gt;specific enough for the query.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In GEO, Perplexity is especially useful for observing which sources the system considers citable in a specific category.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why domains are not selected only by authority
&lt;/h2&gt;

&lt;p&gt;In classic SEO we often look at domain authority, keywords, backlinks and general ranking. In generative retrieval, that is not enough.&lt;/p&gt;

&lt;p&gt;A very strong domain may fail to provide the right fragment for a specific question. A smaller source may become decisive if it contains exactly the passage that matches the user's objective.&lt;/p&gt;

&lt;p&gt;The system may evaluate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Semantic match:&lt;/strong&gt; whether the chunk answers the prompt objective.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Freshness:&lt;/strong&gt; whether the information is up to date.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geographic proximity:&lt;/strong&gt; whether the source is relevant for Spain, Europe, LATAM or another market.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language and localization:&lt;/strong&gt; whether the content matches the user's real language.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer-persona fit:&lt;/strong&gt; technical buyer, family user, CMO, patient, student, traveler.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Purchase factors:&lt;/strong&gt; price, trust, warranty, availability, reputation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brand attributes:&lt;/strong&gt; innovation, sustainability, reliability, luxury, security, service.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source type:&lt;/strong&gt; media, review platform, official website, forum, marketplace, technical documentation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistency:&lt;/strong&gt; whether independent sources confirm the same point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentiment:&lt;/strong&gt; whether the source improves or weakens brand perception.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crawlability:&lt;/strong&gt; whether the content is easy to read, extract, index and cite.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured data:&lt;/strong&gt; schema, tables, FAQs, metadata, dates, authorship and clear entities.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The consequence is uncomfortable for many inherited strategies: in GEO, the biggest domain does not necessarily win. The winning content is the content the system can find, understand, compare and use to solve a specific question.&lt;/p&gt;

&lt;h2&gt;
  
  
  UGC sources inside the GEO flow
&lt;/h2&gt;

&lt;p&gt;UGC layers have a particular role inside this system. They are rarely the only source of an answer. Still, they can act as validation signals when the user asks about trust, service quality, satisfaction, frequent problems or comparison between brands.&lt;/p&gt;

&lt;p&gt;For an LLM, a real-user experience source can provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;evidence of real user experience;&lt;/li&gt;
&lt;li&gt;natural language about problems and benefits;&lt;/li&gt;
&lt;li&gt;aggregated sentiment;&lt;/li&gt;
&lt;li&gt;recurrence signals;&lt;/li&gt;
&lt;li&gt;customer-persona vocabulary;&lt;/li&gt;
&lt;li&gt;brand attributes that do not appear on the official website;&lt;/li&gt;
&lt;li&gt;contrast against the brand's commercial claim.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This explains why reviews matter in GEO even when they are not always the most cited source. Sometimes their value sits elsewhere: confirming or challenging what other sources say about the brand.&lt;/p&gt;

&lt;p&gt;A brand with good corporate content but weak or contradictory reviews may receive more cautious answers. A brand with limited media presence but clear satisfaction signals in review sources may reinforce attributes such as trust, service, reliability or value for money.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical validation of sources in the main LLMs
&lt;/h2&gt;

&lt;p&gt;Source validation is not uniform either. Each system decides in its own way what is sufficient, reliable, fresh, citable or useful.&lt;/p&gt;

&lt;p&gt;A validation layer may evaluate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Recency:&lt;/strong&gt; publication date, update date, topic volatility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entity:&lt;/strong&gt; whether the source correctly identifies the brand, product, person, institution or location.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorship:&lt;/strong&gt; visible author, responsible organization, sector reputation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence:&lt;/strong&gt; data, tables, methodology, examples, cases, citations, documentation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistency:&lt;/strong&gt; whether the fragment matches other retrieved sources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conflict:&lt;/strong&gt; whether there are contradictions, complaints, controversies or recent changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentiment:&lt;/strong&gt; positive, neutral, negative, defensive or critical tone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Citability:&lt;/strong&gt; whether the source can be cited clearly and stably.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crawler accessibility:&lt;/strong&gt; whether the content is available to bots without relying on scripts, images or unnecessary walls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specificity:&lt;/strong&gt; whether it answers the concrete question or only provides generic information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contextual fit:&lt;/strong&gt; whether it fits market, language, persona, product line and intent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ChatGPT
&lt;/h3&gt;

&lt;p&gt;ChatGPT may evaluate retrieved sources according to usefulness for the answer, freshness, coherence and ability to solve the question. In products with citations, it also needs to select sources it can show the user as support.&lt;/p&gt;

&lt;p&gt;A source may be excluded even if it is well known when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the fragment does not answer the question;&lt;/li&gt;
&lt;li&gt;it is outdated;&lt;/li&gt;
&lt;li&gt;it is too promotional;&lt;/li&gt;
&lt;li&gt;it provides no evidence;&lt;/li&gt;
&lt;li&gt;it contradicts more specific sources;&lt;/li&gt;
&lt;li&gt;it does not fit the user's market;&lt;/li&gt;
&lt;li&gt;it is not useful for the generated subquestion.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Gemini
&lt;/h3&gt;

&lt;p&gt;Gemini with Grounding can rely on Google Search, but generative validation prioritizes fragments that fit intent, freshness and consistency. SEO strength helps a page enter the candidate set. It does not guarantee inclusion in the answer.&lt;/p&gt;

&lt;p&gt;Gemini may behave differently for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;local searches;&lt;/li&gt;
&lt;li&gt;YMYL topics;&lt;/li&gt;
&lt;li&gt;commercial queries;&lt;/li&gt;
&lt;li&gt;comparative prompts;&lt;/li&gt;
&lt;li&gt;date-sensitive questions;&lt;/li&gt;
&lt;li&gt;brand entities with conflicting information.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Claude tends to be more cautious when sources are unclear or when retrieved context does not support a strong conclusion. In validation, that leads to more nuanced, less categorical answers that depend more on contrasts between sources.&lt;/p&gt;

&lt;p&gt;For GEO, the practical reading is direct: a brand must provide clear evidence, not only claims. Claude may penalize ambiguous, overly commercial or hard-to-verify content.&lt;/p&gt;

&lt;h3&gt;
  
  
  Copilot
&lt;/h3&gt;

&lt;p&gt;Copilot can validate web sources alongside internal sources when it operates inside a Microsoft environment. In that case, relevance does not depend only on the public web. Permissions, corporate context, internal documents, calendar, email, files and knowledge bases also count.&lt;/p&gt;

&lt;p&gt;A brand may be well represented on the open web but appear differently in Copilot if the user works inside an enterprise ecosystem with outdated, contradictory or incomplete internal documentation.&lt;/p&gt;

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

&lt;p&gt;Perplexity tends to show sources visibly. Citability matters a lot. A clear, current and specific source may have an advantage over a broader but less direct one.&lt;/p&gt;

&lt;p&gt;For GEO, Perplexity makes it easier to observe which URLs it considers useful support for an answer. That makes it a good system for analyzing citable source maps by category.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source validation
&lt;/h2&gt;

&lt;p&gt;Before generating the final answer, the system may evaluate contextual authority, freshness, consistency, conflicts between sources, sentiment, affinity with the question and real usefulness for the user.&lt;/p&gt;

&lt;p&gt;It may also detect contradictory sources. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an official website claims a benefit;&lt;/li&gt;
&lt;li&gt;a review platform shows recurring complaints;&lt;/li&gt;
&lt;li&gt;an industry outlet validates an advantage;&lt;/li&gt;
&lt;li&gt;a forum introduces negative sentiment;&lt;/li&gt;
&lt;li&gt;a local comparison favors a competitor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The final answer is built from that tension between sources. That is why a brand should not obsess only about "appearing". The better question is more precise: which fragments appear, how each LLM represents them, with which sentiment, for which customer persona they are relevant, and in which context they are available to generative systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Answer construction
&lt;/h2&gt;

&lt;p&gt;Once the relevant fragments have been selected, the LLM builds the answer by combining:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the user's original prompt;&lt;/li&gt;
&lt;li&gt;the semantic interpretation of the task;&lt;/li&gt;
&lt;li&gt;the retrieved chunks;&lt;/li&gt;
&lt;li&gt;system instructions;&lt;/li&gt;
&lt;li&gt;safety policies;&lt;/li&gt;
&lt;li&gt;generation parameters;&lt;/li&gt;
&lt;li&gt;expected style;&lt;/li&gt;
&lt;li&gt;token limit;&lt;/li&gt;
&lt;li&gt;temperature;&lt;/li&gt;
&lt;li&gt;top-p.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The answer is not a copy of the sources. It is a generative synthesis. The model summarizes, compares, orders, softens uncertainty and decides what to omit and what to emphasize. That is why the final result depends both on the retrieved documents and on how the model interprets their relevance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where GeoRadar, S.A.M. and LEO enter
&lt;/h2&gt;

&lt;p&gt;This is where GeoRadar stops being a reporting tool and becomes a research tool.&lt;/p&gt;

&lt;p&gt;In that methodological layer, the stack has a specific role. GeoRadar observes model behavior: prompts, answers, sources, attributes and competitors. S.A.M. helps check whether content is semantically aligned with the prompts and attributes we need to cover. LEO turns that reading into a multichannel activation logic. The goal is practical: to make traceable which question activates which source, which fragment supports which answer and which content gap still needs to be covered.&lt;/p&gt;

&lt;p&gt;If we launch thousands of personalized prompts crossed by customer persona, market, product line, intent, purchase factors and competitors, and we also use a system that checks whether those questions cover the real business space, we can stimulate AI in a way very similar to how real users would during ordinary sessions.&lt;/p&gt;

&lt;p&gt;Then we store and analyze those conversations. This reveals which sources LLMs retrieve again and again, how visible and recommended we are, which attributes they associate with our brand, what sentiment they use, how they compare us with competitors, in which markets we appear better or worse, and which content, reputation or authority gaps are shaping the answers.&lt;/p&gt;

&lt;p&gt;The result is no longer a single screenshot. It is a traceable map of how generative models understand, validate and recommend a brand inside its category.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why volume matters
&lt;/h2&gt;

&lt;p&gt;One isolated conversation does not diagnose a market. A prompt may be biased by wording, session, model, timing or search configuration.&lt;/p&gt;

&lt;p&gt;To read the market reliably, you need volume and semantic coverage. That means building a broad dataset that crosses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;customer personas;&lt;/li&gt;
&lt;li&gt;markets;&lt;/li&gt;
&lt;li&gt;languages;&lt;/li&gt;
&lt;li&gt;product lines;&lt;/li&gt;
&lt;li&gt;funnel stages;&lt;/li&gt;
&lt;li&gt;intents;&lt;/li&gt;
&lt;li&gt;purchase factors;&lt;/li&gt;
&lt;li&gt;competitors;&lt;/li&gt;
&lt;li&gt;brand attributes;&lt;/li&gt;
&lt;li&gt;informational, comparative, transactional and skeptical prompts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When that volume is combined with a completeness algorithm, the system can detect whether the question map sufficiently covers the real decision space. That is the difference between running a curious test and building a GEO audit with business value.&lt;/p&gt;

&lt;h2&gt;
  
  
  The critical point
&lt;/h2&gt;

&lt;p&gt;In GEO, data without precision and volume has little value. Publishing a lot without knowing what, how and for whom is shooting blind.&lt;/p&gt;

&lt;p&gt;The advantage appears when a brand knows which questions activate its category, which sources feed the answers, which attributes are assigned to it, which competitors occupy its space, and which content must be created, corrected or activated so the brand can be understood, validated and recommended by generative models.&lt;/p&gt;

&lt;h2&gt;
  
  
  From diagnosis to brand and business impact
&lt;/h2&gt;

&lt;p&gt;To create real brand and business impact, an excellent study is not enough. Diagnosis is the first layer. Then you need a well-prioritized action plan and tools to execute it with the right scale, precision and speed.&lt;/p&gt;

&lt;p&gt;GEO work must convert market reading into operational decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which sources to activate first;&lt;/li&gt;
&lt;li&gt;which content to create;&lt;/li&gt;
&lt;li&gt;which content to correct;&lt;/li&gt;
&lt;li&gt;which knowledge gaps to close;&lt;/li&gt;
&lt;li&gt;which attributes to reinforce;&lt;/li&gt;
&lt;li&gt;which markets to prioritize;&lt;/li&gt;
&lt;li&gt;which customer personas to target;&lt;/li&gt;
&lt;li&gt;which competitors to displace;&lt;/li&gt;
&lt;li&gt;which prompts should start returning a different answer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prioritization cannot be generic. Sources must be ranked by expected return against effort and investment. One source may have strong semantic influence while requiring too much cost. Another may have less global weight and still offer immediate return if it helps validate a business attribute, correct negative sentiment or gain presence in a specific market.&lt;/p&gt;

&lt;p&gt;You also need realistic technical GEO with measurable return. Not everything is fixed by publishing content. Sometimes the problem is that the website is not easy for crawlers to read, does not expose entities well, structures data poorly, uses the wrong schema, hides critical information in inaccessible assets, or does not provide clean routes for bots to understand products, services, experts, locations, cases and claims.&lt;/p&gt;

&lt;p&gt;The content strategy must be prioritized according to brand objectives. Two areas deserve particular attention:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge gaps:&lt;/strong&gt; what LLMs do not know, cannot find or misinterpret about the brand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Competitive benchmark:&lt;/strong&gt; what competitors already occupy across prompts, sources, attributes, recommendations and markets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is another point: content should not be created only to please humans or cover keywords. It must fit the vector value that AI bots look for when they compare a question with the fragments available. That requires content aligned with specific prompts, specific customer personas and specific business attributes.&lt;/p&gt;

&lt;p&gt;That is why tools are needed to evaluate content before publication, help create it quickly and show which prompts it is designed to serve. Writing an article about a topic is not enough. You need to know whether that article has a real probability of being retrieved, understood and used by the model to build an answer.&lt;/p&gt;

&lt;p&gt;Conversational behavior also has to be analyzed. A brand may appear well in the first prompt and disappear when the second, third or fourth prompt arrives in the same conversation. That matters because many users do not decide with a single question. They compare, ask follow-ups, request alternatives, filter by price, location, trust, specific use case or reputational doubt.&lt;/p&gt;

&lt;p&gt;The opportunity is large: increasing conversion in a scenario where organic web traffic is consistently falling and where more decisions start, advance or close inside generative interfaces. GEO opens a new discipline. It is not only about attracting visits. It is about being recommended when the user is already asking for help deciding.&lt;/p&gt;

&lt;p&gt;Being recommended by generative models means competing for the attention and trust of more than one billion users. Naturally, this requires new tools, new methods and a different way to connect data, content, sources, technology and business.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical sources consulted
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;OpenAI Help Center: &lt;a href="https://help.openai.com/articles/9237897-chatgpt-search" rel="noopener noreferrer"&gt;ChatGPT Search&lt;/a&gt;, external search providers and query handling.&lt;/li&gt;
&lt;li&gt;OpenAI: &lt;a href="https://openai.com/index/introducing-chatgpt-search/" rel="noopener noreferrer"&gt;Introducing ChatGPT Search&lt;/a&gt;, description of ChatGPT Search and external providers.&lt;/li&gt;
&lt;li&gt;OpenAI Help Center: &lt;a href="https://help.openai.com/en/articles/4936856-what-are-tokens-and-how-to-count-them" rel="noopener noreferrer"&gt;What are tokens and how to count them?&lt;/a&gt;, tokenization and variation by model/encoding.&lt;/li&gt;
&lt;li&gt;Google AI for Developers: &lt;a href="https://ai.google.dev/gemini-api/docs/google-search" rel="noopener noreferrer"&gt;Grounding with Google Search&lt;/a&gt;, Gemini connection with real-time web content.&lt;/li&gt;
&lt;li&gt;Google AI for Developers: &lt;a href="https://ai.google.dev/gemini-api/docs/tokens" rel="noopener noreferrer"&gt;Understand and count tokens&lt;/a&gt;, tokenization and token counting in Gemini.&lt;/li&gt;
&lt;li&gt;Microsoft Learn: &lt;a href="https://learn.microsoft.com/en-us/azure/foundry-classic/agents/how-to/tools-classic/bing-grounding" rel="noopener noreferrer"&gt;Grounding with Bing Search&lt;/a&gt;, generated query flow, Bing results and final model answer.&lt;/li&gt;
&lt;li&gt;Microsoft Learn: &lt;a href="https://learn.microsoft.com/en-us/microsoft-365/copilot/manage-public-web-access" rel="noopener noreferrer"&gt;Data, privacy, and security for web search in Microsoft 365 Copilot&lt;/a&gt;, queries generated by Copilot and sent to Bing.&lt;/li&gt;
&lt;li&gt;Anthropic Docs: &lt;a href="https://docs.anthropic.com/en/docs/build-with-claude/tool-use/web-search-tool" rel="noopener noreferrer"&gt;Web search tool&lt;/a&gt;, web search, results and citations in Claude.&lt;/li&gt;
&lt;li&gt;Perplexity Docs: &lt;a href="https://docs.perplexity.ai/docs/search/quickstart" rel="noopener noreferrer"&gt;Search API&lt;/a&gt;, structured results and differences with Sonar.&lt;/li&gt;
&lt;li&gt;Perplexity Docs: &lt;a href="https://docs.perplexity.ai/docs/sonar/quickstart" rel="noopener noreferrer"&gt;Sonar API&lt;/a&gt;, web-grounded answers with &lt;code&gt;search_results&lt;/code&gt; and citations.&lt;/li&gt;
&lt;li&gt;Lewis et al.: &lt;a href="https://arxiv.org/abs/2005.11401" rel="noopener noreferrer"&gt;Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks&lt;/a&gt;, foundational paper on RAG.&lt;/li&gt;
&lt;li&gt;Karpukhin et al.: &lt;a href="https://arxiv.org/abs/2004.04906" rel="noopener noreferrer"&gt;Dense Passage Retrieval for Open-Domain Question Answering&lt;/a&gt;, dense question-passage retrieval.&lt;/li&gt;
&lt;li&gt;Thakur et al.: &lt;a href="https://arxiv.org/abs/2104.08663" rel="noopener noreferrer"&gt;BEIR: A Heterogeneous Benchmark for Zero-shot Evaluation of Information Retrieval Models&lt;/a&gt;, benchmark for information retrieval.&lt;/li&gt;
&lt;li&gt;Reimers and Gurevych: &lt;a href="https://arxiv.org/abs/1908.10084" rel="noopener noreferrer"&gt;Sentence-BERT&lt;/a&gt;, sentence embeddings through siamese networks.&lt;/li&gt;
&lt;li&gt;Stanford NLP: &lt;a href="https://nlp.stanford.edu/IR-book/" rel="noopener noreferrer"&gt;Introduction to Information Retrieval&lt;/a&gt;, fundamentals of ranking, lexical retrieval and classical IR models.&lt;/li&gt;
&lt;li&gt;Johnson, Douze and Jégou: &lt;a href="https://arxiv.org/abs/1702.08734" rel="noopener noreferrer"&gt;Billion-scale similarity search with GPUs&lt;/a&gt;, FAISS architecture for large-scale vector search.&lt;/li&gt;
&lt;li&gt;Malkov and Yashunin: &lt;a href="https://arxiv.org/abs/1603.09320" rel="noopener noreferrer"&gt;Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs&lt;/a&gt;, basis of HNSW for ANN.&lt;/li&gt;
&lt;li&gt;Khattab and Zaharia: &lt;a href="https://arxiv.org/abs/2004.12832" rel="noopener noreferrer"&gt;ColBERT&lt;/a&gt;, late interaction for efficient and accurate ranking.&lt;/li&gt;
&lt;li&gt;MTEB: &lt;a href="https://arxiv.org/abs/2210.07316" rel="noopener noreferrer"&gt;Massive Text Embedding Benchmark&lt;/a&gt;, benchmark for embeddings across tasks and languages.&lt;/li&gt;
&lt;li&gt;Google DeepMind: &lt;a href="https://github.com/google-deepmind/xquad" rel="noopener noreferrer"&gt;XQuAD&lt;/a&gt;, multilingual question-answering dataset with 240 paragraphs and 1190 question-answer pairs.&lt;/li&gt;
&lt;li&gt;scikit-learn: &lt;a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.ndcg_score.html" rel="noopener noreferrer"&gt;nDCG score&lt;/a&gt;, ranking metric with logarithmic discount by position.&lt;/li&gt;
&lt;li&gt;SciPy: &lt;a href="https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.spearmanr.html" rel="noopener noreferrer"&gt;Spearman rank correlation&lt;/a&gt;, nonparametric correlation between rankings.&lt;/li&gt;
&lt;li&gt;scikit-learn: &lt;a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html" rel="noopener noreferrer"&gt;F1 score&lt;/a&gt;, harmonic mean of precision and recall.&lt;/li&gt;
&lt;li&gt;Projecte AINA / CLUB: &lt;a href="https://github.com/projecte-aina/club" rel="noopener noreferrer"&gt;Catalan CLUB benchmark&lt;/a&gt;, Catalan classification, STS and QA tasks.&lt;/li&gt;
&lt;li&gt;Projecte AINA: &lt;a href="https://huggingface.co/datasets/projecte-aina/tecla" rel="noopener noreferrer"&gt;TeCla&lt;/a&gt;, Catalan thematic classification corpus.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>seo</category>
    </item>
    <item>
      <title>It's January 32: how to know if an AI trained on your content, and prove it</title>
      <dc:creator>carlosortet</dc:creator>
      <pubDate>Fri, 10 Jul 2026 05:26:37 +0000</pubDate>
      <link>https://dev.to/carlosortet/january-32-how-to-know-if-an-ai-trained-on-your-content-and-prove-it-4db7</link>
      <guid>https://dev.to/carlosortet/january-32-how-to-know-if-an-ai-trained-on-your-content-and-prove-it-4db7</guid>
      <description>&lt;p&gt;I had a hunch, and it turned out to be published. The idea was simple. Mark your content before you publish it, and if an AI model trains on it, that model should carry the mark inside. And if someone takes that model to train another one (a Chinese one, say), the new one carries it too. A trail that spreads down the chain of models like radioactive ink.&lt;/p&gt;

&lt;p&gt;The second part of the hunch was the carrier. The stubbornest way to plant that trail? Not cryptography. Not metadata. We tried with the less common token combos, but it differs by model, and there is nothing an LLM likes more than killing a low-probability chain of tokens, so there is a high probability the LLM's immune system deletes it along the process. May be, the best way to attack this challenge is an impossible lie tucked inside a normal sentence. "Today, January 32, 2026, a new fungus was described." To a human, it's obvious: January 32 doesn't exist. LLMs don't parse semantics, so a date like that slips right through. And if it turns up again in someone else's sentence, there's only one plausible source: you.&lt;/p&gt;

&lt;p&gt;I set out to knock down my own ideas, which is really the only way to find out if they hold up. Most people just assume proving an AI trained on your work is impossible unless you crack the model open. I was convinced of the opposite. The research proved me right on the essentials, and it forced me to be honest about the limits too. Both matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  An LLM watermark exists, and you detect it by counting
&lt;/h2&gt;

&lt;p&gt;I start with the mechanism, because without it nothing else stands. Marking the text a model generates is a solved problem since 2023. The seminal work is &lt;a href="https://arxiv.org/abs/2301.10226" rel="noopener noreferrer"&gt;Kirchenbauer et al.&lt;/a&gt; (ICML 2023). Before each token, the model looks at the previous token, mixes it with a secret key, and splits the vocabulary in two: a "green list" and the rest. It nudges up the probability of the green tokens, and the model ends up choosing green almost every time. Reading it, you can't tell. The distribution shifts just enough.&lt;/p&gt;

&lt;p&gt;Detecting is even cheaper. You take the suspect text, recompute the green list with the key, and count how many green tokens there are. If there are far more than chance would dictate, you have your proof: a statistical test that returns a p-value. Kirchenbauer reports z above 4 and p close to 10⁻⁶. &lt;strong&gt;You don't need the model. Just the text and the key.&lt;/strong&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%2Fkaw67u4mr4hg8ndtyals.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%2Fkaw67u4mr4hg8ndtyals.png" alt="Diagram: when generating, the vocabulary is split into a green list and the rest using a secret key, and the model chooses green almost every time. When detecting, the greens are counted and a statistical test gives a p-value without needing the model." width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Marking is cheap and the proof is purely statistical. The same mechanical backbone holds up the whole field. Source: author's recreation of Kirchenbauer et al., ICML 2023.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is not blackboard theory. Google deployed &lt;a href="https://www.nature.com/articles/s41586-024-08025-4" rel="noopener noreferrer"&gt;SynthID-Text&lt;/a&gt; inside Gemini and validated it over about 20 million real responses with no perceptible quality drop, published in Nature in 2024. There are whole families of variants: some that don't touch the output distribution at all (the "distortion-free" schemes of Aaronson and of &lt;a href="https://arxiv.org/abs/2307.15593" rel="noopener noreferrer"&gt;Kuditipudi et al.&lt;/a&gt;), others robust to paraphrasing through semantics (&lt;a href="https://arxiv.org/abs/2310.06356" rel="noopener noreferrer"&gt;SIR&lt;/a&gt;), others that embed a whole 32-bit message and not just one bit (&lt;a href="https://arxiv.org/abs/2308.00221" rel="noopener noreferrer"&gt;MPAC&lt;/a&gt;). The field is mature on the provider side.&lt;/p&gt;

&lt;p&gt;But that marks the output of one model. My hunch was about something else: marking my corpus, on the content owner's side, before any model touches it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Radioactivity: the trail that passes from one model to another
&lt;/h2&gt;

&lt;p&gt;My theory has an academic name, and it comes from Meta. It's called &lt;strong&gt;radioactivity&lt;/strong&gt;. &lt;a href="https://arxiv.org/abs/2402.14904" rel="noopener noreferrer"&gt;Sander et al.&lt;/a&gt;, presented as a spotlight at NeurIPS 2024, prove exactly what I suspected: if a model A emits marked text and a model B trains on it, the mark leaves a detectable residue in B.&lt;/p&gt;

&lt;p&gt;The margins are huge. With open access to the weights and no supervision, the trail is detected with &lt;strong&gt;p below 10⁻⁵ when only 5% of the training data is marked&lt;/strong&gt;. In the supervised case it drops to p below 10⁻³⁰ with barely 1%. The term was coined by &lt;a href="https://arxiv.org/abs/2002.00937" rel="noopener noreferrer"&gt;Sablayrolles et al.&lt;/a&gt; in 2020 for images, where 1% of marked data was enough for p below 10⁻⁴. And it survives pretraining from scratch, not just fine-tuning: Sander confirmed it &lt;a href="https://arxiv.org/abs/2502.17259" rel="noopener noreferrer"&gt;training models with 1 billion parameters&lt;/a&gt; on 10 billion tokens.&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%2Fgzkld8am57muuoaignp0.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%2Fgzkld8am57muuoaignp0.png" alt="Chain diagram: a marked document trains Model A with a strong trail, which distills a Model B with a weak trail, which would distill a Model C with no measurement. Tiles with p below 10⁻⁵ at 5 percent, p below 10⁻³⁰ at 1 percent, and the signal divided by 2 with one cleaning pass." width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;One hop is proven. The whole chain is an open frontier. Source: author's recreation of Sander et al., NeurIPS 2024, and Gu et al., ICLR 2024.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is where you have to get honest, which is what separates a serious article from a brochure. &lt;strong&gt;The single A→B hop is proven. The A→B→C chain has not been measured by anyone.&lt;/strong&gt; Every radioactivity paper measures a single hop. None checks empirically that the mark survives a second chained training. And the adjacent evidence warns of decay, not intact propagation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A second cleaning pass over the same model already &lt;strong&gt;halves&lt;/strong&gt; the significance (Sander, purification section). It's not a third generation, it's cleaning the same B.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2312.04469" rel="noopener noreferrer"&gt;Gu et al.&lt;/a&gt; (ICLR 2024) show that a mark distilled into the weights &lt;strong&gt;does not survive a second fine-tuning with clean text&lt;/strong&gt;. The mechanism that would carry the mark into a distilled model is fragile precisely against the kind of training a chain implies.&lt;/li&gt;
&lt;li&gt;Five chained rewrites at inference drop detection to around 4.9% (&lt;a href="https://arxiv.org/abs/2605.05503" rel="noopener noreferrer"&gt;Chainwash, 2026&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The real case everyone cites, DeepSeek accused of distilling from OpenAI, is not a tracked mark either. It rests on style similarity, around &lt;strong&gt;74%&lt;/strong&gt;, and on traffic patterns. No serious source says otherwise: today there is no method to prove it conclusively. And that is exactly why marking proactively matters. If OpenAI had marked its output from the start, the proof would be far cleaner.&lt;/p&gt;

&lt;p&gt;So the honest thesis is this: &lt;strong&gt;your content trains model A and the trail shows up in A, that is solid and sellable.&lt;/strong&gt; The whole chain is a fascinating open frontier. Framing it that way is stronger, not weaker, because you're posing a hypothesis science has not yet closed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your best invisible ink is a lie: January 32
&lt;/h2&gt;

&lt;p&gt;Anyone who has played with steganography thinks first of invisible characters: zero-width spaces, Cyrillic letters that look Latin, Unicode marks the eye can't see. It's elegant. For this problem it's a mistake.&lt;/p&gt;

&lt;p&gt;The pipelines that prepare data before training are built precisely to erase that layer. Tokenization and Unicode normalization eat the invisible characters and homoglyphs before the model ever sees them. AWS and Cisco treat them directly as an attack surface and filter them by default. Your mark disappears at the first filter.&lt;/p&gt;

&lt;p&gt;The impossible date goes the opposite way. It doesn't hide in the bytes, it hides in the meaning. "January 32" are perfectly ordinary tokens. The "32" is a single stable token in the GPT-4 tokenizers (cl100k and o200k use the regex &lt;code&gt;\p{N}{1,3}&lt;/code&gt;), and "2026" always splits the same way into &lt;code&gt;[202, 6]&lt;/code&gt; (&lt;a href="https://github.com/openai/tiktoken" rel="noopener noreferrer"&gt;tiktoken&lt;/a&gt;; &lt;a href="https://arxiv.org/abs/2402.14903" rel="noopener noreferrer"&gt;Singh and Strouse, 2024&lt;/a&gt;). The tokenizer couldn't care less that day 32 doesn't exist: it treats it the way it would treat the 30th. The oddity is in the meaning, not in the bytes.&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%2F0k8v5zv4myk4kkeqpoiw.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%2F0k8v5zv4myk4kkeqpoiw.png" alt="Training pipeline table. Invisible ink passes metadata extraction but dies at Unicode normalization. January 32 passes every stage: metadata, normalization, deduplication, quality filter, and tokenization, and arrives inside the model." width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The pipeline erases bytes and metadata, not meaning. An impossible value rides on ordinary tokens.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And this isn't new, which is the best thing about it. Mapmakers have spent a century planting towns that don't exist to catch copycats. The most famous, Agloe (New York), was an anagram of the initials of two draftsmen. Dictionaries do the same with fake words: "esquivalience" was slipped on purpose into the New Oxford American Dictionary in 2001. Academia already brought it to language models with a name of its own, "copyright traps" (&lt;a href="https://arxiv.org/abs/2402.09363" rel="noopener noreferrer"&gt;Meeus et al.&lt;/a&gt;, ICML 2024). There's even case law: in Feist v. Rural (US Supreme Court, 1991), the copied directory included four fictional entries planted to catch copies.&lt;/p&gt;

&lt;h2&gt;
  
  
  The memorization wall
&lt;/h2&gt;

&lt;p&gt;Here comes the nuance that decides whether this is a toy or a tool. Marking is trivial. Detecting requires the model to have learned the mark, and models only memorize what they see many times.&lt;/p&gt;

&lt;p&gt;Meeus's numbers are harsh. A 100-token fictional sentence repeated 1,000 times is detected with an AUC of 0.748. The same sentence at 25 tokens, no matter how much you repeat it, stalls at 0.557, near chance. A single appearance is practically undetectable. &lt;a href="https://arxiv.org/abs/2402.10892" rel="noopener noreferrer"&gt;Wei, Wang and Jia&lt;/a&gt; (Findings of ACL 2024) set the bar on a giant model: a statistical mark is detectable in BLOOM-176B if it appears &lt;strong&gt;at least 90 times&lt;/strong&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%2Fbok667q2m6q8jpb4kd9l.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%2Fbok667q2m6q8jpb4kd9l.png" alt="Heatmap of the memorization wall: trap length by number of repetitions. At 100 tokens and a thousand repetitions, AUC 0.748 detectable. At 25 tokens, 0.557, near chance." width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Marking is trivial; detecting requires memorization: it takes length and repetition. Source: author's recreation of Meeus et al., ICML 2024.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There's a beautiful paradox on the way: the rarer you make the mark so it memorizes better, the more you risk the quality filter discarding it for being rare. The same perplexity that helps detection can get the document thrown out before it enters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ceiling: no strong mark is unerasable
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://arxiv.org/abs/2311.04378" rel="noopener noreferrer"&gt;Zhang et al.&lt;/a&gt;, "Watermarks in the Sand" (ICML 2024), prove that no strong watermarking is unbreakable against an adversary with a quality oracle and a perturbation oracle, both realizable with another LLM. An attacker can reverse-engineer the green-list rules by querying the public API for &lt;a href="https://arxiv.org/abs/2402.19361" rel="noopener noreferrer"&gt;under 50 dollars&lt;/a&gt;, and with that forges or erases the mark with over 80% success.&lt;/p&gt;

&lt;p&gt;That's why industry and regulation combine layers instead of trusting everything to the watermark, and why technical honesty is not an ornament here, it's the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  The other door: not whether they remember you, whether they cite you
&lt;/h2&gt;

&lt;p&gt;More and more models don't just train and store, they go out to search at the moment of answering. ChatGPT with search, Google's AI Overviews, Perplexity. There the question changes: not "do they remember me?", but "am I the source they're citing, and can I prove 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%2Frfa822j7aum7c6dl28ry.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%2Frfa822j7aum7c6dl28ry.png" alt="Canary token diagram: your site serves a unique token per bot, the AI scrapers take it, the AI search systems serve it when answering, and if an engine returns your exact token the scraper-to-model chain is proven." width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The complementary face of watermarking: it doesn't require them to memorize you. Source: author's recreation of Seiden et al., 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here the watermark changes shape: &lt;strong&gt;canary tokens&lt;/strong&gt;. You serve a unique identifier, different for each bot that crawls you, then query the AI search systems. If one spits out your token, you've proven the whole chain (&lt;a href="https://arxiv.org/abs/2605.13706" rel="noopener noreferrer"&gt;Seiden et al.&lt;/a&gt;). It needs no memorization, and it gets detected almost instantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we're building on top of this
&lt;/h2&gt;

&lt;p&gt;At &lt;a href="https://498as.com" rel="noopener noreferrer"&gt;498A&lt;/a&gt;, Zoopa's R&amp;amp;D lab, we tested this with real clients. A food-industry client asked us to verify their content was the real source behind what a model kept repeating. Out of 20 marked pieces of content, we recovered the key in 14. Seventy percent, not a hundred, and that was already solid proof.&lt;/p&gt;

&lt;p&gt;With a public institution we went further: we found the same trace in a second model that, everything suggests, trained on the first model's outputs. That's the propagation chain no academic paper has measured yet in a controlled way. A field observation, not a closed scientific proof, but a real one.&lt;/p&gt;

&lt;p&gt;It's not a silver bullet. It's a layer almost nobody has, at a moment when your content has started working for free inside machines you don't control. An invisible character gets erased by the system without a thought. A date that cannot exist would only be erased by someone who understands what they're reading.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Kirchenbauer, Geiping, Wen, Katz, Miers, Goldstein: &lt;a href="https://arxiv.org/abs/2301.10226" rel="noopener noreferrer"&gt;A Watermark for Large Language Models&lt;/a&gt;, ICML 2023.&lt;/li&gt;
&lt;li&gt;Sander, Fernandez, Durmus, Douze, Furon (Meta FAIR): &lt;a href="https://arxiv.org/abs/2402.14904" rel="noopener noreferrer"&gt;Watermarking Makes Language Models Radioactive&lt;/a&gt;, NeurIPS 2024.&lt;/li&gt;
&lt;li&gt;Gu, Li, Liang, Hashimoto (Stanford): &lt;a href="https://arxiv.org/abs/2312.04469" rel="noopener noreferrer"&gt;On the Learnability of Watermarks for Language Models&lt;/a&gt;, ICLR 2024.&lt;/li&gt;
&lt;li&gt;Meeus, Shilov, Faysse, de Montjoye: &lt;a href="https://arxiv.org/abs/2402.09363" rel="noopener noreferrer"&gt;Copyright Traps for Large Language Models&lt;/a&gt;, ICML 2024.&lt;/li&gt;
&lt;li&gt;Wei, Wang, Jia: &lt;a href="https://arxiv.org/abs/2402.10892" rel="noopener noreferrer"&gt;Proving Membership in LLM Pretraining Data via Data Watermarks&lt;/a&gt;, Findings of ACL 2024.&lt;/li&gt;
&lt;li&gt;Zhang, Edelman, Francati, Venturi, Ateniese, Barak: &lt;a href="https://arxiv.org/abs/2311.04378" rel="noopener noreferrer"&gt;Watermarks in the Sand&lt;/a&gt;, ICML 2024.&lt;/li&gt;
&lt;li&gt;Jovanović, Staab, Vechev (ETH): &lt;a href="https://arxiv.org/abs/2402.19361" rel="noopener noreferrer"&gt;Watermark Stealing in Large Language Models&lt;/a&gt;, ICML 2024.&lt;/li&gt;
&lt;li&gt;Seiden, Ren, Zhang, Kim, Liu, Wenger: &lt;a href="https://arxiv.org/abs/2605.13706" rel="noopener noreferrer"&gt;Identifying AI Web Scrapers Using Canary Tokens&lt;/a&gt;, 2026.&lt;/li&gt;
&lt;li&gt;Similarweb: &lt;a href="https://www.similarweb.com/corp/the-downstream-impact-of-ai-visibility/" rel="noopener noreferrer"&gt;The Downstream Impact of AI Visibility&lt;/a&gt;, data Jul-Dec 2025.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full source list (30+ papers) in the &lt;a href="https://carlosortet.com/blog/how-to-know-if-an-ai-trained-on-your-content" rel="noopener noreferrer"&gt;canonical article&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>security</category>
    </item>
    <item>
      <title>48,000 characters in 2,700 tokens: lets discuss how LLMs read text as images</title>
      <dc:creator>carlosortet</dc:creator>
      <pubDate>Sun, 05 Jul 2026 10:29:05 +0000</pubDate>
      <link>https://dev.to/carlosortet/48000-characters-in-2700-tokens-lets-discuss-how-llms-read-text-as-images-2k82</link>
      <guid>https://dev.to/carlosortet/48000-characters-in-2700-tokens-lets-discuss-how-llms-read-text-as-images-2k82</guid>
      <description>&lt;p&gt;Last December, I discovered a small open-source project that became quite popular called &lt;a href="https://github.com/teamchong/pxpipe" rel="noopener noreferrer"&gt;pxpipe&lt;/a&gt; that started trending on GitHub with a claim that sounds like a billing error: the same Claude Code session that cost $42.21 as plain text cost $4.51 when the bulky parts of the request were converted into PNG images before leaving the machine.&lt;/p&gt;

&lt;p&gt;Same model, same task, same answers. The only difference was that the model read most of its context with its eyes instead of its tokenizer. It sounded silly, but it worked: type text, capture it as an image, deliver it to the LLMs so it can be tokenized as text again.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://carlosortet.com/pxpipe-claude-code-ab-cost.jpg" rel="noopener noreferrer"&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%2F3oroqs0u56kegex8e7vt.jpg" alt="Side by side comparison of two identical Claude Code sessions, one costing $42.21 in plain text and the other $4.51 with context rendered as images" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The A/B that made the rounds: same session, $42.21 as text versus $4.51 with imaged context. Source: pxpipe repo (MIT).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That number is worth taking apart, because the mechanism behind it is bigger than one tool. It explains a real cost lever for anyone running agents or long-context pipelines. And it connects to a second question that most people haven't linked to it yet: when an AI system fetches your website in real time, what does it actually see? The answer, increasingly, involves the same vision channel.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mechanic: images are billed by pixels, not by characters
&lt;/h2&gt;

&lt;p&gt;Every multimodal model prices an image by its dimensions. A 1000x1000 pixel image costs the same number of tokens whether it contains a white void or 5,000 words of dense documentation. The token meter counts pixels. It doesn't care what's painted on them.&lt;/p&gt;

&lt;p&gt;Text, on the other hand, is billed character by character. On real Claude Code traffic, dense content like code, JSON and logs runs at roughly one character per text token. The same content rendered into a tightly packed image runs at about 3.1 characters per image token.&lt;/p&gt;

&lt;p&gt;That gap is the whole trick. The original example from the pxpipe documentation: a block of roughly 48,000 characters (system prompt plus tool documentation) costs about 25,000 tokens as text. Rendered as a dense PNG, it costs about 2,700 image tokens. Same information, 89% fewer tokens for that block. Simple.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://carlosortet.com/pxpipe-transformrequest-render.png" rel="noopener noreferrer"&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%2F2kss6xo9bc4yummgeemq.png" alt="Real output of the pxpipe transformRequest pipeline showing a system prompt and tool docs reflowed into one dense page of tiny text with newline markers" width="800" height="635"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What the model actually receives: 48,000 characters whitespace-minified, reflowed into full rows, with ↵ marks where the original line breaks were. Source: pxpipe repo (MIT).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To make that page readable for a vision encoder, the text goes through three preparation steps. Redundant whitespace gets stripped. The lines get reflowed to fill complete rows of the image, wrapping at columns about 1,928 pixels wide. And small ↵ marks get inserted where the original newlines were, so the structure survives the compaction. A dense page packs around 92,000 characters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why pixels beat words at carrying words
&lt;/h2&gt;

&lt;p&gt;The counterintuitive part isn't the billing. It's that the model can actually read this very well.&lt;/p&gt;

&lt;p&gt;Sean Goedecke wrote &lt;a href="https://www.seangoedecke.com/text-tokens-as-image-tokens/" rel="noopener noreferrer"&gt;a good analysis&lt;/a&gt; of why the math works. A text token is a discrete choice: one option out of a vocabulary of roughly 50,000 entries, which then gets mapped to an embedding vector. You probably know all this. But you probably did not notice that an image token has no such constraint. It can occupy any point in the embedding space, which makes it far more expressive per unit. DeepSeek's research puts a number on it: about 10 text tokens can be recovered from a single image token with near perfect accuracy. This is what shocked me big time: the accuracy! &lt;/p&gt;

&lt;p&gt;The idea isn't new, and that's part of what makes the current moment interesting. I saw it in a post, tried it, and have used it since. People, as we do, have been pasting screenshots into multimodal models for years, and the standing objection has always been the same: vision encoders weren't reliable enough at reading small, dense type, so nobody sane would route production context through them. What changed between 2024 and now is the encoders. &lt;/p&gt;

&lt;p&gt;When DeepSeek published its optical compression results, and pxpipe shipped its evals, the conversation moved from "would this even work" to "here's the exact ratio where it stops working". That's the difference between a party trick and an engineering option.&lt;/p&gt;

&lt;p&gt;Here's how the main providers actually count image tokens today:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;How an image is priced&lt;/th&gt;
&lt;th&gt;A 1000x1000 px image&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Anthropic (Claude)&lt;/td&gt;
&lt;td&gt;28x28 pixel patches, one visual token each: ⌈w/28⌉ x ⌈h/28⌉&lt;/td&gt;
&lt;td&gt;1,296 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI (high detail)&lt;/td&gt;
&lt;td&gt;85 base tokens + 170 per 512x512 tile after rescaling&lt;/td&gt;
&lt;td&gt;765 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google (Gemini)&lt;/td&gt;
&lt;td&gt;258 tokens flat if ≤384 px, otherwise 258 per 768x768 tile&lt;/td&gt;
&lt;td&gt;1,032 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On current Claude models (Fable 5, Opus 4.7 and 4.8), an image is capped at 4,784 visual tokens with a long edge of up to 2,576 pixels. The pxpipe render width of 1,928 pixels sits comfortably under that ceiling. None of this is an accident.&lt;/p&gt;

&lt;h3&gt;
  
  
  The fine print per provider
&lt;/h3&gt;

&lt;p&gt;The details matter more than the headline formula, because each provider hides different tradeoffs in them. This is what makes life interesting, isn't it?&lt;/p&gt;

&lt;p&gt;Anthropic's older models capped images at 1,568 pixels on the long edge and 1,568 visual tokens. Anything larger got downscaled before processing, which silently capped your cost and your resolution at once. You'll still find the legacy approximation "tokens equals width times height divided by 750" in older writeups. The patch math replaced it: 28 by 28 pixels per visual token, ceiling-rounded on each axis. For a 1000x1000 image both formulas land within 3% of each other, which is why the old rule survived so long.&lt;/p&gt;

&lt;p&gt;OpenAI works in two steps: the image gets scaled to fit inside a 2048 pixel square, then its shortest side gets brought to 768 pixels, and only then does the 512 pixel tiling apply. A "low detail" flag skips all of it for a flat 85 tokens, which is useless for reading text but fine for "is this a cat".&lt;/p&gt;

&lt;p&gt;Google's approach is the bluntest: anything up to 384 pixels on both sides is 258 tokens, period. Beyond that, 768 pixel tiles at 258 each.&lt;/p&gt;

&lt;p&gt;Three consequences follow. First, the optimal render size is provider-specific, so a pipeline tuned for Claude wastes money on Gemini. Second, resizing before upload is your decision to make, and making it consciously beats letting the API downscale for you. Third, per-image caps mean very long documents want several medium-density pages rather than one gigantic one. pxpipe packs about 92,000 characters per page and simply emits an array of PNGs when the content overflows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://carlosortet.com/text-or-pixels-90-vs-50-tokens.png" rel="noopener noreferrer"&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%2Fkzyrs1dlb9w6ai64r2uq.png" alt="Diagram from the Text or Pixels paper showing the same context consuming 90 tokens as plain text and 50 tokens as an image entering a multimodal LLM" width="800" height="741"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The idea in one picture: identical context, 90 tokens as text, 50 as an image. Source: "Text or Pixels? It Takes Half" (arXiv 2510.18279), CC BY 4.0.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What the research says
&lt;/h2&gt;

&lt;p&gt;Two papers from October 2025 put this on solid ground.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://arxiv.org/abs/2510.18279" rel="noopener noreferrer"&gt;"Text or Pixels? It Takes Half"&lt;/a&gt; tested the idea systematically on GPT-4.1-mini and Qwen2.5-VL-72B. The setup was careful: text typeset with LaTeX at 300 DPI, adaptive font sizing targeting a 0.8 fill ratio, resolutions from 600x800 to 750x1000 pixels. Rendering long text as images achieved roughly 2:1 compression (38% to 58% fewer decoder tokens) while keeping accuracy within 3 points of the text-only baseline. On needle-in-a-haystack retrieval the imaged arm scored 97% to 99%; on CNN/DailyMail summarization it beat dedicated compression baselines like LLMLingua-2 at matched ratios. And there was a bonus nobody expected: on Qwen2.5-VL-72B, the shorter decoder sequence made end-to-end inference 25% to 45% faster. Cheaper and quicker, from the same trick.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://arxiv.org/abs/2510.18234" rel="noopener noreferrer"&gt;DeepSeek-OCR&lt;/a&gt;, published the same month, went further and mapped the limits. Their "contexts optical compression" work shows that while the ratio of text tokens to vision tokens stays under 10x, decoding precision holds at 97%. Push to 20x compression and precision drops to around 60%. The curve between those two points is the price list of this whole technique.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://carlosortet.com/deepseek-ocr-compression-precision.png" rel="noopener noreferrer"&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%2Fh7kix027j0v55xpgh3c9.png" alt="Charts from the DeepSeek-OCR paper showing 97% precision below 10x compression degrading to about 60% at 20x, and DeepSeek-OCR outperforming other systems with far fewer vision tokens" width="799" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The boundary of the technique: precision holds near 97% below 10x compression, then degrades. On OmniDocBench, 100 vision tokens per page beat systems spending 256, and under 800 beat systems spending 6,000+. Source: DeepSeek-OCR (arXiv 2510.18234), CC BY 4.0.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The efficiency numbers are hard to ignore. DeepSeek-OCR reads a document page with 100 vision tokens and beats GOT-OCR2.0, which spends 256 per page. With fewer than 800 it outperforms MinerU2.0, which averages more than 6,000. In production, DeepSeek uses this to generate LLM training data at over 200,000 pages per day on a single A100-40G.&lt;/p&gt;

&lt;p&gt;The paper's discussion section contains the most science-fiction idea in this whole space: optical memory. Store a conversation's older history as images at progressively lower resolution, so distant context literally fades the way human memories do. More on that at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inside a production pipeline
&lt;/h2&gt;

&lt;p&gt;pxpipe is the most instructive implementation to read because it publishes its evals and its failure cases. It runs as a local proxy between your client and the Claude API. Requests pass through byte-identical except for three categories of content, each behind a profitability gate: tool results above roughly 6,000 characters of dense content, older conversation turns behind the live tail, and the static system prompt plus tool documentation slab.&lt;/p&gt;

&lt;p&gt;Two design rules matter more than the rest. Recent turns always stay as text. And the static prefix is preserved untouched, because breaking prompt caching would eat the savings.&lt;/p&gt;

&lt;p&gt;The measured results, from the project's own benchmark tables:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test&lt;/th&gt;
&lt;th&gt;Text baseline&lt;/th&gt;
&lt;th&gt;With imaged context&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Novel arithmetic, Claude Fable 5 (n=100)&lt;/td&gt;
&lt;td&gt;100/100&lt;/td&gt;
&lt;td&gt;100/100, with 38% fewer tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gist recall A/B (n=98)&lt;/td&gt;
&lt;td&gt;98/98&lt;/td&gt;
&lt;td&gt;98/98&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State tracking (n=18)&lt;/td&gt;
&lt;td&gt;18/18&lt;/td&gt;
&lt;td&gt;18/18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SWE-bench Lite (n=10)&lt;/td&gt;
&lt;td&gt;10/10&lt;/td&gt;
&lt;td&gt;10/10, requests 65% smaller&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12-character hex recall, Opus (n=15)&lt;/td&gt;
&lt;td&gt;15/15&lt;/td&gt;
&lt;td&gt;0/15&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Look at that last row again. We'll get back to it.&lt;/p&gt;

&lt;p&gt;On SWE-bench Pro, the harder agentic benchmark, the imaged arm resolved 14 of 19 tasks against 15 of 19 for plain text, with requests 60% smaller and 18 of 19 runs agreeing on the final verdict. That's the honest shape of the tradeoff on difficult work: a small accuracy tax on the hardest problems, bought at more than half the price.&lt;/p&gt;

&lt;p&gt;End to end, over a snapshot of 13,709 real requests, the bill dropped 59%, from $100 to about $41. Traces where compression applied heavily ran 70% to 74% cheaper.&lt;/p&gt;

&lt;p&gt;Two operational costs come with it. Encoding PNGs adds latency on large requests, noticeable when your pipeline is latency-sensitive rather than cost-sensitive. And the technique is battle-tested on ASCII and Latin-1 content; CJK text works but the project handles it conservatively, with less aggressive packing. If your context is mostly Chinese or Japanese, your compression ratio will be worse than the headline numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  When imaging your context adds, and when it makes it worse
&lt;/h2&gt;

&lt;p&gt;Every writeup of this technique that only quotes the savings is doing you a disservice. Be aware, the method is lossy, and it fails in a specific, nasty way.&lt;/p&gt;

&lt;p&gt;Exact recall of short strings breaks first. In pxpipe's test, Opus recalled 12-character hex strings from imaged content 0 times out of 15. The newer Fable 5 managed 13 of 15. And the failures aren't errors you can catch: the model confabulates a plausible value with full confidence instead of saying it can't read it. The project documents a real case of a name being confidently misremembered from imaged history.&lt;/p&gt;

&lt;p&gt;It's also model-dependent. The technique works because current frontier vision encoders (Claude Fable 5, GPT 5.6) read dense text almost perfectly. Opus 4.7 and 4.8 misread around 7% of the time, which is why pxpipe keeps them opt-in. A model without a strong text-reading encoder turns your compressed context into noise.&lt;/p&gt;

&lt;p&gt;So imaging adds when the content is bulk context for reasoning (code, docs, logs, old conversation turns). It subtracts when any byte matters exactly. Hashes, API keys, IDs, phone numbers and anything you'll need to quote back verbatim should stay as text, always.&lt;/p&gt;

&lt;p&gt;One more caveat, and it's the strategic one: the arbitrage moveswithout warning. When Anthropic shipped Opus 4.7, the maximum native image resolution jumped from 1,568 to 2,576 pixels on the long edge, and typical screenshots went from around 1,558 tokens to 4,739. The same image, three times the cost, in one release. The lesson isn't "use the trick". &lt;/p&gt;

&lt;p&gt;The lesson is: understand your provider's per-pixel economics and measure them, because they change without asking you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it in ten minutes
&lt;/h2&gt;

&lt;p&gt;If you run Claude Code, the experiment costs two commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx pxpipe-proxy
&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:47821 claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A dashboard at &lt;code&gt;127.0.0.1:47821&lt;/code&gt; shows every conversion and the tokens saved. The proxy only touches allowlisted models; everything else passes through byte-identical, and you can kill it entirely with &lt;code&gt;PXPIPE_MODELS=off&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For your own pipelines, the same machinery is available as a library:&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;renderTextToPngs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;transformAnthropicMessages&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pxpipe&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;imgs&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;renderTextToPngs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bigToolResultText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&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="nx"&gt;applied&lt;/span&gt; &lt;span class="p"&gt;}&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;transformAnthropicMessages&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;requestBytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-fable-5&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before trusting any number, measure your own baseline. Anthropic's &lt;code&gt;count_tokens&lt;/code&gt; endpoint is free, and comparing imaged versus plain requests on your real traffic takes an afternoon. My checklist for anyone adopting this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gate by density. Prose compresses poorly; code, JSON and logs compress well.&lt;/li&gt;
&lt;li&gt;Keep the live tail of the conversation as text, always.&lt;/li&gt;
&lt;li&gt;Keep anything byte-exact (hashes, keys, IDs, amounts) out of the imaged path.&lt;/li&gt;
&lt;li&gt;Re-measure after every model release. The Opus 4.7 repricing tripled image costs overnight.&lt;/li&gt;
&lt;li&gt;Log what was compressed. When a confabulation shows up, you'll want to know what the model was reading.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The part almost nobody connects: this is also how AIs read your website
&lt;/h2&gt;

&lt;p&gt;Everything above treats text-as-image as a cost trick you apply to your own requests. Now flip the direction. When ChatGPT, Claude, Perplexity or an AI browser agent fetches a page from your site in real time, what do they see?&lt;/p&gt;

&lt;p&gt;It turns out your site doesn't have one AI reader. It has three, and they disagree.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your website has three AI readers now: the crawler, Google, and the agent. None of them see the same page.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://carlosortet.com/ai-three-readers-web.png" rel="noopener noreferrer"&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%2F3m5zur6mny11vaeobjt9.png" alt="Illustration of a character examining three browser windows showing the same website as raw code, as a rendered page and as a pixel mosaic" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The same page, three readings: raw HTML for crawlers, a rendered page for Google, pixels for agents.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reader one: the crawlers.&lt;/strong&gt; Each AI company runs three families of bots against your site. A training crawler (GPTBot, ClaudeBot) collects content for future models. A search-index bot (OAI-SearchBot, Claude-SearchBot) feeds the assistant's search layer. And a user-triggered fetcher (ChatGPT-User, Perplexity-User) hits your page live, in the seconds between a user's question and the answer. That last one is the "real time" in real-time AI answers.&lt;/p&gt;

&lt;p&gt;As of mid 2026, none of them execute JavaScript. Not one, in any of the three families. Vercel's analysis of production traffic found GPTBot downloads JavaScript files about 11.5% of the time (ClaudeBot 23.8%) and never runs them. They fetch the raw HTML, extract what's there, and move on. No second pass, no rendering queue. If your content only exists in the DOM after client-side rendering, it doesn't exist for these systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reader two: Google, the exception.&lt;/strong&gt; Gemini and AI Overviews inherit Googlebot's infrastructure, and Googlebot renders JavaScript. Google's Martin Splitt has confirmed it. The practical consequence is strange and very real: the same page can be fully visible to Google's AI surfaces and invisible to ChatGPT, Claude and Perplexity at the same time. If your brand shows up in AI Overviews but never in ChatGPT answers, check how much of your content depends on JavaScript before blaming the model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reader three: the agents.&lt;/strong&gt; Agentic browsers like OpenAI's Atlas (powered by their Computer-Using Agent) and Perplexity's Comet read the fully rendered page, through a mix of accessibility-tree snapshots, DOM parsing and screenshots sent to a vision model. This is where the first half of this article loops back: agents are reading web pages through the same vision channel, with the same economics and the same degradation curve. DeepSeek's numbers apply here too. A clean, well-structured page reads at 97%. A dense, cluttered one slides toward the 60% end, and the agent fills the gaps with confident guesses.&lt;/p&gt;

&lt;p&gt;There's a fourth pattern worth knowing about on the retrieval side. &lt;a href="https://arxiv.org/abs/2407.01449" rel="noopener noreferrer"&gt;ColPali&lt;/a&gt; (ICLR 2025) showed that for document search, skipping OCR entirely and embedding page images directly beats the classic extract-and-chunk pipeline: 0.81 versus 0.66 NDCG@5, while indexing pages in 0.39 seconds instead of 7.22. The layout, tables and figures that text extraction destroys turn out to carry retrievable meaning. Visual structure is information.&lt;/p&gt;

&lt;h3&gt;
  
  
  What this means if you publish content
&lt;/h3&gt;

&lt;p&gt;If you own a website that you'd like AI systems to read correctly, the three-reader split translates into checkable work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Serve the substance in raw HTML.&lt;/strong&gt; Server-side render or prerender anything you want crawlers and live fetchers to see: prices, specs, FAQs, comparisons. The test takes one command: &lt;code&gt;curl&lt;/code&gt; your page and search the response for your key facts. If they're not in that output, two of your three readers can't see them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't let AI Overviews lull you.&lt;/strong&gt; Google renders your JavaScript, so decent AIO visibility proves nothing about ChatGPT, Claude or Perplexity. Audit them separately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat your accessibility tree as an API.&lt;/strong&gt; Agents from OpenAI and Perplexity prioritize ARIA roles and labels before falling back to vision. Semantic HTML and honest labels are no longer just an accessibility checkbox; they're how machines operate your interface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design for the 97% end of the curve.&lt;/strong&gt; Dense, cluttered, low-contrast pages push a vision-reading agent toward the degradation zone where it starts guessing. Clear hierarchy and legible text sizes now serve two audiences.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep critical facts unambiguous.&lt;/strong&gt; An agent misreading a price from a screenshot fails exactly like the hex test: silently and confidently.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What we're building on top of this
&lt;/h2&gt;

&lt;p&gt;pxpipe proved the mechanism on one developer's traffic. The question that interests us at &lt;a href="https://498as.com" rel="noopener noreferrer"&gt;498A&lt;/a&gt; is what it does at audit scale, and it's turning into two work lines.&lt;/p&gt;

&lt;p&gt;The first is about simulation economics. A &lt;a href="https://georadar.app" rel="noopener noreferrer"&gt;GEORadar&lt;/a&gt; brand study runs between 3,000 and 30,000 personalized prompts against five LLMs plus Google's AI Overviews. Every one of those calls carries a slab of static context: persona definitions, market instructions, product catalogs, scoring rubrics. It repeats thousands of times per study, it's token-dense, and none of it needs byte-exact recall. That's exactly the profile the compression math favors. So we're testing optical compression of that static slab on our own simulation engine. The public ratios say dense content compresses about 3x; what we're measuring is what that buys back on a full study: more prompts per budget, more engines per prompt, or the same audit at a fraction of the cost. Until our numbers are in, it stays labeled what it is, an experiment.&lt;/p&gt;

&lt;p&gt;The second line points the other way. Our audits interrogate models about brands through the text channel, and the technical side already checks what crawlers can fetch. Nobody is auditing the third reader yet. We're prototyping exactly that: feeding brand pages to vision models the way agentic browsers see them, screenshot plus accessibility tree, and scoring what survives the trip. Which facts does a vision reader actually extract? At what layout density does the page slide toward the confabulation zone DeepSeek measured? For &lt;a href="https://sam.georadar.app" rel="noopener noreferrer"&gt;S.A.M.&lt;/a&gt;, our semantic alignment tool, this extends validation to a second channel: a claim now has to survive as text for the crawler and as pixels for the agent. Semantic alignment used to be a property of your copy. It's becoming a property of your layout too.&lt;/p&gt;

&lt;p&gt;I wrote about the text side of that machinery in &lt;a href="https://carlosortet.com/blog/how-llms-search-retrieve-answer-real-time-web-data" rel="noopener noreferrer"&gt;how LLMs search, retrieve and answer with real-time web data&lt;/a&gt;. The vision side is newer, and most sites haven't been checked against it even once. That gap is the opportunity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Text that fades like memory
&lt;/h2&gt;

&lt;p&gt;Back to DeepSeek's closing idea, because it reframes everything. If text rendered as an image is cheap and readable, then old context doesn't have to be summarized or deleted. It can be stored as pictures that lose resolution over time. Yesterday's conversation at high DPI. Last month's at half. Last year's as a blurry thumbnail that still preserves the gist.&lt;/p&gt;

&lt;p&gt;That's not a billing hack anymore. That's an architecture for artificial memory that behaves like the biological kind, built out of the same mechanism that turns $42.21 into $4.51. And for anyone running simulations at audit scale, it's also the difference between sampling a market and saturating it.&lt;/p&gt;

&lt;p&gt;The pipeline between language models and text keeps getting stranger. We spent years teaching machines to read. Now the cheapest way to hand text to a machine built on language is, more and more often, to show it a picture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical sources consulted
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;teamchong: &lt;a href="https://github.com/teamchong/pxpipe" rel="noopener noreferrer"&gt;pxpipe&lt;/a&gt;, local proxy rendering request context as PNGs, benchmark tables and production cost traces (MIT).&lt;/li&gt;
&lt;li&gt;Wei et al., DeepSeek-AI: &lt;a href="https://arxiv.org/abs/2510.18234" rel="noopener noreferrer"&gt;DeepSeek-OCR: Contexts Optical Compression&lt;/a&gt;, compression-precision curves, DeepEncoder architecture and the optical memory proposal (CC BY 4.0).&lt;/li&gt;
&lt;li&gt;Li et al.: &lt;a href="https://arxiv.org/abs/2510.18279" rel="noopener noreferrer"&gt;Text or Pixels? It Takes Half&lt;/a&gt;, token efficiency of visual text inputs in multimodal LLMs (CC BY 4.0).&lt;/li&gt;
&lt;li&gt;Faysse et al.: &lt;a href="https://arxiv.org/abs/2407.01449" rel="noopener noreferrer"&gt;ColPali: Efficient Document Retrieval with Vision Language Models&lt;/a&gt;, ICLR 2025, visual document retrieval and the ViDoRe benchmark.&lt;/li&gt;
&lt;li&gt;Anthropic: &lt;a href="https://platform.claude.com/docs/en/build-with-claude/vision" rel="noopener noreferrer"&gt;Vision documentation&lt;/a&gt;, 28x28 pixel patches, per-tier resolution caps and token cost tables.&lt;/li&gt;
&lt;li&gt;Google AI for Developers: &lt;a href="https://ai.google.dev/gemini-api/docs/tokens" rel="noopener noreferrer"&gt;Understand and count tokens&lt;/a&gt;, Gemini image tokenization by 768x768 tiles.&lt;/li&gt;
&lt;li&gt;OpenAI: &lt;a href="https://platform.openai.com/docs/guides/vision" rel="noopener noreferrer"&gt;Vision guide&lt;/a&gt;, base plus per-tile image token pricing.&lt;/li&gt;
&lt;li&gt;Vercel: &lt;a href="https://vercel.com/blog/the-rise-of-the-ai-crawler" rel="noopener noreferrer"&gt;The rise of the AI crawler&lt;/a&gt;, production measurements of GPTBot, ClaudeBot and PerplexityBot JavaScript behavior.&lt;/li&gt;
&lt;li&gt;Stan Ventures: &lt;a href="https://www.stanventures.com/news/gemini-ai-renders-javascript-2586/" rel="noopener noreferrer"&gt;Gemini AI renders JavaScript like Googlebot&lt;/a&gt;, Martin Splitt's confirmation of Gemini's rendering infrastructure.&lt;/li&gt;
&lt;li&gt;Sean Goedecke: &lt;a href="https://www.seangoedecke.com/text-tokens-as-image-tokens/" rel="noopener noreferrer"&gt;Should LLMs just treat text content as an image?&lt;/a&gt;, discrete versus continuous token expressiveness.&lt;/li&gt;
&lt;li&gt;Sinaptik AI: &lt;a href="https://github.com/sinaptik-ai/pixelprompt" rel="noopener noreferrer"&gt;PixelPrompt&lt;/a&gt;, alternative open source implementation of text-to-image context compression.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>performance</category>
    </item>
    <item>
      <title>I keep wondering: if AI already writes 22-46% of new code, what is MAI-Code-1 really training on?</title>
      <dc:creator>carlosortet</dc:creator>
      <pubDate>Sun, 07 Jun 2026 09:27:46 +0000</pubDate>
      <link>https://dev.to/carlosortet/i-keep-wondering-if-ai-already-writes-22-46-of-new-code-what-is-mai-code-1-really-training-on-2m1k</link>
      <guid>https://dev.to/carlosortet/i-keep-wondering-if-ai-already-writes-22-46-of-new-code-what-is-mai-code-1-really-training-on-2m1k</guid>
      <description>&lt;p&gt;A budgeting note that bites everyone the first time: with any reasoning model you pay for the 'thinking tokens' even though they never show up in the response (they can run up to ~6x the cost of input tokens), and you eat 40 to 90 seconds of latency on tasks a classic LLM answers instantly. &lt;/p&gt;

&lt;p&gt;Reserve reasoning for deliberate work (architecture reviews, migrations, incident post-mortems). Use a fast model for autocomplete. More thinking is not always better.&lt;/p&gt;

&lt;p&gt;For price context while you wait for MAI numbers: OpenAI o3 sits at $10/$40 per 1M in/out tokens, Gemini 2.5 Pro at $1.25/$10 with a 200K thinking budget.&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.amazonaws.com%2Fuploads%2Farticles%2Fwsuuphz6t4fam9kel0zc.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.amazonaws.com%2Fuploads%2Farticles%2Fwsuuphz6t4fam9kel0zc.png" alt=" " width="768" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reasoning model vs classic LLM, the 30-second version
&lt;/h2&gt;

&lt;p&gt;If you've shipped with both you can skip this. If not: a classic LLM answers on instinct, predicting the next token in one shot. Fast, cheap, and it stumbles on multi-step problems. A reasoning model thinks first: it generates an internal chain (the thinking tokens), tries paths, checks itself, then answers. It learns this through reinforcement learning, rewarded when the chain lands on the right answer.&lt;/p&gt;

&lt;p&gt;You know that friend who answers before you finish the question? Sometimes right, often not. Kahneman's "Thinking, Fast and Slow" nailed it years ago: System 1 is fast, System 2 is deliberate. An RLM is System 2, billed by the token.&lt;/p&gt;

&lt;h2&gt;
  
  
  Copilot was never a model
&lt;/h2&gt;

&lt;p&gt;This is the part most people get wrong, and it changes how you evaluate this launch. &lt;strong&gt;Copilot is a layer, not a model.&lt;/strong&gt; Different engines run underneath, selectable from a picker, same as Perplexity. Until now that engine was OpenAI's GPT.&lt;/p&gt;

&lt;p&gt;We learned this the hard way doing brand-visibility audits for clients. Auditing "Copilot" was really auditing ChatGPT, because that was the model under the hood. Same engine, different shell. With MAI, Copilot gets reasoning and a voice of its own, so that equivalence breaks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest part, from the lab
&lt;/h2&gt;

&lt;p&gt;I'll be straight, because that's the only part of these posts worth reading.&lt;/p&gt;

&lt;p&gt;Copilot "out of the box" frustrated us for two years. The Office integrations underdelivered. You'd open Copilot in Excel and it would tell you it couldn't touch the data, while a Claude with a Playwright plugin handled the whole thing without breaking a sweat. At some point our internal read was blunt: we'd be better off dropping Office entirely and letting the models generate the deck in HTML.&lt;/p&gt;

&lt;p&gt;What we actually want is a system where the AI orchestrates the workflow and the human brings experience and judgment. We still don't have a clean market solution for that, the kind that does collaborative project knowledge plus full AI integration. So, like a lot of teams, we run a funky homemade stack: Obsidian + SharePoint + GitHub wired to Codex, agents and Claude Code. It works. It is not a long-term answer, honestly.&lt;/p&gt;

&lt;p&gt;So a model trained on GitHub data and built for GitHub lands right on a pain we know. But it also raises a question I genuinely can't answer, and I'd love your take in the comments.&lt;/p&gt;

&lt;p&gt;Here's the uncomfortable math. By 2025 GitHub said Copilot was generating up to &lt;strong&gt;46% of code&lt;/strong&gt; in files where it's enabled (&lt;strong&gt;61% for Java&lt;/strong&gt;), at an acceptance rate around &lt;strong&gt;27-30%&lt;/strong&gt;. DX's Q4 2025 report put &lt;strong&gt;~22% of merged code&lt;/strong&gt; as AI-authored. Google has said &lt;strong&gt;~25-30%&lt;/strong&gt; of its new code is AI-assisted. Nobody measures the total cleanly (there's no reliable detector for AI-written code after the fact), but the flow of new code already sits somewhere in the &lt;strong&gt;20-46%&lt;/strong&gt; range, and climbing.&lt;/p&gt;

&lt;p&gt;So when Microsoft says MAI-Code-1 is "trained on GitHub code", a meaningful slice of that code was almost certainly written by Copilot, Codex or Claude in the first place. Which sharpens the question: is "trained on GitHub" really that different from "trained on model outputs"? That's model collapse in practice. A CMU study and an analysis of &lt;strong&gt;800+ popular GitHub projects&lt;/strong&gt; already flag code quality degrading after AI adoption. If new models learn from increasingly AI-written code, they risk amplifying their own mistakes.&lt;/p&gt;

&lt;p&gt;I don't have the number for MAI-Code-1 specifically (Microsoft hasn't disclosed the AI-generated share of its training set). But "clean, licensed data" and "free of AI contamination" are not the same claim. What's your read?&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters beyond the benchmark
&lt;/h2&gt;

&lt;p&gt;The strategy is the actual story. Microsoft put 13 billion dollars into OpenAI and up to 5 billion into Anthropic, and it sells both on Azure. On April 27, 2026 the OpenAI exclusivity fell (the trigger was OpenAI's up-to-50-billion deal with Amazon). So Microsoft is now investor, distributor, infra provider and direct competitor, all at once, and it would rather own the engine than rent it.&lt;/p&gt;

&lt;p&gt;For us, the practical reads:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Adoption won't be decided by leaderboards.&lt;/strong&gt; It'll be decided by identity, logging, data boundaries, retention, SLAs, predictable cost and IP indemnity. Microsoft is very good at selling that management plane.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean IP lineage is a real feature&lt;/strong&gt;, not marketing. "No distillation" is a procurement checkbox for regulated teams (the DeepSeek "trained on whose outputs?" mess in 2025 made that concrete).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lock-in gets subtler.&lt;/strong&gt; A model tuned on your flows, wired to your identity, billed through Azure is powerful precisely because it's hard to move. Test it, meter it, demand portability.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The skeptic's asterisk
&lt;/h2&gt;

&lt;p&gt;Stay level-headed. The benchmarks are Microsoft's own and no external lab has reproduced them. The comparison is selective (beats Sonnet 4.6 broadly, ties Opus 4.6 only on one code metric). Public figures wobble, including that 256K vs 128K context. New, real, in-house models? Yes. A capability revolution? Probably not. Neither do I care too much. The value is independence, cost and control.&lt;/p&gt;

&lt;p&gt;That, and one quieter outcome: Microsoft's AI future starts to look a lot less borrowed and far more promising. I know, we are always afraid of Microsoft having too much control over our workflow, but if we are not concerned about Google taking control of the web or TikTok taking control of our kids' minds, is this so worrying? After we accepted Microsoft taking ownership of GitHub, we knew sth like this was coming. &lt;/p&gt;




&lt;p&gt;&lt;em&gt;Written by Carlos Ortet for 498A, the AI R&amp;amp;D division behind Zoopa. Originally published, with glossary and FAQ, on the &lt;a href="https://zoopa.es/en/geo-ai-visibility/microsoft-mai-in-house-models-reasoning-mai-thinking-1/" rel="noopener noreferrer"&gt;Zoopa blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sources: &lt;a href="https://microsoft.ai/news/introducing-mai-thinking-1/" rel="noopener noreferrer"&gt;Introducing MAI-Thinking-1 (Microsoft AI)&lt;/a&gt; · &lt;a href="https://microsoft.ai/news/introducingmai-code-1-flash/" rel="noopener noreferrer"&gt;Introducing MAI-Code-1-Flash (Microsoft AI)&lt;/a&gt; · &lt;a href="https://github.blog/changelog/2026-06-02-mai-code-1-flash-is-now-available-for-github-copilot/" rel="noopener noreferrer"&gt;MAI-Code-1-Flash on the GitHub Changelog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;On AI-written code share: &lt;a href="https://www.getpanto.ai/blog/github-copilot-statistics" rel="noopener noreferrer"&gt;GitHub Copilot statistics&lt;/a&gt; · &lt;a href="https://medium.com/@reliabledataengineering/ai-is-writing-46-of-all-code-github-copilots-real-impact-on-15-million-developers-787d789fcfdc" rel="noopener noreferrer"&gt;"AI is writing 46% of all code"&lt;/a&gt; · &lt;a href="https://www.itpro.com/technology/artificial-intelligence/what-is-model-collapse-and-why-is-it-a-risk-for-enterprise-ai" rel="noopener noreferrer"&gt;Model collapse explained (IT Pro)&lt;/a&gt; · &lt;a href="https://blog.robbowley.net/2025/12/04/ai-is-still-making-code-worse-a-new-cmu-study-confirms/" rel="noopener noreferrer"&gt;CMU: AI is still making code worse&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="http://www.carlosortet.com" rel="noopener noreferrer"&gt;www.carlosortet.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>microsoft</category>
      <category>programming</category>
    </item>
    <item>
      <title>From expensive tokens to intelligent compression: how we optimize LLM costs in production</title>
      <dc:creator>carlosortet</dc:creator>
      <pubDate>Thu, 26 Mar 2026 09:24:16 +0000</pubDate>
      <link>https://dev.to/carlosortet/from-expensive-tokens-to-intelligent-compression-how-we-optimize-llm-costs-in-production-18ig</link>
      <guid>https://dev.to/carlosortet/from-expensive-tokens-to-intelligent-compression-how-we-optimize-llm-costs-in-production-18ig</guid>
      <description>&lt;p&gt;We spend absurd amounts on AI tokens. And that number is only going up.&lt;/p&gt;

&lt;p&gt;At 498Advance we run multiple LLMs in production — Claude for development, Gemini for multimodal, DeepSeek and OpenAI models locally for routine tasks. Every model does something well and fails at something else. That is why they coexist.&lt;/p&gt;

&lt;p&gt;But this creates a problem: &lt;strong&gt;dependency and cost&lt;/strong&gt;. What happens when a provider goes down? What happens when pricing changes overnight?&lt;/p&gt;

&lt;p&gt;Here is how we deal with it, and why a new Google Research paper caught our attention this week.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 1: Fallback policies
&lt;/h2&gt;

&lt;p&gt;If a model fails, the system automatically redirects to the next available model. No human intervention, no perceptible downtime.&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="c1"&gt;# Simplified fallback logic
&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemini-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-local&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;inference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task_type&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;get_ranked_models&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task_type&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;try&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;call_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;ModelUnavailable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; unavailable, falling back&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;AllModelsUnavailable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple but effective. The key is having your models ranked per task type, not globally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 2: Router shadow
&lt;/h2&gt;

&lt;p&gt;Not every task needs a frontier model. A two-line summary does not need Claude Opus. A 50-page legal analysis does.&lt;/p&gt;

&lt;p&gt;Router shadow evaluates each incoming task and routes it to the optimal model based on complexity and cost. We categorize tasks into tiers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Task type&lt;/th&gt;
&lt;th&gt;Model class&lt;/th&gt;
&lt;th&gt;Cost&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;Simple extraction, formatting&lt;/td&gt;
&lt;td&gt;Local (DeepSeek 7B)&lt;/td&gt;
&lt;td&gt;~$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Summarization, translation&lt;/td&gt;
&lt;td&gt;Mid-tier API (Haiku, Flash)&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Complex analysis, code generation&lt;/td&gt;
&lt;td&gt;Frontier (Opus, GPT-4o)&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The result: cost optimization per project without sacrificing quality where it matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 3: Local models
&lt;/h2&gt;

&lt;p&gt;At 498Advance we have been running &lt;strong&gt;DeepSeek&lt;/strong&gt; and &lt;strong&gt;OpenAI&lt;/strong&gt; models locally for three months. They handle a significant portion of production tasks.&lt;/p&gt;

&lt;p&gt;The benefits go beyond cost:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: data never leaves your infrastructure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance&lt;/strong&gt;: concrete guarantees about where data is processed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latency&lt;/strong&gt;: no network round-trip for simple tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Availability&lt;/strong&gt;: no dependency on external uptime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trade-off: local models are not frontier models. You lose capability on complex tasks. The strategy is selective migration — identify what can run locally, move it, keep frontier for what needs it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The compression landscape
&lt;/h2&gt;

&lt;p&gt;At some point, better hardware is not enough. You need &lt;strong&gt;efficiency&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;LLMs keep growing — tens or hundreds of billions of parameters. The compression techniques that make them deployable:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quantization&lt;/strong&gt; reduces weight precision. A quantized Llama 70B fits on 1 NVIDIA A100. Unquantized, it needs 4.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pruning&lt;/strong&gt; removes low-relevance weights. 2:4 Sparse Llama achieved 98.4% accuracy recovery on the Open LLM Leaderboard V1, with +30% throughput and -20% latency from sparsity alone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Knowledge distillation&lt;/strong&gt; trains a small student model to replicate a large teacher's behavior.&lt;/p&gt;

&lt;p&gt;These are not mutually exclusive. Sparsity + quantization yields improvements greater than either alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-world examples
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt; built domain-adapted EON models on open source LLMs with proprietary data, reducing prompt size by 30%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Roblox&lt;/strong&gt; scaled from &amp;lt;50 to ~250 concurrent ML inference pipelines using Ray and vLLM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Red Hat&lt;/strong&gt; maintains pre-optimized models on Hugging Face (Llama, Qwen, DeepSeek, Granite) — quantized and ready for inference with vLLM.&lt;/p&gt;

&lt;h2&gt;
  
  
  TurboQuant: the paper that caught our attention
&lt;/h2&gt;

&lt;p&gt;On March 24, 2026, Google Research published &lt;strong&gt;TurboQuant&lt;/strong&gt; (ICLR 2026). Authors: Amir Zandieh and Vahab Mirrokni.&lt;/p&gt;

&lt;p&gt;The headline numbers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;6x minimum&lt;/strong&gt; KV cache memory reduction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;8x speedup&lt;/strong&gt; with 4-bit quantization on H100 GPUs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3-bit&lt;/strong&gt; KV cache quantization with &lt;strong&gt;zero accuracy loss&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;No fine-tuning or retraining required&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why it matters technically
&lt;/h3&gt;

&lt;p&gt;Traditional quantization has a memory overhead problem. Most methods need to store quantization constants for each data block, adding 1-2 extra bits per number. TurboQuant eliminates this.&lt;/p&gt;

&lt;p&gt;It combines two algorithms:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PolarQuant&lt;/strong&gt; converts vectors from Cartesian to polar coordinates. Instead of normalizing data on a shifting square grid, it maps to a fixed circular grid where boundaries are known. This eliminates the normalization overhead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;QJL (Quantized Johnson-Lindenstrauss)&lt;/strong&gt; compresses the residual error from PolarQuant to a single sign bit (+1 or -1) using the JL Transform. Zero memory overhead.&lt;/p&gt;

&lt;p&gt;The pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;PolarQuant compresses with most of the bits&lt;/li&gt;
&lt;li&gt;QJL uses 1 bit to correct residual bias&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Benchmark results
&lt;/h3&gt;

&lt;p&gt;Tested on LongBench, Needle In A Haystack, ZeroSCROLLS, RULER, and L-Eval with Gemma and Mistral:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TurboQuant (KV: 3.5 bits)&lt;/strong&gt; scores 50.06 on LongBench — identical to Full Cache (KV: 16 bits)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KIVI&lt;/strong&gt; needs 5 bits for 50.16, drops to 48.50 at 3 bits&lt;/li&gt;
&lt;li&gt;Perfect needle-in-haystack results with 6x memory reduction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For vector search, TurboQuant outperforms PQ and RabbiQ in recall ratio even when those baselines use large codebooks and dataset-specific tuning.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means in practice
&lt;/h2&gt;

&lt;p&gt;TurboQuant is a research paper, not a product. But the direction is clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Same hardware, bigger models&lt;/strong&gt;: 6x KV cache compression means the GPU running an 8B model could handle something significantly larger&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lower inference costs&lt;/strong&gt;: 8x attention speedup = fewer GPUs for the same workload&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge deployment&lt;/strong&gt;: compression is what separates "interesting demo" from "deployable product"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simpler compliance&lt;/strong&gt;: smaller models running locally = less data traveling externally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The race is not for bigger models. It is for models that are smarter about how they use their resources.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;TurboQuant paper (ICLR 2026) — Google Research&lt;/li&gt;
&lt;li&gt;PolarQuant (AISTATS 2026)&lt;/li&gt;
&lt;li&gt;Red Hat optimized models repository on Hugging Face&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zoopa.es/en/digital-marketing-en/llm-optimization-compression-tokens-turboquant/" rel="noopener noreferrer"&gt;Full analysis with data visualizations on our blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;What compression or optimization techniques are you using in production? Have you tried running models locally? Would love to hear about your setup.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Carlos Ortet | 498Advance&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>deeplearning</category>
    </item>
    <item>
      <title>OpenAI's Agentic Commerce Protocol: a technical look at how ChatGPT becomes a shopping agent</title>
      <dc:creator>carlosortet</dc:creator>
      <pubDate>Wed, 25 Mar 2026 08:51:38 +0000</pubDate>
      <link>https://dev.to/carlosortet/openais-agentic-commerce-protocol-a-technical-look-at-how-chatgpt-becomes-a-shopping-agent-20fd</link>
      <guid>https://dev.to/carlosortet/openais-agentic-commerce-protocol-a-technical-look-at-how-chatgpt-becomes-a-shopping-agent-20fd</guid>
      <description>&lt;p&gt;Last week, OpenAI launched a redesigned shopping experience in ChatGPT. 900 million weekly users can now browse products visually, compare options side-by-side, and get real-time pricing — all inside the conversation.&lt;/p&gt;

&lt;p&gt;The protocol powering it is called &lt;strong&gt;ACP (Agentic Commerce Protocol)&lt;/strong&gt;, an open standard co-developed by OpenAI and Stripe under Apache 2.0. And the technical implementation is worth a closer look.&lt;/p&gt;

&lt;h2&gt;
  
  
  What ACP actually is
&lt;/h2&gt;

&lt;p&gt;ACP defines a common language for AI agents and merchants to coordinate transactions. Think of it as an API contract between ChatGPT (the buyer's agent) and a merchant's product catalog.&lt;/p&gt;

&lt;p&gt;Key architectural principle: &lt;strong&gt;OpenAI is not the merchant of record.&lt;/strong&gt; Merchants retain full control over products, pricing, payments and fulfillment. ChatGPT is just the conversational intermediary.&lt;/p&gt;

&lt;p&gt;The protocol lives on GitHub with 1,300+ stars and 192 forks:&lt;br&gt;
&lt;a href="https://github.com/agentic-commerce-protocol/agentic-commerce-protocol" rel="noopener noreferrer"&gt;github.com/agentic-commerce-protocol/agentic-commerce-protocol&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The pivot nobody expected
&lt;/h2&gt;

&lt;p&gt;OpenAI originally launched ACP in September 2025 with "Instant Checkout" — buy directly inside the chat. Etsy was the first integration.&lt;/p&gt;

&lt;p&gt;It didn't work. Out of Shopify's millions of merchants, only about 12 activated checkout. Users browsed and compared, but went to the retailer's site to pay.&lt;/p&gt;

&lt;p&gt;OpenAI acknowledged it in March 2026: &lt;em&gt;"the initial version of Instant Checkout did not offer the level of flexibility that we aspire to provide."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The new focus is &lt;strong&gt;product discovery&lt;/strong&gt;: visual browsing, image-based search, comparison tables, budget filtering — then redirect to the merchant's site for checkout.&lt;/p&gt;
&lt;h2&gt;
  
  
  Technical integration: how it works
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Feed specification
&lt;/h3&gt;

&lt;p&gt;Merchants push product data to an OpenAI endpoint via encrypted HTTPS. The feed spec:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Formats&lt;/td&gt;
&lt;td&gt;CSV, TSV (recommended), XML, JSON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encoding&lt;/td&gt;
&lt;td&gt;UTF-8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max size&lt;/td&gt;
&lt;td&gt;10 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compression&lt;/td&gt;
&lt;td&gt;gzip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update frequency&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Every 15 minutes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Required fields per product:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;id&lt;/code&gt; — unique identifier&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;title&lt;/code&gt; — max 150 chars&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;description&lt;/code&gt; — max 5,000 chars&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;price&lt;/code&gt; — with ISO 4217 currency code&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;availability&lt;/code&gt; — in stock / out of stock / preorder&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;image_url&lt;/code&gt; — at least one high-res image&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recommended: GTIN/UPC/MPN, reviews, rich media, shipping options, performance signals.&lt;/p&gt;
&lt;h3&gt;
  
  
  Three APIs
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Feeds API      → Upload/manage full product catalogs
Products API   → Individual product upserts
Promotions API → Manage promotions (API-only)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;For existing Stripe merchants, integration can take as little as one line of code.&lt;/p&gt;
&lt;h3&gt;
  
  
  Delegated payments
&lt;/h3&gt;

&lt;p&gt;The payment flow uses single-use, time-bound, amount-restricted tokens. OpenAI prepares a delegated payment request; the payment service provider (Stripe, PayPal, Checkout.com) handles tokenization. PCI compliant by design.&lt;/p&gt;
&lt;h3&gt;
  
  
  Versioning
&lt;/h3&gt;

&lt;p&gt;ACP uses date-based versioning (YYYY-MM-DD). The latest stable spec is &lt;code&gt;2026-01-30&lt;/code&gt;, which added extensions, discounts, and payment handlers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spec/2025-09-29/  → Initial release
spec/2025-12-12/  → Fulfillment enhancements
spec/2026-01-16/  → Capability negotiation
spec/2026-01-30/  → Extensions, discounts, payment handlers (latest)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ACP vs. Google UCP vs. Amazon
&lt;/h2&gt;

&lt;p&gt;Three ecosystems are forming:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ACP (OpenAI + Stripe):&lt;/strong&gt; Open standard, Apache 2.0. Feeds update every 15 minutes. 900M weekly users. Focused on conversational product discovery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UCP (Google):&lt;/strong&gt; Open standard, launched January 2026. Backed by Shopify, Walmart, Visa, Mastercard. 50 billion indexed products. Covers the full purchase journey.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Amazon (Rufus/Alexa+):&lt;/strong&gt; Closed ecosystem. 300M Rufus users, 60% higher conversion than standard Amazon flow. Blocks OpenAI crawlers. Removed 600M products from ChatGPT results.&lt;/p&gt;

&lt;p&gt;The key difference between ACP and Google Shopping feeds: ACP feeds are designed for AI reasoning, not indexing. Every field can become an argument the agent uses to explain &lt;em&gt;why&lt;/em&gt; a product is relevant — not just that it exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  The data that matters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Agentic traffic converts at &lt;strong&gt;15-30%&lt;/strong&gt; (Q1 2026 data) — 5-10x over traditional e-commerce&lt;/li&gt;
&lt;li&gt;AI-generated recommendations convert &lt;strong&gt;4.4x&lt;/strong&gt; better than traditional search (McKinsey)&lt;/li&gt;
&lt;li&gt;ChatGPT drives &lt;strong&gt;20%+ of referral traffic to Walmart&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;But: less than &lt;strong&gt;0.2% of total e-commerce sessions&lt;/strong&gt; come from ChatGPT&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The volume is small. The conversion is extraordinary. The year-over-year growth is +805% (Adobe, Black Friday 2025).&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means if you build e-commerce
&lt;/h2&gt;

&lt;p&gt;If you're building or maintaining e-commerce systems, ACP changes the optimization target.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Feed quality &amp;gt; ad spend
&lt;/h3&gt;

&lt;p&gt;Products surface based on what the AI can parse and verify. Incomplete feeds = invisible products. Every missing attribute is a lost recommendation opportunity. A product without a GTIN, without proper category depth (up to 5 levels), or with a generic "Great product, buy now!" description will never be recommended when a user asks for something specific.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Descriptions for NLP, not SEO
&lt;/h3&gt;

&lt;p&gt;Attribute-rich descriptions that an AI can reason about beat keyword-stuffed copy. When someone asks "waterproof running shoes for flat feet under $120," the AI needs to find "waterproof," "arch support for flat feet," and the price in your product data. If those attributes are buried in marketing copy instead of structured fields, you lose.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Schema markup matters more than ever
&lt;/h3&gt;

&lt;p&gt;Product, Offer, AggregateRating with real data. The AI cross-references your structured data against user queries. Complete schema is no longer optional — it's the foundation of agentic visibility.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Multi-protocol support
&lt;/h3&gt;

&lt;p&gt;Prepare to maintain feeds for both ACP (OpenAI) and UCP (Google). Shopify already offers dual support. The formats are similar enough that a single product data pipeline can serve both, but the update frequencies differ (15 minutes for ACP vs. 24 hours default for UCP).&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Attribution is fundamentally broken
&lt;/h3&gt;

&lt;p&gt;The customer behavior that drives the sale is invisible to existing analytics. A user asks ChatGPT for a recommendation, gets three product suggestions, visits one site, and buys. Your analytics sees a direct visit or an unknown referrer. No impression. No click. No session.&lt;/p&gt;

&lt;p&gt;Server-side webhook tracking from ACP/UCP is the path forward. Start building this infrastructure now — you'll need 18-24 months of data before it becomes reliable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Merchant portal: &lt;a href="https://chatgpt.com/merchants" rel="noopener noreferrer"&gt;chatgpt.com/merchants&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Developer docs: &lt;a href="https://developers.openai.com/commerce" rel="noopener noreferrer"&gt;developers.openai.com/commerce&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Feed spec: &lt;a href="https://developers.openai.com/commerce/specs/feed" rel="noopener noreferrer"&gt;developers.openai.com/commerce/specs/feed&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/agentic-commerce-protocol/agentic-commerce-protocol" rel="noopener noreferrer"&gt;github.com/agentic-commerce-protocol&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Stripe integration: &lt;a href="https://docs.stripe.com/agentic-commerce" rel="noopener noreferrer"&gt;docs.stripe.com/agentic-commerce&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Currently US-only for merchant onboarding. Product discovery is available globally for all ChatGPT users (Free, Go, Plus, Pro).&lt;/p&gt;




&lt;p&gt;We wrote a detailed analysis with market data, competitive comparisons, and practical recommendations:&lt;br&gt;
&lt;a href="https://zoopa.es/en/digital-marketing-en/agentic-commerce-protocol-acp-chatgpt-shopping/" rel="noopener noreferrer"&gt;zoopa.es/en/digital-marketing-en/agentic-commerce-protocol-acp-chatgpt-shopping/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What's your take on agentic commerce? Are you already preparing your product feeds for AI agents, or waiting to see how ACP vs. UCP plays out?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>ecommerce</category>
      <category>openai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>robots.txt is a sign, not a fence: 8 technical vectors through which AI still reads your website</title>
      <dc:creator>carlosortet</dc:creator>
      <pubDate>Mon, 23 Mar 2026 07:54:14 +0000</pubDate>
      <link>https://dev.to/carlosortet/robotstxt-is-a-sign-not-a-fence-8-technical-vectors-through-which-ai-still-reads-your-website-37c6</link>
      <guid>https://dev.to/carlosortet/robotstxt-is-a-sign-not-a-fence-8-technical-vectors-through-which-ai-still-reads-your-website-37c6</guid>
      <description>&lt;p&gt;You configure &lt;code&gt;robots.txt&lt;/code&gt; like this:&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;GPTBot&lt;/span&gt;
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /

&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;CCBot&lt;/span&gt;
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /

&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;anthropic&lt;/span&gt;-&lt;span class="n"&gt;ai&lt;/span&gt;
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /

&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;PerplexityBot&lt;/span&gt;
&lt;span class="n"&gt;Disallow&lt;/span&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You enable Cloudflare Bot Management. You set up Akamai. Maybe even a server-side paywall.&lt;/p&gt;

&lt;p&gt;And then you query ChatGPT about your product and it cites your website as a source.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I work on GEO (Generative Engine Optimization) projects where we audit how LLMs represent brands. We routinely analyze thousands of prompt-response pairs. Across multiple projects, we consistently find that &lt;strong&gt;10–20% of LLM responses&lt;/strong&gt; cite the brand's own website as a source — even when every known bot is blocked.&lt;/p&gt;

&lt;p&gt;Here are the 8 technical vectors we documented, with academic sources and industry data.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Historical crawl data (Common Crawl)
&lt;/h2&gt;

&lt;p&gt;This is the biggest one and the least understood.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://commoncrawl.org/" rel="noopener noreferrer"&gt;Common Crawl&lt;/a&gt; is a nonprofit that has been archiving the web since 2007. The numbers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;9.5+ petabytes&lt;/strong&gt;, 300+ billion documents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~2/3 of the 47 LLMs&lt;/strong&gt; published between 2019–2023 use it as training data&lt;/li&gt;
&lt;li&gt;GPT-3, LLaMA, T5, Red Pajama all trained on it&lt;/li&gt;
&lt;li&gt;Google's C4 dataset: 750 GB filtered from Common Crawl&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Blocking crawlers today &lt;strong&gt;does not retroactively remove&lt;/strong&gt; content already captured. Those snapshots are permanent, public resources.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://dl.acm.org/doi/10.1145/3630106.3659033" rel="noopener noreferrer"&gt;ACM FAccT 2024 — "A Critical Analysis of Common Crawl"&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Client-side paywall bypass
&lt;/h2&gt;

&lt;p&gt;Common Crawl does not execute JavaScript. If your paywall depends on client-side JS:&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;!-- Your paywall loads after DOM ready --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;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;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;DOMContentLoaded&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="nf"&gt;showPaywall&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;span class="c"&gt;&amp;lt;!-- But the crawler already captured the full HTML --&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The crawler gets the complete article before JS even runs.&lt;/p&gt;

&lt;p&gt;Alex Reisner documented this for The Atlantic (Nov 2025): Common Crawl was capturing full articles from NYT, WSJ, The Economist and The Atlantic itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. User-agent spoofing
&lt;/h2&gt;

&lt;p&gt;Some AI bots change their identity when blocked.&lt;/p&gt;

&lt;p&gt;Cloudflare documented (Aug 2024) that Perplexity was using:&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;# Declared user-agent
PerplexityBot/1.0

# What they actually sent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 Chrome/120.0.0.0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plus ASN rotation to evade IP-based blocking. The evasion ecosystem includes FlareSolverr (Selenium + undetected-chromedriver), Scrapfly (94–98% bypass rates), and residential proxy rotation.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Syndication redistribution
&lt;/h2&gt;

&lt;p&gt;Once your content leaves your domain through any syndication channel, your &lt;code&gt;robots.txt&lt;/code&gt; is irrelevant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Original domain (robots.txt: Disallow)
  → RSS feed (no robots.txt)
  → Apple News (different domain)
  → Email newsletter (archived on web)
  → Cross-posted to social (scraped by bots)
  → API aggregators (reformatted downstream)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each channel creates a copy outside your control.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Web archives (Wayback Machine)
&lt;/h2&gt;

&lt;p&gt;Internet Archive: 1+ billion pages, 99+ petabytes. &lt;code&gt;web.archive.org&lt;/code&gt; is domain #187 in Google's C4 dataset.&lt;/p&gt;

&lt;p&gt;Harvard's &lt;a href="https://lil.law.harvard.edu/" rel="noopener noreferrer"&gt;WARC-GPT&lt;/a&gt; lets you ingest WARC archives directly into RAG pipelines. As of Feb 2026, publishers like The Guardian and NYT started blocking Wayback Machine over AI concerns.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Real-time RAG access
&lt;/h2&gt;

&lt;p&gt;Modern LLMs don't just rely on training data. They fetch content in real time:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bot&lt;/th&gt;
&lt;th&gt;Growth 2024–2025&lt;/th&gt;
&lt;th&gt;Mechanism&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ChatGPT-User&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+2,825%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fetch on user "search the web"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PerplexityBot&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+157,490%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fetch on every query&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meta-ExternalFetcher&lt;/td&gt;
&lt;td&gt;New in 2024&lt;/td&gt;
&lt;td&gt;Meta AI features&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These bots claim the fetch is "user-initiated" (not autonomous crawling), trying to exempt themselves from &lt;code&gt;robots.txt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Cloudflare reported Anthropic's bots have crawl-to-refer ratios of &lt;strong&gt;38,000:1 to 70,000:1&lt;/strong&gt;. For every time they send traffic back, they crawl tens of thousands of times.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://blog.cloudflare.com/" rel="noopener noreferrer"&gt;Cloudflare Blog 2025&lt;/a&gt;, &lt;a href="https://platform.openai.com/docs/bots" rel="noopener noreferrer"&gt;OpenAI Crawlers Overview&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Content farms
&lt;/h2&gt;

&lt;p&gt;Content farms — human or AI-operated — rewrite your articles on unrestricted domains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Scrape/copy original article
2. Rewrite to avoid plagiarism detection
3. Publish on domain with no robots.txt restrictions
4. AI crawler indexes the rewrite
5. LLM absorbs the rewritten version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In &lt;em&gt;Bartz v. Anthropic PBC&lt;/em&gt;, the court ruled that training AI with content from "pirate sites" constituted fair use. This sets precedent for rewritten content too.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Direct non-compliance
&lt;/h2&gt;

&lt;p&gt;The simplest vector: bots just ignore &lt;code&gt;robots.txt&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;12.9% of bots&lt;/strong&gt; ignore it entirely (was 3.3%) — &lt;a href="https://paulcalvano.com/" rel="noopener noreferrer"&gt;Paul Calvano, Aug 2025&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Duke University (2025): "several categories of AI-related crawlers never request robots.txt"&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2505.21733" rel="noopener noreferrer"&gt;Kim &amp;amp; Bock (ACM IMC 2025)&lt;/a&gt;: scrapers are &lt;strong&gt;less likely&lt;/strong&gt; to comply with more restrictive directives&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The legal status is clear: in &lt;em&gt;Ziff Davis v. OpenAI&lt;/em&gt; (2025), the judge described &lt;code&gt;robots.txt&lt;/code&gt; as "more like a sign than a fence" — not a technological measure that "effectively controls access" under the DMCA.&lt;/p&gt;

&lt;h2&gt;
  
  
  The compliance stats
&lt;/h2&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;Value&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bots ignoring robots.txt&lt;/td&gt;
&lt;td&gt;12.9%&lt;/td&gt;
&lt;td&gt;Paul Calvano, 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Top 10K sites with AI bot rules&lt;/td&gt;
&lt;td&gt;Only 14%&lt;/td&gt;
&lt;td&gt;Market analysis 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sites with any robots.txt&lt;/td&gt;
&lt;td&gt;94% (12.2M sites)&lt;/td&gt;
&lt;td&gt;Global study 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  So what do you do?
&lt;/h2&gt;

&lt;p&gt;Blocking alone doesn't work. Defensive measures reduce direct crawling by 40–60% for compliant bots, but they can't touch historical data, syndicated copies, or content farm rewrites.&lt;/p&gt;

&lt;p&gt;The alternative is &lt;strong&gt;offensive&lt;/strong&gt;: control the narrative instead of trying to hide from it.&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://498as.com" rel="noopener noreferrer"&gt;498 Advance&lt;/a&gt; we built tools for this: &lt;strong&gt;GEOdoctor&lt;/strong&gt; for technical auditing of brand visibility in LLMs, and &lt;strong&gt;S.A.M.&lt;/strong&gt; (Semantic Alignment Machine) for content alignment across owned media, UGC platforms (social GEO) and authority domains.&lt;/p&gt;




&lt;p&gt;Full analysis with all academic sources: &lt;a href="https://zoopa.es/en/digital-marketing-en/why-ai-keeps-reading-your-website-even-after-you-block-every-bot/" rel="noopener noreferrer"&gt;zoopa.es/en/blog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have you run into this paradox? Blocking everything but still appearing in LLM outputs? I'd love to hear what you've observed in your own infrastructure.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>How I built a proactive personal AI assistant based on Moltbot for 10€ a month</title>
      <dc:creator>carlosortet</dc:creator>
      <pubDate>Fri, 30 Jan 2026 07:18:51 +0000</pubDate>
      <link>https://dev.to/carlosortet/how-i-built-a-proactive-personal-ai-assistant-based-on-moltbot-for-10eu-a-month-34dp</link>
      <guid>https://dev.to/carlosortet/how-i-built-a-proactive-personal-ai-assistant-based-on-moltbot-for-10eu-a-month-34dp</guid>
      <description>&lt;p&gt;&lt;strong&gt;An open source agent with persistent memory, command execution, real proactivity, and WhatsApp as its interface. Full architecture, real costs, and lessons learned.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Build Your Own Assistant
&lt;/h2&gt;

&lt;p&gt;The idea of having an AI assistant that actually knows you is nothing new. Anyone who uses ChatGPT, Claude, or Gemini daily has felt the same frustration: every conversation starts from scratch, you have to re-explain your project context, and the assistant cannot do anything beyond the chat window.&lt;/p&gt;

&lt;p&gt;At 498AS, we have been experimenting for months with language models applied to real workflows. Not just text generation, but agents that execute tasks, access tools, and maintain long-term context.&lt;/p&gt;

&lt;p&gt;When we discovered Clawdbot (Moltbot), we saw an opportunity to close that gap. An open source project that lets you run your own AI agent with persistent memory, command execution, and the ability to message you before you message it.&lt;/p&gt;

&lt;p&gt;We set it up. It works. And it costs 10 euros a month.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Clawdbot
&lt;/h2&gt;

&lt;p&gt;Clawdbot (Moltbot) is an open source project that provides the infrastructure for running your own AI agent. It is not a closed product or a subscription app. It is the technical skeleton on which you build your personalized assistant.&lt;/p&gt;

&lt;p&gt;Its core capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multichannel communication.&lt;/strong&gt; It talks to you via WhatsApp, Telegram, Discord, or whatever platform you prefer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistent memory.&lt;/strong&gt; It remembers previous conversations, your projects, your preferences. It does not start from zero.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Command execution.&lt;/strong&gt; It can run scripts, open applications, control your browser. Real actions on your computer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool and API access.&lt;/strong&gt; You configure which tools it can use, and the agent integrates them into its responses and actions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full control.&lt;/strong&gt; It runs on your server, under your infrastructure. You decide what data it holds and who can access it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key difference from ChatGPT or Claude is that Clawdbot does not live in a third party's cloud. It lives wherever you decide.&lt;/p&gt;




&lt;h2&gt;
  
  
  Full System Architecture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Central Server
&lt;/h3&gt;

&lt;p&gt;The heart of the system is a VPS on Hetzner. Minimum specs: 2 vCPUs, 4GB of RAM. Model CX22. Cost: approximately 4 euros per month.&lt;/p&gt;

&lt;p&gt;This server runs the Clawdbot gateway, which handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Receiving and sending messages&lt;/li&gt;
&lt;li&gt;Communication with the AI model&lt;/li&gt;
&lt;li&gt;Persistent memory management&lt;/li&gt;
&lt;li&gt;Tool and node coordination&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The AI Model
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Subscription option.&lt;/strong&gt; If you already pay for Claude Pro Max, ChatGPT Plus/Pro, or similar, Clawdbot can use that subscription directly. No separate API costs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API option.&lt;/strong&gt; If you prefer pay-per-use, you can connect the APIs from Claude, OpenAI, or any compatible model. For personal use it typically ranges between 10 and 30 euros per month.&lt;/p&gt;

&lt;h3&gt;
  
  
  WhatsApp as the Interface
&lt;/h3&gt;

&lt;p&gt;The setup requires a dedicated prepaid SIM. Cost: 6 euros per month with minimal data. The agent has its own phone number. You message it like any other contact and it replies.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security with Tailscale
&lt;/h3&gt;

&lt;p&gt;The Clawdbot gateway is &lt;strong&gt;not exposed to the internet&lt;/strong&gt;. It only listens on the Tailscale network.&lt;/p&gt;

&lt;p&gt;Tailscale is a mesh VPN that creates a private network between your devices. End-to-end encryption, regardless of physical location. Free for personal use.&lt;/p&gt;

&lt;p&gt;Our specific configuration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Hetzner VPS is on the Tailscale network&lt;/li&gt;
&lt;li&gt;Our phones and computers are too&lt;/li&gt;
&lt;li&gt;The gateway only accepts connections from Tailscale IP ranges&lt;/li&gt;
&lt;li&gt;The firewall is explicitly configured: only Tailscale can reach the gateway&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If someone scans the server from the internet, the gateway port does not even show up.&lt;/p&gt;

&lt;h3&gt;
  
  
  Distributed Nodes
&lt;/h3&gt;

&lt;p&gt;Clawdbot lets you connect "nodes": computers that the agent can control remotely. My MacBook is connected as a node. I can be out on the street, message the agent via WhatsApp saying "open Chrome and look up X" and it does it on my Mac.&lt;/p&gt;

&lt;p&gt;All traffic between nodes and the gateway goes through Tailscale.&lt;/p&gt;

&lt;h3&gt;
  
  
  Access Control
&lt;/h3&gt;

&lt;p&gt;The agent does not talk to just anyone. We have an allowlist of authorized phone numbers. Permissions are granular: who can interact, which commands it can execute, which tools are available, whether execution requires prior approval.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Proactive Agent: The Real Game Changer
&lt;/h2&gt;

&lt;p&gt;This is the feature that turns a chatbot into an actual assistant. The agent does not wait for you to write. It messages you first.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Email alerts.&lt;/strong&gt; The agent monitors your email and notifies you via WhatsApp when something relevant arrives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calendar reminders.&lt;/strong&gt; It reads your calendar and alerts you ahead of meetings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom alerts.&lt;/strong&gt; Weather updates, price monitoring, GitHub repository activity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scheduled tasks.&lt;/strong&gt; "Every Monday at 9, review my pending tasks and tell me what I need to do this week."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Proactivity completely transforms the relationship with the assistant.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real Cost Breakdown
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Monthly Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hetzner CX22 VPS&lt;/td&gt;
&lt;td&gt;~4 EUR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prepaid SIM with data&lt;/td&gt;
&lt;td&gt;~6 EUR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tailscale&lt;/td&gt;
&lt;td&gt;0 EUR (free tier)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total infrastructure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~10 EUR/month&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The AI model is separate. If you already have a subscription to Claude Pro, ChatGPT Plus, or similar, you pay nothing extra.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lessons Learned After Weeks of Use
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;More useful than expected.&lt;/strong&gt; What started as a technical experiment became a daily tool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proactivity is the differentiator.&lt;/strong&gt; Having the agent message you when something important happens is a paradigm shift.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security is non-negotiable.&lt;/strong&gt; Tailscale, firewall, allowlist, granular permissions. All of it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WhatsApp as an interface reduces friction.&lt;/strong&gt; It is where you already are.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How to Get Started
&lt;/h2&gt;

&lt;p&gt;Clawdbot is open source and available on GitHub with comprehensive documentation and an active Discord community.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get a cheap VPS (Hetzner, DigitalOcean, or similar)&lt;/li&gt;
&lt;li&gt;Install Clawdbot following the documentation&lt;/li&gt;
&lt;li&gt;Connect WhatsApp with a dedicated SIM&lt;/li&gt;
&lt;li&gt;Set up Tailscale on the server and your devices&lt;/li&gt;
&lt;li&gt;Define an allowlist of authorized numbers&lt;/li&gt;
&lt;li&gt;Configure tools and permissions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Security recommendations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do not expose the gateway to the internet. Use Tailscale.&lt;/li&gt;
&lt;li&gt;Do not run as root.&lt;/li&gt;
&lt;li&gt;Configure user allowlists.&lt;/li&gt;
&lt;li&gt;Enable approval for command execution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We wrote a detailed blog post with the full architecture and step-by-step setup: &lt;a href="https://zoopa.es/es/blog/como-montar-un-asistente-de-ia-personal-por-10e-al-mes-con-clawdbot/" rel="noopener noreferrer"&gt;Read the full article on our blog&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Article published by the 498AS team. Questions about the setup? Drop a comment or get in touch.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>selfhosted</category>
      <category>ai</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Clawdbot: The AI Assistant Siri Promised But Never Delivered — Complete 2026 Guide</title>
      <dc:creator>carlosortet</dc:creator>
      <pubDate>Sun, 25 Jan 2026 18:32:18 +0000</pubDate>
      <link>https://dev.to/carlosortet/clawdbot-the-ai-assistant-siri-promised-but-never-delivered-complete-2026-guide-4la0</link>
      <guid>https://dev.to/carlosortet/clawdbot-the-ai-assistant-siri-promised-but-never-delivered-complete-2026-guide-4la0</guid>
      <description>&lt;p&gt;&lt;strong&gt;Clawdbot is an open-source personal AI assistant that radically transforms how we interact with artificial intelligence.&lt;/strong&gt; Unlike ChatGPT or Claude web, Clawdbot lives inside your everyday messaging apps — WhatsApp, Telegram, Slack, Discord — and can proactively message you, remember conversations from weeks ago, and execute tasks on your computer.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem Clawdbot Solves
&lt;/h2&gt;

&lt;p&gt;For over a decade, big tech companies promised us intelligent assistants that would transform our productivity. Siri arrived in 2011. Google Assistant in 2016. Alexa conquered millions of homes. And yet, in 2026, most users remain frustrated with these tools.&lt;/p&gt;

&lt;p&gt;The fundamental problem is that these traditional assistants:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wait passively&lt;/strong&gt; for you to speak to them&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forget everything&lt;/strong&gt; when the session closes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can't execute&lt;/strong&gt; complex tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live in closed ecosystems&lt;/strong&gt; that limit their utility&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prioritize data collection&lt;/strong&gt; over real functionality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clawdbot represents a paradigm shift. It's what Siri should have been and never was.&lt;/p&gt;




&lt;h2&gt;
  
  
  Clawdbot vs Siri vs Google Assistant vs Alexa: 2026 Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Clawdbot&lt;/th&gt;
&lt;th&gt;Siri&lt;/th&gt;
&lt;th&gt;Google Assistant&lt;/th&gt;
&lt;th&gt;Alexa&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Proactivity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Writes to you when there's news&lt;/td&gt;
&lt;td&gt;Only responds&lt;/td&gt;
&lt;td&gt;Limited to routines&lt;/td&gt;
&lt;td&gt;Only basic notifications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Persistent memory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Remembers weeks/months&lt;/td&gt;
&lt;td&gt;Forgets on close&lt;/td&gt;
&lt;td&gt;Very limited&lt;/td&gt;
&lt;td&gt;Session only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Executes PC tasks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Terminal, browser, files&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Open source&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MIT License, auditable&lt;/td&gt;
&lt;td&gt;Closed&lt;/td&gt;
&lt;td&gt;Closed&lt;/td&gt;
&lt;td&gt;Closed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Your data on your machine&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Local-first&lt;/td&gt;
&lt;td&gt;Apple servers&lt;/td&gt;
&lt;td&gt;Google servers&lt;/td&gt;
&lt;td&gt;Amazon servers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WhatsApp integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Monthly cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$27 (VPS+Claude)&lt;/td&gt;
&lt;td&gt;Free (with iPhone)&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Free (with Echo)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt;: Clawdbot is the only assistant that combines real proactivity, persistent memory, and total user control. The trade-off is it requires initial technical setup.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Clawdbot and Why Does It Matter
&lt;/h2&gt;

&lt;p&gt;Clawdbot is an open-source personal AI assistant that runs locally on your machine and responds through the messaging apps you already use: WhatsApp, Telegram, Slack, Discord, Signal, iMessage, and 50+ additional integrations.&lt;/p&gt;

&lt;p&gt;The fundamental difference with ChatGPT or Claude web is that Clawdbot &lt;strong&gt;lives inside your messaging apps&lt;/strong&gt;. You don't go to a website. You message it like any other contact. And it can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proactively send you messages&lt;/li&gt;
&lt;li&gt;Remember past conversations&lt;/li&gt;
&lt;li&gt;Execute tasks on your computer&lt;/li&gt;
&lt;li&gt;Run 24/7&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Local-First Philosophy
&lt;/h3&gt;

&lt;p&gt;One of the most relevant aspects of Clawdbot is its local-first architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your data stays on your machine by default&lt;/li&gt;
&lt;li&gt;No dependency on external servers (except the AI model you choose)&lt;/li&gt;
&lt;li&gt;You can audit all the code since it's open-source&lt;/li&gt;
&lt;li&gt;You have total control over what it can and cannot do&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Creator: Peter Steinberger
&lt;/h2&gt;

&lt;p&gt;Peter Steinberger (@steipete) is the creator of Clawdbot. He's not an anonymous developer or a weekend project funded by VCs promising to revolutionize the world.&lt;/p&gt;

&lt;p&gt;His profile:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ex-founder of PSPDFKit&lt;/strong&gt;, a PDF software company with global presence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;13+ years of experience&lt;/strong&gt; in native iOS development&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Based in Vienna and London&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Builds in public&lt;/strong&gt;, sharing both successes and failures&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Technical Architecture
&lt;/h2&gt;

&lt;p&gt;Clawdbot uses a hub-and-spoke architecture with a centralized Gateway that acts as the control plane. The Gateway manages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Session routing and isolation&lt;/strong&gt;: Each conversation stays separate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Channel connections and events&lt;/strong&gt;: WhatsApp, Telegram, Slack, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool execution and streaming&lt;/strong&gt;: Real-time responses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canvas/A2UI hosting&lt;/strong&gt;: Visual interface when needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Device node orchestration&lt;/strong&gt;: Multiple synchronized devices&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Supported AI Models
&lt;/h3&gt;

&lt;p&gt;Clawdbot isn't tied to a single provider:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Models&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;Anthropic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Claude Pro/Max&lt;/td&gt;
&lt;td&gt;Recommended: Claude Opus 4.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenAI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ChatGPT/Codex&lt;/td&gt;
&lt;td&gt;GPT-4 available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Local&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ollama, LM Studio&lt;/td&gt;
&lt;td&gt;For maximum privacy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Installation and Requirements
&lt;/h2&gt;

&lt;h3&gt;
  
  
  System Requirements
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Node.js&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;gt;= 22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Package Manager&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;npm, pnpm (preferred), or bun&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Operating System&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;macOS, Linux, Windows (via WSL2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Minimum RAM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2GB (4GB for web automation)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Optional&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Docker (for sandboxing)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Quick Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; clawdbot@latest
clawdbot onboard &lt;span class="nt"&gt;--install-daemon&lt;/span&gt;
clawdbot gateway &lt;span class="nt"&gt;--port&lt;/span&gt; 18789 &lt;span class="nt"&gt;--verbose&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or the one-liner:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://clawd.bot/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Estimated setup time&lt;/strong&gt;: 30 minutes for basic configuration. 2-4 hours for complete customization with skills.&lt;/p&gt;




&lt;h2&gt;
  
  
  Differentiating Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Persistent Memory
&lt;/h3&gt;

&lt;p&gt;Unlike traditional chatbots that forget everything when the session closes, Clawdbot maintains continuous 24/7 context, learned user preferences, history of past conversations, and structured memory files. The workspace can be a Git repository — if the bot "learns" something incorrect, you can git revert and return to a previous state.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Real Proactivity
&lt;/h3&gt;

&lt;p&gt;This is perhaps the most differentiating feature. Clawdbot doesn't wait passively:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Morning briefings&lt;/strong&gt;: Summary of emails, calendar, relevant news&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contextual alerts&lt;/strong&gt;: "Your meeting starts in 20 minutes"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Topic tracking&lt;/strong&gt;: "That project you mentioned has updates"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart reminders&lt;/strong&gt;: Based on usage patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. System Control
&lt;/h3&gt;

&lt;p&gt;Clawdbot can interact with your computer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Browser&lt;/strong&gt;: Automation with Chrome/Chromium (CDP)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Files&lt;/strong&gt;: Reading and writing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terminal&lt;/strong&gt;: Shell command execution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scripts&lt;/strong&gt;: On-the-fly creation and execution&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Extensibility
&lt;/h3&gt;

&lt;p&gt;The skills system allows extending capabilities. Most interesting: Clawdbot can write its own plugins to gain new capabilities.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Personal Productivity
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Inbox Zero&lt;/strong&gt; — Email cleanup, mass unsubscription, organization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart Calendar&lt;/strong&gt; — Contextual reminders based on location/time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flight Check-in&lt;/strong&gt; — Complete automation without intervention&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Morning Briefings&lt;/strong&gt; — Personalized daily summary&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Advanced Automation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;WhatsApp Memory Vault&lt;/strong&gt; — A user automatically transcribed over 1000 voice messages with integrated semantic search.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grocery Autopilot&lt;/strong&gt; — From recipe photo to completed shopping cart in under 5 minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Complete Website Migration&lt;/strong&gt; — &lt;a class="mentioned-user" href="https://dev.to/thekitze"&gt;@thekitze&lt;/a&gt;: "Rebuilt my entire site via Telegram while watching Netflix in bed. Notion to Astro, 18 posts migrated, DNS moved to Cloudflare. Never opened my laptop."&lt;/p&gt;




&lt;h2&gt;
  
  
  Community Testimonials
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"I got up and running today with @clawdbot and it's been nothing short of an iPhone moment for me." — @dajaset&lt;/p&gt;

&lt;p&gt;"Using @clawdbot for a week and it genuinely feels like early AGI." — &lt;a class="mentioned-user" href="https://dev.to/davekiss"&gt;@davekiss&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Not enterprise. Not hosted. Infrastructure you control. This is what personal AI should feel like." — @karpathy&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Real Costs
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Basic VPS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~5 EUR/month (Hetzner, 2GB RAM)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Recommended VPS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~10 EUR/month (4GB RAM)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Pro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$20/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Max&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$100-200/month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Minimum functional configuration&lt;/strong&gt;: ~$27/month (VPS + Claude Pro)&lt;/p&gt;

&lt;p&gt;Clawdbot software is 100% free and open-source under MIT license.&lt;/p&gt;




&lt;h2&gt;
  
  
  Security and Privacy
&lt;/h2&gt;

&lt;p&gt;Clawdbot follows a local-first architecture: your data stays on your machine by default. Being open-source, you can audit all the code. However, the agent has broad access to your system (files, terminal, browser), so you should carefully configure permissions and use Docker containers to limit access in group contexts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security Recommendations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use restrictive pairing&lt;/li&gt;
&lt;li&gt;SSH tunneling for remote access&lt;/li&gt;
&lt;li&gt;Dedicated number for WhatsApp (ban risk)&lt;/li&gt;
&lt;li&gt;Carefully evaluate skill permissions&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;clawdbot doctor&lt;/code&gt; regularly&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Who is Clawdbot For
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Ideal Profiles
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Developers&lt;/strong&gt; — Infinite extensibility, hackable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technical Power Users&lt;/strong&gt; — Total control, privacy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Founders/CEOs&lt;/strong&gt; — 24/7 automation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content Creators&lt;/strong&gt; — Multi-platform, community management&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Who Should NOT Use It (Yet)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Non-technical users&lt;/strong&gt; — Requires terminal, VPS knowledge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Companies with strict compliance&lt;/strong&gt; — Unaudited security&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error intolerant users&lt;/strong&gt; — Still early stage software&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;Clawdbot represents a milestone in the evolution of personal AI assistants. It's not perfect — onboarding is still rough, there are occasional bugs, and it requires technical knowledge — but it's genuinely useful in ways Siri never achieved.&lt;/p&gt;

&lt;p&gt;For developers and technical power users, it's a transformative tool. For the average user, it's probably better to wait for more polished versions.&lt;/p&gt;

&lt;p&gt;What's clear is that the model of "assistant that lives in your infrastructure and contacts you proactively" is the future. Big Tech will eventually arrive. The open-source community got there first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/clawdbot/clawdbot" rel="noopener noreferrer"&gt;github.com/clawdbot/clawdbot&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Analysis by ZOOPA Research | 498AS Innovation Lab | January 2026&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>selfhosted</category>
    </item>
  </channel>
</rss>
