<?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: Mike Viewfy</title>
    <description>The latest articles on DEV Community by Mike Viewfy (@mike_viewfy).</description>
    <link>https://dev.to/mike_viewfy</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%2F4051960%2F9dce2333-c5b4-4b3a-bec5-e027f11db95e.jpg</url>
      <title>DEV Community: Mike Viewfy</title>
      <link>https://dev.to/mike_viewfy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mike_viewfy"/>
    <language>en</language>
    <item>
      <title>We scanned 383 Show HN products. 27% were unreadable to crawlers, 17% blocked Claude (and nobody wrote that rule)</title>
      <dc:creator>Mike Viewfy</dc:creator>
      <pubDate>Mon, 10 Aug 2026 00:59:40 +0000</pubDate>
      <link>https://dev.to/mike_viewfy/we-scanned-383-show-hn-products-27-were-unreadable-to-crawlers-17-blocked-claude-and-nobody-3f8h</link>
      <guid>https://dev.to/mike_viewfy/we-scanned-383-show-hn-products-27-were-unreadable-to-crawlers-17-blocked-claude-and-nobody-3f8h</guid>
      <description>&lt;p&gt;Most founders assume that if a page loads in a browser and shows up in Google, an AI assistant can read it too. We scanned 383 products from Show HN with a script we keep in the repo. 27% were unreadable to crawlers, and 17% were blocked from Claude outright.&lt;/p&gt;

&lt;h2&gt;
  
  
  27% of 383 launches could not be read by a crawler
&lt;/h2&gt;

&lt;p&gt;These are shipped products. Landing pages, docs, pricing, the whole thing. They render fine for a human with a Chrome tab. Fetch them the way a crawler does and better than a quarter of them return something a machine cannot use.&lt;/p&gt;

&lt;p&gt;The failure is not exotic. It is client-side rendering with no server response worth parsing, or an interstitial, or a bot filter that decides an unfamiliar user agent is an attack. The founder never sees it because the founder always arrives with a real browser and a real cookie jar.&lt;/p&gt;

&lt;h2&gt;
  
  
  17% blocked Claude, and almost none of it was a decision
&lt;/h2&gt;

&lt;p&gt;Here is the part that surprised me. Of those 383 products, 17% were blocked from Claude. Not throttled, not rate limited on a bad day. Blocked.&lt;/p&gt;

&lt;p&gt;If you ask the founders, most of them will tell you they never made that call. There is no board meeting where a two-person team decides to exclude an AI assistant from reading their marketing site. The rule came from somewhere else.&lt;/p&gt;

&lt;h2&gt;
  
  
  robots.txt says yes, the edge says no
&lt;/h2&gt;

&lt;p&gt;This is the actual mechanism, and it is worth checking on your own domain today.&lt;/p&gt;

&lt;p&gt;Your &lt;code&gt;robots.txt&lt;/code&gt; is permissive. You wrote it, or your framework wrote it, and it allows everything. Then a CDN bot management rule, a WAF preset, or a "block AI scrapers" toggle someone flipped during a scare month intercepts the request before your app ever hears about it. The two layers disagree, and the layer that wins is not the one in your repo.&lt;/p&gt;

&lt;p&gt;So the file you can read in your editor is not the file that governs behavior. That is why reading &lt;code&gt;robots.txt&lt;/code&gt; is not a test. Sending a request with the crawler's user agent is a test.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you check&lt;/th&gt;
&lt;th&gt;What it actually tells you&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Page loads in your browser&lt;/td&gt;
&lt;td&gt;A logged-in human with JS can see it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;robots.txt allows the bot&lt;/td&gt;
&lt;td&gt;Your repo intends to allow the bot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Search Console coverage&lt;/td&gt;
&lt;td&gt;Google specifically got through&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fetch with the crawler's user agent&lt;/td&gt;
&lt;td&gt;Whether that crawler got through&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The fourth row is the only one that answers the question, and it is the row almost nobody runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Analytics cannot show you traffic that never arrived
&lt;/h2&gt;

&lt;p&gt;This is a distribution bug that lives in your infrastructure and is invisible in your dashboards. There is no line in Plausible for "assistant tried to read us and got a 403." The request failed upstream, so the visit never existed, so there is nothing to count and nothing to alert on.&lt;/p&gt;

&lt;p&gt;Compare that to a normal outage. If your checkout breaks you get support tickets within an hour. If your site is unreadable to an AI crawler you get silence, indefinitely, and you interpret the silence as low demand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our own sitemap left out the three pages we most wanted indexed
&lt;/h2&gt;

