<?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: Nadeem Akram</title>
    <description>The latest articles on DEV Community by Nadeem Akram (@nadeemakram035).</description>
    <link>https://dev.to/nadeemakram035</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%2F4141878%2Fe40cae63-9e1a-4d69-b9c3-9fab941b4027.jpg</url>
      <title>DEV Community: Nadeem Akram</title>
      <link>https://dev.to/nadeemakram035</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nadeemakram035"/>
    <language>en</language>
    <item>
      <title>Spot the bug: one character breaks this JSON</title>
      <dc:creator>Nadeem Akram</dc:creator>
      <pubDate>Thu, 05 Nov 2026 08:19:55 +0000</pubDate>
      <link>https://dev.to/nadeemakram035/spot-the-bug-one-character-breaks-this-json-43a6</link>
      <guid>https://dev.to/nadeemakram035/spot-the-bug-one-character-breaks-this-json-43a6</guid>
      <description>&lt;p&gt;Quick puzzle 🧩&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%2Fz4p8g6bp08lbrogc2x3a.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%2Fz4p8g6bp08lbrogc2x3a.png" alt=" " width="800" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The JSON in the image looks fine, but JSON.parse() rejects it, and so will most APIs.&lt;/p&gt;

&lt;p&gt;One character is the problem. Which line is it on?&lt;/p&gt;

&lt;p&gt;Hint: it's a habit JavaScript allows and JSON doesn't.&lt;/p&gt;

&lt;p&gt;Comment your line number. We'll post the answer this evening.&lt;/p&gt;

&lt;p&gt;When you hit "Unexpected token" for real, paste the JSON into a validator before you hunt through a 500-line file: &lt;a href="https://seopeck.com/tool/json-validator" rel="noopener noreferrer"&gt;https://seopeck.com/tool/json-validator&lt;/a&gt;&lt;/p&gt;

</description>
      <category>json</category>
      <category>ai</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Is the Website Down? How to Actually Check, Step by Step</title>
      <dc:creator>Nadeem Akram</dc:creator>
      <pubDate>Tue, 03 Nov 2026 12:38:37 +0000</pubDate>
      <link>https://dev.to/nadeemakram035/is-the-website-down-how-to-actually-check-step-by-step-266</link>
      <guid>https://dev.to/nadeemakram035/is-the-website-down-how-to-actually-check-step-by-step-266</guid>
      <description>&lt;p&gt;![Is the Website Down? How to Actually Check, Step by Step]&lt;/p&gt;

&lt;p&gt;A step-by-step way to figure out whether a site is down for everyone or just for you, and what each result actually tells you.&lt;/p&gt;

&lt;p&gt;A website not loading could mean a dozen different things: the server is down, DNS has not propagated, your own network has an issue, or an SSL certificate has expired. Guessing wastes time. Working through the checks in order tells you exactly where the problem sits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Confirm it is not just you
&lt;/h2&gt;

&lt;p&gt;Before assuming a site is down, rule out your own connection or device. Try loading the site on a different network, such as switching from Wi-Fi to mobile data, or ask someone else to check. If it works for them and not you, the problem is local to your network, browser cache, or DNS resolver, not the website itself.&lt;/p&gt;

&lt;p&gt;If you cannot easily ask someone else, SEOpeck's &lt;a href="https://seopeck.com/tool/website-status-checker" rel="noopener noreferrer"&gt;Website Status Checker&lt;/a&gt; checks a site's live status from an independent location, which settles the question in one click.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Check basic connectivity
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://seopeck.com/tool/ping" rel="noopener noreferrer"&gt;Ping tool&lt;/a&gt; tests whether a server is responding at all, and how long it takes to reply. No response at all points toward the server being down or a firewall blocking the request. A slow but successful response points toward a performance problem rather than an outage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Check the HTTP status code
&lt;/h2&gt;

&lt;p&gt;If the site loads but shows an error, the HTTP status code tells you what kind of error it is. A 5xx code (like 500 or 503) means the server itself hit a problem. A 4xx code (like 404 or 403) means the server responded fine but is refusing or cannot find the specific request. The &lt;a href="https://seopeck.com/tool/http-status-code-checker" rel="noopener noreferrer"&gt;HTTP Status Code Checker&lt;/a&gt; shows this directly, and the &lt;a href="https://seopeck.com/tool/redirect-checker" rel="noopener noreferrer"&gt;Redirect Checker&lt;/a&gt; is useful when a URL seems to be looping or landing somewhere unexpected. Our guide to &lt;a href="https://seopeck.com/blog/http-status-codes-explained" rel="noopener noreferrer"&gt;what each HTTP status code means&lt;/a&gt; covers the codes you are likely to see, and &lt;a href="https://seopeck.com/blog/301-vs-302-redirects" rel="noopener noreferrer"&gt;301 vs 302 redirects&lt;/a&gt; explains how redirect loops and chains happen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Check DNS
&lt;/h2&gt;

&lt;p&gt;If the domain will not resolve at all, DNS is a likely suspect, especially after a recent domain or hosting change. If every record has disappeared at once, check that the registration has not lapsed: the &lt;a href="https://seopeck.com/tool/domain-age-checker" rel="noopener noreferrer"&gt;Domain Age Checker&lt;/a&gt; shows when a domain expires. The &lt;a href="https://seopeck.com/tool/dns-lookup" rel="noopener noreferrer"&gt;DNS Lookup tool&lt;/a&gt; shows the current A record and whether it points where you expect; the &lt;a href="https://seopeck.com/tool/hosting-checker" rel="noopener noreferrer"&gt;Hosting Checker&lt;/a&gt; tells you which host that address belongs to. If the record types are unfamiliar, &lt;a href="https://seopeck.com/blog/dns-records-explained" rel="noopener noreferrer"&gt;DNS records explained&lt;/a&gt; covers A, AAAA, MX, TXT and CNAME. If DNS was changed recently, it can take time to fully propagate, so a record that looks correct but is not working everywhere yet is not necessarily broken.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Check the SSL certificate
&lt;/h2&gt;

&lt;p&gt;Browsers block access outright to sites with an expired or misconfigured SSL certificate, which can look identical to the site being "down" at first glance. The &lt;a href="https://seopeck.com/tool/ssl-checker" rel="noopener noreferrer"&gt;SSL Checker&lt;/a&gt; confirms whether the certificate is valid and how long it has left before it expires, which is worth checking on a recurring basis, since a forgotten renewal is a surprisingly common cause of sudden outages. If the browser shows a certificate warning, &lt;a href="https://seopeck.com/blog/ssl-certificate-errors-explained" rel="noopener noreferrer"&gt;SSL certificate errors explained&lt;/a&gt; covers each fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Check the mail and network layer, if relevant
&lt;/h2&gt;

&lt;p&gt;If the issue is specifically email not arriving rather than the website itself, the &lt;a href="https://seopeck.com/tool/mx-lookup" rel="noopener noreferrer"&gt;MX Lookup tool&lt;/a&gt; confirms mail is routed correctly. For deeper server-side troubleshooting, the &lt;a href="https://seopeck.com/tool/open-port-checker" rel="noopener noreferrer"&gt;Open Port Checker&lt;/a&gt; tests whether a specific port is reachable, which is useful when a service on a server is unreachable but the server itself responds to a ping.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting it together
&lt;/h2&gt;

&lt;p&gt;Confirm it is not local, check connectivity, read the status code, check DNS, then check SSL. Working through those five checks in order takes a couple of minutes and almost always identifies exactly where the problem is, instead of guessing and waiting for it to resolve itself.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>discuss</category>
    </item>
    <item>
      <title>301 vs 302 Redirects: Which One to Use, and How to Check Them</title>
      <dc:creator>Nadeem Akram</dc:creator>
      <pubDate>Fri, 30 Oct 2026 09:34:47 +0000</pubDate>
      <link>https://dev.to/nadeemakram035/301-vs-302-redirects-which-one-to-use-and-how-to-check-them-2g7i</link>
      <guid>https://dev.to/nadeemakram035/301-vs-302-redirects-which-one-to-use-and-how-to-check-them-2g7i</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://seopeck.com/blog/301-vs-302-redirects" rel="noopener noreferrer"&gt;seopeck.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A redirect sends visitors and search engines from one URL to another. You need one whenever a page moves, a site switches to HTTPS, two domains merge, or you tidy up old URLs. The two redirects people use most are 301 and 302, and choosing the wrong one is one of the most common technical SEO mistakes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short answer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;301 (permanent):&lt;/strong&gt; the old URL is gone for good. Use it for site moves, HTTP to HTTPS, www to non-www, renamed pages and merged content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;302 (temporary):&lt;/strong&gt; the old URL will come back. Use it for short-term promotions, A/B tests, or sending visitors to a page while the original is being fixed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are not sure, ask yourself: "Will I ever want the old URL to show up in search results again?" If the answer is no, use a 301.&lt;/p&gt;

&lt;h2&gt;
  
  
  How search engines treat each one
&lt;/h2&gt;

&lt;p&gt;With a &lt;strong&gt;301&lt;/strong&gt;, search engines gradually replace the old URL with the new one in their index and pass the old page's ranking signals, such as links pointing to it, to the new address.&lt;/p&gt;

&lt;p&gt;With a &lt;strong&gt;302&lt;/strong&gt;, search engines usually keep the original URL indexed because you have said the move is temporary. Google has said that a 302 left in place for a long time may eventually be treated like a 301, but relying on that is slow and unpredictable. If a move is permanent, say so with a 301.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about 307 and 308?
&lt;/h2&gt;

&lt;p&gt;307 and 308 are the modern, stricter versions of 302 and 301. The difference is that they guarantee the request method stays the same, so a form sent with POST is resent with POST. For ordinary page moves, 301 and 302 are fine; 307 and 308 matter mostly for APIs and forms. Browsers also generate an internal 307 when a site uses HSTS to force HTTPS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common redirect mistakes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Redirect chains
&lt;/h3&gt;

&lt;p&gt;A chain is when URL A redirects to B, which redirects to C. Each hop adds delay, and crawlers may stop following after several hops. After a migration, update old redirects so each one points straight to the final URL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Redirect loops
&lt;/h3&gt;

