cd /news/developer-tools/show-hn-indexflow-seo-a-lightweight-… · home topics developer-tools article
[ARTICLE · art-117734] src=github.com ↗ pub= topic=developer-tools verified=true sentiment=· neutral

Show HN: Indexflow-SEO – A lightweight SEO analyzer written in Rust

Indexflow-SEO, a lightweight SEO analyzer written in Rust, has been released as version 0.1.2 on crates.io, offering zero-dependency technical SEO validation and Generative Engine Optimization (GEO) auditing for AI bots such as GPTBot, PerplexityBot, ClaudeBot, and Google-Extended. The tool checks HTTP status codes, canonical URLs, robots directives, title tags, and Schema.org structured data, and includes an optional async HTTP prober with a 5 MiB body cap.

read2 min views1 publishedSep 1, 2026
Show HN: Indexflow-SEO – A lightweight SEO analyzer written in Rust
Image: Michielbdejong (auto-discovered)

A blazing-fast, zero-dependency Technical SEO Quality Gate & GEO (Generative Engine Optimization) Auditor written in pure Rust.

  • 🛡️ Technical SEO Gatekeeper: Pre-flight validation for HTTP status codes, Canonical declaration equivalence,noindex

/nofollow

robots directives,<title>

tags, and<h1>

headings. - 🤖 GEO & AI Bot Auditing: Audits crawler exclusion directives forGPTBot

/ChatGPT-User

,PerplexityBot

,ClaudeBot

/anthropic-ai

, andGoogle-Extended

— including per-botX-Robots-Tag

headers andnone

/noai

. - 📑 Schema.org Structured Data: Extractsapplication/ld+json

blocks, expands@graph

and top-level arrays, and maps@type

(string or array). - 🌐 Social & Multilingual Metadata: Parses OpenGraph, Twitter Card tags, andlink rel="alternate" hreflang

arrays. - ⚡ Pure In-Memory Evaluation: Char-boundary-safe HTML scanner (CJK / emoji never panic). Quote-aware tags, unquoted attributes, multiline meta, HTML comments and<script>

/<style>

skipped for visible tags. - 🚀 Optional Non-Redirecting Prober: Lightweight async HTTP client that treats 3xx redirects as actionable gate issues, with a 5 MiB body cap.

Add this to your Cargo.toml

:

[dependencies]
indexflow-seo = "0.1.2"

probe

(default): Enables the async HTTPSeoProbeClient

viareqwest

(with pure Rustls TLS).

use indexflow_seo::evaluate_html;

fn main() {
    let page_url = "https://example.com/blog/rust-guide";
    let html = r#"
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <title>Rust Monolith Guide &amp; SEO Best Practices</title>
      <meta name="description" content="A complete technical SEO guide for modern Rust developers." />
      <link rel="canonical" href="https://example.com/blog/rust-guide" />
      <meta name="robots" content="index, follow" />
      
      <!-- AI Bot Directives -->
      <meta name="gptbot" content="index" />
      <meta name="perplexitybot" content="index" />

      <!-- Structured Data -->
      <script type="application/ld+json">
      {
        "@context": "https://schema.org",
        "@type": "Article",
        "headline": "Rust Monolith Guide"
      }
      </script>
    </head>
    <body>
      <h1>Complete Guide to Rust Monolith</h1>
    </body>
    </html>"#;

    let result = evaluate_html(page_url, 200, 25, None, html);

    if result.passed {
        println!("✅ SEO Gate: PASSED");
        println!("Page Title: {:?}", result.page_title);
        println!("H1 Content: {:?}", result.h1_content);
        println!("Schema.org Entities: {:?}", result.schema_types());
    } else {
        println!("❌ SEO Gate: BLOCKED (Reason: {:?})", result.block_reason);
    }
}
use indexflow_seo::SeoProbeClient;
use std::time::Duration;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let prober = SeoProbeClient::new(
        "Mozilla/5.0 (compatible; IndexFlowBot/1.0)",
        Duration::from_secs(10),
    )?;

    let result = prober.check_url("https://www.example.com").await;

    println!("Gate Result: passed={}, reason={:?}", result.passed, result.block_reason);
    println!("Response Time: {:?} ms", result.response_time_ms);
    println!("GPTBot Blocked: {}", result.ai_directives.gptbot_blocked);

    Ok(())
}

indexflow-seo

enforces the following pre-flight checks before approving a URL for search engine submission:

HTTP Status: Must strictly return200 OK

.Robots Directives: Neither<meta name="robots" content="noindex">

(ornone

) norX-Robots-Tag: noindex

may be present.Canonical Normalization: Declared<link rel="canonical">

must match the page URL. Handles relative and protocol-relative paths,.

/..

segments, default ports 80/443, trailing slashes, scheme/host case, query-parameter order, and percent-encoding. Path case is preserved (case-sensitive).Title Tag: Must contain a valid, non-empty<title>

element.

  • Char-boundary-safe HTML scanner: CJK / emoji, quote-aware >

, unquoted URL attributes, multiline meta, comments and raw<script>

/<style>

skipped for visible tags. - JSON-LD expands @graph

, top-level arrays, and array-typed@type

; CDATA wrappers tolerated. - Single-pass entity decode (HTML named Latin-1 + &#N;

/&#xN;

); no double-decode of&lt;

. - Canonical matching: sorted query params, ../

per RFC 3986, protocol-relative URLs,%7E

~

. - GEO: AI-bot aliases, none

/noai

, per-botX-Robots-Tag

; probe body capped at 5 MiB.

Dual-licensed under either of:

── more in #developer-tools 4 stories · sorted by recency
── more on @indexflow-seo 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
Live at https://your-agent.zahid.host
Get free account → Pricing
from €0/mo · no card required
LIVE [news/show-hn-indexflow-se…] indexed:0 read:2min 2026-09-01 ·