&lt;p&gt;I would like to report that we found this problem in other people's repos only. We did not.&lt;/p&gt;

&lt;p&gt;Our sitemap omitted three of our highest-intent pages, including the free check page and the proof wall. Both were indexable routes with no &lt;code&gt;noindex&lt;/code&gt;, no auth, nothing unusual. They were simply absent from the file whose entire job is telling crawlers what exists. Generated sitemap, route filter, silent omission.&lt;/p&gt;

&lt;p&gt;That is a one-line class of bug. It is also the kind of thing that stays broken for months because finding it requires someone to diff the sitemap against the route table, and that task never wins a sprint.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ranking and being citable are different failure modes
&lt;/h2&gt;

&lt;p&gt;SEO aims at a position in a results page. AI visibility aims at being readable and citable by an assistant. They overlap, but they fail independently.&lt;/p&gt;

&lt;p&gt;A page can rank perfectly well on Google and still be blocked from an AI crawler by a bot filter, because Googlebot has been on the allowlist since before the filter existed and the newer agents have not. Your rank tracker will show green the entire time. That is the trap: the instrument you trust is measuring a different pipe.&lt;/p&gt;

&lt;h2&gt;
  
  
  A 60 item audit list is not a fix
&lt;/h2&gt;

&lt;p&gt;The standard remedy here is a crawler that produces a report. You get a PDF, the PDF goes into Notion, and six weeks later the title tags are unchanged. I have done this. Most people reading this have done this.&lt;/p&gt;

&lt;p&gt;The reason is not laziness. It is that a recommendation creates work and a diff removes it. Meta descriptions, title tags, structured data, robots and crawler access, sitemap entries: all of these are edits to files that already live in your repo. A pull request against them takes a minute to review. A list of the same edits takes an afternoon to implement and therefore never gets implemented.&lt;/p&gt;

&lt;p&gt;We build a tool that opens those as PRs (Viewfy), which is how the sitemap bug above got caught, but you do not need a tool to run the scan. Curl with a user agent string and a loop over your routes will find most of this.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this scan cannot tell you
&lt;/h2&gt;

&lt;p&gt;Several honest limits.&lt;/p&gt;

&lt;p&gt;It is a single snapshot. A bot filter that returned 403 during our scan window might pass on retry, and rate limiting can look identical to a block if you only ask once.&lt;/p&gt;

&lt;p&gt;It does not prove intent. We say most of the Claude blocks were not deliberate because founders say so and because the &lt;code&gt;robots.txt&lt;/code&gt; files contradict the edge behavior, not because we surveyed all 383 teams.&lt;/p&gt;

&lt;p&gt;It does not measure lost revenue. Being readable is a precondition for being cited, not a cause of it. A crawlable page with nothing worth quoting stays uncited.&lt;/p&gt;

&lt;p&gt;And Show HN is a skewed sample: early launches, heavy on JS frameworks, heavy on free CDN tiers with aggressive defaults. A cohort of five year old SaaS companies would likely fail differently, probably less on rendering and more on stale structured data.&lt;/p&gt;

&lt;p&gt;What the numbers do support is narrow and checkable: for 383 real shipped products, 27% could not be read by a crawler and 17% were closed to Claude, and you can re-run that test against your own domain in about ten minutes.&lt;/p&gt;

&lt;p&gt;What does your site return when you fetch it with an AI crawler's user agent, and did you write that rule or did your CDN?&lt;/p&gt;

&lt;p&gt;Full method and the scan script live on our blog at viewfy.ai.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>llm</category>
      <category>startup</category>
    </item>
    <item>
      <title>I probed 156 Show HN launches: 23 block Claude, 0 block OpenAI (almost none wrote that file)</title>
      <dc:creator>Mike Viewfy</dc:creator>
      <pubDate>Fri, 07 Aug 2026 22:30:52 +0000</pubDate>
      <link>https://dev.to/mike_viewfy/i-probed-156-show-hn-launches-23-block-claude-0-block-openai-almost-none-wrote-that-file-54o2</link>
      <guid>https://dev.to/mike_viewfy/i-probed-156-show-hn-launches-23-block-claude-0-block-openai-almost-none-wrote-that-file-54o2</guid>
      <description>&lt;p&gt;Most founders assume the rules in their robots.txt are rules they chose. Across 156 Show HN launches from August 2026, 23 sites (14.7%) disallow Anthropic's ClaudeBot while leaving OpenAI's OAI-SearchBot allowed, and 0 sites (0.0%) do the reverse. In a cohort of 156 independent founders shipping independent products, a coin-flip preference does not come out 23 to zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  23 to 0 is not a preference, it is a paste
