<?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: thisisismayill</title>
    <description>The latest articles on DEV Community by thisisismayill (@thisisismayill).</description>
    <link>https://dev.to/thisisismayill</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%2F4106565%2F2e76f6a2-d4b9-4431-8f24-16b3bc5103ec.png</url>
      <title>DEV Community: thisisismayill</title>
      <link>https://dev.to/thisisismayill</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thisisismayill"/>
    <language>en</language>
    <item>
      <title>I pointed my website audit tool at its own website. It lied to me.</title>
      <dc:creator>thisisismayill</dc:creator>
      <pubDate>Wed, 02 Sep 2026 16:49:06 +0000</pubDate>
      <link>https://dev.to/thisisismayill/i-pointed-my-website-audit-tool-at-its-own-website-it-lied-to-me-4842</link>
      <guid>https://dev.to/thisisismayill/i-pointed-my-website-audit-tool-at-its-own-website-it-lied-to-me-4842</guid>
      <description>&lt;p&gt;I built a website audit tool. It crawls a site in a real browser and writes one HTML report: accessibility, performance, security headers, SEO, broken links, JavaScript errors, forms that accept anything. It runs on your machine. No account, no upload, no server.&lt;/p&gt;

&lt;p&gt;Before telling anyone about it, I did the obvious thing: I pointed it at its own website.&lt;/p&gt;

&lt;p&gt;It came back with three findings. Two of them were false.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[HIGH] Page returns HTTP 403
[LOW]  No sitemap.xml found
[INFO] No robots.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The site publishes both files. Bing had crawled the sitemap successfully the day before. I had opened robots.txt in a browser an hour earlier.&lt;/p&gt;

&lt;p&gt;Here is what happened. The site sits behind Vercel, and Vercel's managed mitigations answered my automated browser with 403 on everything — the homepage, robots.txt, sitemap.xml, all of it. My crawler saw the 403, could not read the files, and reported them as missing.&lt;/p&gt;

&lt;p&gt;That is a worse failure than crashing. A crash tells you something went wrong. A confident "No sitemap.xml found" sends you off to fix a file that is already there, and quietly teaches you that the tool cannot be trusted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Absence is only ever proven by a 404
&lt;/h2&gt;

&lt;p&gt;That is the rule I settled on. A refusal, a rate limit, a timeout, a server error — all of those mean &lt;em&gt;the check could not be made&lt;/em&gt;, which is a different sentence entirely.&lt;/p&gt;

&lt;p&gt;Now a blocked robots.txt reads "Could not check robots.txt". And when the whole site turns the crawler away, the report says so once, at the top, and stops making claims it cannot support:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[HIGH] The site refused TesterBot (HTTP 403) - this report is incomplete
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One curl tells you which situation you are in. If &lt;code&gt;curl&lt;/code&gt; gets a 200 from the same machine that the crawler got a 403 from, nothing is wrong with the site — the block is aimed at the automated browser, and it is invisible to you because your own Chrome passes and curl is waved through as a harmless script.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then I pointed it at a hundred real sites
&lt;/h2&gt;

&lt;p&gt;Three more, in the first hour:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;www is not a subdomain boundary.&lt;/strong&gt; A crawl seeded at &lt;code&gt;example.com&lt;/code&gt; that redirected to &lt;code&gt;www.example.com&lt;/code&gt; treated every internal link as out of scope and stopped after one page. Eight of ten sites came back with a single page each and I assumed they were blocking me. They were not. Sites move between the two forms freely and a crawler has to treat them as one place.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A domain the crawler could not reach was recorded as crawled.&lt;/strong&gt; It vanished from the queue, would never be retried, and nothing in the output said so. When the machine's network dropped mid-run, nine domains disappeared from the index that way — silently. Failures are now counted instead, the domain keeps its place in the queue, and three consecutive DNS failures stop the run with "this machine looks offline" rather than burning the whole queue on a dead network.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One slow government site spent half of a 45-minute crawl on its own&lt;/strong&gt; while fifteen others waited. Breadth beats depth for this kind of work: twenty-five pages from a hundred domains says far more than twenty-five pages from twenty. There is a per-domain time cap now.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part worth keeping
&lt;/h2&gt;

&lt;p&gt;None of these showed up in the test suite. All of them showed up in the first hour of pointing the thing at the real web. Fixtures test the paths you thought of; the open web tests the ones you did not.&lt;/p&gt;

&lt;p&gt;But the first bug is the one I would take away from this. If you build anything that reports on the state of the world — a monitor, a linter, a health check, a scraper — decide early what your program is allowed to say when it could not look. Mine said "not there". It should have said "I could not see".&lt;/p&gt;

&lt;p&gt;The tool is MIT licensed, runs locally, and needs Python 3.9+.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/thisisismayill/testerbot" rel="noopener noreferrer"&gt;https://github.com/thisisismayill/testerbot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Site and a real sample report: &lt;a href="https://testerbot-web.vercel.app" rel="noopener noreferrer"&gt;https://testerbot-web.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>testing</category>
      <category>python</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
