<?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: Kamayega Bharat</title>
    <description>The latest articles on DEV Community by Kamayega Bharat (@kamayegabharat).</description>
    <link>https://dev.to/kamayegabharat</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%2F4142646%2F2902b58d-f6fe-496f-9b54-92fd9694d84f.png</url>
      <title>DEV Community: Kamayega Bharat</title>
      <link>https://dev.to/kamayegabharat</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kamayegabharat"/>
    <language>en</language>
    <item>
      <title>I Built a Website Intelligence Engine Instead of Another SEO Checklist</title>
      <dc:creator>Kamayega Bharat</dc:creator>
      <pubDate>Fri, 25 Sep 2026 10:11:04 +0000</pubDate>
      <link>https://dev.to/kamayegabharat/i-built-a-website-intelligence-engine-instead-of-another-seo-checklist-46ab</link>
      <guid>https://dev.to/kamayegabharat/i-built-a-website-intelligence-engine-instead-of-another-seo-checklist-46ab</guid>
      <description>&lt;p&gt;What I learned while building AuditForge AI: why crawling, rendering, shared resource intelligence, evidence, and root-cause analysis matter more than a long list of SEO checks.&lt;br&gt;
Most website auditors give you a checklist.&lt;/p&gt;

&lt;p&gt;A title is missing.&lt;/p&gt;

&lt;p&gt;A meta description is missing.&lt;/p&gt;

&lt;p&gt;A page has no schema.&lt;/p&gt;

&lt;p&gt;An image has no alt text.&lt;/p&gt;

&lt;p&gt;A page is slow.&lt;/p&gt;

&lt;p&gt;Then you get a long list of warnings and have to figure out what actually matters.&lt;/p&gt;

&lt;p&gt;While building &lt;strong&gt;AuditForge AI&lt;/strong&gt;, I started thinking about the problem differently:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if a website auditor tried to understand the website before deciding what is wrong with it?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question changed the architecture of the project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://audit-forge-ai.github.io/" rel="noopener noreferrer"&gt;AuditForge AI&lt;/a&gt; is the project I am building around that idea.&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%2Fe9h2nad316omsqihamtx.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%2Fe9h2nad316omsqihamtx.png" alt="AuditForge AI codebase shown in Visual Studio Code" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  A website issue rarely exists by itself
&lt;/h2&gt;

&lt;p&gt;Consider a JavaScript-heavy page.&lt;br&gt;
A basic auditor might report several separate problems:&lt;br&gt;
content is not present in the initial HTML&lt;br&gt;
indexability may be uncertain&lt;br&gt;
structured data may not match the rendered page&lt;br&gt;
accessibility checks based only on static HTML may miss something&lt;br&gt;
the page may also have a performance problem&lt;br&gt;
Those warnings are not necessarily five independent problems.&lt;br&gt;
They can be different symptoms of the same underlying condition.&lt;br&gt;
That led me toward a different model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Page architecture
       ↓
Rendering behavior
       ↓
Content availability
       ↓
Indexability
       ↓
Schema / semantics
       ↓
Accessibility
       ↓
Performance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is not to hide individual findings. It is to understand their relationships.&lt;br&gt;
From individual checks to a shared pipeline&lt;br&gt;
The architecture gradually became closer to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;URL
 ↓
Security validation
 ↓
Audit job
 ↓
Crawl
 ↓
Browser rendering when required
 ↓
Site resource discovery
 ↓
Page / resource graph
 ↓
Engine analysis
 ↓
Finding reconciliation
 ↓
Scoring
 ↓
Root-cause relationships
 ↓
Recommendations
 ↓
Verification
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is that the engines are not supposed to behave like completely isolated tools.&lt;br&gt;
They share evidence.&lt;br&gt;
That matters because the crawler may know something that the schema engine needs, or the resource layer may know something that the indexability engine needs.&lt;br&gt;
Static HTML is not always enough&lt;br&gt;
One of the biggest decisions was separating static analysis from browser analysis.&lt;br&gt;
Static HTML can tell us a lot.&lt;br&gt;
But it cannot reliably answer every question about a JavaScript application.&lt;br&gt;
So the system has separate rendering modes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;static
browser
auto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the audit needs to know what actually happened.&lt;br&gt;
For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;modeRequested: browser
modeUsed: browser
rendered: true
renderingRequired: true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This kind of provenance is important.&lt;br&gt;
Otherwise an audit can accidentally present a browser-derived conclusion as though it came from the original HTML response.&lt;br&gt;
A website is more than its HTML&lt;br&gt;
A serious audit may need to understand resources such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;robots.txt
sitemaps
sitemap indexes
RSS / Atom
JSON-LD
canonical URLs
hreflang
HTTP headers
llms.txt
manifests
service workers
security.txt
OpenAPI
internal links
external links
images
scripts
stylesheets
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of letting every engine rediscover the same resources independently, I wanted a shared site-resource intelligence layer.&lt;br&gt;
The basic idea is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 Site Resource Intelligence
                            │
          ┌─────────────────┼─────────────────┐
          ↓                 ↓                 ↓
       Robots            Sitemaps          HTML
          │                 │                 │
          └─────────────────┼─────────────────┘
                            ↓
                     Resource Graph
                            ↓
              ┌─────────────┼─────────────┐
              ↓             ↓             ↓
         Indexability     Schema        AI visibility
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes reconciliation possible.&lt;br&gt;
A resource should also have a useful state.&lt;br&gt;
For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DISCOVERED
VALID
INVALID
PARTIALLY_VALID
CONFLICTING
UNAVAILABLE
NOT_APPLICABLE
UNVERIFIABLE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is more useful than a simple &lt;code&gt;found: true&lt;/code&gt;.&lt;br&gt;
Crawlability and indexability are different&lt;br&gt;
This was another important lesson.&lt;br&gt;
A page can be crawlable without being indexable.&lt;br&gt;
For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;robots.txt
    allows crawling