&lt;/h2&gt;

&lt;p&gt;The perfect one-sidedness is the tell. Something is writing the same decision into everyone's repo.&lt;/p&gt;

&lt;p&gt;That something is Cloudflare's managed robots.txt. Of the 24 sites in the cohort that disallow any AI crawler, 23 (95.8%) serve that managed file, identifiable by its Content-Signal preamble. The file declares &lt;code&gt;search=yes&lt;/code&gt; in the same breath that it disallows ClaudeBot, GPTBot and Google-Extended. The site is telling AI search engines it wants to be found and telling three named crawlers to go away.&lt;/p&gt;

&lt;p&gt;The written blocks are uniform in a way hand-editing never produces. ClaudeBot, GPTBot and Google-Extended are each disallowed on the same 24 sites (15.4%). OAI-SearchBot, ChatGPT-User, Claude-User, Claude-SearchBot and PerplexityBot are each disallowed on 1 site (0.6%). Exactly one site in 156 runs a blanket disallow, and it is the only block in the whole dataset that reads like a deliberate choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloudflare wrote the block, not the founder
&lt;/h2&gt;

&lt;p&gt;Cloudflare authored the blocks on 33 of the 156 sites (21.2%). That is 50.8% of the 59 Cloudflare-fronted launches, and Cloudflare fronts 37.8% of the cohort overall.&lt;/p&gt;

&lt;p&gt;The cost is concrete. atlasmotion.com launched motors for drones and robotics with 406 words of readable homepage HTML and one point on Hacker News. That page is unreachable to ChatGPT, Claude, Google AI Overviews and Perplexity at once. zipbox.ai shipped 2,141 words about Firecracker VMs for agents and has the same four-engine verdict.&lt;/p&gt;

&lt;p&gt;One founder in r/SEO put it plainly: "&lt;a href="https://www.reddit.com/r/SEO/comments/1srlq0o/cloudflare_has_been_quietly_blocking_gptbot_and/" rel="noopener noreferrer"&gt;Then I ran a curl on /robots.txt and saw this block that I definitely didn't write&lt;/a&gt;".&lt;/p&gt;

&lt;h2&gt;
  
  
  Half of the blocks are theater
&lt;/h2&gt;

&lt;p&gt;On 12 of the 23 managed-file sites, the origin still hands ClaudeBot a 200. The block exists only on paper, which is worse than either alternative: crawlers that respect robots.txt stay away from a page the server was happy to serve. You get the traffic loss of a block with none of the protection, and nothing in your logs looks broken.&lt;/p&gt;

&lt;h2&gt;
  
  
  Twelve rows you can read line by line
&lt;/h2&gt;

