<?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: Livraith</title>
    <description>The latest articles on DEV Community by Livraith (@fhiltscher).</description>
    <link>https://dev.to/fhiltscher</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%2F4073157%2Ff1e36be8-0b40-47df-b12d-66d11a92de75.png</url>
      <title>DEV Community: Livraith</title>
      <link>https://dev.to/fhiltscher</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fhiltscher"/>
    <language>en</language>
    <item>
      <title>Your README link is nofollow. I checked. Here's the script.</title>
      <dc:creator>Livraith</dc:creator>
      <pubDate>Tue, 11 Aug 2026 13:21:07 +0000</pubDate>
      <link>https://dev.to/fhiltscher/your-readme-link-is-nofollow-i-checked-heres-the-script-319p</link>
      <guid>https://dev.to/fhiltscher/your-readme-link-is-nofollow-i-checked-heres-the-script-319p</guid>
      <description>&lt;p&gt;My new domain had exactly one backlink.&lt;/p&gt;

&lt;p&gt;I had just launched &lt;a href="https://www.ainclave.com" rel="noopener noreferrer"&gt;ainclave.com&lt;/a&gt;, ran a backlink report, and got one row back: a &lt;code&gt;.ru&lt;/code&gt; redirect page with 44 outbound links and a spam score of 40. It pointed to my homepage with the anchor text "Ainclave.com".&lt;/p&gt;

&lt;p&gt;Classic automated domain-scraper stuff.&lt;/p&gt;

&lt;p&gt;That result didn't make sense at first. I had added the site to our GitHub organisation profile, several repositories, LinkedIn, and Mastodon. Four places linking to the domain, yet the report showed none of them.&lt;/p&gt;

&lt;p&gt;I could have waited for another crawl and assumed the tool was behind. Instead, I checked the links themselves.&lt;/p&gt;

&lt;p&gt;This is what I found, plus a small script you can use to check any page in about thirty seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  The claim I had never bothered to verify
&lt;/h2&gt;

&lt;p&gt;At some point, I picked up the idea that a link in a GitHub README counts as an SEO backlink. You see this advice everywhere in developer SEO guides: add your site to GitHub and get a free link from a high-authority domain.&lt;/p&gt;

&lt;p&gt;So I tested it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sL&lt;/span&gt; &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="s2"&gt;"Mozilla/5.0"&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/n8n-io/n8n"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;a[^&amp;gt;]*href="https\?://[^"]*n8n\.io[^"]*"[^&amp;gt;]*&amp;gt;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&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;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://n8n.io/workflows"&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"nofollow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://docs.n8n.io"&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"nofollow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://community.n8n.io"&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"nofollow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://n8n.io/integrations"&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"nofollow"&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;Every link had &lt;code&gt;rel="nofollow"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then I counted links to &lt;code&gt;n8n.io&lt;/code&gt; that did not:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sL&lt;/span&gt; &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="s2"&gt;"Mozilla/5.0"&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/n8n-io/n8n"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;a[^&amp;gt;]*href="https\?://[^"]*n8n\.io[^"]*"[^&amp;gt;]*&amp;gt;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; nofollow | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;span class="c"&gt;# 0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zero.&lt;/p&gt;

&lt;p&gt;That included the repository's Website field in the About sidebar. I had assumed GitHub might treat that one differently. It doesn't.&lt;/p&gt;

&lt;p&gt;I repeated the check on my own organisation page. GitHub rendered eight links to my site, including the profile URL with &lt;code&gt;itemprop="url"&lt;/code&gt;. All eight had &lt;code&gt;rel="nofollow"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;GitHub applies this through its HTML sanitiser. It affects user-generated content across the platform: READMEs, About fields, issues, pull requests, discussions, wikis, and gists. There is no repository setting that turns it off.&lt;/p&gt;

&lt;h2&gt;
  
  
  A script for checking any page
&lt;/h2&gt;

&lt;p&gt;Give it a page URL and your domain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="c"&gt;# usage: ./check-link.sh &amp;lt;page-url&amp;gt; &amp;lt;your-domain&amp;gt;&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-euo&lt;/span&gt; pipefail