&lt;p&gt;A loop is when A redirects to B and B redirects back to A. Browsers give up with a "too many redirects" error. Loops often come from conflicting rules, for example one rule forcing www and another removing it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Redirecting everything to the homepage
&lt;/h3&gt;

&lt;p&gt;When pages are removed, sending all of them to the homepage is tempting but unhelpful. Search engines often treat it as a soft 404. Redirect each old page to the most relevant new page, and let pages with no equivalent return 404 or 410.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mixing up HTTP and HTTPS, www and non-www
&lt;/h3&gt;

&lt;p&gt;Pick one canonical version of your domain, such as &lt;code&gt;https://example.com&lt;/code&gt;, and 301 every other variation to it in a single hop.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to create a redirect
&lt;/h2&gt;

&lt;p&gt;On an Apache or LiteSpeed server, redirects usually live in the &lt;code&gt;.htaccess&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Redirect 301 /old-page https://example.com/new-page
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;a href="https://seopeck.com/tool/htaccess-generator" rel="noopener noreferrer"&gt;.htaccess Redirect Generator&lt;/a&gt; writes these rules for you, including whole-domain moves. On Nginx, redirects go in the server configuration, and most content management systems have a redirect plugin or setting.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to check a redirect
&lt;/h2&gt;

&lt;p&gt;Paste the old URL into the &lt;a href="https://seopeck.com/tool/redirect-checker" rel="noopener noreferrer"&gt;Redirect Checker&lt;/a&gt;. It shows every hop, the status code of each one and where the chain ends. Check that there is exactly one hop, that it is a 301 for permanent moves, and that the final page returns 200. The &lt;a href="https://seopeck.com/tool/http-status-code-checker" rel="noopener noreferrer"&gt;HTTP Status Code Checker&lt;/a&gt; is a quick way to confirm the destination works, and the guide to &lt;a href="https://seopeck.com/blog/http-status-codes-explained" rel="noopener noreferrer"&gt;HTTP status codes&lt;/a&gt; explains the rest of the codes you may see along the way.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Check MX Records (and Fix Email Not Arriving)</title>
      <dc:creator>Nadeem Akram</dc:creator>
      <pubDate>Tue, 27 Oct 2026 09:14:25 +0000</pubDate>
      <link>https://dev.to/nadeemakram035/how-to-check-mx-records-and-fix-email-not-arriving-1ba1</link>
      <guid>https://dev.to/nadeemakram035/how-to-check-mx-records-and-fix-email-not-arriving-1ba1</guid>
      <description>&lt;p&gt;See any domain’s MX records in seconds, online or with nslookup and dig, learn to read the priority numbers, and work through the checks that find out why email is not arriving.&lt;/p&gt;

&lt;p&gt;To check a domain’s MX records, type the domain into an &lt;a href="https://seopeck.com/tool/mx-lookup" rel="noopener noreferrer"&gt;MX Lookup tool&lt;/a&gt;, or run &lt;code&gt;nslookup -q=mx example.com&lt;/code&gt; on Windows or &lt;code&gt;dig mx example.com +short&lt;/code&gt; on Mac and Linux. You get back a list of mail servers, each with a priority number. The lowest number is the server other mail systems try first.&lt;/p&gt;

&lt;p&gt;If email to your domain bounces or never shows up, the rest of this guide shows how to read the result, what correct records look like for Google Workspace, Microsoft 365 and Zoho, and the checks to run, in order.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an MX record does
&lt;/h2&gt;

&lt;p&gt;When someone sends a message to &lt;code&gt;you@yourdomain.com&lt;/code&gt;, their mail server asks DNS one question: "Which servers accept mail for yourdomain.com?" The answer is the domain's MX (mail exchanger) records. Each one names a mail server and gives it a preference number. The sender tries the lowest number first and moves to higher numbers only if that server cannot be reached.&lt;/p&gt;

&lt;p&gt;Here are the two MX records for seopeck.com, as a DNS zone file would show them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;seopeck.com. 14400 IN MX 5 mx1.hostinger.com. seopeck.com. 14400 IN MX 10 mx2.hostinger.com.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mail goes to &lt;code&gt;mx1.hostinger.com&lt;/code&gt; (priority 5) first, and to &lt;code&gt;mx2.hostinger.com&lt;/code&gt; (priority 10) as a backup. The &lt;code&gt;14400&lt;/code&gt; is the TTL: resolvers may cache this answer for four hours. MX records only decide where mail is &lt;em&gt;delivered&lt;/em&gt;, not how it is sent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The quickest way: check MX records online
&lt;/h2&gt;

&lt;p&gt;An online lookup is the fastest option and works from any device, including a phone.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Open the &lt;a href="https://seopeck.com/tool/mx-lookup" rel="noopener noreferrer"&gt;MX Lookup&lt;/a&gt; tool.&lt;/li&gt;
&lt;li&gt; Type the domain, for example &lt;code&gt;seopeck.com&lt;/code&gt;. You can also paste a full page address or an email address, such as &lt;code&gt;https://www.seopeck.com/blog&lt;/code&gt; or &lt;code&gt;you@seopeck.com&lt;/code&gt;; the tool reduces it to the domain.&lt;/li&gt;
&lt;li&gt; Click &lt;strong&gt;Lookup&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For seopeck.com the result is two lines, sorted from the lowest priority number to the highest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Priority: 5, MX Host: mx1.hostinger.com, IP Address: 172.65.182.103 Priority: 10, MX Host: mx2.hostinger.com, IP Address: 172.65.182.103
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each line has a &lt;strong&gt;Copy&lt;/strong&gt; link for the hostname, and the share menu below lets you copy a link to the result or save it as a report for your host or IT person. If the tool says &lt;strong&gt;No MX records found for this domain&lt;/strong&gt;, jump to the troubleshooting list below.&lt;/p&gt;

&lt;p&gt;To see the MX records next to the domain’s A, TXT and CNAME records in one go, use the &lt;a href="https://seopeck.com/tool/dns-lookup" rel="noopener noreferrer"&gt;DNS Lookup&lt;/a&gt; tool instead; our walkthrough on &lt;a href="https://seopeck.com/blog/dns-lookup-tool-check-dns-records" rel="noopener noreferrer"&gt;checking all of a domain’s DNS records&lt;/a&gt; shows how to read that output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check MX records from the command line
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Windows: nslookup
&lt;/h2&gt;

&lt;p&gt;Open Command Prompt or PowerShell and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nslookup &lt;span class="nt"&gt;-q&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mx seopeck.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Real output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Non-authoritative answer: seopeck.com MX preference = 10, mail exchanger = mx2.hostinger.com seopeck.com MX preference = 5, mail exchanger = mx1.hostinger.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-type=mx&lt;/code&gt; does the same thing as &lt;code&gt;-q=mx&lt;/code&gt;. Notice the order: nslookup lists the records in whatever order the DNS server sent them, not by priority. Always read the &lt;code&gt;preference&lt;/code&gt; number, not the line order. "Non-authoritative answer" only means the reply came from a cache rather than from the domain's own name servers. It is normal.&lt;/p&gt;

&lt;p&gt;In PowerShell you can also use &lt;code&gt;Resolve-DnsName seopeck.com -Type MX&lt;/code&gt;, which prints a table with &lt;code&gt;NameExchange&lt;/code&gt; and &lt;code&gt;Preference&lt;/code&gt; columns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mac and Linux: dig and hos
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig mx seopeck.com +shor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10 mx2.hostinger.com. 5 mx1.hostinger.com.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without &lt;code&gt;+short&lt;/code&gt;, dig prints the full answer section, including the TTL. The &lt;code&gt;host&lt;/code&gt; command gives a more readable line per record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;host &lt;span class="nt"&gt;-t&lt;/span&gt; mx seopeck.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It prints lines in the form &lt;code&gt;seopeck.com mail is handled by 5 mx1.hostinger.com.&lt;/code&gt; The trailing dot on the hostnames is normal DNS notation for a fully qualified name.&lt;/p&gt;

&lt;p&gt;To ask one specific DNS server, add it to the command: &lt;code&gt;nslookup -q=mx seopeck.com 8.8.8.8&lt;/code&gt; or &lt;code&gt;dig mx seopeck.com @8.8.8.8&lt;/code&gt;. That is useful right after a change, when your own network may still have the old answer cached.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to read the result
&lt;/h2&gt;

&lt;p&gt;Priority (preference)&lt;/p&gt;

&lt;p&gt;Order in which senders try the servers. Lower is tried first.&lt;/p&gt;

&lt;p&gt;Your provider’s main server has the lowest number. Servers with the same number share the load at random.&lt;/p&gt;

&lt;p&gt;Host (mail exchanger)&lt;/p&gt;

&lt;p&gt;The hostname of a server that accepts mail for the domain.&lt;/p&gt;

&lt;p&gt;It belongs to your current email provider, not a previous one.&lt;/p&gt;

&lt;p&gt;IP&lt;/p&gt;

&lt;p&gt;The IPv4 address that hostname resolves to.&lt;/p&gt;

&lt;p&gt;A real address. In MX Lookup, if the IP column repeats the hostname instead of showing numbers, that hostname did not resolve to an IPv4 address and mail sent to it cannot be delivered.&lt;/p&gt;

&lt;p&gt;The actual priority numbers do not matter, only their order. &lt;code&gt;5&lt;/code&gt; and &lt;code&gt;10&lt;/code&gt; behave exactly like &lt;code&gt;1&lt;/code&gt; and &lt;code&gt;2&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What correct MX records look like for Google Workspace, Microsoft 365 and Zoho
&lt;/h2&gt;

&lt;p&gt;These values come from each provider’s own setup pages (checked October 2026). Your provider’s admin console always has the final word for your domain.&lt;/p&gt;