&lt;p&gt;Rows where robots.txt names GPTBot, ClaudeBot and Google-Extended but the 403 column is empty are paper-only blocks. Rows where the 403 column is long and the robots column is empty are silent CDN blocks. Rows with both are invisible to all four engines.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;host&lt;/th&gt;
&lt;th&gt;server&lt;/th&gt;
&lt;th&gt;CF managed robots.txt&lt;/th&gt;
&lt;th&gt;robots.txt disallows&lt;/th&gt;
&lt;th&gt;HTTP 403 to&lt;/th&gt;
&lt;th&gt;engines unreachable&lt;/th&gt;
&lt;th&gt;words in raw HTML&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;atlasmotion.com&lt;/td&gt;
&lt;td&gt;cloudflare&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;GPTBot, ClaudeBot, Google-Extended&lt;/td&gt;
&lt;td&gt;OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-User, Claude-SearchBot, PerplexityBot&lt;/td&gt;
&lt;td&gt;ChatGPT, Claude, Google AI Overviews, Perplexity&lt;/td&gt;
&lt;td&gt;406&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;zipbox.ai&lt;/td&gt;
&lt;td&gt;cloudflare&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;GPTBot, ClaudeBot, Google-Extended&lt;/td&gt;
&lt;td&gt;OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-User, Claude-SearchBot, PerplexityBot&lt;/td&gt;
&lt;td&gt;ChatGPT, Claude, Google AI Overviews, Perplexity&lt;/td&gt;
&lt;td&gt;2141&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;portfoliovideo.com&lt;/td&gt;
&lt;td&gt;cloudflare&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;GPTBot, ClaudeBot, Google-Extended&lt;/td&gt;
&lt;td&gt;OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-User, Claude-SearchBot, PerplexityBot&lt;/td&gt;
&lt;td&gt;ChatGPT, Claude, Google AI Overviews, Perplexity&lt;/td&gt;
&lt;td&gt;2554&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fosbury.ai&lt;/td&gt;
&lt;td&gt;cloudflare&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;GPTBot, ClaudeBot, Google-Extended&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;Claude, Google AI Overviews&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cochat.ai&lt;/td&gt;
&lt;td&gt;cloudflare&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;GPTBot, ClaudeBot, Google-Extended&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;Claude, Google AI Overviews&lt;/td&gt;
&lt;td&gt;1571&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;imagetovideoai.tools&lt;/td&gt;
&lt;td&gt;cloudflare&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;GPTBot, ClaudeBot, Google-Extended&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;Claude, Google AI Overviews&lt;/td&gt;
&lt;td&gt;1215&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;scalequest.io&lt;/td&gt;
&lt;td&gt;cloudflare&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;GPTBot, ClaudeBot, Google-Extended&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;Claude, Google AI Overviews&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;usecharming.com&lt;/td&gt;
&lt;td&gt;cloudflare&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;Claude, Google AI Overviews, Perplexity&lt;/td&gt;
&lt;td&gt;1241&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;spacescience.tech&lt;/td&gt;
&lt;td&gt;cloudflare&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-User, Claude-SearchBot, PerplexityBot&lt;/td&gt;
&lt;td&gt;ChatGPT, Claude, Perplexity&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;today.spqrk.net&lt;/td&gt;
&lt;td&gt;Apache&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;ClaudeBot&lt;/td&gt;
&lt;td&gt;Claude&lt;/td&gt;
&lt;td&gt;1163&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;reelang.com&lt;/td&gt;
&lt;td&gt;cloudflare&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;GPTBot, ClaudeBot, Google-Extended&lt;/td&gt;
&lt;td&gt;OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-User, Claude-SearchBot, PerplexityBot, Google-Extended&lt;/td&gt;
&lt;td&gt;Claude, Google AI Overviews&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;modelplane.dev&lt;/td&gt;
&lt;td&gt;cloudflare&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;GPTBot, ClaudeBot, Google-Extended&lt;/td&gt;
&lt;td&gt;OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-User, Claude-SearchBot, PerplexityBot&lt;/td&gt;
&lt;td&gt;ChatGPT, Claude, Google AI Overviews, Perplexity&lt;/td&gt;
&lt;td&gt;393&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;reelang.com is the row to stare at: three readable words in the un-executed HTML, a managed robots.txt disallowing three crawlers, and a server refusing seven user-agents including Google-Extended. A language-learning product with speech-analyzed native speaker video, and an assistant asked about it has nothing to read.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ChatGPT block is silent; the Google block is written down
&lt;/h2&gt;

&lt;p&gt;The two layers block opposite engines. robots.txt in this cohort forbids ClaudeBot, GPTBot and Google-Extended. The CDN and WAF layer refuses OAI-SearchBot, ChatGPT-User, Claude-User, Claude-SearchBot and PerplexityBot at the network layer, where nothing is declared.&lt;/p&gt;

&lt;p&gt;15 sites (9.6%) returned a non-200 to at least one AI crawler. OAI-SearchBot and PerplexityBot were refused on 14 each (9.0%). Google-Extended was refused on only 2 (1.3%), and on 13 of those 15 sites (86.7%) Google-Extended got a 200 while every other AI crawler got a 403.&lt;/p&gt;

&lt;p&gt;Stack the layers and honesty goes lopsided:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google AI Overviews: unreachable on 25 sites (16.0%), only 4.0% of those blocks silent.&lt;/li&gt;
&lt;li&gt;ChatGPT: unreachable on 15 sites (9.6%), 93.3% silent.&lt;/li&gt;
&lt;li&gt;Perplexity: unreachable on 15 sites (9.6%), 93.3% silent.&lt;/li&gt;
&lt;li&gt;Claude: worst off at 28 sites (17.9%), at least 14.3% silent, the rest declared.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A commenter in r/SEO described the intent behind the split: "&lt;a href="https://www.reddit.com/r/SEO/comments/1ua5kzn/why_cloudflare_is_blocking_als_and_llms_by_default/" rel="noopener noreferrer"&gt;Cloudflare blocks the training bots, not the ones that handle search/appearance on the platform. For example, Cloudflare will block GPTBot and allow OAI-SearchBot&lt;/a&gt;". The measurement says the bot-fight rules underneath do not honor that split.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your host decides your visibility more than your craft does
&lt;/h2&gt;

