llms.txt Is Not a Standard, and Your Site Probably Does Not Need One

In March we added an llms.txt file to a client's site. It was on every SEO checklist doing the rounds, it took twenty minutes, and it felt like the responsible thing to do in a year when a growing share of traffic arrives through an AI assistant rather than a search results page.

Ninety days later we went back to the access logs to see what had come of it. In that window the file was requested exactly zero times by any AI crawler. The only hits it ever got were from us, checking that it deployed. Over the same period the same site served roughly fourteen thousand requests to crawlers operated by AI companies — every single one of them for ordinary HTML pages.

That gap is worth understanding, because the advice to "add an llms.txt" has hardened into received wisdom without anyone stopping to check whether the thing on the other end is listening.

What llms.txt Is Supposed to Be

The idea is straightforward and, on paper, sensible. You put a Markdown file at /llms.txt that describes your site to a language model: what it is, which pages matter, where the canonical documentation lives. Think of it as a sitemap written for a reader rather than a parser.

The pitch is that an assistant answering a question about your product should not have to guess which of your four hundred URLs is the real pricing page. Hand it a curated index and you get better answers and fewer mangled citations.

Nothing about that reasoning is wrong. The problem is entirely in the second half of the sentence — the part where someone reads the file.

A Standard Requires a Consumer

robots.txt is a standard because Googlebot fetches it before it crawls you, and because that behaviour is documented, tested, and enforced by the company that operates the crawler. sitemap.xml is a standard for the same reason. The file format is the least interesting part; the commitment on the other side is what makes it real.

llms.txt has the file format and not the commitment. As of this writing no major AI vendor has published documentation saying their crawler fetches it, and — more to the point — none of them appear in our logs asking for it. A convention that no client implements is a proposal, not a standard.

This is easy enough to verify on your own infrastructure. If you have access to raw logs, one line tells you whether anything has ever asked:

grep -c "GET /llms.txt" access.log

Run the same count against robots.txt for comparison. On the client site above, the second number was in the hundreds. The first was zero.

What the Crawlers Actually Request

The AI crawlers hitting your site are not looking for a special file. They are doing what crawlers have always done: fetching HTML, following links, and reading robots.txt on the way in.

If you want to see which ones are visiting you, the user-agent strings are distinctive enough to grep for directly:

grep -oE "GPTBot|ClaudeBot|Claude-User|PerplexityBot|Google-Extended|CCBot|Bytespider|meta-externalagent" access.log \
  | sort | uniq -c | sort -rn

Two useful things fall out of that command. The first is a real picture of who is reading your site, which is often quite different from what people assume — smaller crawlers frequently outnumber the ones that get written about. The second is a reminder that all of this traffic is arriving at your ordinary pages, through your ordinary server, governed by your ordinary crawl rules.

The Distinction Almost Everyone Gets Wrong

There are two categories of AI crawler and they deserve very different treatment.

Training crawlers collect content in bulk to build future models. GPTBot and CCBot are the familiar examples. Whether you allow them is a business decision about your content, and there is a defensible answer in either direction.

Retrieval fetchers are a different animal. They fire when a person has already asked a question and the assistant is going out to read a page in order to answer it. Blocking one of these does not protect your content from anything — it removes you from an answer a real potential customer is reading right now, and hands the citation to a competitor who left the door open.

The mistake we see most often is a blanket block written in a hurry, which catches both. If you want to opt out of training while staying visible in live answers, you have to name the agents individually:

User-agent: GPTBot
Disallow: /

User-agent: CCBot
Disallow: /

User-agent: *
Allow: /

Note that the same caveat from ordinary SEO applies here: robots.txt is a request, not a fence. Crawlers that respect it will respect it, and crawlers that do not were never going to. If you need enforcement rather than etiquette, that belongs at the server or CDN layer, not in a text file.

The One Case for Keeping an llms.txt

None of this makes the file harmful. It costs a few kilobytes and it breaks nothing, and if a major vendor does adopt the convention next year, having one already in place is a small head start.

But keep it only under one condition: generate it from the same source as your sitemap, as part of whatever build or deploy step you already run. A file that is produced automatically stays honest for free.

A hand-maintained one does not. Six months after launch it describes a product tier you retired, links to two pages that now 404, and confidently states a price that changed in April. If anything ever does start reading it, that is the version it reads. A stale llms.txt is meaningfully worse than no llms.txt, because it replaces "no information" with "wrong information", stated in your own voice.

What Actually Makes a Site Readable to a Model

Here is the slightly deflating part. Everything that helps a language model understand your site is something we have been telling clients to do for fifteen years.