meta robots
    noindex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those are two different signals.&lt;br&gt;
Likewise, a &lt;code&gt;200&lt;/code&gt; response does not automatically mean a page should be considered a healthy indexable page.&lt;br&gt;
The system therefore treats indexability as a state derived from several pieces of evidence.&lt;br&gt;
The model uses states such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INDEXABLE
INDEXABLE_WITH_WARNINGS
AT_RISK
BLOCKED
UNVERIFIABLE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is to avoid reducing a complicated website state to a single boolean.&lt;br&gt;
Context matters&lt;br&gt;
One of the easiest ways for an auditing tool to create noise is to apply every check to every page.&lt;br&gt;
A homepage, an article, a login page, a checkout flow, a utility page, and a legal page do not necessarily have the same expectations.&lt;br&gt;
That means a finding should be able to distinguish between:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ACTIONABLE
OPTIONAL
NOT_APPLICABLE
UNVERIFIABLE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This principle affects SEO, accessibility, content, structured data, and AI visibility.&lt;br&gt;
A missing signal is not automatically a failure.&lt;br&gt;
Findings should contain evidence&lt;br&gt;
A useful finding should answer more than:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Your page has a problem."&lt;br&gt;
It should answer:&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What happened?
Where did it happen?
Why does it matter?
What evidence supports it?
What should be changed?
How can the change be verified?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That leads to a structure like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Finding
   ↓
Affected URL
   ↓
Observed evidence
   ↓
Root cause
   ↓
Recommendation
   ↓
Verification condition
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is also important for AI-assisted development.&lt;br&gt;
An AI coding assistant has much more useful information when it receives:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;missing accessible name
affected element
HTML evidence
affected URL
recommended correction
verification condition
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;than when it receives:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Improve accessibility."&lt;br&gt;
Scoring should follow evidence&lt;br&gt;
Another thing I learned is how easy it is for a scoring system to become misleading.&lt;br&gt;
Suppose a browser-only metric cannot be measured.&lt;br&gt;
That should not automatically mean:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-10 points
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Likewise, an optional improvement should not automatically behave like a hard failure.&lt;br&gt;
I prefer score changes to require stronger evidence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;deterministic violation
+
strong evidence
+
meaningful impact
=
possible score impact
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything else should remain clearly distinguishable as advisory or informational.&lt;br&gt;
A clean website should be able to reach a clean score without being penalized simply because an unavailable measurement was unavailable.&lt;br&gt;
Performance needs measured evidence&lt;br&gt;
Performance analysis creates a similar problem.&lt;br&gt;
There is a big difference between:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MEASURED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ESTIMATED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LCP = 6.2s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is measured evidence.&lt;br&gt;
But:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Removing this script will save 420ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is much weaker if that saving has not actually been measured.&lt;br&gt;
So an audit system should be explicit about evidence quality:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VERIFIED
MEASURED
ESTIMATED
HEURISTIC
UNMEASURED
UNAVAILABLE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An estimate should never look like a measurement.&lt;br&gt;
Security has to be part of the architecture&lt;br&gt;
A website auditor makes network requests and can execute websites in a browser.&lt;br&gt;
That makes security part of the core architecture.&lt;br&gt;
An auditor needs to think about things such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SSRF
private IP ranges
localhost
cloud metadata services
redirect chains
browser process limits
timeouts
concurrency
network policies
resource limits
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The crawler and browser should not have completely different definitions of what is safe.&lt;br&gt;
The same security policy needs to remain consistent across the audit pipeline.&lt;br&gt;
The interesting part is connecting the engines&lt;br&gt;
At first, a system like this can look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SEO checker
+
Accessibility checker
+
Performance checker
+
Schema checker
+
AI visibility checker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the more interesting architecture looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 Site Intelligence
                        │
        ┌───────────────┼────────────────┐
        ↓               ↓                ↓
      Pages          Resources        Graph
        │               │                │
        └───────────────┼────────────────┘
                        ↓
                 Engine analysis
                        ↓
              Finding reconciliation
                        ↓
                 Root-cause graph
                        ↓
                   Action plan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A collection of independent checkers produces a collection of warnings.&lt;br&gt;
A shared intelligence layer can start producing explanations.&lt;br&gt;
What I am building toward&lt;br&gt;
The long-term direction is not simply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Run an SEO scan.&lt;br&gt;
It is:&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DISCOVER
    ↓
UNDERSTAND
    ↓
DIAGNOSE
    ↓
EXPLAIN
    ↓
PRIORITIZE
    ↓
PLAN
    ↓
FIX
    ↓
VERIFY
    ↓
MONITOR
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is to move from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Here are 57 problems."&lt;br&gt;
toward:&lt;br&gt;
"These are the root causes affecting these pages. Here is the evidence, the affected systems, the recommended order of fixes, and how to verify each change."&lt;br&gt;
That is the direction I am taking AuditForge AI.&lt;br&gt;
Still building.&lt;br&gt;
Still learning.&lt;br&gt;
Still a lot left to improve.&lt;br&gt;
But one lesson is already clear:&lt;br&gt;
A good website auditor should not just detect problems. It should understand why they exist.&lt;/p&gt;
&lt;/blockquote&gt;

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