&lt;span class="nv"&gt;page&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;domain&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nv"&gt;html&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-sL&lt;/span&gt; &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="s2"&gt;"Mozilla/5.0 (Windows NT 10.0; Win64; x64)"&lt;/span&gt; &lt;span class="nt"&gt;--max-time&lt;/span&gt; 25 &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$page&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;anchors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$html&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nv"&gt;DOMAIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$domain&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; perl &lt;span class="nt"&gt;-0777&lt;/span&gt; &lt;span class="nt"&gt;-ne&lt;/span&gt; &lt;span class="s1"&gt;'
  my $d = quotemeta $ENV{DOMAIN};
  while (/&amp;lt;a\b[^&amp;gt;]*&amp;gt;/gs) {
    my $t = $&amp;amp;;
    $t =~ s/\s+/ /g;
    print "$t\n" if $t =~ /href\s*=\s*["\x27]https?:\/\/[^"\x27]*$d/i;
  }'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$anchors&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"No external anchor to &lt;/span&gt;&lt;span class="nv"&gt;$domain&lt;/span&gt;&lt;span class="s2"&gt; found on &lt;/span&gt;&lt;span class="nv"&gt;$page&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nv"&gt;total&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$anchors&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;a'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;nf&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$anchors&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-ci&lt;/span&gt; &lt;span class="s1"&gt;'nofollow'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"anchors: &lt;/span&gt;&lt;span class="nv"&gt;$total&lt;/span&gt;&lt;span class="s2"&gt; | nofollow: &lt;/span&gt;&lt;span class="nv"&gt;$nf&lt;/span&gt;&lt;span class="s2"&gt; | without nofollow: &lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;total &lt;span class="o"&gt;-&lt;/span&gt; nf&lt;span class="k"&gt;))&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$anchors&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-vi&lt;/span&gt; nofollow | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Checked against three pages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;github.com/n8n-io/n8n     n8n.io        13 anchors, 13 nofollow
github.com/ainclave       ainclave.com   8 anchors,  8 nofollow
ainclave.github.io        ainclave.com   7 anchors,  0 nofollow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two details in that script are load-bearing, and I got both wrong on my first attempt. More on that below.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I found on sites developers commonly use
&lt;/h2&gt;

&lt;p&gt;I used the same method on each site. These were the results when I checked; platforms can change their link policies, so I would rerun the test before relying on this table.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitHub README, About field, issues, gists&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;nofollow&lt;/code&gt; throughout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LinkedIn company page website field&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;nofollow&lt;/code&gt;; much of the page is also closed to crawlers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mastodon profile metadata&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;rel="me nofollow noopener"&lt;/code&gt;; many instances also use &lt;code&gt;noindex&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dev.to article body&lt;/td&gt;
&lt;td&gt;no &lt;code&gt;rel&lt;/code&gt; attribute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hacker News front-page story links&lt;/td&gt;
&lt;td&gt;no &lt;code&gt;rel&lt;/code&gt; attribute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;awesome-selfhosted.net&lt;/td&gt;
&lt;td&gt;72 external anchors, none with &lt;code&gt;nofollow&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The last result caught my attention.&lt;/p&gt;

&lt;p&gt;The awesome-selfhosted list is maintained on GitHub. Links on the GitHub version are sanitised like other user-generated links. But the rendered version on &lt;a href="https://awesome-selfhosted.net" rel="noopener noreferrer"&gt;awesome-selfhosted.net&lt;/a&gt; is generated as the maintainers' own HTML, so those links do not inherit GitHub's attributes.&lt;/p&gt;

&lt;p&gt;The distinction is simple: GitHub sanitises content displayed on &lt;code&gt;github.com&lt;/code&gt;. It does not control HTML that someone publishes on a separate site.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about GitHub Pages?
&lt;/h2&gt;

&lt;p&gt;A site on &lt;code&gt;username.github.io&lt;/code&gt; contains your HTML. GitHub Pages does not run your outbound links through the same content sanitiser used on &lt;code&gt;github.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I published a small technical page there and checked the result:&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;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"deep-link"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://www.ainclave.com/security/microvm-isolation"&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;No &lt;code&gt;rel&lt;/code&gt; attribute. The page had seven outbound links, and none were marked &lt;code&gt;nofollow&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That does not mean you should throw up a page containing nothing but links to your main domain. A thin page built only to pass link equity is unlikely to help and may look like a doorway page.&lt;/p&gt;

&lt;p&gt;Give it a reason to exist. Mine contains a technical comparison that can stand on its own. The links point to supporting material rather than making up the whole page.&lt;/p&gt;

