{"slug": "show-hn-indexflow-seo-a-lightweight-seo-analyzer-written-in-rust", "title": "Show HN: Indexflow-SEO – A lightweight SEO analyzer written in Rust", "summary": "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.", "body_md": "A blazing-fast, zero-dependency Technical SEO Quality Gate & GEO (Generative Engine Optimization) Auditor written in pure Rust.\n\n- 🛡️\n**Technical SEO Gatekeeper**: Pre-flight validation for HTTP status codes, Canonical declaration equivalence,`noindex`\n\n/`nofollow`\n\nrobots directives,`<title>`\n\ntags, and`<h1>`\n\nheadings. - 🤖\n**GEO & AI Bot Auditing**: Audits crawler exclusion directives for`GPTBot`\n\n/`ChatGPT-User`\n\n,`PerplexityBot`\n\n,`ClaudeBot`\n\n/`anthropic-ai`\n\n, and`Google-Extended`\n\n— including per-bot`X-Robots-Tag`\n\nheaders and`none`\n\n/`noai`\n\n. - 📑\n**Schema.org Structured Data**: Extracts`application/ld+json`\n\nblocks, expands`@graph`\n\nand top-level arrays, and maps`@type`\n\n(string or array). - 🌐\n**Social & Multilingual Metadata**: Parses OpenGraph, Twitter Card tags, and`link rel=\"alternate\" hreflang`\n\narrays. - ⚡\n**Pure In-Memory Evaluation**: Char-boundary-safe HTML scanner (CJK / emoji never panic). Quote-aware tags, unquoted attributes, multiline meta, HTML comments and`<script>`\n\n/`<style>`\n\nskipped for visible tags. - 🚀\n**Optional Non-Redirecting Prober**: Lightweight async HTTP client that treats 3xx redirects as actionable gate issues, with a 5 MiB body cap.\n\nAdd this to your `Cargo.toml`\n\n:\n\n```\n[dependencies]\nindexflow-seo = \"0.1.2\"\n```\n\n`probe`\n\n*(default)*: Enables the async HTTP`SeoProbeClient`\n\nvia`reqwest`\n\n(with pure Rustls TLS).\n\n``` js\nuse indexflow_seo::evaluate_html;\n\nfn main() {\n    let page_url = \"https://example.com/blog/rust-guide\";\n    let html = r#\"\n    <!DOCTYPE html>\n    <html lang=\"en\">\n    <head>\n      <title>Rust Monolith Guide &amp; SEO Best Practices</title>\n      <meta name=\"description\" content=\"A complete technical SEO guide for modern Rust developers.\" />\n      <link rel=\"canonical\" href=\"https://example.com/blog/rust-guide\" />\n      <meta name=\"robots\" content=\"index, follow\" />\n      \n      <!-- AI Bot Directives -->\n      <meta name=\"gptbot\" content=\"index\" />\n      <meta name=\"perplexitybot\" content=\"index\" />\n\n      <!-- Structured Data -->\n      <script type=\"application/ld+json\">\n      {\n        \"@context\": \"https://schema.org\",\n        \"@type\": \"Article\",\n        \"headline\": \"Rust Monolith Guide\"\n      }\n      </script>\n    </head>\n    <body>\n      <h1>Complete Guide to Rust Monolith</h1>\n    </body>\n    </html>\"#;\n\n    let result = evaluate_html(page_url, 200, 25, None, html);\n\n    if result.passed {\n        println!(\"✅ SEO Gate: PASSED\");\n        println!(\"Page Title: {:?}\", result.page_title);\n        println!(\"H1 Content: {:?}\", result.h1_content);\n        println!(\"Schema.org Entities: {:?}\", result.schema_types());\n    } else {\n        println!(\"❌ SEO Gate: BLOCKED (Reason: {:?})\", result.block_reason);\n    }\n}\nuse indexflow_seo::SeoProbeClient;\nuse std::time::Duration;\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn std::error::Error>> {\n    let prober = SeoProbeClient::new(\n        \"Mozilla/5.0 (compatible; IndexFlowBot/1.0)\",\n        Duration::from_secs(10),\n    )?;\n\n    let result = prober.check_url(\"https://www.example.com\").await;\n\n    println!(\"Gate Result: passed={}, reason={:?}\", result.passed, result.block_reason);\n    println!(\"Response Time: {:?} ms\", result.response_time_ms);\n    println!(\"GPTBot Blocked: {}\", result.ai_directives.gptbot_blocked);\n\n    Ok(())\n}\n```\n\n`indexflow-seo`\n\nenforces the following pre-flight checks before approving a URL for search engine submission:\n\n**HTTP Status**: Must strictly return`200 OK`\n\n.**Robots Directives**: Neither`<meta name=\"robots\" content=\"noindex\">`\n\n(or`none`\n\n) nor`X-Robots-Tag: noindex`\n\nmay be present.**Canonical Normalization**: Declared`<link rel=\"canonical\">`\n\nmust match the page URL. Handles relative and protocol-relative paths,`.`\n\n/`..`\n\nsegments, 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>`\n\nelement.\n\n- Char-boundary-safe HTML scanner: CJK / emoji, quote-aware\n`>`\n\n, unquoted URL attributes, multiline meta, comments and raw`<script>`\n\n/`<style>`\n\nskipped for visible tags. - JSON-LD expands\n`@graph`\n\n, top-level arrays, and array-typed`@type`\n\n; CDATA wrappers tolerated. - Single-pass entity decode (HTML named Latin-1 +\n`&#N;`\n\n/`&#xN;`\n\n); no double-decode of`&lt;`\n\n. - Canonical matching: sorted query params,\n`../`\n\nper RFC 3986, protocol-relative URLs,`%7E`\n\n≡`~`\n\n. - GEO: AI-bot aliases,\n`none`\n\n/`noai`\n\n, per-bot`X-Robots-Tag`\n\n; probe body capped at 5 MiB.\n\nDual-licensed under either of:", "url": "https://wpnews.pro/news/show-hn-indexflow-seo-a-lightweight-seo-analyzer-written-in-rust", "canonical_source": "https://github.com/IndexFlowing/IndexFlow-core/tree/main/crates/indexflow-seo", "published_at": "2026-09-01 13:01:16+00:00", "updated_at": "2026-09-01 13:23:49.432011+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools"], "entities": ["Indexflow-SEO", "Rust", "GPTBot", "PerplexityBot", "ClaudeBot", "Google-Extended"], "alternates": {"html": "https://wpnews.pro/news/show-hn-indexflow-seo-a-lightweight-seo-analyzer-written-in-rust", "markdown": "https://wpnews.pro/news/show-hn-indexflow-seo-a-lightweight-seo-analyzer-written-in-rust.md", "text": "https://wpnews.pro/news/show-hn-indexflow-seo-a-lightweight-seo-analyzer-written-in-rust.txt", "jsonld": "https://wpnews.pro/news/show-hn-indexflow-seo-a-lightweight-seo-analyzer-written-in-rust.jsonld"}}