&lt;p&gt;A few notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Google:&lt;/strong&gt; Google says the older &lt;code&gt;aspmx&lt;/code&gt; records still work, so there is no need to change them if mail is arriving. Do not mix the old set with &lt;code&gt;smtp.google.com&lt;/code&gt;, and remove every MX record that is not Google's.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Microsoft 365:&lt;/strong&gt; copy the exact value from the admin center (Settings, Domains, DNS records). Microsoft is moving new domains to hosts under &lt;code&gt;mx.microsoft&lt;/code&gt;, so do not assume the older &lt;code&gt;mail.protection.outlook.com&lt;/code&gt; pattern.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Zoho:&lt;/strong&gt; the domain ending depends on the data center your account uses (for example a &lt;code&gt;.eu&lt;/code&gt; or &lt;code&gt;.in&lt;/code&gt; account). Use the values shown in your Zoho admin console.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Email isn’t arriving? Check these in order
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;No MX records at all.&lt;/strong&gt; If MX Lookup finds nothing, check the spelling of the domain first. If it is correct, the records were never added, or were lost when the domain’s name servers changed (for example after moving DNS to a new host or to Cloudflare). Add the records your email provider gives you at whichever company runs your DNS today.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;A null MX.&lt;/strong&gt; A single record with priority 0 and a host of just “.” (nslookup shows it as &lt;code&gt;(root)&lt;/code&gt;, dig as &lt;code&gt;0 .&lt;/code&gt;) is a "null MX", defined in RFC 7505. It means "this domain accepts no email", and senders give up immediately. &lt;code&gt;example.com&lt;/code&gt; has one on purpose. If yours does and you want email, replace it with your provider's records.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;A typo in the hostname.&lt;/strong&gt; One wrong letter and the mail server name does not exist. Compare the host character by character with your provider’s setup page, and watch for a domain added twice, such as &lt;code&gt;smtp.google.com.yourdomain.com&lt;/code&gt;. Some DNS panels append your domain unless the value ends with a dot.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;The MX points to an IP address or a CNAME.&lt;/strong&gt; An MX record must name a host, and that host must have its own A or AAAA record (RFC 5321, section 5.1). An IP address typed into the host field is read as a hostname and will not work. RFC 2181 also says an MX must not point to an alias, so do not aim it at a hostname that is a CNAME. Point it at a real mail server name and check that name resolves with &lt;a href="https://seopeck.com/tool/hostname-to-ip" rel="noopener noreferrer"&gt;Hostname to IP&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;The old provider is still listed.&lt;/strong&gt; After a move, leftover MX records from the previous host mean some mail still goes there. Google and Microsoft both tell you to remove the old records. If the old server has a lower number than the new one, almost all mail goes to the old host.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;The change has not reached everyone yet.&lt;/strong&gt; Resolvers keep the previous answer until its TTL runs out. See the next section.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Mail arrives, but in spam.&lt;/strong&gt; Then MX records are fine; the problem is trust. Check that the domain publishes SPF, DKIM and DMARC records with the &lt;a href="https://seopeck.com/tool/spf-dkim-dmarc-checker" rel="noopener noreferrer"&gt;SPF, DKIM &amp;amp; DMARC Checker&lt;/a&gt;, that the sending server’s IP is not on a blocklist with the &lt;a href="https://seopeck.com/tool/email-blacklist-checker" rel="noopener noreferrer"&gt;Email Blacklist Checker&lt;/a&gt;, and that its IP has reverse DNS with &lt;a href="https://seopeck.com/tool/ip-to-hostname" rel="noopener noreferrer"&gt;IP to Hostname&lt;/a&gt;. Pasting a received message’s headers into the &lt;a href="https://seopeck.com/tool/email-header-analyzer" rel="noopener noreferrer"&gt;Email Header Analyzer&lt;/a&gt; shows which servers handled it and whether SPF, DKIM and DMARC passed.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  After you change MX records: how long it takes
&lt;/h2&gt;

&lt;p&gt;New MX records work as soon as your DNS host publishes them, but resolvers that cached the old answer keep using it until the old TTL expires. With a TTL of 3600 (one hour) most of the world sees the change within an hour or two. With 14400 it can take four hours or more. Providers quote a safe upper limit: Google says up to 72 hours.&lt;/p&gt;

&lt;p&gt;Two tips make the switch smoother:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  A day before a planned move, lower the TTL on the existing MX records to 300 or 3600 seconds, so the change spreads faster when you make it.&lt;/li&gt;
&lt;li&gt;  Create the mailboxes at the new provider &lt;em&gt;before&lt;/em&gt; you change the MX records, so mail that arrives there has somewhere to go.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To watch the change spread, enter the domain in the &lt;a href="https://seopeck.com/tool/dns-propagation-checker" rel="noopener noreferrer"&gt;DNS Propagation Checker&lt;/a&gt; and choose MX. It shows which DNS servers around the world still return the old host. Our guide to &lt;a href="https://seopeck.com/blog/dns-records-explained" rel="noopener noreferrer"&gt;DNS records&lt;/a&gt; covers TTLs and the other record types in more detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;How do I check MX records for my domain?&lt;/p&gt;

&lt;p&gt;Enter the domain in the &lt;a href="https://seopeck.com/tool/mx-lookup" rel="noopener noreferrer"&gt;MX Lookup&lt;/a&gt; tool, or run &lt;code&gt;nslookup -q=mx yourdomain.com&lt;/code&gt; (Windows) or &lt;code&gt;dig mx yourdomain.com +short&lt;/code&gt; (Mac, Linux).&lt;/p&gt;

&lt;p&gt;Why does MX Lookup say no MX records were found?&lt;/p&gt;

&lt;p&gt;The domain is misspelled, does not exist, or has no MX records published at the DNS host that is currently in charge of it. Without MX records, senders may fall back to the domain’s A record, but that rarely points to a working mail server.&lt;/p&gt;

&lt;p&gt;Can an MX record point to an IP address or a CNAME?&lt;/p&gt;

&lt;p&gt;No to an IP address: the value must be a hostname that has its own A or AAAA record. A CNAME is not allowed either (RFC 2181). Some mail servers will still follow one, but many will not, so do not rely on it.&lt;/p&gt;

&lt;p&gt;How long do MX record changes take to work?&lt;/p&gt;

&lt;p&gt;Usually within the old record’s TTL, often one to four hours. Providers quote up to 48 or 72 hours as a worst case.&lt;/p&gt;

&lt;p&gt;Do I need more than one MX record?&lt;/p&gt;

&lt;p&gt;Not always. Google Workspace and Microsoft 365 each use a single record, and senders retry for days if a server is briefly down. Only add backups your provider gives you.&lt;/p&gt;

&lt;p&gt;My MX records are correct, but email still goes to spam. Why?&lt;/p&gt;

&lt;p&gt;MX records only route incoming mail. Spam placement depends on the sender’s SPF, DKIM, DMARC, reverse DNS and reputation. Start with the &lt;a href="https://seopeck.com/tool/spf-dkim-dmarc-checker" rel="noopener noreferrer"&gt;SPF, DKIM &amp;amp; DMARC Checker&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next step
&lt;/h2&gt;

&lt;p&gt;Run your domain through &lt;a href="https://seopeck.com/tool/mx-lookup" rel="noopener noreferrer"&gt;MX Lookup&lt;/a&gt; now and compare the hosts with the provider table above. If a whole website is unreachable rather than just its email, our &lt;a href="https://seopeck.com/blog/website-is-down-troubleshooting-guide" rel="noopener noreferrer"&gt;website down troubleshooting guide&lt;/a&gt; walks through the checks for that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;About the author&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://seopeck.com/page/about-us" rel="noopener noreferrer"&gt;&lt;strong&gt;Nadeem Akram&lt;/strong&gt;&lt;/a&gt; Founder and developer of &lt;strong&gt;SEOpeck&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nadeem builds and maintains the SEOpeck tools and writes the guides on this blog. He is a web developer who works on SEO, performance and the everyday problems of running a website.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at&lt;/em&gt; &lt;a href="https://seopeck.com/blog/how-to-check-mx-records" rel="noopener noreferrer"&gt;&lt;em&gt;https://seopeck.com&lt;/em&gt;&lt;/a&gt; &lt;em&gt;on October 27, 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seo</category>
    </item>
    <item>
      <title>Which AI Crawlers Do the Top 1,000 Websites Block? (robots.txt Study, October 2026)</title>
      <dc:creator>Nadeem Akram</dc:creator>
      <pubDate>Sat, 24 Oct 2026 14:03:00 +0000</pubDate>
      <link>https://dev.to/nadeemakram035/which-ai-crawlers-do-the-top-1000-websites-block-robotstxt-study-october-2026-31k</link>
      <guid>https://dev.to/nadeemakram035/which-ai-crawlers-do-the-top-1000-websites-block-robotstxt-study-october-2026-31k</guid>
      <description>&lt;p&gt;We read the robots.txt files of the 1,000 most popular websites: 20.9% block at least one of 16 AI bots. Per-bot shares, site strategies, common mistakes and open data.&lt;/p&gt;

&lt;p&gt;On 12 October 2026 we fetched the robots.txt file of each of the 1,000 most popular websites and checked 16 AI crawlers against it. &lt;strong&gt;209 of the 1,000 sites (20.9%) block at least one AI bot from the whole site; 789 (78.9%) let every one of them in.&lt;/strong&gt; Training crawlers are blocked most often (CCBot on 15.5% of sites, GPTBot on 13.8%), bots that fetch pages for AI search less often (OAI-SearchBot on 7.0%).&lt;/p&gt;

&lt;p&gt;Below are the five main findings, the bot-by-bot table, the strategies sites use, the mistakes we found and what it means for your own robots.txt. The per-site data and the method are open, so you can check any number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five key findings
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;About one site in five blocks AI bots.&lt;/strong&gt; 20.9% block at least one of the 16 AI crawlers from their home page. Only 2.0% (20 sites) block all 16.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Training is blocked more than search.&lt;/strong&gt; 20.6% block at least one training crawler, 12.4% at least one AI search bot and 11.8% at least one bot that fetches a page when a person asks for it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Half of the sites that block GPTBot still let OAI-SearchBot in:&lt;/strong&gt; 70 of 138. For Anthropic, 58 of the 131 sites that block ClaudeBot still allow Claude-SearchBot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The biggest sites block most.&lt;/strong&gt; 27% of the top 100 block at least one AI bot, against 23.8% of sites ranked 101–500 and 17.4% of sites ranked 501–1,000.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Files drift.&lt;/strong&gt; 109 sites still list the retired &lt;code&gt;anthropic-ai&lt;/code&gt; name and 94 list &lt;code&gt;Claude-Web&lt;/code&gt;; 49 sites serve a web page instead of a robots.txt file, so none of their rules exist for a crawler.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who we checked, in short
&lt;/h2&gt;