Put the content in the HTML. A page that renders its text through JavaScript after load is a page that some crawlers will record as empty, exactly as it was a decade ago with search. Use one <h1> that says what the page is. Use real heading levels underneath it rather than styled <div> elements. Put a visible date on anything time-sensitive, so a model quoting you can tell whether it is quoting something current.

We can see this play out across our own properties. The static, server-delivered pages get quoted back to us with their wording intact. The JavaScript-heavy sections get summarised vaguely, when they get picked up at all. No index file changed that; the markup did.

Optimise for What Actually Arrives

The appeal of llms.txt is that it is a discrete task. You can add it on a Tuesday, tick it off, and feel prepared for a shift in how people find things. Auditing your markup and deciding a real position on training crawlers is slower and harder to declare finished.

But the logs are not ambiguous. Ninety days, zero requests for the curated file, fourteen thousand requests for the pages themselves. Whatever attention these crawlers have to give your site, they are spending all of it on your actual HTML.

So spend your effort there. Make the pages clean, make the important ones reachable, decide deliberately which crawlers you want and write that down in the file they demonstrably read. Keep the llms.txt if you like — generated, not hand-written — and treat it as a bet on next year rather than a fix for this one.

U ožujku smo klijentu na sajt dodali llms.txt. Bio je na svakoj SEO checklisti koja je tada kružila, oduzeo je dvadeset minuta i djelovao je kao odgovorna stvar u godini u kojoj sve veći dio prometa dolazi preko AI asistenta, a ne preko stranice s rezultatima pretrage.

Devedeset dana kasnije vratili smo se u access logove da vidimo što je od toga ispalo. U tom razdoblju nijedan AI crawler nije zatražio tu datoteku nijednom. Jedini pogoci koje je ikad dobila bili su naši, dok smo provjeravali je li se deployala. U istom periodu isti je sajt poslužio otprilike četrnaest tisuća zahtjeva crawlerima AI kompanija — svaki jedan od njih za obične HTML stranice.

Tu razliku vrijedi razumjeti, jer se savjet "dodaj llms.txt" stvrdnuo u opće mjesto, a da nitko usput nije provjerio sluša li išta s druge strane.

Što bi llms.txt trebao biti

Ideja je jednostavna i, na papiru, razumna. Na /llms.txt stavite Markdown datoteku koja opisuje vaš sajt jezičnom modelu: što je, koje stranice su bitne, gdje je kanonska dokumentacija. Zamislite je kao sitemap pisan za čitatelja, a ne za parser.

Argument je da asistent koji odgovara na pitanje o vašem proizvodu ne bi trebao pogađati koji je od vaših četiristo URL-ova prava stranica s cijenama. Dajte mu kurirani indeks i dobit ćete bolje odgovore i manje iskrivljenih citata.

Ništa u tom razmišljanju nije pogrešno. Problem je u cijelosti u drugoj polovici rečenice — u dijelu gdje netko tu datoteku pročita.

Standard traži konzumenta

robots.txt je standard zato što ga Googlebot dohvaća prije nego što vas crawla, i zato što je to ponašanje dokumentirano, testirano i provedeno od strane tvrtke koja taj crawler pogoni. sitemap.xml je standard iz istog razloga. Format datoteke najmanje je zanimljiv dio; obveza s druge strane je ono što ga čini stvarnim.

Kod llms.txt-a postoji format, ali ne i obveza. U trenutku pisanja nijedan veći AI proizvođač nije objavio dokumentaciju u kojoj stoji da njihov crawler dohvaća tu datoteku — i, još važnije, nijedan se u našim logovima ne pojavljuje tražeći je. Konvencija koju nijedan klijent ne implementira je prijedlog, a ne standard.

To je lako provjeriti na vlastitoj infrastrukturi. Ako imate pristup sirovim logovima, jedan redak vam kaže je li išta ikad pitalo:

grep -c "GET /llms.txt" access.log

Pokrenite isto brojanje nad robots.txt-om radi usporedbe. Na spomenutom klijentskom sajtu druga je brojka bila u stotinama. Prva je bila nula.

Što crawleri zapravo traže

AI crawleri koji dolaze na vaš sajt ne traže posebnu datoteku. Rade ono što crawleri oduvijek rade: dohvaćaju HTML, prate linkove i usput čitaju robots.txt.

Ako želite vidjeti tko vas posjećuje, user-agent stringovi su dovoljno prepoznatljivi da ih se grepa izravno:

grep -oE "GPTBot|ClaudeBot|Claude-User|PerplexityBot|Google-Extended|CCBot|Bytespider|meta-externalagent" access.log \
  | sort | uniq -c | sort -rn

Iz te naredbe ispadaju dvije korisne stvari. Prva je stvarna slika toga tko čita vaš sajt, koja se često prilično razlikuje od pretpostavki — manji crawleri nerijetko nadmašuju one o kojima se piše. Druga je podsjetnik da sav taj promet stiže na vaše obične stranice, kroz vaš obični server, po vašim običnim pravilima crawlanja.

