An Index — kept by Alek

Dataset & Analysis

The web wrote 605,000 robots files. It said far fewer things.

Not who is blocked, but what the files actually contain: the vocabulary, the boilerplate, the comments people leave for machines, and which rules travel together.

605,046
robots.txt files analysed
0.85 GB of text
13,546,143
disallow rules parsed
31,819,812 lines total
16.4%
of the web shares 40 signatures
top one covers 30,013 sites
190 MB
of human-readable comments
3,363,309 comment lines

01 — The corpus

What 605,000 files add up to

Every robots.txt served by the Tranco top million, parsed line by line: 31,819,812 lines, 13,546,143 disallow rules, and 0.85 GB of plain text written almost entirely for machines to read.

The average file runs 52.6 lines. Of the disallow rules, 28.9% contain a wildcard and 8.0% end in a file extension — the web blocking individual files rather than directories.

1: 5,366,403 5,366,403 1 2: 3,035,782 3,035,782 2 3: 1,297,648 1,297,648 3 4: 349,793 349,793 4 5: 187,069 187,069 5 6: 67,879 67,879 6 7: 21,521 21,521 7
Path depth of disallow rules, counted in slash-separated segments. Depth 1 — /admin/, /search — dominates: the web blocks directories, not deep leaves.

02 — Boilerplate

The web is a photocopy

Strip the comments, lowercase the directives, sort them, and hash the result. Two files with the same hash express exactly the same policy. What comes back is the single most striking fact in this corpus.

16.4% of every robots.txt on the web — 99,015 files — reduces to just 40 distinct signatures. The most common one alone accounts for 30,013 sites. And the signatures at the top are not elaborate: most are two lines long.