&lt;p&gt;Cloudflare-fronted launches are invisible at 47.5% of 59 sites. Vercel-fronted launches are invisible at 2.6% of 39. That is a ratio of 18.5, and Cloudflare accounts for 82.4% of every invisible site while making up 37.8% of the cohort. nginx sat at 10.0% invisible across 20 sites.&lt;/p&gt;

&lt;p&gt;Each stack fails differently. Cloudflare's failure is the block: 8.5% JavaScript-only, only 6.8% missing robots.txt. Vercel's failure is absence: 28.2% serve no robots.txt at all, nginx 35.0%. The 10 launches on shared app-platform subdomains were 20.0% invisible, 20.0% JavaScript-only shells, and 80.0% with no robots.txt.&lt;/p&gt;

&lt;p&gt;Cohort-wide: 21.8% of the 156 are invisible to at least one engine and 71.8% are fully clean. 15.4% blocked in robots.txt, 9.6% refused at the network layer, 5.8% ship an empty JavaScript shell, 19.2% serve no robots.txt, 9.0% are thin HTML. Median readable words in raw HTML: 687. Sitemap declared: 67.3%.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four checks you can run before your coffee cools
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;curl https://yoursite.com/robots.txt&lt;/code&gt; and look for a Content-Signal preamble. 21.2% of the cohort has one; 50.8% of Cloudflare-fronted sites do. If it disallows ClaudeBot, GPTBot and Google-Extended while declaring &lt;code&gt;search=yes&lt;/code&gt;, you did not write that.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;curl -A "OAI-SearchBot" -I https://yoursite.com&lt;/code&gt;, then repeat for ChatGPT-User, ClaudeBot, Claude-User, Claude-SearchBot, PerplexityBot and Google-Extended. 9.6% of the cohort returns a non-200 to at least one, and 93.3% of the ChatGPT blocks appear nowhere in robots.txt.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;curl -s https://yoursite.com | wc -w&lt;/code&gt; on the un-executed HTML. 5.8% of launches ship a shell that is empty until JavaScript runs. Median was 687 words. scalequest.io shipped five, reelang.com three.&lt;/li&gt;
&lt;li&gt;Confirm robots.txt and sitemap.xml exist at all. 19.2% serve no robots.txt, only 67.3% declare a sitemap. On Vercel that miss rate was 28.2%, on nginx 35.0%.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What this data cannot say
&lt;/h2&gt;

&lt;p&gt;Homepage only, one request per user-agent, one two-day slice of Show HN, so a rate limit or transient 403 can read as a permanent block. We made no attempt to verify that a user-agent string belonged to the vendor it claims. We did not test Cloudflare defaults, only outcomes.&lt;/p&gt;

&lt;p&gt;This study also counts ClaudeBot among retrieval crawlers and GPTBot as training-only, and blocking ClaudeBot does not remove a site from Claude entirely: the 23 sites disallowing ClaudeBot still allow Claude-User and Claude-SearchBot, so exposure is reduced, not zero. Claude still came out worst overall because the network layer refused Claude-User and Claude-SearchBot on 14 sites each, separately from anything robots.txt said.&lt;/p&gt;

&lt;p&gt;Method, briefly: Hacker News Algolia &lt;code&gt;search_by_date&lt;/code&gt; with &lt;code&gt;tags=show_hn&lt;/code&gt;, newest first, no upvote filter, deduped by host, code hosts and app stores and socials and doc hosts dropped. 274 posts scanned down to 170 hosts, 166 reachable, 156 on their own domain and 10 on shared app-platform subdomains. Nine requests per homepage, no crawl beyond it. Spot checks reproduced by hand with &lt;code&gt;curl -A&lt;/code&gt; on atlasmotion.com and zipbox.ai.&lt;/p&gt;

&lt;p&gt;Run check 1 on your own domain and tell me what came back: did you write that file, or did your CDN?&lt;br&gt;
Full dataset, per-host rows and the recompute script live on the Viewfy blog.&lt;/p&gt;

&lt;h2&gt;
  
  
  Correction, added after publication
&lt;/h2&gt;

&lt;p&gt;A founder in the cohort pushed back on the network layer numbers, and he was right. Our probes sent crawler user agents from an ordinary IP, so a 403 in that setup measures how a CDN treats an impersonator, not the real crawler. Verified bots calling from their published IP ranges typically pass. The robots.txt findings in this post are unaffected, that file is public text anyone can read. But treat every "unreachable" and WAF number above as "unmeasurable from the outside", not "blocked". We have changed the methodology so outbound claims only use the robots.txt layer.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>seo</category>
      <category>webdev</category>
      <category>cloudflare</category>
    </item>
  </channel>
</rss>
