<?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: shadow88sky</title>
    <description>The latest articles on DEV Community by shadow88sky (@shadow88sky).</description>
    <link>https://dev.to/shadow88sky</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3820730%2F3d2c6c5a-ca83-47ee-8498-c064deec4ba1.png</url>
      <title>DEV Community: shadow88sky</title>
      <link>https://dev.to/shadow88sky</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shadow88sky"/>
    <language>en</language>
    <item>
      <title>I Built an Open-Source GEO Audit Tool — Because I Couldn't Find One</title>
      <dc:creator>shadow88sky</dc:creator>
      <pubDate>Thu, 12 Mar 2026 16:36:54 +0000</pubDate>
      <link>https://dev.to/shadow88sky/i-built-an-open-source-geo-audit-tool-because-i-couldnt-find-one-47m0</link>
      <guid>https://dev.to/shadow88sky/i-built-an-open-source-geo-audit-tool-because-i-couldnt-find-one-47m0</guid>
      <description>&lt;p&gt;65% of websites unknowingly block AI crawlers. Your site might be invisible to ChatGPT, Gemini, and Claude right now — and you'd never know.&lt;/p&gt;

&lt;p&gt;I went looking for an open-source tool to audit websites for AI search readiness. Couldn't find one. So I built it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is GEO?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GEO (Generative Engine Optimization)&lt;/strong&gt; is like SEO, but for AI search engines.&lt;/p&gt;

&lt;p&gt;When someone asks ChatGPT &lt;em&gt;"What's the best CRM for small teams?"&lt;/em&gt;, the AI doesn't return a list of links. It generates an answer by pulling from crawled content, structured data, and knowledge graphs.&lt;/p&gt;

&lt;p&gt;If your site blocks AI crawlers or lacks structured data, your brand doesn't exist in that answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the tool checks
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;rankweave-geo-audit&lt;/strong&gt; evaluates 4 dimensions:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. AI Crawler Access (30%)
&lt;/h3&gt;

&lt;p&gt;Checks your &lt;code&gt;robots.txt&lt;/code&gt; against 9 AI crawlers:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;GPTBot&lt;/code&gt; · &lt;code&gt;ChatGPT-User&lt;/code&gt; · &lt;code&gt;OAI-SearchBot&lt;/code&gt; · &lt;code&gt;ClaudeBot&lt;/code&gt; · &lt;code&gt;Claude-Web&lt;/code&gt; · &lt;code&gt;Google-Extended&lt;/code&gt; · &lt;code&gt;PerplexityBot&lt;/code&gt; · &lt;code&gt;Bytespider&lt;/code&gt; · &lt;code&gt;CCBot&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Fun fact: websites blocking GPTBot get cited &lt;a href="https://firstpagesage.com/reports/top-generative-ai-chatbots/" rel="noopener noreferrer"&gt;73% less often&lt;/a&gt; in ChatGPT responses.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Structured Data (25%)
&lt;/h3&gt;

&lt;p&gt;Detects JSON-LD and checks Schema.org type coverage (Organization, WebSite, Product, FAQPage, Article, BreadcrumbList).&lt;/p&gt;

&lt;p&gt;GPT-4's accuracy jumps from &lt;a href="https://writesonic.com/blog/structured-data-in-ai-search" rel="noopener noreferrer"&gt;16% to 54%&lt;/a&gt; when content includes structured data.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Knowledge Graph (20%)
&lt;/h3&gt;

&lt;p&gt;Checks if your brand exists in Wikidata, Wikipedia (EN/ZH), and Baidu Baike — the sources AI models use as ground truth.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Content Basics (25%)
&lt;/h3&gt;

&lt;p&gt;9 checks: HTTPS, &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;, meta description, OG tags, H1, content length, blog link, FAQ link.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;rankweave-geo-audit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;audit&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rankweave-geo-audit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;audit&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;companyName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Example Inc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;overallScore&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;       &lt;span class="c1"&gt;// 0-100&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dimensions&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;         &lt;span class="c1"&gt;// 4 scores with details&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;recommendations&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    &lt;span class="c1"&gt;// bilingual suggestions (EN/ZH)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result gives you an overall score (0-100), per-dimension breakdowns, and actionable recommendations in both English and Chinese.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scoring formula
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Overall = Crawler Access × 30%
        + Structured Data × 25%
        + Knowledge Graph × 20%
        + Content Basics  × 25%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything is transparent — the weights, the checks, the algorithm. No black boxes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design decisions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Only 1 dependency&lt;/strong&gt; — &lt;code&gt;cheerio&lt;/code&gt; for HTML parsing. HTTP uses Node 18+ built-in &lt;code&gt;fetch&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parallel execution&lt;/strong&gt; — Crawler access, knowledge graph, and homepage fetch run concurrently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pure functions&lt;/strong&gt; — No database, no framework. Just &lt;code&gt;audit(options)&lt;/code&gt; → result object.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ESM + TypeScript&lt;/strong&gt; — Full type definitions included.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progress callback&lt;/strong&gt; — &lt;code&gt;onProgress&lt;/code&gt; for real-time updates in your UI.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What it doesn't do
&lt;/h2&gt;

&lt;p&gt;This covers the &lt;strong&gt;technical foundation&lt;/strong&gt; — can AI crawl and understand your site?&lt;/p&gt;

&lt;p&gt;It doesn't tell you whether AI engines are actually &lt;em&gt;mentioning&lt;/em&gt; your brand in their answers. That requires querying live AI engines, which is a different problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/shadow88sky/rankweave-geo-audit" rel="noopener noreferrer"&gt;github.com/shadow88sky/rankweave-geo-audit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm&lt;/strong&gt;: &lt;a href="https://www.npmjs.com/package/rankweave-geo-audit" rel="noopener noreferrer"&gt;npmjs.com/package/rankweave-geo-audit&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MIT licensed. Issues and PRs welcome.&lt;/p&gt;




&lt;p&gt;If you run it on your site and find something interesting, I'd love to hear about it in the comments.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>showdev</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