&lt;p&gt;We walked down the &lt;a href="https://tranco-list.eu/list/94GG2/1000000" rel="noopener noreferrer"&gt;Tranco research ranking&lt;/a&gt; (list 94GG2) and kept the first 1,000 domains that serve a real website, which took 2,364 domains: the raw list is full of infrastructure domains with no site behind them. For each site we read one robots.txt file with our own research bot, SEOpeckBot, and parsed it under RFC 9309, the robots.txt standard, using the same code as our &lt;a href="https://seopeck.com/tool/ai-crawler-checker" rel="noopener noreferrer"&gt;AI Crawler Checker&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;"Blocks a bot" in this study means the bot may not fetch the home page (&lt;code&gt;/&lt;/code&gt;) while Googlebot still may. A site that only keeps a bot out of some folders is not counted as blocking. 168 sites refused our bot outright and are left out; the full method and its limits are at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three kinds of AI bot, not two
&lt;/h2&gt;

&lt;p&gt;Most AI crawler studies split bots into "training" and "search". There is a third kind, and site owners treat each one differently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Training crawlers&lt;/strong&gt; collect pages to build AI models: GPTBot (OpenAI), ClaudeBot (Anthropic), CCBot (Common Crawl), Bytespider (ByteDance), Meta-ExternalAgent (Meta) and Amazonbot (Amazon). &lt;code&gt;Google-Extended&lt;/code&gt; and &lt;code&gt;Applebot-Extended&lt;/code&gt; belong here too, although they are control tokens rather than separate crawlers: Google and Apple read them to decide whether pages fetched by their normal crawlers may be used for AI models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI search bots&lt;/strong&gt; index pages so an assistant can find and cite them: OAI-SearchBot, Claude-SearchBot, PerplexityBot and Amzn-SearchBot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User-triggered fetchers&lt;/strong&gt; visit a page only when a person asks the assistant about it or pastes the link: ChatGPT-User, Claude-User, Perplexity-User and Amzn-User. Some operators say these fetchers may not apply robots.txt because a person asked for the page; Perplexity says so about Perplexity-User. Check each operator's documentation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Websites blocking at least one AI bot of each kind&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Training20.6%&lt;/li&gt;
&lt;li&gt;AI search12.4%&lt;/li&gt;
&lt;li&gt;User-triggered11.8%&lt;/li&gt;
&lt;li&gt;Any of the 16 AI bots20.9%&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;0%25%&lt;/p&gt;