&lt;p&gt;I also set the canonical URL to the GitHub Pages page itself. Pointing &lt;code&gt;rel="canonical"&lt;/code&gt; at the main site would tell search engines that the page is a duplicate and that another URL should be indexed instead. That would work against the reason for publishing it separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  nofollow does not make a link useless
&lt;/h2&gt;

&lt;p&gt;It is easy to overcorrect here.&lt;/p&gt;

&lt;p&gt;Google has treated &lt;code&gt;nofollow&lt;/code&gt; as a hint rather than a strict directive since 2019. A nofollow link can still help a crawler discover a new URL. It can also send actual people to your site, which tends to get lost in backlink discussions.&lt;/p&gt;

&lt;p&gt;For a new domain, discovery matters. A public GitHub profile that mentions your URL still has value. It just does not provide the clean, authority-passing backlink that many SEO guides imply.&lt;/p&gt;

&lt;p&gt;I now think about these links in two separate categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Links that help crawlers and people find the site&lt;/li&gt;
&lt;li&gt;Links that may also pass ranking signals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;rel&lt;/code&gt; attribute helps you understand which kind you may be looking at. It does not tell you the full SEO value of a link.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two mistakes I made while checking
&lt;/h2&gt;

&lt;p&gt;I nearly published false claims in this article. Twice, in different ways, and both times the command told me something I misread as a fact about the world.&lt;/p&gt;

&lt;h3&gt;
  
  
  grep reads one line at a time
&lt;/h3&gt;

&lt;p&gt;While checking my GitHub Pages site, I looked for its meta description with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sL&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$url&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-io&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;meta[^&amp;gt;]*name="description"[^&amp;gt;]*&amp;gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The command returned nothing. I concluded that the tag was missing and repeated that conclusion twice.&lt;/p&gt;

&lt;p&gt;The tag was there. It just looked like this:&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;"..."&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;&lt;code&gt;grep&lt;/code&gt; processes input one line at a time. My pattern expected the entire tag to appear on one line, so the command could never have matched the actual HTML.&lt;/p&gt;

&lt;p&gt;I fixed the check by reading the document as a single string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sL&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$url&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | perl &lt;span class="nt"&gt;-0777&lt;/span&gt; &lt;span class="nt"&gt;-ne&lt;/span&gt; &lt;span class="s1"&gt;'while (/&amp;lt;meta\b[^&amp;gt;]*&amp;gt;/gs) { my $t=$&amp;amp;; $t =~ s/\s+/ /g; print "$t\n" }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Perl, &lt;code&gt;-0777&lt;/code&gt; reads the whole document at once, and &lt;code&gt;/s&lt;/code&gt; allows &lt;code&gt;.&lt;/code&gt; to match newlines.&lt;/p&gt;

&lt;h3&gt;
  
  
  A dot in a domain is a regex wildcard
&lt;/h3&gt;

&lt;p&gt;The second one was subtler, and it produced a confident wrong answer rather than an empty one.&lt;/p&gt;

&lt;p&gt;My first version of the link checker filtered anchors with &lt;code&gt;grep -i "$2"&lt;/code&gt;, passing the domain straight through as a pattern. Run it with &lt;code&gt;n8n.io&lt;/code&gt; and the dot matches any character, so it also matches &lt;code&gt;n8n-io&lt;/code&gt; — which appears in every internal repository path on the page. It reported this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;anchors: 154 | nofollow: 17 | without nofollow: 137
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A tidy, plausible, completely wrong result. The correct answer is 13 anchors, all of them nofollow.&lt;/p&gt;

&lt;p&gt;Two changes fixed it. &lt;code&gt;quotemeta&lt;/code&gt; escapes the domain so the dot is a dot. And the pattern now requires the domain to appear inside an absolute &lt;code&gt;href&lt;/code&gt;, which drops internal links entirely.&lt;/p&gt;

&lt;p&gt;The empty output taught me one thing; this one taught me a worse lesson. &lt;strong&gt;An empty result proves the check found nothing. A populated result does not prove the check was measuring what I thought it was.&lt;/strong&gt; The second failure mode is more dangerous, because it looks like data.&lt;/p&gt;




&lt;p&gt;If you know of a platform whose actual &lt;code&gt;rel&lt;/code&gt; policy differs from the usual SEO advice, send me the page. I would rather test it than add another unchecked row to the table.&lt;/p&gt;

&lt;p&gt;I write about sandboxing and EU-hosted infrastructure for coding agents at &lt;a href="https://www.ainclave.com" rel="noopener noreferrer"&gt;ainclave.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>github</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