#SitesShareRulesThe shared policy
130,0135%21allow: / · content-signal: search=yes,ai-train=no,use=reference · disa …
216,3822.7%2disallow: · user-agent: *
312,6002.1%2disallow: / · user-agent: *
48,7711.4%2allow: / · user-agent: *
53,7540.6%1user-agent: *
63,2740.5%3allow: /wp-admin/admin-ajax.php · disallow: /wp-admin/ · user-agent: *
72,5070.4%53allow: /core/*.css$ · allow: /core/*.css? · allow: /core/*.gif …
82,2820.4%4allow: / · llm-policy: /llms.txt · sitemap: /sitemap.xml …
91,8070.3%80allow: / · allow: / · allow: / …
101,6030.3%2crawl-delay: 10 · user-agent: *

Four of the ten most common robots.txt files on the internet say only “everyone, everything” or “everyone, nothing.” They are the two shortest possible opinions, and together they cover tens of thousands of sites.

Note what this does to the coverage report next door. When 16.4% of files are identical to some other file, most robots.txt “decisions” are not decisions at all. They are defaults, inherited from a CMS, a host or a CDN — which is exactly what the rank-independence of AI blocking implied from the other direction.

03 — A new directive

Something appeared that the standard has never heard of

The most common signature in the corpus is not a robots.txt in the traditional sense at all. It carries a directive that does not exist in RFC 9309.

allow: /
content-signal: search=yes,ai-train=no,use=reference
disallow: /
disallow: /
disallow: /
disallow: /

Content-Signal appears in 58,034 files. Rather than blocking a crawler by name, it declares what the content may be used forsearch=yes, ai-train=no — and leaves the crawling itself permitted. It is a licence expressed in a file that has no licensing mechanism, aimed at companies under no obligation to read it. A second contender, llm-policy, appears in 2,314 more.

Why this matters. Every other rule in robots.txt is an access control: fetch this, don't fetch that. Content-Signal is the first widely-deployed attempt to say you may read this, but you may not learn from it — a distinction the protocol was never built to express, now sitting on 9.6% of the web.

04 — The comments

190 MB of prose nobody reads

46.4% of files carry at least one comment — 3,363,309 lines of natural language, addressed to an audience of parsers that discard them.

Machine-generated / plugin: 152,823 Machine-generated / plugin 152,823 54.5% of commented Legal & rights language: 103,943 Legal & rights language 103,943 37.1% of commented AI / LLM mentioned: 92,723 AI / LLM mentioned 92,723 33.1% of commented Model training mentioned: 81,737 Model training mentioned 81,737 29.1% of commented Contact details: 27,751 Contact details 27,751 9.9% of commented Scraping / harvesting: 4,420 Scraping / harvesting 4,420 1.6% of commented Recruiting message: 396 Recruiting message 396 0.1% of commented
Files whose comments match each intent vocabulary. These are lexical probes, not classification: a file counts only if a comment literally contains one of the terms.

The largest category is the least human. Over half of all commented files mention a plugin, a generator, or an instruction not to edit — the comments are themselves machine output. Legal and rights language comes second, AI and training third.

Ranking the vocabulary makes the same point. These are the most frequent words across every comment in the corpus:

content 764,088search 486,109corresponding 306,394content-signal 263,460website 233,014signals 230,532models 155,493via 154,444rights 153,928collect 153,927include 153,762operator 153,447providing 153,393block 137,363robots 123,033cloudflare 111,341managed 110,508shopify 107,661bots 105,461end 102,791payment 101,186index 86,776

Not one of them is addressed to a person. content, signals, corresponding, operator and rights are the vocabulary of the Content Signals boilerplate; cloudflare, managed and shopify name the machines that wrote the file. Only 396 files in the entire corpus — 0.1% of commented ones — contain a recruiting message, the classic robots.txt easter egg. It is effectively extinct.

05 — What relates to what

Crawlers travel in constellations

Site owners do not evaluate crawlers one at a time. Grouping user-agents by how often they are named together — connected components over a Jaccard overlap graph — recovers distinct blocks that get chosen as units.

9 crawlerscohesion 0.688
  • ccbot119,287
  • bytespider112,269
  • gptbot102,412
  • claudebot93,580
  • google-extended86,346
  • amazonbot84,408
  • meta-externalagent79,302
  • applebot-extended76,643
  • cloudflarebrowserrenderingcrawler55,100
11 crawlerscohesion 0.585
  • ahrefsbot69,836
  • mj12bot67,310
  • semrushbot59,584
  • dotbot53,558
  • petalbot49,836
  • dataforseobot41,716
  • applebot41,620
  • yandexbot37,626
  • rogerbot35,595
  • serpstatbot32,943
  • seokicks31,221
2 crawlerscohesion 0.564
  • googlebot69,422
  • bingbot56,092
9 crawlerscohesion 0.519
  • chatgpt-user32,649
  • perplexitybot31,283
  • anthropic-ai26,444
  • claude-web19,844
  • cohere-ai19,579
  • youbot16,709
  • omgili16,372
  • omgilibot16,048
  • imagesiftbot15,147
3 crawlerscohesion 0.57
  • diffbot14,239
  • timpibot10,189
  • ai2bot9,583
3 crawlerscohesion 0.564
  • nutch11,906
  • ahrefssiteaudit10,181
  • pinterest8,704

None of these groups was defined in advance; they fell out of the co-occurrence structure. And they map cleanly onto real artefacts. The largest is the modern AI blocklist shipped by CDNs and CMS plugins. Another is the SEO-tool tier — AhrefsBot, SemrushBot, MJ12bot, DotBot — a decade-old copy-paste block that predates the AI ones entirely. A third is just Googlebot and Bingbot, the pair everyone writes rules for on purpose.

You can date a robots.txt by which constellation it contains. The SEO block is the sediment of one era; the AI block is the sediment of the next.

Crawler ACrawler BCo-namedLiftA→BB→A
awariosmartbotawariorssbot7,91472.4995.1%99.7%
claude-searchbotclaude-user7,10557.2876.8%87.5%
magpie-crawlerawariorssbot6,45651.6367.8%81.3%
perplexity-userclaude-user5,94751.6169.2%73.3%
magpie-crawlerawariosmartbot6,49449.5668.1%78.1%
ahrefssiteauditpinterest7,16348.9170.4%82.3%
timpibotai2bot7,21944.7370.9%75.3%
nutchpinterest7,64144.6164.2%87.8%
claude-searchbotperplexity-user5,79944.1762.7%67.5%
timpibotmeta-externalfetcher5,56043.454.6%73.1%
ai2botmeta-externalfetcher4,95341.151.7%65.1%
diffbottimpibot9,39339.1766%92.2%

Lift above 1 means the pair appears together more often than independence would predict. A→B is the share of sites naming A that also name B.

06 — Fingerprints

Paths that always arrive together

Run the same clustering over disallowed paths and something different emerges: not policy, but platform. Each cluster is a piece of software's default output.

21 pathscohesion 0.961
  • /checkout38,541
  • /account35,467
  • /orders33,229
  • /checkouts/32,103
  • /collections/*%2B*31,902
  • /collections/*+*31,894
  • /blogs/*+*31,859
  • /collections/*%2b*31,857
  • /blogs/*%2B*31,850
  • /blogs/*%2b*31,826
  • /collections/*sort_by*31,777
  • /*/collections/*%2B*31,746
  • /*/collections/*sort_by*31,740
  • /*/collections/*%2b*31,730
  • +7 more
12 pathscohesion 0.964
  • /cart/30,133
  • /*/checkout25,245
  • /*/cart/25,220
  • /*/account25,202
  • /services25,152
  • /*/orders25,079
  • /*/collections/*filter*&*filter*25,032
  • /*/checkouts/25,015
  • /cart.js25,003
  • /collections/*filter*&*filter*24,999
  • /sf_*24,992
  • /*/cart.js24,984