Razlika koju gotovo svi promaše

Postoje dvije kategorije AI crawlera i zaslužuju vrlo različit tretman.

Crawleri za treniranje skupljaju sadržaj u velikim količinama kako bi gradili buduće modele. GPTBot i CCBot su poznati primjeri. Hoćete li im dopustiti pristup poslovna je odluka o vašem sadržaju i postoji obranjiv odgovor u oba smjera.

Dohvatni crawleri su druga priča. Oni se pale tek kad je čovjek već postavio pitanje, a asistent odlazi pročitati stranicu kako bi na njega odgovorio. Blokiranje takvog crawlera ne štiti vaš sadržaj ni od čega — izbacuje vas iz odgovora koji upravo sada čita stvarni potencijalni klijent i predaje citat konkurentu koji je ostavio vrata otvorena.

Greška koju najčešće viđamo je blanko blokada napisana u žurbi, koja pohvata oboje. Ako se želite isključiti iz treniranja, a ostati vidljivi u živim odgovorima, agente morate imenovati pojedinačno:

User-agent: GPTBot
Disallow: /

User-agent: CCBot
Disallow: /

User-agent: *
Allow: /

Vrijedi ista ograda kao i u običnom SEO-u: robots.txt je molba, a ne ograda. Crawleri koji ga poštuju poštovat će ga, a oni koji ga ne poštuju ionako nisu namjeravali. Ako trebate provedbu, a ne bonton, to pripada na razinu servera ili CDN-a, a ne u tekstualnu datoteku.

Jedan razlog da ipak zadržite llms.txt

Ništa od ovoga ne čini tu datoteku štetnom. Košta nekoliko kilobajta i ništa ne kvari, a ako neki veliki proizvođač konvenciju usvoji dogodine, imati je već postavljenu mala je prednost.

Ali zadržite je samo pod jednim uvjetom: generirajte je iz istog izvora kao i sitemap, u sklopu build ili deploy koraka koji ionako pokrećete. Datoteka koja nastaje automatski ostaje točna besplatno.

Ona koju održavate ručno neće. Šest mjeseci nakon lansiranja opisuje paket koji ste ugasili, linka na dvije stranice koje sada vraćaju 404 i samouvjereno navodi cijenu promijenjenu u travnju. Ako je išta ikad počne čitati, to je verzija koju će pročitati. Ustajali llms.txt osjetno je gori od nikakvog, jer "nema informacije" zamjenjuje "krivom informacijom" — izrečenom vašim glasom.

Što stvarno čini sajt čitljivim modelu

Evo pomalo otrežnjujućeg dijela. Sve što pomaže jezičnom modelu da razumije vaš sajt nešto je što klijentima govorimo već petnaest godina.

Neka sadržaj bude u HTML-u. Stranica koja svoj tekst renderira JavaScriptom nakon učitavanja je stranica koju će neki crawleri zabilježiti kao praznu, potpuno isto kao prije deset godina s tražilicama. Koristite jedan <h1> koji kaže što je stranica. Ispod njega koristite prave razine naslova, a ne stilizirane <div> elemente. Stavite vidljiv datum na sve što je vremenski osjetljivo, kako bi model koji vas citira mogao znati citira li nešto aktualno.

To vidimo i na vlastitim stranicama. Statične, sa servera poslužene stranice vraćaju nam se citirane s netaknutim formulacijama. JavaScriptom teški dijelovi sažimaju se maglovito, kad se uopće pokupe. To nije promijenila nikakva indeksna datoteka; promijenio je markup.

Optimizirajte za ono što stvarno dolazi

Privlačnost llms.txt-a je u tome što je zaokružen zadatak. Dodate ga u utorak, prekrižite ga s liste i osjećate se spremno za promjenu u načinu na koji ljudi pronalaze stvari. Revizija markupa i stvarna odluka o crawlerima za treniranje sporije su i teže ih je proglasiti gotovima.

Ali logovi nisu dvosmisleni. Devedeset dana, nula zahtjeva za kuriranom datotekom, četrnaest tisuća zahtjeva za samim stranicama. Kakvu god pažnju ti crawleri imaju za vaš sajt, svu je troše na vaš stvarni HTML.

Zato uložite trud tamo. Neka stranice budu čiste, neka one važne budu dohvatljive, odlučite promišljeno koje crawlere želite i to zapišite u datoteku koju dokazano čitaju. Zadržite llms.txt ako želite — generiran, ne ručno pisan — i shvatite ga kao okladu na sljedeću godinu, a ne kao rješenje za ovu.

← Back to blog