&lt;p&gt;Source: SEOpeck robots.txt study, October 2026 (1,000 websites, Tranco list 94GG2).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kind of bot&lt;/th&gt;
&lt;th&gt;Bots in the study&lt;/th&gt;
&lt;th&gt;Sites blocking at least one&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Training&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;206 (20.6%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI search&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;124 (12.4%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User-triggered&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;118 (11.8%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Any of the 16&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;209 (20.9%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Almost every site that blocks AI bots blocks training: only 3 of the 209 block a search or user-triggered bot without blocking any training crawler. 48 sites block all eight training crawlers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bot by bot: who gets blocked
&lt;/h2&gt;

&lt;p&gt;The table shows, for each of the 16 AI bots, the share of the 1,000 websites that block it from the whole site, and the share whose robots.txt names it at all.&lt;/p&gt;

&lt;p&gt;Share of the 1,000 websites that block each AI bot site-wide&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Training&lt;/li&gt;
&lt;li&gt;AI search&lt;/li&gt;
&lt;li&gt;User-triggered&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;CCBot15.5%&lt;/li&gt;
&lt;li&gt;Bytespider15.2%&lt;/li&gt;
&lt;li&gt;GPTBot13.8%&lt;/li&gt;
&lt;li&gt;ClaudeBot13.1%&lt;/li&gt;
&lt;li&gt;Meta-ExternalAgent11.8%&lt;/li&gt;
&lt;li&gt;Google-Extended11.2%&lt;/li&gt;
&lt;li&gt;PerplexityBot10.5%&lt;/li&gt;
&lt;li&gt;Amazonbot9.8%&lt;/li&gt;
&lt;li&gt;Applebot-Extended9.7%&lt;/li&gt;
&lt;li&gt;ChatGPT-User9.0%&lt;/li&gt;
&lt;li&gt;Perplexity-User8.4%&lt;/li&gt;
&lt;li&gt;Claude-User7.9%&lt;/li&gt;
&lt;li&gt;Claude-SearchBot7.5%&lt;/li&gt;
&lt;li&gt;OAI-SearchBot7.0%&lt;/li&gt;
&lt;li&gt;Amzn-SearchBot5.1%&lt;/li&gt;
&lt;li&gt;Amzn-User4.8%&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;0%20%&lt;/p&gt;

&lt;p&gt;Google-Extended and Applebot-Extended are control tokens, not separate crawlers. Source: SEOpeck robots.txt study, October 2026 (1,000 websites, Tranco list 94GG2).&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;Operator&lt;/th&gt;
&lt;th&gt;Kind&lt;/th&gt;
&lt;th&gt;Blocked site-wide&lt;/th&gt;
&lt;th&gt;Named in robots.txt&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CCBot&lt;/td&gt;
&lt;td&gt;Common Crawl&lt;/td&gt;
&lt;td&gt;Training&lt;/td&gt;
&lt;td&gt;155 (15.5%)&lt;/td&gt;
&lt;td&gt;17.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bytespider&lt;/td&gt;
&lt;td&gt;ByteDance&lt;/td&gt;
&lt;td&gt;Training&lt;/td&gt;
&lt;td&gt;152 (15.2%)&lt;/td&gt;
&lt;td&gt;14.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPTBot&lt;/td&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;Training&lt;/td&gt;
&lt;td&gt;138 (13.8%)&lt;/td&gt;
&lt;td&gt;19.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ClaudeBot&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;td&gt;Training&lt;/td&gt;
&lt;td&gt;131 (13.1%)&lt;/td&gt;
&lt;td&gt;17.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meta-ExternalAgent&lt;/td&gt;
&lt;td&gt;Meta&lt;/td&gt;
&lt;td&gt;Training&lt;/td&gt;
&lt;td&gt;118 (11.8%)&lt;/td&gt;
&lt;td&gt;11.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google-Extended&lt;/td&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;td&gt;Training (control token)&lt;/td&gt;
&lt;td&gt;112 (11.2%)&lt;/td&gt;
&lt;td&gt;16.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PerplexityBot&lt;/td&gt;
&lt;td&gt;Perplexity&lt;/td&gt;
&lt;td&gt;AI search&lt;/td&gt;
&lt;td&gt;105 (10.5%)&lt;/td&gt;
&lt;td&gt;16.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazonbot&lt;/td&gt;
&lt;td&gt;Amazon&lt;/td&gt;
&lt;td&gt;Training&lt;/td&gt;
&lt;td&gt;98 (9.8%)&lt;/td&gt;
&lt;td&gt;10.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Applebot-Extended&lt;/td&gt;
&lt;td&gt;Apple&lt;/td&gt;
&lt;td&gt;Training (control token)&lt;/td&gt;
&lt;td&gt;97 (9.7%)&lt;/td&gt;
&lt;td&gt;10.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ChatGPT-User&lt;/td&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;User-triggered&lt;/td&gt;
&lt;td&gt;90 (9.0%)&lt;/td&gt;
&lt;td&gt;14.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perplexity-User&lt;/td&gt;
&lt;td&gt;Perplexity&lt;/td&gt;
&lt;td&gt;User-triggered&lt;/td&gt;
&lt;td&gt;84 (8.4%)&lt;/td&gt;
&lt;td&gt;9.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude-User&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;td&gt;User-triggered&lt;/td&gt;
&lt;td&gt;79 (7.9%)&lt;/td&gt;
&lt;td&gt;8.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude-SearchBot&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;td&gt;AI search&lt;/td&gt;
&lt;td&gt;75 (7.5%)&lt;/td&gt;
&lt;td&gt;8.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OAI-SearchBot&lt;/td&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;AI search&lt;/td&gt;
&lt;td&gt;70 (7.0%)&lt;/td&gt;
&lt;td&gt;13.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amzn-SearchBot&lt;/td&gt;
&lt;td&gt;Amazon&lt;/td&gt;
&lt;td&gt;AI search&lt;/td&gt;
&lt;td&gt;51 (5.1%)&lt;/td&gt;
&lt;td&gt;2.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amzn-User&lt;/td&gt;
&lt;td&gt;Amazon&lt;/td&gt;
&lt;td&gt;User-triggered&lt;/td&gt;
&lt;td&gt;48 (4.8%)&lt;/td&gt;
&lt;td&gt;2.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two things stand out. First, &lt;strong&gt;naming a bot is not the same as blocking it&lt;/strong&gt;: 195 sites name GPTBot, but 74 of them still let it fetch the home page, usually because they keep it out of some folders only. Second, Bytespider, Meta-ExternalAgent and the two Amazon AI bots are blocked by more sites than name them. That comes from "allowlist" files, explained in the next section.&lt;/p&gt;

&lt;p&gt;For comparison, the search engines we used as controls are almost never blocked: Googlebot on 2 sites (0.2%) and Bingbot on 7 (0.7%).&lt;/p&gt;

&lt;h2&gt;
  
  
  Site strategies: where does your site fit?
&lt;/h2&gt;

&lt;p&gt;Counting bots one by one hides how sites actually decide. So we put each site into one strategy, based on which kinds of AI bot it blocks from the home page.&lt;/p&gt;

&lt;p&gt;How the 1,000 websites treat AI bots (one strategy per site)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open to all AI bots78.9%&lt;/li&gt;
&lt;li&gt;Blocks at least one bot of each kind11.0%&lt;/li&gt;
&lt;li&gt;Blocks training only7.8%&lt;/li&gt;
&lt;li&gt;Blocks training and AI search1.1%&lt;/li&gt;
&lt;li&gt;Other mix1.0%&lt;/li&gt;
&lt;li&gt;Blocks all crawlers, Googlebot included0.2%&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;0%80%&lt;/p&gt;

&lt;p&gt;Source: SEOpeck robots.txt study, October 2026 (1,000 websites, Tranco list 94GG2).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;Sites&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Open to all AI bots (no site-wide AI block)&lt;/td&gt;
&lt;td&gt;789&lt;/td&gt;
&lt;td&gt;78.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blocks at least one bot of each kind (training, AI search and user-triggered)&lt;/td&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;td&gt;11.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blocks training only&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;td&gt;7.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blocks training and AI search, not user-triggered&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;1.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Other mix (for example search but not training)&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;1.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blocks all crawlers, Googlebot included&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read the second row carefully: blocking at least one bot of each kind is not the same as blocking every AI bot. Of those 110 sites, only 20 block all 16.&lt;/p&gt;

&lt;p&gt;About 3% of sites, 34 in all, run an &lt;strong&gt;allowlist&lt;/strong&gt;: a &lt;code&gt;User-agent: *&lt;/code&gt; group with &lt;code&gt;Disallow: /&lt;/code&gt;, plus groups that let named search engines in. Every crawler the file does not name, AI bots included, is shut out. We count these sites as blocking, because that is what the file tells an AI bot. 33 of the 110 sites in the second row work this way, and so do 16 of the 20 sites that block all 16 bots. pinterest.com is one example: none of the 16 AI bots is named, and all of them are blocked through the &lt;code&gt;*&lt;/code&gt; group. Other sites list the bots one by one: bbc.com blocks 14 of the 16 by name and cnn.com 15.&lt;/p&gt;

&lt;h2&gt;
  
  
  Block training, allow AI search: the middle path
&lt;/h2&gt;

&lt;p&gt;The 78 "training only" sites are the clearest group, but the pattern runs wider. Of the 138 sites that block GPTBot, &lt;strong&gt;70 (50.7%) still let OAI-SearchBot fetch the home page&lt;/strong&gt;. Of the 131 that block ClaudeBot, 58 (44.3%) still allow Claude-SearchBot. Perplexity has no separate training crawler, and 105 sites (10.5%) block PerplexityBot.&lt;/p&gt;

&lt;p&gt;forbes.com is one example of the approach: its file blocks GPTBot and ClaudeBot and has groups that allow OAI-SearchBot, Claude-SearchBot and Claude-User. The logic is simple: a training crawler takes content without sending visitors, while an AI search bot can cite the page and link to it. Here is a minimal version of that setup, checked with our parser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="c"&gt;# Block AI training&lt;/span&gt;
&lt;span class="nc"&gt;User&lt;/span&gt;-agent: GPTBot
&lt;span class="nc"&gt;User&lt;/span&gt;-agent: ClaudeBot
&lt;span class="nc"&gt;User&lt;/span&gt;-agent: CCBot
&lt;span class="nc"&gt;User&lt;/span&gt;-agent: Google-Extended
&lt;span class="nc"&gt;User&lt;/span&gt;-agent: Applebot-Extended
&lt;span class="nc"&gt;User&lt;/span&gt;-agent: Meta-ExternalAgent
&lt;span class="nc"&gt;User&lt;/span&gt;-agent: Bytespider
&lt;span class="nc"&gt;User&lt;/span&gt;-agent: Amazonbot
Disallow: /

&lt;span class="c"&gt;# Everyone else, including AI search and user-triggered fetchers&lt;/span&gt;
&lt;span class="nc"&gt;User&lt;/span&gt;-agent: *
Disallow: /admin/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Bigger sites block more
&lt;/h2&gt;

&lt;p&gt;The share of sites blocking AI bots falls as you go down the ranking. "Rank" here is a site's place among the 1,000 websites in the study, not its raw Tranco rank.&lt;/p&gt;

&lt;p&gt;Bigger sites block more&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Block at least one AI bot&lt;/li&gt;
&lt;li&gt;Block GPTBot&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Rank 1–10027.0%20.0%&lt;/li&gt;
&lt;li&gt;Rank 101–50023.8%15.5%&lt;/li&gt;
&lt;li&gt;Rank 501–1,00017.4%11.2%&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;0%30%&lt;/p&gt;

&lt;p&gt;Rank is the place among the 1,000 websites in the study. Source: SEOpeck robots.txt study, October 2026 (1,000 websites, Tranco list 94GG2).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rank&lt;/th&gt;
&lt;th&gt;Sites&lt;/th&gt;
&lt;th&gt;Block at least one AI bot&lt;/th&gt;
&lt;th&gt;Block GPTBot&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1–100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;27 (27.0%)&lt;/td&gt;
&lt;td&gt;20 (20.0%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;101–500&lt;/td&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;td&gt;95 (23.8%)&lt;/td&gt;
&lt;td&gt;62 (15.5%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;501–1,000&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;87 (17.4%)&lt;/td&gt;
&lt;td&gt;56 (11.2%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Drift and mistakes
&lt;/h2&gt;

&lt;p&gt;robots.txt files collect old lines. These are the patterns we counted, described as neutrally as we can: some are deliberate choices we cannot see the reason for.&lt;/p&gt;

&lt;h3&gt;
  
  
  Legacy names
&lt;/h3&gt;

&lt;p&gt;109 sites still list &lt;code&gt;anthropic-ai&lt;/code&gt; and 94 list &lt;code&gt;Claude-Web&lt;/code&gt;, names Anthropic no longer documents; its current bots are ClaudeBot, Claude-SearchBot and Claude-User. Other agent names outside our 16 are common too: &lt;code&gt;cohere-ai&lt;/code&gt; appears on 115 sites, &lt;code&gt;Diffbot&lt;/code&gt; on 106 and &lt;code&gt;YouBot&lt;/code&gt; on 94.&lt;/p&gt;

&lt;p&gt;Old names do little harm next to current ones, and Anthropic has said ClaudeBot honours rules written for its retired names. Only &lt;strong&gt;7 sites rely on the legacy names alone&lt;/strong&gt;, with no ClaudeBot line. We call these legacy-only rules rather than broken ones, but a parser that follows RFC 9309 to the letter would not apply them to ClaudeBot. If you want to block Anthropic's crawler, name ClaudeBot.&lt;/p&gt;

&lt;h3&gt;
  
  
  One operator, mixed rules
&lt;/h3&gt;

&lt;p&gt;Blocking GPTBot while allowing OAI-SearchBot is a clear choice. The reverse pairing for user-triggered bots is harder to explain: &lt;strong&gt;22 sites block ChatGPT-User but allow OAI-SearchBot&lt;/strong&gt;, 7 do the same with Claude-User and Claude-SearchBot, and 7 with Perplexity-User and PerplexityBot. The search bot may index the page, but the assistant cannot open it when a person asks about it. Worth a second look if that is your file.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lines a strict parser ignores
&lt;/h3&gt;

&lt;p&gt;9 sites have lines that RFC 9309 does not recognise: 5 use a versioned name such as &lt;code&gt;User-agent: GPTBot/1.0&lt;/code&gt;, and 4 have &lt;code&gt;Allow&lt;/code&gt; or &lt;code&gt;Disallow&lt;/code&gt; rules before any &lt;code&gt;User-agent&lt;/code&gt; line, so the rules belong to no group. Some crawlers are forgiving about these, but a strict parser, ours included, skips them. Write the bare product token: &lt;code&gt;User-agent: GPTBot&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  A web page instead of a robots.txt file
&lt;/h3&gt;

&lt;p&gt;49 sites (4.9%) answer &lt;code&gt;/robots.txt&lt;/code&gt; with an HTML page, usually their home page or an error page sent with a 200 status. Under RFC 9309 that is not a valid robots.txt file, so a crawler finds no rules in it and treats the whole site as open. If you think you have AI rules, check that the URL returns plain text.&lt;/p&gt;

&lt;h2&gt;
  
  
  New signals: llms.txt and Content-Signal
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;llms.txt:&lt;/strong&gt; 192 of the 1,000 websites serve a file at &lt;code&gt;/llms.txt&lt;/code&gt;. We fetched it only where robots.txt allowed our bot to, which left 42 sites unchecked, so the share is 20.0% of the 958 we could check. llms.txt is a proposed format, not a standard; a file being there says nothing about whether any AI system reads it. We counted any non-empty plain-text answer and did not validate the format.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content-Signal:&lt;/strong&gt; 30 sites (3.0%) have a &lt;code&gt;Content-Signal:&lt;/code&gt; line, the format Cloudflare introduced to state preferences such as &lt;code&gt;ai-train=no&lt;/code&gt;. 15 of them say &lt;code&gt;ai-train=no&lt;/code&gt;, but only 5 of those 15 also block GPTBot in robots.txt. A Content-Signal line states a preference; it does not block anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare's policy text:&lt;/strong&gt; 7 sites include the licence-style text of Cloudflare's Content Signals Policy in their robots.txt.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What this means for your site
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Decide per kind of bot, not per company.&lt;/strong&gt; Blocking training says "don't learn from my pages". Blocking AI search and user-triggered fetchers also takes you out of the answers and links those assistants show. Our guide &lt;a href="https://seopeck.com/blog/should-you-block-ai-crawlers-robots-txt" rel="noopener noreferrer"&gt;Should you block AI crawlers?&lt;/a&gt; walks through the trade-off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use current names.&lt;/strong&gt; Name ClaudeBot, Claude-SearchBot and Claude-User, not only &lt;code&gt;anthropic-ai&lt;/code&gt;. Write each name bare, without a version number.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check what your file really does.&lt;/strong&gt; Paste your domain into the &lt;a href="https://seopeck.com/tool/ai-crawler-checker" rel="noopener noreferrer"&gt;AI Crawler Checker&lt;/a&gt;: it uses the same parser as this study and shows each bot as allowed, partly blocked or blocked. The &lt;a href="https://seopeck.com/tool/robots-txt-tester" rel="noopener noreferrer"&gt;Robots.txt Tester&lt;/a&gt; shows whether a URL is open for any user agent, and the &lt;a href="https://seopeck.com/tool/robotstxt-generator" rel="noopener noreferrer"&gt;Robots.txt Generator&lt;/a&gt; writes a clean file if yours has drifted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remember robots.txt is a request.&lt;/strong&gt; The large AI companies say their crawlers follow it, but it cannot stop a bot that ignores it. For a hard block, use your firewall or CDN as well.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How this compares with earlier studies
&lt;/h2&gt;

&lt;p&gt;The comparison is directional only: samples and methods differ. In 2023, Originality.ai counted 242 of the top 1,000 sites blocking GPTBot within weeks of its launch; we count 138 of 1,000 websites. Cloudflare's 2025 analysis of about 3,900 robots.txt files from the top 10,000 domains found GPTBot was the most disallowed bot; in our data it ranks third, after CCBot and Bytespider. Chris Humphrey's June 2026 study of the Majestic top 10,000 found 22.6% blocking at least one of 10 bots and 4% blocking all ten; we find 20.9% blocking at least one of 16 and 2.0% blocking all 16.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full method
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Sample
&lt;/h3&gt;

&lt;p&gt;The list is Tranco list 94GG2, generated on 2 October 2026 from 30 days of data (3 September to 2 October 2026). We checked domains in rank order and kept a domain as a website if its home page answered with a 2xx HTML page on the same registrable domain, stopping at 1,000 websites. That took 2,364 domains. The 1,364 skipped domains break down as: no connection 694, robots.txt or home page redirecting to another domain 221, home page not answering 2xx 189, robots.txt refused (401/403) 168, home page disallowed for our bot and not open to Googlebot 37, home page not connecting 23, robots.txt server error 12, home page not HTML 9, timeout 9, rate-limited (429) 2.&lt;/p&gt;

&lt;p&gt;Near-duplicates are kept as Tranco lists them (for example bbc.com and bbc.co.uk, or x.com and twitter.com), so the 1,000 websites are not 1,000 separate organisations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fetching
&lt;/h3&gt;

&lt;p&gt;The crawl ran on 12 October 2026 from our own machine, not a server. SEOpeckBot fetched &lt;code&gt;/robots.txt&lt;/code&gt; first (up to 5 redirects; if there was no valid file, once more on the &lt;code&gt;www.&lt;/code&gt; or bare version of the domain, which found the file for 72 sites), then the home page only if robots.txt allowed it, then &lt;code&gt;/llms.txt&lt;/code&gt; only if allowed. 35 sites disallow our bot's home page through their &lt;code&gt;*&lt;/code&gt; group but let Googlebot in; we counted them as websites without fetching the page. The bot sent at most 12 requests at once, waited at least 2 seconds between requests to the same host, gave up after 10 seconds without a connection or 20 seconds in total, and read at most 500 KiB of a robots.txt file. Its user agent was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SEOpeckBot/1.0 (robots.txt study; +https://seopeck.com/page/robots-txt-study)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The linked page explains the study and how to opt out. At the time of the crawl, no site had opted out or asked to be removed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Counting
&lt;/h3&gt;

&lt;p&gt;Of the 1,000 websites, 890 had a valid robots.txt, 59 had none (404 or 410), 49 served an HTML page and 2 gave another 4xx answer. Under RFC 9309 a missing or invalid file means no restrictions, so all 1,000 are in the denominator. The 168 sites that refused our bot (401 or 403) are not: a refusal says nothing about their rules. Counted as open sites instead, the headline figure would be 17.9% (209 of 1,168) rather than 20.9%.&lt;/p&gt;

&lt;p&gt;Each file was parsed with the same code as the AI Crawler Checker, following RFC 9309: a bot obeys the group or groups that name it (case-insensitive), otherwise the &lt;code&gt;*&lt;/code&gt; group; within a group the longest matching rule wins, and &lt;code&gt;Allow&lt;/code&gt; wins a tie. A bot counts as blocked when &lt;code&gt;/&lt;/code&gt; is disallowed for it. AI blocks are counted only where Googlebot may still fetch &lt;code&gt;/&lt;/code&gt;; the 2 sites that block Googlebot as well form their own strategy. We classify Amazonbot as a training crawler, as our checker does. Legacy names such as &lt;code&gt;anthropic-ai&lt;/code&gt; are counted when a file names them, not evaluated as live crawlers. After the crawl we re-fetched 25 random sites and re-parsed them; every result matched.&lt;/p&gt;

&lt;h3&gt;
  
  
  Limits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;robots.txt is a stated policy. We did not test whether bots obey it, and many sites block AI bots at the firewall or CDN without any robots.txt rule, so the real share of sites keeping AI bots out can be higher.&lt;/li&gt;
&lt;li&gt;It is one snapshot. robots.txt files change often; the per-site data shows each file as it was on 12 October 2026.&lt;/li&gt;
&lt;li&gt;We only test the home page. A site that blocks an AI bot from its articles but not from &lt;code&gt;/&lt;/code&gt; counts as open.&lt;/li&gt;
&lt;li&gt;Tranco combines five popularity rankings; it is not a count of visits. The 168 sites that refused our bot are missing from the sample.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rankings: Victor Le Pochat, Tom Van Goethem, Samaneh Tajalizadehkhoob, Maciej Korczyński and Wouter Joosen. 2019. "Tranco: A Research-Oriented Top Sites Ranking Hardened Against Manipulation." In &lt;em&gt;Proceedings of the 26th Annual Network and Distributed System Security Symposium (NDSS 2019)&lt;/em&gt;. &lt;a href="https://doi.org/10.14722/ndss.2019.23386" rel="noopener noreferrer"&gt;https://doi.org/10.14722/ndss.2019.23386&lt;/a&gt;. List used: Tranco list 94GG2, generated on 2 October 2026, available at &lt;a href="https://tranco-list.eu/list/94GG2/1000000" rel="noopener noreferrer"&gt;https://tranco-list.eu/list/94GG2&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Download the data
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://seopeck.com/data/ai-crawlers-robots-txt-2026-10-12.csv" rel="noopener noreferrer"&gt;Per-site CSV&lt;/a&gt;: one row per website with its Tranco rank, robots.txt URL and HTTP status, strategy, the result for all 16 AI bots and the two search engines, legacy names, ignored lines, Content-Signal and llms.txt.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://seopeck.com/data/ai-crawlers-robots-txt-2026-10-12-summary.json" rel="noopener noreferrer"&gt;Summary JSON&lt;/a&gt;: every figure in this post.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You are welcome to use the data and charts in your own work; please credit "SEOpeck robots.txt study, October 2026" with a link to this page. We plan to repeat the study every quarter and publish what changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cite this study
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;APA:&lt;/strong&gt; Akram, N. (2026, October 20). &lt;em&gt;Which AI crawlers do the top 1,000 websites block? (robots.txt study, October 2026)&lt;/em&gt;. SEOpeck. &lt;a href="https://seopeck.com/blog/ai-crawlers-robots-txt-top-1000-websites" rel="noopener noreferrer"&gt;https://seopeck.com/blog/ai-crawlers-robots-txt-top-1000-websites&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Link:&lt;/strong&gt; &lt;a href="https://seopeck.com/blog/ai-crawlers-robots-txt-top-1000-websites" rel="noopener noreferrer"&gt;SEOpeck robots.txt study, October 2026&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>data</category>
      <category>webscraping</category>
    </item>
    <item>
      <title>What Is GZIP Compression, and Is It Working on Your Site?</title>
      <dc:creator>Nadeem Akram</dc:creator>
      <pubDate>Fri, 23 Oct 2026 13:03:01 +0000</pubDate>
      <link>https://dev.to/nadeemakram035/what-is-gzip-compression-and-is-it-working-on-your-site-334o</link>
      <guid>https://dev.to/nadeemakram035/what-is-gzip-compression-and-is-it-working-on-your-site-334o</guid>
      <description>&lt;p&gt;How GZIP and Brotli compression make pages load faster, what should and should not be compressed, how to switch it on, and how to check it is working.&lt;/p&gt;

&lt;p&gt;Most of what a browser downloads to show a web page is text: HTML, CSS, JavaScript, JSON and SVG. Text compresses extremely well, often shrinking by 70 percent or more. HTTP compression uses that fact to send smaller files over the network, and it is one of the easiest speed improvements a site can make.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;When a browser requests a page, it tells the server which compression methods it understands with a header such as Accept-Encoding: gzip, deflate, br. If the server supports one of them, it compresses the response and says which method it used with Content-Encoding: gzip (or br). The browser decompresses the file before using it. Visitors never notice anything except that the page arrives sooner.&lt;/p&gt;

&lt;h2&gt;
  
  
  GZIP vs Brotli
&lt;/h2&gt;

&lt;p&gt;GZIP has been the standard for decades and is supported by essentially every browser and server. Brotli is a newer algorithm that usually produces smaller files for text, especially at higher compression levels. All modern browsers support Brotli over HTTPS. The best setup serves Brotli to browsers that ask for it and GZIP to everyone else; many hosts and CDNs do this automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to compress, and what not to
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Compress:&lt;/strong&gt; HTML, CSS, JavaScript, JSON, XML, SVG, plain text and web fonts in older formats such as TTF.&lt;br&gt;
&lt;strong&gt;Do not bother:&lt;/strong&gt; JPG, PNG, WebP, GIF, MP4, WOFF2 fonts and ZIP files. They are already compressed, so compressing them again wastes server time and can even make them slightly larger.&lt;br&gt;
Images need a different approach: resizing, choosing the right format and lossy compression. Our guide on &lt;a href="https://seopeck.com/blog/how-to-compress-images-for-the-web" rel="noopener noreferrer"&gt;compressing images for the web&lt;/a&gt; covers that.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to switch it on
&lt;/h2&gt;

&lt;p&gt;Managed hosting and CDNs: compression is often already on, or available as a setting in the control panel.&lt;br&gt;
Apache and LiteSpeed: enable mod_deflate (or the server's built-in compression) and list the text content types to compress, usually in the server config or .htaccess.&lt;br&gt;
Nginx: set gzip on; and a gzip_types list in the configuration, and add the Brotli module if you want Brotli too.&lt;br&gt;
After making changes, clear any cache or CDN layer so you are testing the new behaviour.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check it is working&lt;/strong&gt;&lt;br&gt;
Enter your page in the &lt;a href="https://seopeck.com/tool/gzip-test" rel="noopener noreferrer"&gt;GZIP Compression Test&lt;/a&gt;. It requests the page with compression allowed and reports whether the server compressed it and how large the page is. You can also see the Content-Encoding header directly with the &lt;a href="https://seopeck.com/tool/http-headers-parser" rel="noopener noreferrer"&gt;HTTP Headers Parser&lt;/a&gt;, and the &lt;a href="https://seopeck.com/tool/seo-checker" rel="noopener noreferrer"&gt;On-Page SEO Checker&lt;/a&gt; flags compression alongside its other checks.&lt;/p&gt;

&lt;p&gt;Remember to test your CSS and JavaScript files as well as the HTML page, since they are often the largest text files a page loads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond compression
&lt;/h2&gt;

&lt;p&gt;Compression makes each file smaller; it does not reduce how many files you send. Once compression is on, look at removing unused CSS and JavaScript, minifying code with the &lt;a href="https://seopeck.com/tool/css-minifier" rel="noopener noreferrer"&gt;CSS Minifier&lt;/a&gt; and &lt;a href="https://seopeck.com/tool/js-minifier" rel="noopener noreferrer"&gt;JavaScript Minifier&lt;/a&gt;, and caching static files so returning visitors do not download them again.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Free PDF Tools That Never Upload Your Files</title>
      <dc:creator>Nadeem Akram</dc:creator>
      <pubDate>Mon, 12 Oct 2026 15:08:32 +0000</pubDate>
      <link>https://dev.to/nadeemakram035/free-pdf-tools-that-never-upload-your-files-40ck</link>
      <guid>https://dev.to/nadeemakram035/free-pdf-tools-that-never-upload-your-files-40ck</guid>
      <description>&lt;p&gt;&lt;em&gt;A note for dev.to readers: these tools use &lt;a href="https://pdf-lib.js.org/" rel="noopener noreferrer"&gt;pdf-lib&lt;/a&gt; to edit files, &lt;a href="https://mozilla.github.io/pdf.js/" rel="noopener noreferrer"&gt;pdf.js&lt;/a&gt; to render pages, and &lt;a href="https://qpdf.readthedocs.io/" rel="noopener noreferrer"&gt;qpdf&lt;/a&gt; compiled to WebAssembly for AES-256 encryption, all running client-side. Nothing is uploaded.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Contracts, bank statements, payslips, medical letters, ID scans: the PDFs we most often need to merge, shrink or lock are also the ones we least want to hand to a stranger. Yet the usual way to do it online is to upload the file to a website, let its server process it, and download the result. This guide explains what that actually involves, and how to do the same jobs without your file ever leaving your computer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens when you "upload" a PDF
&lt;/h2&gt;

&lt;p&gt;A typical online PDF tool copies your document to its server, works on it there, and keeps the result long enough for you to download it. Reputable services delete files after an hour or so, but you are relying on their word, their security, and every company they use for storage and logging. For a restaurant menu that is fine. For a signed contract or a passport scan, it is a real risk that is easy to avoid.&lt;/p&gt;

&lt;h2&gt;
  
  
  The alternative: tools that run in your browser
&lt;/h2&gt;

&lt;p&gt;Modern browsers are powerful enough to read and rewrite PDF files themselves. SEOpeck's &lt;a href="https://seopeck.com/category/pdf-tools" rel="noopener noreferrer"&gt;PDF Tools&lt;/a&gt; work this way: the page loads the program, and your file is opened, processed and saved by your own browser. Nothing is sent to our server, so there is nothing for us to store, leak or delete. You can check this yourself: open the browser's developer tools, switch to the Network tab and run a tool. You will not see your file go anywhere.&lt;/p&gt;

&lt;p&gt;There is a side benefit, too. Because there is no upload or download round trip, large files are often faster to process locally than online, and the tools keep working on a slow connection once the page has loaded.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can do
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Combine and rearrange
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://seopeck.com/tool/merge-pdf" rel="noopener noreferrer"&gt;Merge PDF&lt;/a&gt; joins several PDFs into one, in the order you choose.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://seopeck.com/tool/split-pdf" rel="noopener noreferrer"&gt;Split PDF&lt;/a&gt; breaks a document into separate files by page range.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://seopeck.com/tool/organize-pdf" rel="noopener noreferrer"&gt;Organize PDF&lt;/a&gt; lets you drag pages into a new order, and &lt;a href="https://seopeck.com/tool/rotate-pdf" rel="noopener noreferrer"&gt;Rotate PDF&lt;/a&gt; fixes sideways scans.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://seopeck.com/tool/delete-pdf-pages" rel="noopener noreferrer"&gt;Delete PDF Pages&lt;/a&gt; and &lt;a href="https://seopeck.com/tool/extract-pdf-pages" rel="noopener noreferrer"&gt;Extract PDF Pages&lt;/a&gt; remove the pages you do not need, or pull out the ones you do.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Make files smaller
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://seopeck.com/tool/compress-pdf" rel="noopener noreferrer"&gt;Compress PDF&lt;/a&gt; reduces file size so a document fits under an email attachment limit or an upload form's cap. Scanned documents usually shrink the most, because they are really a stack of photos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Convert
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://seopeck.com/tool/pdf-to-jpg" rel="noopener noreferrer"&gt;PDF to JPG&lt;/a&gt; and &lt;a href="https://seopeck.com/tool/pdf-to-png" rel="noopener noreferrer"&gt;PDF to PNG&lt;/a&gt; turn each page into an image.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://seopeck.com/tool/jpg-to-pdf" rel="noopener noreferrer"&gt;JPG to PDF&lt;/a&gt; and &lt;a href="https://seopeck.com/tool/png-to-pdf" rel="noopener noreferrer"&gt;PNG to PDF&lt;/a&gt; turn photos and screenshots into a single PDF.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://seopeck.com/tool/pdf-to-text" rel="noopener noreferrer"&gt;PDF to Text&lt;/a&gt; pulls out the text so you can copy, search or reuse it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Finish and sign
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://seopeck.com/tool/add-page-numbers-to-pdf" rel="noopener noreferrer"&gt;Add Page Numbers&lt;/a&gt; and &lt;a href="https://seopeck.com/tool/watermark-pdf" rel="noopener noreferrer"&gt;Watermark PDF&lt;/a&gt; for reports and drafts.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://seopeck.com/tool/sign-pdf" rel="noopener noreferrer"&gt;Sign PDF&lt;/a&gt; to draw or type a signature and place it on the page.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://seopeck.com/tool/pdf-metadata-editor" rel="noopener noreferrer"&gt;PDF Metadata Editor&lt;/a&gt; to change or clear the title, author and other hidden details before you share a file.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Password-protect a PDF
&lt;/h2&gt;

&lt;p&gt;The newest additions are &lt;a href="https://seopeck.com/tool/protect-pdf" rel="noopener noreferrer"&gt;Protect PDF&lt;/a&gt; and &lt;a href="https://seopeck.com/tool/unlock-pdf" rel="noopener noreferrer"&gt;Unlock PDF&lt;/a&gt;. Protect PDF encrypts a document with AES-256, the same standard used by banks and by Adobe Acrobat, so it cannot be opened without the password. You can also switch off printing, copying or editing for people who do open it.&lt;/p&gt;

&lt;p&gt;A few tips for passwords on documents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use a long passphrase&lt;/strong&gt;, such as four unrelated words, rather than a short word with a number on the end. The encryption is only as strong as the password. Our &lt;a href="https://seopeck.com/tool/password-generator" rel="noopener noreferrer"&gt;Password Generator&lt;/a&gt; can make one for you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Send the password separately.&lt;/strong&gt; If the PDF goes by email, send the password by text message or say it on a call. A password in the same email protects nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep a copy.&lt;/strong&gt; There is no "forgot password" for an encrypted PDF. If the password is lost, the file is effectively lost too.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restrictions are a polite request.&lt;/strong&gt; Blocking printing or copying stops casual reuse in normal PDF readers, but it is not a strong lock. The open password is the real protection.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Remove a password you know
&lt;/h2&gt;

&lt;p&gt;Password-protected files are a nuisance when you have to open them every day, such as your own bank statements. &lt;a href="https://seopeck.com/tool/unlock-pdf" rel="noopener noreferrer"&gt;Unlock PDF&lt;/a&gt; takes the file and its password and saves a copy without encryption. It will not guess or crack a password you do not have; that is deliberate. Only remove protection from documents you own or are entitled to open.&lt;/p&gt;

&lt;h2&gt;
  
  
  When a server-based tool is still the right choice
&lt;/h2&gt;

&lt;p&gt;Browser tools are limited by your device. A very large PDF of several hundred megabytes may be slow on an older phone, and some jobs, such as turning a scanned image into editable text with OCR or converting to Word with perfect layout, still need heavier software. For the everyday jobs above, though, there is no need to upload anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;If a document contains anything personal, prefer a PDF tool that works inside your browser. All of SEOpeck's &lt;a href="https://seopeck.com/category/pdf-tools" rel="noopener noreferrer"&gt;PDF Tools&lt;/a&gt; are free, need no account, add no watermark, and never send your file to our server.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://seopeck.com/blog/free-pdf-tools-without-uploading" rel="noopener noreferrer"&gt;SEOpeck&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>pdf</category>
      <category>privacy</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>A 5-minute SEO checklist for your homepage</title>
      <dc:creator>Nadeem Akram</dc:creator>
      <pubDate>Sat, 26 Sep 2026 10:16:46 +0000</pubDate>
      <link>https://dev.to/nadeemakram035/a-5-minute-seo-checklist-for-your-homepage-2eeo</link>
      <guid>https://dev.to/nadeemakram035/a-5-minute-seo-checklist-for-your-homepage-2eeo</guid>
      <description>&lt;h1&gt;
  
  
  A 5-minute SEO checklist for your homepage
&lt;/h1&gt;

&lt;p&gt;Your homepage is usually the page with the most links pointing at it, so it is the one search engines and social networks look at first. You don't need an audit tool with a monthly fee to catch the most common problems. Five checks cover most of them, and each takes about a minute.&lt;/p&gt;

&lt;p&gt;Open your homepage, right-click, choose &lt;strong&gt;View page source&lt;/strong&gt;, and search (Ctrl+F) for the tags below.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. One H1 that says what the page is about
&lt;/h2&gt;

&lt;p&gt;Search for &lt;code&gt;&amp;lt;h1&lt;/code&gt;. You want exactly one, and it should describe the page in plain words.&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="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Free SEO and developer tools, no sign-up&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Common problems: the H1 is missing because the logo is the only heading, there are several H1s because a theme reused the tag for styling, or the H1 just says "Welcome" or "Home". Headings help search engines and screen-reader users understand the page, so they should be about the content, not the layout.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. A meta description you wrote yourself
&lt;/h2&gt;

&lt;p&gt;Search for &lt;code&gt;name="description"&lt;/code&gt;.&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="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"130+ free SEO and developer tools: check a page's SEO, test robots.txt, compress images and more. No sign-up."&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Google doesn't use the description for ranking, and it sometimes rewrites the snippet. A good description still helps, because it is often what people read in the search results before deciding to click. If the tag is missing, Google picks some text from the page itself. Keep it to about 150 to 160 characters and describe what the visitor gets.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. A canonical URL, and no stray "noindex"
&lt;/h2&gt;

&lt;p&gt;Search for &lt;code&gt;rel="canonical"&lt;/code&gt; and for &lt;code&gt;noindex&lt;/code&gt;.&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="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"canonical"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The canonical tag tells search engines which version of the URL is the main one (https or http, with or without &lt;code&gt;www&lt;/code&gt;, with or without tracking parameters). It should point to the page's own preferred address.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;noindex&lt;/code&gt; in a robots meta tag tells search engines to leave the page out of their results. It often gets left behind after a site moves from staging to production, and it will quietly keep a homepage out of Google. It can also come as an &lt;code&gt;X-Robots-Tag&lt;/code&gt; HTTP header, which doesn't appear in the page source, so check the response headers too.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Alt text on every image that carries meaning
&lt;/h2&gt;

&lt;p&gt;Search for &lt;code&gt;&amp;lt;img&lt;/code&gt; and look at the &lt;code&gt;alt&lt;/code&gt; attributes.&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="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"dashboard.png"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"SEO Checker report with a score of 92 out of 100"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"divider.svg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alt text is read by screen readers and helps image search understand the picture. Describe what the image shows. Purely decorative images should have an empty &lt;code&gt;alt=""&lt;/code&gt; so screen readers skip them. Leaving out the attribute entirely is the one option to avoid.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Open Graph tags, so shared links look right
&lt;/h2&gt;

&lt;p&gt;Search for &lt;code&gt;og:&lt;/code&gt;.&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="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"SEOpeck: free SEO and developer tools"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"130+ free tools, no sign-up."&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:image"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/og-image.png"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Facebook, LinkedIn, Slack, WhatsApp and many other apps use these tags to build the preview card when someone shares your link. Without them you get a bare URL or a random image from the page. An image of 1200 × 630 px works well almost everywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check all five at once
&lt;/h2&gt;

&lt;p&gt;If you'd rather not read page source, I built a free &lt;a href="https://seopeck.com/tool/seo-checker" rel="noopener noreferrer"&gt;SEO Checker&lt;/a&gt; that tests all five of these on any URL. It also checks HTTPS, redirects, response time, subheadings, word count, the mobile viewport and structured data, and gives a score out of 100 with a short fix for each problem. No sign-up needed.&lt;/p&gt;

&lt;p&gt;Run it on your homepage, fix anything marked as a problem, and then run it on your two or three most important pages. That's usually the fastest SEO win a small site can get.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>html</category>
    </item>
    <item>
      <title>Should You Block AI Crawlers? A Plain Guide to robots.txt and AI Bots</title>
      <dc:creator>Nadeem Akram</dc:creator>
      <pubDate>Thu, 24 Sep 2026 21:07:43 +0000</pubDate>
      <link>https://dev.to/nadeemakram035/should-you-block-ai-crawlers-a-plain-guide-to-robotstxt-and-ai-bots-2ham</link>
      <guid>https://dev.to/nadeemakram035/should-you-block-ai-crawlers-a-plain-guide-to-robotstxt-and-ai-bots-2ham</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://seopeck.com/blog/should-you-block-ai-crawlers-robots-txt" rel="noopener noreferrer"&gt;seopeck.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Alongside Googlebot and Bingbot, most websites are now visited by crawlers from AI companies. Some collect text to train language models; others fetch pages so an AI assistant can answer a question and cite its source. Site owners are increasingly asking the same question: should I let them in?&lt;/p&gt;

&lt;p&gt;There is no single right answer. It depends on what you publish and what you want in return. This guide explains the main crawlers, what they are used for, and how to control them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two kinds of AI crawler
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Training crawlers&lt;/strong&gt; collect content to build and improve AI models. Examples are OpenAI's &lt;code&gt;GPTBot&lt;/code&gt;, Anthropic's &lt;code&gt;ClaudeBot&lt;/code&gt;, Meta's &lt;code&gt;Meta-ExternalAgent&lt;/code&gt; and Common Crawl's &lt;code&gt;CCBot&lt;/code&gt;, whose open dataset is used by many AI projects. Blocking these keeps your future content out of new training runs. It does not remove anything that was collected before.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search and user crawlers&lt;/strong&gt; fetch pages in response to what people ask right now. Examples are &lt;code&gt;OAI-SearchBot&lt;/code&gt; and &lt;code&gt;ChatGPT-User&lt;/code&gt; from OpenAI, &lt;code&gt;Claude-SearchBot&lt;/code&gt; and &lt;code&gt;Claude-User&lt;/code&gt; from Anthropic, and &lt;code&gt;PerplexityBot&lt;/code&gt;. These are the bots that can show your page as a source and send visitors to it.&lt;/p&gt;

&lt;p&gt;There are also &lt;strong&gt;control tokens&lt;/strong&gt; that are not separate crawlers at all. &lt;code&gt;Google-Extended&lt;/code&gt; lets you opt out of your content being used for Google's Gemini models without affecting Google Search. &lt;code&gt;Applebot-Extended&lt;/code&gt; does the same for Apple's AI training.&lt;/p&gt;

&lt;h2&gt;
  
  
  How robots.txt rules work
&lt;/h2&gt;

&lt;p&gt;robots.txt is a plain text file at the root of your site, for example &lt;code&gt;https://example.com/robots.txt&lt;/code&gt;. It is made of groups. Each group names one or more crawlers with &lt;code&gt;User-agent&lt;/code&gt; lines, followed by &lt;code&gt;Allow&lt;/code&gt; and &lt;code&gt;Disallow&lt;/code&gt; rules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User-agent: GPTBot
Disallow: /

User-agent: *
Disallow: /admin/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two details trip people up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A crawler follows only the most specific group that names it.&lt;/strong&gt; In the example above, GPTBot obeys its own group and ignores the &lt;code&gt;*&lt;/code&gt; group completely. A crawler that is not named anywhere falls back to &lt;code&gt;*&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Within a group, the longest matching rule wins.&lt;/strong&gt; &lt;code&gt;Disallow: /&lt;/code&gt; with &lt;code&gt;Allow: /blog/&lt;/code&gt; means the blog is allowed and everything else is blocked.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common setups
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Block AI training, allow AI search.&lt;/strong&gt; This is a popular middle ground for publishers who want citations and visits but do not want their work used to train models:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User-agent: GPTBot
User-agent: ClaudeBot
User-agent: CCBot
User-agent: Google-Extended
User-agent: Applebot-Extended
User-agent: Meta-ExternalAgent
Disallow: /
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Allow everything.&lt;/strong&gt; If you want the widest possible reach, including being part of the data AI tools learn from, you do not need any AI-specific rules at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Block everything AI.&lt;/strong&gt; Add the search and user crawlers to the list above as well. Be aware that you will no longer appear as a source in those assistants' answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What robots.txt cannot do
&lt;/h2&gt;

&lt;p&gt;robots.txt is a request, not a wall. The large AI companies say their crawlers respect it, but a badly behaved bot can ignore it. If you need to stop a crawler for certain, block it at the server or firewall level as well. Also remember that robots.txt is public: anyone can read it, so never use it to hide private areas. Protect those with a login.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check what your site allows today
&lt;/h2&gt;

&lt;p&gt;It is easy to get a rule slightly wrong, for example by adding a crawler to a group you did not intend, or leaving a typo in its name. A few free resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://seopeck.com/tool/ai-crawler-checker" rel="noopener noreferrer"&gt;AI Crawler Checker&lt;/a&gt;: reads your live robots.txt and shows, crawler by crawler, whether it is allowed, blocked or partly blocked.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Nadeem035/ai-crawlers-robots-txt" rel="noopener noreferrer"&gt;ai-crawlers-robots-txt on GitHub&lt;/a&gt;: an open list of 14 AI crawlers with their operator, purpose and official docs link, plus copy-paste templates (CC0).&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://seopeck.com/tool/robotstxt-generator" rel="noopener noreferrer"&gt;Robots.txt Generator&lt;/a&gt;: builds a full robots.txt with per-crawler rules.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I build SEOpeck and maintain the GitHub list. Corrections and new crawlers are welcome as PRs.&lt;/em&gt;&lt;/p&gt;

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