3 pathscohesion 0.962
  • /profiles/12,466
  • /comment/reply/12,117
  • /node/add/12,011
28 pathscohesion 0.803
  • /core/10,610
  • /index.php/admin/9,517
  • /index.php/node/add/9,485
  • /index.php/comment/reply/9,483
  • /index.php/search/9,441
  • /filter/tips9,293
  • /index.php/filter/tips9,170
  • /user/login7,898
  • /user/register7,773
  • /user/password7,717
  • /user/logout7,695
  • /index.php/user/logout7,557
  • /index.php/user/login7,554
  • /index.php/user/password7,552
  • +14 more
3 pathscohesion 0.995
  • /wp-content/uploads/wc-logs/8,651
  • /wp-content/uploads/woocommerce_uploads/8,629
  • /wp-content/uploads/woocommerce_transient_files/8,617

These are identifiable on sight. Shopify ships /checkout, /cart/, /orders and the /collections/*+* filter patterns. Drupal ships /node/add/, /comment/reply/, /filter/tips and /core/, each duplicated behind /index.php. WooCommerce ships the /wp-content/uploads/wc-logs/ trio. The cohesion figures — most above 0.95 — mean the paths are almost never seen apart.

A robots.txt is therefore a reliable fingerprint of the stack underneath it, whether or not the site meant to disclose that.

07 — Meaning

What the rules are actually about

Classifying all 13,546,143 disallow rules by what they refer to gives the web's blocking priorities in aggregate.

Whole site (blanket): 3,168,989 Whole site (blanket) 3,168,989 23.4% Content areas: 1,244,342 Content areas 1,244,342 9.2% Cart & checkout: 821,343 Cart & checkout 821,343 6.1% Admin & CMS internals: 625,378 Admin & CMS internals 625,378 4.6% Accounts & auth: 605,043 Accounts & auth 605,043 4.5% Localisation: 489,367 Localisation 489,367 3.6% Scripts & machinery: 482,500 Scripts & machinery 482,500 3.6% Search & filtering: 463,984 Search & filtering 463,984 3.4% APIs & endpoints: 260,856 APIs & endpoints 260,856 1.9% Media & uploads: 200,336 Media & uploads 200,336 1.5% Print & alternate views: 107,096 Print & alternate views 107,096 0.8% Dev, staging & temp: 103,908 Dev, staging & temp 103,908 0.8%
Disallow rules by semantic category, first match wins over an ordered pattern list. 29.8% of rules stay uncategorised — genuinely site-specific paths with no shared vocabulary.

The shape agrees with the coverage report's finding that the web blocks infinite spaces and private surfaces. Search and filtering, accounts, and admin interfaces dominate. Blanket whole-site blocks are the second largest single category, driven by the parked and unlaunched tail.

Which paths each crawler is steered away from

Crossing agents against paths shows what sites are protecting when they name a specific crawler. Lift compares against that path's base rate across the whole corpus.

CrawlerFiles naming itMost over-represented disallow paths
ccbot119,287/admin/ ×2.69 / ×2.64 /account/ ×1.7
bytespider112,269/admin/ ×2.79 / ×2.68 /account/ ×1.73
gptbot102,412/ ×2.47 /account/ ×2.1 /api/ ×1.67
claudebot93,580/ ×2.46 /account/ ×2.31 /api/ ×1.65
google-extended86,346/ ×2.48 /account/ ×2.29 /api/ ×1.66
amazonbot84,408/ ×2.59 /account/ ×2.39 /api/ ×1.47
meta-externalagent79,302/ ×2.59 /account/ ×2.38 /api/ ×1.54
applebot-extended76,643/ ×2.58 /account/ ×1.9 /api/ ×1.56
ahrefsbot69,836/*/collections/*/products/*-[a-f0-9][a-f0-9][a-f0-9][a-f0-9] ×8.49 /collections/*/products/*-[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a ×8.49 /products/*-[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9] ×8.48
googlebot69,422/admin/ ×4.34 / ×2.1 /cgi-bin ×1.86

The AI crawlers cluster on the same three targets: the site root, account areas and admin paths. When a site singles out an AI crawler, it is usually not curating which sections may be read — it is closing the whole door, or the doors that were already shut to everyone.

08 — Language

An overwhelmingly English, overwhelmingly ASCII file

Despite covering a million domains across every country, the text is near-uniform.

Script detected in commentsFilesShare of corpus
Cyrillic1,6990.3%
Cjk1,1200.2%
Korean4030.1%
Arabic1780%
Greek1110%
Hebrew740%
Thai520%

Non-Latin scripts appear in a fraction of a percent of files. robots.txt is a technical artefact written in the lingua franca of technical artefacts — and increasingly it is not written by hand at all, which makes the language question mostly moot.

Method

The source is the 605,046 parseable robots.txt files collected from the Tranco top-1M, the same corpus behind the coverage report. Analysis runs as two passes over the dataset. The first builds bounded vocabularies — the most frequent paths, agents and template signatures — with periodic trimming. The second recounts against those fixed vocabularies, so every figure here is an exact count rather than an artefact of when a rare key happened to be trimmed. Co-occurrence needs a fixed vocabulary in any case: pairs cannot be counted over a set that is still changing underneath you.

Template signatures strip comments and blank lines, lowercase and collapse whitespace, then sort the remaining directives before hashing. Two files match when they express the same policy regardless of ordering or commentary. The reported share covers the top 40 signatures only — the true proportion of duplicated files is higher, since the long tail of shared signatures is not counted here.

Clusters are connected components over a graph whose edges are pairs with a Jaccard overlap above a threshold — 0.55 for crawlers, 0.8 for paths. Cohesion is the mean pairwise Jaccard inside a group. The grouping is structural, not semantic: nothing tells the algorithm what a crawler is. Every interpretation offered above is read off the membership afterwards.

Intent categories are lexical probes. A file counts toward “AI mentioned” only if a comment literally contains one of the listed terms; they undercount paraphrase and cannot detect sentiment, so a comment welcoming AI crawlers counts identically to one refusing them. Path categories are ordered regular expressions, first match wins, and the uncategorised remainder is reported rather than hidden.