{
 "name": "Vendors behind what an agent reads",
 "edition": "2026-11-05",
 "cite": "Agent Ready HTML. Vendors behind what an agent reads. Edition 2026-11-05. https://agentreadyhtml.com/vendors/",
 "source": "https://agentreadyhtml.com/vendors/",
 "license": "https://agentreadyhtml.com/terms/",
 "standards": {
  "llms-txt": "generates or serves /llms.txt",
  "markdown-negotiation": "answers Accept: text/markdown on the same URL",
  "markdown-twin": "publishes a .md copy of each page",
  "initial-html": "puts the page content in the server HTML by default",
  "real-404": "answers a missing path with a 404 status",
  "vary-accept": "sends Vary: Accept when it negotiates"
 },
 "counts": {
  "docs-platform": 18,
  "framework": 22,
  "cms": 7,
  "site-builder": 8,
  "host-or-cdn": 12,
  "markdown-tooling": 7
 },
 "vendors": 74,
 "facts": 888,
 "sources": 502,
 "rows": [
  {
   "id": "webflow",
   "name": "Webflow",
   "type": "site-builder",
   "homepage": "https://webflow.com/",
   "one_line": "Webflow is a visual site builder and host that publishes static and CMS pages as server HTML, serves an llms.txt the owner uploads, and converts pages to markdown for agents on Enterprise sites on its Cloudflare setup.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Webflow's about page gives 2013 as its founding year and lists 300k organizations using Webflow and $335M in funding to date.",
     "source_url": "https://webflow.com/about",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "On 2026-11-05 the Webflow pricing page listed Starter as free with a webflow.io domain and 2 static pages, Basic at $15 a month billed yearly, and a new Premium plan at $25 a month billed yearly that adds Webflow CMS and well-known files.",
     "source_url": "https://webflow.com/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Webflow's plan comparison marks both the Robots.txt & LLMs.txt row and the Schema markup support row with a note that a free Starter site needs a paid Workspace plan before either feature works.",
     "source_url": "https://webflow.com/pricing",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Webflow switches on Markdown for agents per site under Site settings, Publishing, Advanced publishing options, and only for sites on a custom domain that have been migrated to Webflow's Cloudflare infrastructure under an Enterprise Workspace plan.",
     "source_url": "https://help.webflow.com/api/v2/help_center/en-us/articles/50435871026195.json",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Five curl 8.7.1 requests to webflow.com with Accept: text/markdown on 2026-11-05 returned the 65,585-byte markdown version twice and the 553,434-byte HTML page three times, all as Cloudflare cache hits, and only the markdown answers carried Vary: accept.",
     "source_url": "https://help.webflow.com/api/v2/help_center/en-us/articles/50435871026195.json",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Since an update dated 2026-08-20, each URL in Webflow's auto-generated sitemap carries a <lastmod> timestamp, the sitemap can use the canonical URL as its domain, and publishing a single page refreshes it.",
     "source_url": "https://webflow.com/updates/lastmod-timestamp",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-08-20"
    },
    {
     "claim": "Webflow writes the sitemap.xml address into robots.txt on its own, and dropping that line with the Remove sitemap.xml from robots.txt toggle under Site settings, SEO, Indexing needs a paid Site plan.",
     "source_url": "https://help.webflow.com/api/v2/help_center/en-us/articles/33961355371667.json",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Webflow keeps robots.txt rules in Site settings, SEO, Indexing, and adding any rule there takes a Site plan or a paid Workspace plan.",
     "source_url": "https://help.webflow.com/api/v2/help_center/en-us/articles/41954183592851.json",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Webflow page settings carry a Schema markup field that Webflow AI can fill, markup saved there is published in the page <head>, and Reference, Multi-reference and Multi-image Collection fields cannot be bound into it.",
     "source_url": "https://help.webflow.com/api/v2/help_center/en-us/articles/45766917223955.json",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Webflow Data API v2 returns a site's robots.txt rules and sitemap URL from GET /v2/sites/{site_id}/robots_txt, an endpoint limited to Enterprise workspaces and the site_config:read scope.",
     "source_url": "https://developers.webflow.com/data/v2.0.0/reference/enterprise/site-configuration/robots-txt/get.md",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Webflow's well-known file endpoint, PUT /v2/sites/{site_id}/well_known, is Enterprise-only and accepts fewer than 30 files, each under 100kb, with a .txt, .json or .noext extension.",
     "source_url": "https://developers.webflow.com/data/v2.0.0/reference/enterprise/site-configuration/well-known-files/put.md",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Webflow says its hosting runs on AWS infrastructure behind Cloudflare's CDN with 99.99% uptime, and that Webflow Cloud adds server-side rendering for apps built with Next.js and Astro on the same domain.",
     "source_url": "https://webflow.com/hosting",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "Webflow places the editable 404 page under Utility Pages in the Pages panel and refuses Collection lists on it, so the page still renders when the CMS is down.",
     "source_url": "https://help.webflow.com/api/v2/help_center/en-us/articles/33961393564435.json",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "A curl 8.7.1 GET for /this-page-does-not-exist-ora-check on webflow.com on 2026-11-05 came back with HTTP 404 and a 5,571-byte text/html body.",
     "source_url": "https://help.webflow.com/api/v2/help_center/en-us/articles/33961393564435.json",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Webflow site plans",
     "what": "Hosted site plans from a free Starter site to Premium with Webflow CMS and well-known files.",
     "pricing": {
      "model": "freemium",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://webflow.com/pricing",
      "note": "Starter free; Basic $15 and Premium $25 per month billed yearly"
     }
    },
    {
     "name": "Webflow Team",
     "what": "Platform plan that adds Localize, AEO agents, publishing workflows and single-page publishing.",
     "pricing": {
      "model": "subscription",
      "from": 2500,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://webflow.com/pricing",
      "note": "per month, annual contract required"
     }
    },
    {
     "name": "Webflow Enterprise",
     "what": "Custom platform plan required for Markdown for agents and the robots.txt and well-known file APIs.",
     "pricing": {
      "model": "enterprise quote",
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://webflow.com/pricing",
      "note": "Talk to us"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "The owner uploads a hand-written llms.txt; the plan comparison puts Robots.txt & LLMs.txt behind a paid Workspace plan on Starter sites.",
     "source_url": "https://webflow.com/pricing"
    },
    {
     "id": "markdown-negotiation",
     "status": "partial",
     "evidence": "Markdown for agents converts HTML to markdown for agent requests on Enterprise sites with a custom domain on Webflow's Cloudflare infrastructure; webflow.com answered markdown on 2 of 5 tries on 2026-11-05.",
     "source_url": "https://help.webflow.com/api/v2/help_center/en-us/articles/50435871026195.json"
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No statement about a per-page .md URL found in the Markdown for agents help article or the 2026 updates on Webflow's updates feed."
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "Webflow says the platform automatically generates clean, semantic HTML markup, and its core hosting serves static and CMS-driven sites.",
     "source_url": "https://webflow.com/seo"
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "The 404 help article covers the Utility Pages design but not the HTTP status; webflow.com returned 404 for a made-up path on 2026-11-05.",
     "source_url": "https://help.webflow.com/api/v2/help_center/en-us/articles/33961393564435.json"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement in the Markdown for agents article; markdown answers from webflow.com on 2026-11-05 carried vary accept-encoding, accept while HTML answers to the same request did not.",
     "source_url": "https://help.webflow.com/api/v2/help_center/en-us/articles/50435871026195.json"
    }
   ],
   "checks": {
    "domain": "webflow.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 2642,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "accept-encoding, accept"
     },
     "llms_txt": {
      "status": null,
      "error": "request failed or timed out"
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 78,
     "grade": "B",
     "scanned_at": "2026-11-03T21:28:44.349+00:00",
     "via": "GET https://ora.ai/api/score/webflow.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 47,
     "level": "L4 Agent-Integrated",
     "scanned_at": "2026-11-05T13:51:52.681Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 2772,
     "reachable": false,
     "skipped_by_robots": false,
     "note": "the shared crawl recorded no home page read for this domain",
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Webflow's Markdown for agents is unavailable on Basic, Premium and Team sites, and on Enterprise sites not yet moved to Webflow's Cloudflare infrastructure.",
    "Webflow AI does not generate schema markup in a site's secondary locales during the localization beta, so markup there is written by hand.",
    "The Webflow robots.txt and well-known file API endpoints reject workspaces below Enterprise."
   ],
   "does_not_do_basis": [
    {
     "fact": 3,
     "keep": "fact"
    },
    null,
    {
     "fact": 9,
     "keep": "fact"
    }
   ],
   "related": [
    "webflow"
   ],
   "page": "https://agentreadyhtml.com/vendors/webflow/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "framer",
   "name": "Framer",
   "type": "site-builder",
   "homepage": "https://www.framer.com/",
   "one_line": "Framer is a hosted React site builder that prerenders every page on its servers, answers Accept: text/markdown with a markdown copy, and hosts an uploaded llms.txt or robots.txt on Pro and Enterprise plans.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Framer launched in 2014, and its about page traces the company to co-founders Koen Bok and Jorn van Dijk building software together in Amsterdam.",
     "source_url": "https://www.framer.com/about/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Framer announced $100 million in Series D funding at a $2 billion valuation in August 2025, in a round led by Meritech and Atomico.",
     "source_url": "https://www.framer.com/about/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "With yearly billing selected on 2026-11-05, Framer priced Free at $0 with a Framer domain, Basic at $10 a month, Pro at $30 a month with staging and site redirects, and Enterprise at a custom price.",
     "source_url": "https://www.framer.com/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Framer hosts an uploaded llms.txt through Site Settings, Hosting, Files, a static file feature limited to Pro and Enterprise plans, with up to 50 files on Pro or 500 with the Advanced Hosting add-on.",
     "source_url": "https://www.framer.com/help/articles/llms-txt-framer/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "On Framer, a robots.txt uploaded through Static Files with its path set to / takes the place of the generated file, an option open only on Pro and Enterprise plans.",
     "source_url": "https://www.framer.com/help/articles/how-can-i-access-the-robots-txt-file/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Framer's AI agent help article says markdown is generated only for optimized pages, may be missing while a site is rate-limited, and that the auto-generated robots.txt lets every AI and search crawler in by default.",
     "source_url": "https://www.framer.com/help/articles/make-site-readable-by-ai-agents/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Framer appends a ## Navigation section of site links to each markdown page; the markdown for framer.com/pricing fetched with curl 8.7.1 on 2026-11-05 ran 393 lines with that heading starting at line 299.",
     "source_url": "https://www.framer.com/help/articles/make-site-readable-by-ai-agents/",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Framer converts pages served from another host through multi-site rewrites to markdown too, and passes through the other host's own markdown when that host already produces it.",
     "source_url": "https://www.framer.com/help/articles/make-site-readable-by-ai-agents/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Framer leaves overlay content out of the HTML of the first load, so text and links that live only inside an overlay stay hidden from crawlers, and Framer says no setting changes that.",
     "source_url": "https://www.framer.com/help/articles/fixing-uncrawlable-overlay-content/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Framer offers no HTML export for self-hosting and names page pre-rendering and server-side rendering among the hosted services a published Framer site depends on.",
     "source_url": "https://www.framer.com/help/articles/can-i-export-my-website-to-html-and-self-host-it/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Framer adds JSON-LD through its Custom Code feature, and on CMS detail pages the {{Title | json}} filter escapes CMS field values so each page gets valid structured data.",
     "source_url": "https://www.framer.com/help/articles/structured-data-through-json-ld/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "A Framer 404 page is made from the Pages panel with the New 404 Page option, which assigns it to the project as its 404 page without further setup.",
     "source_url": "https://www.framer.com/help/articles/creating-a-custom-not-found-404-page/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "On 2026-11-05 a curl 8.7.1 request for a made-up path on www.framer.com returned HTTP 404 with an 850,936-byte HTML body and Vary: Accept-Encoding, Accept.",
     "source_url": "https://www.framer.com/help/articles/creating-a-custom-not-found-404-page/",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Framer site plans",
     "what": "Hosted Framer sites from a free plan on a Framer domain to Pro with staging and static files.",
     "pricing": {
      "model": "freemium",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.framer.com/pricing",
      "note": "Free $0; Basic $10 and Pro $30 per month with yearly billing selected"
     }
    },
    {
     "name": "Framer Enterprise",
     "what": "Custom limits, SSO, SCIM and an uptime guarantee for large sites.",
     "pricing": {
      "model": "enterprise quote",
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.framer.com/pricing",
      "note": "Custom"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "Framer hosts an llms.txt the owner uploads through Static Files, available on Pro and Enterprise plans.",
     "source_url": "https://www.framer.com/help/articles/llms-txt-framer/"
    },
    {
     "id": "markdown-negotiation",
     "status": "supports",
     "evidence": "Framer returns a markdown version instead of HTML when a request sends Accept: text/markdown, with no setup.",
     "source_url": "https://www.framer.com/help/articles/make-site-readable-by-ai-agents/"
    },
    {
     "id": "markdown-twin",
     "status": "supports",
     "evidence": "Adding a md query parameter to any page URL returns that page's markdown, for example framer.com/pricing?md.",
     "source_url": "https://www.framer.com/help/articles/make-site-readable-by-ai-agents/"
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "Framer says every page is pre-rendered to HTML on its servers before it is served; overlays are the stated exception.",
     "source_url": "https://www.framer.com/help/articles/make-site-readable-by-ai-agents/"
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "The custom 404 article does not give the HTTP status; www.framer.com returned 404 for a made-up path on 2026-11-05.",
     "source_url": "https://www.framer.com/help/articles/creating-a-custom-not-found-404-page/"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement in the AI agents article; www.framer.com responses on 2026-11-05 carried Vary: Accept-Encoding, Accept.",
     "source_url": "https://www.framer.com/help/articles/make-site-readable-by-ai-agents/"
    }
   ],
   "checks": {
    "domain": "framer.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 1563,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "Accept-Encoding, Accept"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 9831,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 75,
     "grade": "B",
     "scanned_at": "2026-11-05T01:12:27.669+00:00",
     "via": "GET https://ora.ai/api/score/framer.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 33,
     "level": "L4 Agent-Integrated",
     "scanned_at": "2026-11-05T13:52:06.470Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 5051,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 1565,
     "js_shell": false,
     "jsonld_types": [
      "Organization"
     ],
     "home_links_llms_txt": true,
     "markdown_alternate_link": true,
     "generator": "Framer f537ee4",
     "answers_markdown": true,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 9831,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Framer keeps overlay content out of the first-load HTML, and its help center says overlay text and links cannot be made crawlable.",
    "Framer has no static HTML export, so a Framer site cannot be moved to another host as files.",
    "Free and Basic Framer sites cannot upload an llms.txt or a custom robots.txt, because static file hosting starts on the Pro plan."
   ],
   "does_not_do_basis": [
    {
     "fact": 8,
     "keep": "fact"
    },
    null,
    {
     "fact": 3,
     "keep": "fact"
    }
   ],
   "related": [
    "framer"
   ],
   "page": "https://agentreadyhtml.com/vendors/framer/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "wix",
   "name": "Wix",
   "type": "site-builder",
   "homepage": "https://www.wix.com/",
   "one_line": "Wix is a hosted site builder whose sites are server-side rendered, with an auto-generated llms.txt on upgraded sites with a custom domain, a robots.txt editor and JSON-LD markup set in SEO Settings.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Wix gives 2006 as its founding year, went public on the NASDAQ on November 6, 2013, and its about page reports more than 300 million users worldwide.",
     "source_url": "https://www.wix.com/about/us",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Wix plans page read on 2026-11-05 showed five tiers, Free, Light, Core, Business and Business Elite, and says the prices it displays are for yearly subscriptions and change with the visitor's location.",
     "source_url": "https://www.wix.com/plans",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Wix's help center states that Wix sites use server-side rendering and warns that most AI crawlers read only the HTML the server sends, so content a script adds stays invisible to them.",
     "source_url": "https://support.wix.com/en/article/viewing-your-pages-source-code-the-way-search-engines-do",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Wix only publishes the auto-generated llms.txt for an upgraded site with a custom domain and search engine indexing on; the file sits under SEO & GEO, Tools and settings, Go to llms.txt, where a toggle can hide it.",
     "source_url": "https://support.wix.com/en/article/understanding-your-sites-llms-txt-file",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Wix's AI Search Lab writes that Wix rolled out its agent-optimized LLMs.txt globally in May 2026.",
     "source_url": "https://www.wix.com/studio/ai-search-lab/llms-txt-myths",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Wix's llms.txt help suggests enabling NLWeb for AI agent access and reviewing log data in Wix SEO Reports as ways to improve the generated file.",
     "source_url": "https://support.wix.com/en/article/understanding-your-sites-llms-txt-file",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Wix edits robots.txt in the Robots.txt Editor under SEO & GEO, Tools and settings, offers a Reset to Default button, and tells owners that Wix Customer Care will not help with changes made there.",
     "source_url": "https://support.wix.com/en/article/editing-your-sites-robotstxt-file",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Wix takes structured data only as JSON-LD of fewer than 7,000 characters per markup, and its AI-generated structured data works only on Wix Blog posts.",
     "source_url": "https://support.wix.com/en/article/adding-structured-data-markup-to-your-sites-pages-2546962",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Wix says it adds structured data markup to product pages, events and blog and forum posts automatically, and creates 301 redirects and updates sitemaps when URLs change.",
     "source_url": "https://www.wix.com/seo/features",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "In the Wix Studio Editor a custom 404 page is an ordinary page whose URL slug is set to error404, and the site must be upgraded first.",
     "source_url": "https://support.wix.com/en/article/studio-editor-creating-a-custom-404-page",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Requested with curl 8.7.1 on 2026-11-05, a made-up path on www.wix.com answered with HTTP 404 and a short 3,035-byte HTML body.",
     "source_url": "https://support.wix.com/en/article/studio-editor-creating-a-custom-404-page",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Wix site plans",
     "what": "Hosted Wix sites from a free plan to Business Elite; llms.txt and a custom 404 page need an upgraded site.",
     "pricing": {
      "model": "freemium",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.wix.com/plans",
      "note": "Free, Light, Core, Business, Business Elite; displayed prices are yearly and vary by location"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "Wix generates and maintains llms.txt automatically, but only for upgraded sites with a custom domain and indexing enabled.",
     "source_url": "https://support.wix.com/en/article/understanding-your-sites-llms-txt-file"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the llms.txt, source code or SEO features pages; www.wix.com answered Accept: text/markdown with text/html in the shared crawl of 2026-11-04."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No statement about per-page markdown copies found in the Wix llms.txt help, the SEO features page or the AI Search Lab article."
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "Wix states that Wix sites use Server Side Rendering (SSR).",
     "source_url": "https://support.wix.com/en/article/viewing-your-pages-source-code-the-way-search-engines-do"
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "The custom 404 article covers the error404 page, not the status code; www.wix.com returned 404 for a made-up path on 2026-11-05.",
     "source_url": "https://support.wix.com/en/article/studio-editor-creating-a-custom-404-page"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found; Wix documents no markdown negotiation that would need Vary: Accept."
    }
   ],
   "checks": {
    "domain": "wix.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 2156,
     "jsonld_blocks": 5,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 37975,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 64,
     "grade": "C",
     "scanned_at": "2026-10-28T20:54:08.415+00:00",
     "via": "GET https://ora.ai/api/score/wix.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T13:52:21.425Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 610,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": false,
     "words": 3798,
     "js_shell": false,
     "jsonld_types": [
      "HowTo",
      "VideoObject",
      "Organization",
      "FAQPage"
     ],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": "Wix.com Website Builder",
     "answers_markdown": false,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 37975,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Wix publishes no llms.txt for a free site on a Wix subdomain; the help center asks for an upgrade and a custom domain first.",
    "Wix's AI-generated structured data skips every page type except Wix Blog posts, so other pages need JSON-LD written by hand.",
    "Wix Customer Care does not support edits to robots.txt or custom structured data markup."
   ],
   "does_not_do_basis": [
    {
     "fact": 3,
     "keep": "fact"
    },
    {
     "fact": 7,
     "keep": "fact"
    },
    {
     "fact": 6,
     "keep": "both"
    }
   ],
   "related": [
    "wix"
   ],
   "page": "https://agentreadyhtml.com/vendors/wix/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "squarespace",
   "name": "Squarespace",
   "type": "site-builder",
   "homepage": "https://www.squarespace.com/",
   "one_line": "Squarespace is a hosted site builder that writes structured data, a sitemap and robots.txt for every site, offers an owner-written llms.txt on version 7.1 sites that is off by default, and a checkbox to block known AI crawlers.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Squarespace says it was founded in 2003 in a University of Maryland dorm room, has a team of more than 1,760, and lists offices in New York, Dublin and Aveiro, Portugal.",
     "source_url": "https://www.squarespace.com/about/company",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "On 2026-11-05 the Squarespace pricing page showed Basic at $12 a month paid annually or $19 paid monthly, Core at $17 or $27 and Advanced at $25 or $36, with a 14-day free trial.",
     "source_url": "https://www.squarespace.com/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Squarespace's llms.txt is disabled by default on version 7.1 sites; the owner turns it on by typing text into the LLMS.txt tab of SEO Settings in the SEO/AI Visibility panel.",
     "source_url": "https://support.squarespace.com/api/v2/help_center/en-us/articles/47434125611277.json",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Squarespace support declines to advise on what to put in llms.txt, calling it a proposed standard still in development.",
     "source_url": "https://support.squarespace.com/api/v2/help_center/en-us/articles/47434125611277.json",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Squarespace generates structured data with blog post, event, local business, organization, product and website schemas, and site owners can neither edit nor remove those schemas.",
     "source_url": "https://support.squarespace.com/api/v2/help_center/en-us/articles/206744067.json",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Squarespace says every page and collection item gets a static URL and that it marks up headings and other key text so search engines can read the page structure.",
     "source_url": "https://support.squarespace.com/api/v2/help_center/en-us/articles/206744067.json",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "A Squarespace sitemap.xml cannot be edited, leaves out code block content and disabled pages, does not exist for trial sites or parking pages, and picks up content changes within an hour to 24 hours.",
     "source_url": "https://support.squarespace.com/api/v2/help_center/en-us/articles/206543547.json",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Squarespace's Block known artificial intelligence crawlers checkbox under Settings, Crawlers is unchecked by default and, once checked, writes robots.txt rules for 26 named bots including GPTBot, ClaudeBot, Google-Extended and Applebot-Extended.",
     "source_url": "https://support.squarespace.com/api/v2/help_center/en-us/articles/360022347072.json",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Squarespace's AI crawler request applies to the whole site, since the help center says it cannot be limited to chosen pages.",
     "source_url": "https://support.squarespace.com/api/v2/help_center/en-us/articles/360022347072.json",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Squarespace default 404 page (Pages, System Pages, 404 Page) links to the homepage and site search, and the help center warns that a custom 404 page can raise a Soft 404 alert in Google Search Console unless it is set to noindex.",
     "source_url": "https://support.squarespace.com/api/v2/help_center/en-us/articles/205814478.json",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "A made-up path on www.squarespace.com drew HTTP 404 and a 365,978-byte HTML page when fetched with curl 8.7.1 on 2026-11-05.",
     "source_url": "https://support.squarespace.com/api/v2/help_center/en-us/articles/205814478.json",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Squarespace's AI Visibility tool runs prompts on version 7.1 sites in English on every website plan, with the number of AI credits set by the plan.",
     "source_url": "https://support.squarespace.com/api/v2/help_center/en-us/articles/38299115788813.json",
     "read_date": "2026-11-05",
     "kind": "primary"
    }
   ],
   "products": [
    {
     "name": "Squarespace website plans",
     "what": "Hosted Squarespace sites on Basic, Core or Advanced plans.",
     "pricing": {
      "model": "subscription",
      "from": 12,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.squarespace.com/pricing",
      "note": "Basic, per month paid annually; $19 paid monthly"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "Version 7.1 sites can publish an llms.txt the owner writes in SEO Settings; the file is disabled by default.",
     "source_url": "https://support.squarespace.com/api/v2/help_center/en-us/articles/47434125611277.json"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the llms.txt, SEO, sitemap or AI search help articles; www.squarespace.com answered Accept: text/markdown with text/html in the shared crawl of 2026-11-04."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No statement about per-page markdown found in the Squarespace help articles on llms.txt, SEO and AI search."
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "Squarespace says it formats each site's code so search engines can read and index it, with headings and key text tagged.",
     "source_url": "https://support.squarespace.com/api/v2/help_center/en-us/articles/206744067.json"
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "The 404 article describes the 404 message and Soft 404 alerts but not the status code; www.squarespace.com returned 404 for a made-up path on 2026-11-05.",
     "source_url": "https://support.squarespace.com/api/v2/help_center/en-us/articles/205814478.json"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found; Squarespace documents no markdown negotiation."
    }
   ],
   "checks": {
    "domain": "squarespace.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 2412,
     "jsonld_blocks": 5,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 2409,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 67,
     "grade": "C",
     "scanned_at": "2026-10-06T16:11:13.469+00:00",
     "via": "GET https://ora.ai/api/score/squarespace.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T13:52:37.012Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 593,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 3979,
     "js_shell": false,
     "jsonld_types": [
      "WebSite",
      "Organization",
      "LocalBusiness",
      "HowTo",
      "FAQPage"
     ],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": false,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 2409,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Squarespace does not write llms.txt content for the owner; the LLMS.txt tab stays empty and the file stays off until text is entered.",
    "Squarespace lets no one edit sitemap.xml or a page's source code, or remove the automatic structured data schemas.",
    "Squarespace's Block known artificial intelligence crawlers setting cannot target chosen pages, only the whole site."
   ],
   "does_not_do_basis": [
    {
     "fact": 2,
     "keep": "fact"
    },
    null,
    {
     "fact": 8,
     "keep": "fact"
    }
   ],
   "related": [
    "squarespace"
   ],
   "page": "https://agentreadyhtml.com/vendors/squarespace/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "wordpress",
   "name": "WordPress",
   "type": "cms",
   "homepage": "https://wordpress.org/",
   "one_line": "WordPress is open-source PHP software whose themes render pages on the server, with a core XML sitemap, a virtual robots.txt and real 404 handling; llms.txt and markdown output come from plugins, not core.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "WordPress started in 2003 as a fork of b2/cafelog by Mike Little and Matt Mullenweg, is built on PHP and MariaDB, and is licensed under the GPLv2.",
     "source_url": "https://wordpress.org/about/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "wordpress.org states that the WordPress trademark is the intellectual property of the WordPress Foundation.",
     "source_url": "https://wordpress.org/about/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "WordPress 7.0 \"Armstrong\", released on 2026-05-20, added an AI Client in core for calling generative AI models and a Connectors screen that manages those connections.",
     "source_url": "https://wordpress.org/news/2026/05/armstrong/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-05-20"
    },
    {
     "claim": "WordPress core has exposed an XML sitemap index at /wp-sitemap.xml since version 5.5, per a core dev note of 2020-07-22, with up to 2,000 entries per sitemap by default and room for 50,000 sitemaps in the index.",
     "source_url": "https://make.wordpress.org/core/2020/07/22/new-xml-sitemaps-functionality-in-wordpress-5-5/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2020-07-22"
    },
    {
     "claim": "WordPress core sitemaps turn off when the Site Visibility setting asks search engines not to index the site, and the wp_sitemaps_enabled filter overrides that default.",
     "source_url": "https://make.wordpress.org/core/2020/07/22/new-xml-sitemaps-functionality-in-wordpress-5-5/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "WordPress serves a virtual robots.txt from do_robots(), which disallows the admin path, allows admin-ajax.php, and passes its output through the robots_txt filter available since version 3.0.0.",
     "source_url": "https://developer.wordpress.org/reference/functions/do_robots/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "In the WordPress template hierarchy a theme renders a missing URL with 404.php and falls back to index.php when no 404 template exists.",
     "source_url": "https://developer.wordpress.org/themes/basics/template-hierarchy/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "WP::handle_404() switches a request to a 404 status when it matches no posts or existing objects and is neither a search nor the homepage.",
     "source_url": "https://developer.wordpress.org/reference/classes/wp/handle_404/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Fetched with curl 8.7.1 on 2026-11-05, a made-up path on wordpress.org came back as HTTP 404 with a 125,068-byte HTML page.",
     "source_url": "https://developer.wordpress.org/reference/classes/wp/handle_404/",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Since 2026-03-03 most WordPress.org sites, a network run by the Meta team and separate from the software's defaults, return markdown for Accept: text/markdown or ?output_format=md and point to it with a link rel=alternate tag of type text/markdown.",
     "source_url": "https://make.wordpress.org/meta/2026/03/03/markdown-now-available-on-wordpress-org/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-03-03"
    },
    {
     "claim": "The WordPress 7.0 release post requested with ?output_format=md through curl 8.7.1 on 2026-11-05 came back as text/markdown, 67,334 bytes, with Vary: accept, content-type.",
     "source_url": "https://make.wordpress.org/meta/2026/03/03/markdown-now-available-on-wordpress-org/",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "The LLM Friendly plugin in the WordPress.org directory writes /llms.txt and per-post .md exports, and keeps its Accept: text/markdown mode off by default because that mode sends Vary: Accept and needs caches that honour it.",
     "source_url": "https://wordpress.org/plugins/llm-friendly/",
     "read_date": "2026-11-05",
     "kind": "secondary"
    }
   ],
   "products": [
    {
     "name": "WordPress",
     "what": "Open-source PHP content management system downloaded from wordpress.org.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://wordpress.org/about/",
      "note": "GPLv2 or later"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "Core writes no llms.txt; plugins such as LLM Friendly add /llms.txt.",
     "source_url": "https://wordpress.org/plugins/llm-friendly/"
    },
    {
     "id": "markdown-negotiation",
     "status": "partial",
     "evidence": "Core has no markdown output; the LLM Friendly plugin offers opt-in Accept: text/markdown negotiation on singular URLs.",
     "source_url": "https://wordpress.org/plugins/llm-friendly/"
    },
    {
     "id": "markdown-twin",
     "status": "partial",
     "evidence": "Plugins add .md endpoints, for example LLM Friendly under /{base}/{post_type}/{path}.md.",
     "source_url": "https://wordpress.org/plugins/llm-friendly/"
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "PHP template files chosen through the template hierarchy generate each page on the server.",
     "source_url": "https://developer.wordpress.org/themes/basics/template-hierarchy/"
    },
    {
     "id": "real-404",
     "status": "supports",
     "evidence": "WP::handle_404() issues a 404 when a request matches no posts and no existing object.",
     "source_url": "https://developer.wordpress.org/reference/classes/wp/handle_404/"
    },
    {
     "id": "vary-accept",
     "status": "partial",
     "evidence": "Only with a plugin; LLM Friendly sends Vary: Accept when its negotiation mode is on.",
     "source_url": "https://wordpress.org/plugins/llm-friendly/"
    }
   ],
   "checks": {
    "domain": "wordpress.org",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 393,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "Accept"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 5765,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 65,
     "grade": "C",
     "scanned_at": "2026-11-01T08:10:47.065+00:00",
     "via": "GET https://ora.ai/api/score/wordpress.org (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 33,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T13:52:52.844Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 65,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 529,
     "js_shell": false,
     "jsonld_types": [
      "Organization",
      "WebSite",
      "WebPage"
     ],
     "home_links_llms_txt": false,
     "markdown_alternate_link": true,
     "generator": "WordPress 7.2-beta4-65258",
     "answers_markdown": true,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 5765,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "WordPress core ships no llms.txt and no markdown output; the markdown on wordpress.org itself is custom work by the WordPress.org Meta team.",
    "WordPress core prints no JSON-LD structured data, so schema comes from the theme or an SEO plugin.",
    "The core robots.txt from do_robots() names no AI crawlers; blocking them takes a robots_txt filter, a physical robots.txt file or a plugin."
   ],
   "does_not_do_basis": [
    {
     "fact": 9,
     "keep": "both"
    },
    null,
    null
   ],
   "related": [
    "wordpress-elementor"
   ],
   "page": "https://agentreadyhtml.com/vendors/wordpress/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "elementor",
   "name": "Elementor",
   "type": "site-builder",
   "homepage": "https://elementor.com/",
   "hq": "Israel",
   "one_line": "Elementor is a WordPress page builder plugin, with Pro plans and its own hosting, whose pages render through WordPress on the server; an Alpha experiment in Elementor 4.1 builds a markdown version of pages for AI agents.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Elementor was created in 2016 by Yoni Luksenberg and Ariel Klikstein, who came out of the open-source WordPress community.",
     "source_url": "https://elementor.com/about/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Organization JSON-LD in the HTML that curl 8.7.1 fetched from elementor.com/about/ on 2026-11-05 named the legal entity Elementor Ltd. with a street address at Tuval 40, Ramat Gan, Israel.",
     "source_url": "https://elementor.com/about/",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Elementor's pricing page lists Essential for a basic website, Advanced Solo for a single professional and eCommerce website, then Advanced, Expert, One and One Agency, with a 30-day money-back guarantee and Theme Builder included from Essential up.",
     "source_url": "https://elementor.com/pricing/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "A plain curl 8.7.1 fetch of elementor.com/pricing/ on 2026-11-05 held empty price slots for every plan, its only dollar figure being the $60 in the meta description, while the markdown answer to the same URL said plans start from $60/year.",
     "source_url": "https://elementor.com/pricing/",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "elementor.com answered a curl 8.7.1 request with Accept: text/markdown on /pricing/ on 2026-11-05 with a 51,323-byte text/markdown body, an X-Powered-By header reading Elementor Cloud and Vary: accept-encoding, accept.",
     "source_url": "https://elementor.com/pricing/",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Elementor's Generate website markdown experiment, described in a help article last updated on 2026-05-26, strips redundant HTML and JavaScript from Elementor pages into a simplified markdown version for AI agents, needs Elementor Core 4.1 with the Atomic Editor, and is an Alpha experiment that starts inactive.",
     "source_url": "https://elementor.com/help/how-do-i-make-my-site-more-accessible-to-ai-agents/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-05-26"
    },
    {
     "claim": "Elementor launched the Elementor MCP on 2026-09-29 so that Claude, Codex, Cursor and other MCP clients can build pages and theme parts such as headers, footers and popups inside a site, with access limited to site admins.",
     "source_url": "https://elementor.com/blog/elementor-mcp-launch/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-09-29"
    },
    {
     "claim": "Elementor builds a custom 404 page as an Error 404 site part under Templates, Theme Builder in the WordPress dashboard, and a template only goes live once Display Conditions are assigned, marked by a green dot.",
     "source_url": "https://elementor.com/help/error-404-site-part/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "A made-up path on elementor.com produced HTTP 404, a 137,628-byte HTML page and Vary: Accept, accept-encoding for curl 8.7.1 on 2026-11-05.",
     "source_url": "https://elementor.com/help/error-404-site-part/",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Elementor Pro plans",
     "what": "Paid Elementor plans from Essential to One Agency that add Theme Builder, Form Builder and One credits.",
     "pricing": {
      "model": "subscription",
      "from": 60,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://elementor.com/pricing/",
      "note": "per year, from the page's own description; plan prices load by script"
     }
    },
    {
     "name": "Elementor (free plugin)",
     "what": "The free Elementor Core page builder plugin for WordPress, which carries the Generate website markdown experiment.",
     "pricing": {
      "model": "free",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://elementor.com/help/how-do-i-make-my-site-more-accessible-to-ai-agents/",
      "note": "experiment available to free Elementor Core users"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No statement on llms.txt generation found in the Elementor help articles on AI agents and 404 pages or the MCP launch post; elementor.com serves its own file."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "The markdown experiment article does not say how agents request the markdown version; elementor.com itself answered Accept: text/markdown with markdown on 2026-11-05.",
     "source_url": "https://elementor.com/pricing/"
    },
    {
     "id": "markdown-twin",
     "status": "partial",
     "evidence": "The Generate website markdown experiment creates a simplified markdown version of Elementor pages; it is Alpha and off by default.",
     "source_url": "https://elementor.com/help/how-do-i-make-my-site-more-accessible-to-ai-agents/"
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "No rendering statement found in the Elementor help articles read; Elementor pages are served by WordPress, which renders them in PHP."
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "The 404 site part article says visitors are redirected to a 404 page and gives no status code; elementor.com returned 404 for a made-up path on 2026-11-05.",
     "source_url": "https://elementor.com/help/error-404-site-part/"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found; elementor.com sent Vary: accept-encoding, accept on markdown answers on 2026-11-05.",
     "source_url": "https://elementor.com/pricing/"
    }
   ],
   "checks": {
    "domain": "elementor.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 2228,
     "jsonld_blocks": 2,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "accept-encoding, accept"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 14205,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 88,
     "grade": "A",
     "scanned_at": "2026-11-05T07:49:41.021+00:00",
     "via": "GET https://ora.ai/api/score/elementor.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 47,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T13:53:04.259Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 3916,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 2609,
     "js_shell": false,
     "jsonld_types": [
      "WebPage",
      "ImageObject",
      "BreadcrumbList",
      "WebSite",
      "Organization",
      "SoftwareApplication",
      "FAQPage"
     ],
     "home_links_llms_txt": false,
     "markdown_alternate_link": true,
     "generator": "WordPress 7.1.4",
     "answers_markdown": true,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 14205,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Elementor's markdown experiment does nothing until a site owner activates it, and it needs Elementor Core 4.1 or later with the Atomic Editor.",
    "An Elementor Error 404 template stays a draft and is never shown until Display Conditions are assigned to it.",
    "The Elementor MCP connects a site admin's AI tools to the editor; it does not publish anything for visiting agents to read."
   ],
   "does_not_do_basis": [
    {
     "fact": 5,
     "keep": "fact"
    },
    {
     "fact": 7,
     "keep": "fact"
    },
    null
   ],
   "ora_relation": "Elementor sits on the AgentReady committee for WordPress and site building, the standard Ora launched in October 2026.",
   "related": [
    "wordpress-elementor"
   ],
   "page": "https://agentreadyhtml.com/vendors/elementor/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "shopify",
   "name": "Shopify",
   "type": "site-builder",
   "homepage": "https://www.shopify.com/",
   "one_line": "Shopify is a hosted commerce platform whose Online Store themes render Liquid templates on the server, serve agents.md with llms.txt mirrors, a 404 template, a generated robots.txt and sitemap, and JSON-LD through a Liquid filter.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Liquid, the template language Shopify themes are written in, was created by Shopify and is published as an open-source project on GitHub.",
     "source_url": "https://shopify.dev/docs/api/liquid",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "A Shopify theme's 404 page comes from templates/404.json, and the theme docs suggest no objects for it beyond making clear that the page was not found.",
     "source_url": "https://shopify.dev/docs/storefronts/themes/architecture/templates/404",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Asked by curl 8.7.1 for a made-up path, the Shopify storefront www.allbirds.com returned HTTP 404 with a 421,495-byte HTML page and Vary: Accept on 2026-11-05.",
     "source_url": "https://shopify.dev/docs/storefronts/themes/architecture/templates/404",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 the same Shopify storefront answered a curl 8.7.1 request with Accept: text/markdown on its home page with a text/markdown content type and Vary: Accept, yet the 702,741-byte body opened as an HTML document.",
     "source_url": "https://shopify.dev/docs/storefronts/themes/architecture/templates/404",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Shopify's developer changelog of 2026-05-28 introduced llms.txt.liquid and llms-full.txt.liquid next to agents.md.liquid, each edited under Online Store, Themes, Edit code.",
     "source_url": "https://shopify.dev/changelog/posts/customize-llmstxt-llms-fulltxt-and-agentsmd",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-05-28"
    },
    {
     "claim": "www.allbirds.com served /llms.txt to curl 8.7.1 on 2026-11-05 as text/markdown rather than text/plain, 5,793 bytes long, with Vary: Accept.",
     "source_url": "https://shopify.dev/changelog/posts/customize-llmstxt-llms-fulltxt-and-agentsmd",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Shopify keeps the theme-root AGENTS.md, a file of up to 50 KB that briefs coding agents such as Sidekick, apart from the public /agents.md, and never serves the theme-root file on the storefront.",
     "source_url": "https://shopify.dev/docs/storefronts/themes/agentic-workflows/agents-md",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Shopify generates a default robots.txt, and a robots.txt.liquid file in the theme's Templates folder replaces that output, with the robots object supplying the default rule groups.",
     "source_url": "https://shopify.dev/docs/storefronts/themes/seo/robots-txt",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Shopify's structured_data Liquid filter turns a product into schema.org Product, or ProductGroup when it has variants, and an article into schema.org Article, for the theme to print inside a JSON-LD script tag.",
     "source_url": "https://shopify.dev/docs/api/liquid/filters/structured_data",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Every Shopify store generates sitemap.xml at the root of each of its domains, linking separate sitemaps for products, collections, blogs and pages, and refreshes it when content is added.",
     "source_url": "https://help.shopify.com/en/manual/promoting-marketing/seo/find-site-map",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Shopify pricing page read on 2026-11-05 listed Basic at $29 a month billed yearly or $39 monthly, Grow at $79, Advanced at $299 and Plus from $2,300 a month.",
     "source_url": "https://www.shopify.com/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Shopify plans",
     "what": "Hosted store plans that include the Online Store theme storefront.",
     "pricing": {
      "model": "subscription",
      "from": 29,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.shopify.com/pricing",
      "note": "Basic, per month billed yearly; $39 billed monthly"
     }
    },
    {
     "name": "Shopify Plus",
     "what": "Enterprise commerce plan.",
     "pricing": {
      "model": "subscription",
      "from": 2300,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.shopify.com/pricing",
      "note": "per month"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "supports",
     "evidence": "Every store has a default agents.md, and /llms.txt and /llms-full.txt point to that content unless a theme template overrides them.",
     "source_url": "https://shopify.dev/changelog/posts/customize-llmstxt-llms-fulltxt-and-agentsmd"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement in the theme, changelog or Liquid docs read; a storefront home page answered Accept: text/markdown on 2026-11-05 with a markdown content type on an HTML body.",
     "source_url": "https://shopify.dev/docs/storefronts/themes/architecture/templates/404"
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No statement about per-page markdown copies found; agents.md and llms.txt are store-level files."
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "Online Store themes are Liquid templates that Shopify renders with store data; headless Hydrogen storefronts are not covered by the pages read.",
     "source_url": "https://shopify.dev/docs/api/liquid"
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "The 404 template docs do not give the status code; a storefront returned 404 for a made-up path on 2026-11-05.",
     "source_url": "https://shopify.dev/docs/storefronts/themes/architecture/templates/404"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found; storefront responses on 2026-11-05 carried Vary: Accept.",
     "source_url": "https://shopify.dev/docs/storefronts/themes/architecture/templates/404"
    }
   ],
   "checks": {
    "domain": "shopify.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 564,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "accept-encoding"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 12521,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 72,
     "grade": "B",
     "scanned_at": "2026-11-04T02:27:32.452+00:00",
     "via": "GET https://ora.ai/api/score/shopify.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T13:53:16.610Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 171,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 1133,
     "js_shell": false,
     "jsonld_types": [],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": false,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 12521,
     "llms_full_valid": true,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Shopify does not serve the theme-root AGENTS.md to shoppers or shopping agents; only agents.md.liquid output reaches /agents.md.",
    "Shopify's structured_data filter prints nothing unless the theme calls it inside a JSON-LD script tag, and it handles only product and article objects.",
    "A robots.txt.liquid template does not merge with Shopify's generated file; it replaces it, so any rule the template drops disappears from /robots.txt."
   ],
   "does_not_do_basis": [
    null,
    {
     "fact": 8,
     "keep": "fact"
    },
    {
     "fact": 7,
     "keep": "fact"
    }
   ],
   "related": [
    "shopify-themes"
   ],
   "page": "https://agentreadyhtml.com/vendors/shopify/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "hubspot-cms",
   "name": "HubSpot Content Hub",
   "type": "cms",
   "operator": "HubSpot",
   "homepage": "https://www.hubspot.com/products/content",
   "one_line": "HubSpot Content Hub is the HubSpot CMS, which builds pages from HubL templates on HubSpot hosting, returns error page templates for 404 and 500 status codes, and edits robots.txt and the sitemap per connected domain.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "HubSpot was founded in 2006 by MIT graduate students Brian Halligan and Dharmesh Shah, and its story page counts more than 9,000 employees, 306,000 customers and 15 global offices.",
     "source_url": "https://www.hubspot.com/our-story",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Content Hub on 2026-11-05 started at $0 for Free, $20 a month per seat for Starter (shown at $10 for new customers), $100 a month per seat for Professional and $175 a month per seat for Enterprise.",
     "source_url": "https://www.hubspot.com/products/content",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "HubSpot CMS templates and modules are written in HubL, a Jinja-inspired templating language that extends Jinjava and leaves out some Jinja features.",
     "source_url": "https://developers.hubspot.com/docs/cms/reference/hubl/overview",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "HubSpot's System Pages tab assigns templates of the Error page type to the pages returned for 404 and 500 status codes.",
     "source_url": "https://developers.hubspot.com/docs/cms/start-building/introduction/developer-environment/website-settings",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Content Hub Starter has no drag and drop system templates, so a custom 404 page there is an HTML + HubL template, and custom system templates apply per primary domain with other domains using the defaults.",
     "source_url": "https://knowledge.hubspot.com/design-manager/use-system-templates-to-customize-error-subscription-and-password-prompt-pages",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "A made-up path on www.hubspot.com, a site that declares a HubSpot generator tag, returned HTTP 404 to curl 8.7.1 with a 500,613-byte HTML page on 2026-11-05.",
     "source_url": "https://knowledge.hubspot.com/design-manager/use-system-templates-to-customize-error-subscription-and-password-prompt-pages",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "HubSpot edits robots.txt per connected domain or through Default settings for all domains, and content on HubSpot system domains containing hs-sites is always marked no-index in robots.txt.",
     "source_url": "https://knowledge.hubspot.com/seo/prevent-content-from-appearing-in-search-results",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "HubSpot's knowledge base warns against pairing a robots.txt block with a noindex meta tag, since the block keeps search engines from ever reading the tag.",
     "source_url": "https://knowledge.hubspot.com/seo/prevent-content-from-appearing-in-search-results",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "HubSpot adds live website pages and blog posts to a domain's sitemap automatically, leaves landing pages out until they are added by hand, allows only the standard tags plus <lastmod>, and can take up to 30 minutes to update it.",
     "source_url": "https://knowledge.hubspot.com/domains-and-urls/view-and-edit-a-hubspot-hosted-domain-sitemap",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "HubSpot AEO costs $50 a month, or $45 paid yearly, needs no other HubSpot subscription, and tracks brand visibility in ChatGPT, Perplexity and Gemini; HubSpot's AEO page says it acquired XFunnel in 2026.",
     "source_url": "https://www.hubspot.com/products/aeo",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Content Hub",
     "what": "HubSpot's CMS and content tools, from a free edition to Enterprise with multiple sites.",
     "pricing": {
      "model": "freemium",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.hubspot.com/products/content",
      "note": "Starter from $20 per seat per month ($10 new-customer offer); Professional from $100; Enterprise from $175"
     }
    },
    {
     "name": "HubSpot AEO",
     "what": "Tracks how a brand appears in ChatGPT, Perplexity and Gemini answers and recommends content changes.",
     "pricing": {
      "model": "subscription",
      "from": 45,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.hubspot.com/products/aeo",
      "note": "per month paid yearly; $50 monthly"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No HubSpot knowledge base or developer page on llms.txt found; the file comes from a third-party Marketplace app or a hand-uploaded file."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the HubL, website settings or SEO knowledge base pages; www.hubspot.com answered Accept: text/markdown with 406 in the shared crawl of 2026-11-04."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No statement about per-page markdown found in the HubSpot CMS developer docs or knowledge base articles read."
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "The HubL docs describe templates and modules but give no rendering statement; the Content Hub product page returned its full text to a plain fetch on 2026-11-05.",
     "source_url": "https://developers.hubspot.com/docs/cms/reference/hubl/overview"
    },
    {
     "id": "real-404",
     "status": "supports",
     "evidence": "HubSpot says error page templates are the pages returned for 404 or 500 status codes.",
     "source_url": "https://developers.hubspot.com/docs/cms/start-building/introduction/developer-environment/website-settings"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found; HubSpot documents no markdown negotiation."
    }
   ],
   "checks": {
    "domain": "hubspot.com",
    "read_on": "2026-11-05",
    "scope": "Plain-fetch checks ran on https://www.hubspot.com/products/content; the Ora and Cloudflare scores cover the whole host hubspot.com.",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 861,
     "jsonld_blocks": 4,
     "markdown_request": {
      "status": 406,
      "content_type": "",
      "vary": "origin, accept-encoding"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 35564,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 72,
     "grade": "B",
     "scanned_at": "2026-11-03T23:46:23.348+00:00",
     "via": "GET https://ora.ai/api/score/hubspot.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T13:53:40.669Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 259,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 2309,
     "js_shell": false,
     "jsonld_types": [
      "Organization",
      "WebSite",
      "WebPage",
      "Product"
     ],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": "HubSpot",
     "answers_markdown": false,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 35564,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "HubSpot does not put landing pages into a domain's sitemap until someone adds them by hand.",
    "HubSpot AEO measures brand mentions in AI answers wherever a site is hosted; it does not change what the HubSpot CMS serves to a fetching agent.",
    "Content Hub Starter cannot use drag and drop templates for system pages such as the 404 page."
   ],
   "does_not_do_basis": [
    {
     "fact": 8,
     "keep": "fact"
    },
    null,
    {
     "fact": 3,
     "keep": "fact"
    }
   ],
   "related": [
    "hubspot-cms"
   ],
   "page": "https://agentreadyhtml.com/vendors/hubspot-cms/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "mintlify",
   "name": "Mintlify",
   "type": "docs-platform",
   "homepage": "https://www.mintlify.com/",
   "hq": "United States",
   "one_line": "Mintlify is a hosted docs platform that server-renders pages, hands markdown to agents by Accept header, user agent or .md URL, and generates llms.txt, skill.md and schema.org JSON-LD for public docs sites.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Mintlify announced an $18M Series A led by Andreessen Horowitz on 2024-09-03, joined by Bain Capital Ventures and Y Combinator, and put its total raised at $21M.",
     "source_url": "https://www.mintlify.com/blog/series-a",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2024-09-03"
    },
    {
     "claim": "Mintlify's Series B post of 2026-04-14 reports $45M at a $500M valuation, led by a16z and Salesforce Ventures, and says Mintlify now powers documentation for over 20,000 companies.",
     "source_url": "https://www.mintlify.com/blog/series-b",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-04-14"
    },
    {
     "claim": "On 2026-03-03 Mintlify announced it is acquiring Helicone, the open source LLM observability platform and AI gateway, with Helicone's founders joining Mintlify in San Francisco.",
     "source_url": "https://www.mintlify.com/blog/mintlify-acquires-helicone",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-03-03"
    },
    {
     "claim": "Mintlify Pro lists at $450 a month billed annually or $540 billed monthly with 10,000 AI credits a month, while the free Starter plan carries no assistant, agent or Autopilot.",
     "source_url": "https://www.mintlify.com/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Mintlify renders custom React components only in the browser, so a component exported in an MDX file or imported from a snippet is missing from the server HTML; built-in components render on the server.",
     "source_url": "https://www.mintlify.com/docs/help-center/custom-components-flash-or-missing-from-page-source",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Mintlify's changelog of 2026-10-16 says custom components defined with export that only place their props into HTML now render on the server instead of popping in after load.",
     "source_url": "https://www.mintlify.com/docs/changelog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-16"
    },
    {
     "claim": "Mintlify's static export API pre-renders a project into a bundle of HTML, CSS and JavaScript for self-hosting with .html page URLs, and Mintlify keeps it to Enterprise plans.",
     "source_url": "https://www.mintlify.com/docs/api/static-export/overview",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Mintlify leaves the default <subdomain>.mintlify.site address live and crawlable after a custom domain is added, with no redirect or noindex, and warns that it can outrank the custom domain.",
     "source_url": "https://www.mintlify.com/docs/help-center/default-subdomain-indexed-alongside-custom-domain",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Turning on the Don't index project setting in the Mintlify dashboard makes llms.txt and /.well-known/llms.txt return 404 while llms-full.txt keeps loading.",
     "source_url": "https://www.mintlify.com/docs/help-center/llms-txt-returns-404-but-llms-full-txt-works",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Mintlify configures its 404 page under errors.404 in docs.json, where a redirect flag set to true sends missing URLs to the home page instead of the custom 404 page.",
     "source_url": "https://www.mintlify.com/docs/customize/custom-404-page",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Mintlify's changelog of 2026-07-10 added auto-generated schema.org JSON-LD to docs pages, and the seo.organization object in docs.json names the publisher entity in that markup.",
     "source_url": "https://www.mintlify.com/docs/changelog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-07-10"
    },
    {
     "claim": "Mintlify also hands the markdown version to known AI agents such as Claude-User, ChatGPT-User and PerplexityBot on the normal page URL, while Googlebot and Bingbot keep getting HTML.",
     "source_url": "https://www.mintlify.com/docs/ai/markdown-export",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Mintlify's changelog of 2026-09-25 shipped WebMCP, which registers a site's MCP tools in the browser with no setup, on Pro and Enterprise plans only.",
     "source_url": "https://www.mintlify.com/docs/changelog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-09-25"
    },
    {
     "claim": "A curl GET of a made-up path under www.mintlify.com/docs on 2026-11-05 returned HTTP 404 text/html, so a Mintlify-hosted missing page carried a real 404 status by default.",
     "source_url": "https://www.mintlify.com/docs/customize/custom-404-page",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "A markdown request to www.mintlify.com/docs/ai/markdown-export on 2026-11-05 came back from a Vercel server with vary: accept-encoding, Accept, User-Agent, matching Mintlify's Accept and user-agent switching.",
     "source_url": "https://www.mintlify.com/docs/ai/markdown-export",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Mintlify Starter",
     "what": "Hosted docs with custom domain, web editor, MCP server and API playground for up to 5 editors.",
     "pricing": {
      "model": "free",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.mintlify.com/pricing",
      "note": "Starter plan, $0 per month; AI features not included"
     }
    },
    {
     "name": "Mintlify Pro",
     "what": "Adds the agent, assistant, Autopilot, preview deployments and unlimited editor seats.",
     "pricing": {
      "model": "subscription",
      "from": 450,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.mintlify.com/pricing",
      "note": "Pro, per month billed annually; $540 per month billed monthly; 10,000 credits a month, overage $0.01 per credit"
     }
    },
    {
     "name": "Mintlify Enterprise",
     "what": "Adds automations, SSO and SCIM, static export, self-hosting and EU hosting.",
     "pricing": {
      "model": "enterprise quote",
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.mintlify.com/pricing",
      "note": "Enterprise, contact sales"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "supports",
     "evidence": "Auto-generated llms.txt is documented in the help center, which also notes that the Don't index setting makes it 404.",
     "source_url": "https://www.mintlify.com/docs/help-center/llms-txt-returns-404-but-llms-full-txt-works"
    },
    {
     "id": "markdown-negotiation",
     "status": "supports",
     "evidence": "The markdown-export docs describe Accept-header negotiation for text/markdown and text/plain on every page URL.",
     "source_url": "https://www.mintlify.com/docs/ai/markdown-export"
    },
    {
     "id": "markdown-twin",
     "status": "supports",
     "evidence": "A documented .md route exists for each page and carries a noindex robots header.",
     "source_url": "https://www.mintlify.com/docs/ai/markdown-export"
    },
    {
     "id": "initial-html",
     "status": "partial",
     "evidence": "Pages are server-rendered, but custom React components imported from snippets render only in the browser.",
     "source_url": "https://www.mintlify.com/docs/help-center/custom-components-flash-or-missing-from-page-source"
    },
    {
     "id": "real-404",
     "status": "supports",
     "evidence": "Mintlify documents its 404 page and its suggested pages; errors.404.redirect set to true redirects to the home page instead. A made-up path returned 404 on 2026-11-05.",
     "source_url": "https://www.mintlify.com/docs/customize/custom-404-page"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement on Vary found in the markdown-export docs; a curl on 2026-11-05 saw vary: accept-encoding, Accept, User-Agent.",
     "source_url": "https://www.mintlify.com/docs/ai/markdown-export"
    }
   ],
   "checks": {
    "domain": "mintlify.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 523,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch, Accept"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 6752,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 74,
     "grade": "B",
     "scanned_at": "2026-11-05T12:00:52.073+00:00",
     "via": "GET https://ora.ai/api/score/mintlify.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 47,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T13:53:53.259Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": null,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 671,
     "js_shell": false,
     "jsonld_types": [],
     "home_links_llms_txt": true,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": true,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 6752,
     "llms_full_valid": true,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Mintlify does not noindex or redirect the default mintlify.site copy once a custom domain is live; the owner has to remove that duplicate from search.",
    "Self-hosting through static export is not sold on Starter or Pro; Mintlify keeps it behind an Enterprise contract.",
    "Custom React components pulled in from /snippets still render only after load, so a plain fetch of a Mintlify page misses their text."
   ],
   "does_not_do_basis": [
    {
     "fact": 7,
     "keep": "fact"
    },
    {
     "fact": 6,
     "keep": "fact"
    },
    {
     "fact": 4,
     "keep": "limit"
    }
   ],
   "ora_relation": "Mintlify sits on the AgentReady committee for docs, and Ora's launch post of the standard names mintlify.com/score as one of three public rankers that read the spec.",
   "related": [
    "mintlify"
   ],
   "page": "https://agentreadyhtml.com/vendors/mintlify/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "gitbook",
   "name": "GitBook",
   "type": "docs-platform",
   "homepage": "https://www.gitbook.com/",
   "one_line": "GitBook is a hosted docs platform whose published sites are pre-rendered on the server and ship .md copies, llms.txt, llms-full.txt and an MCP server, with a Broken links report that turns 404 traffic into redirect suggestions.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "GitBook's SEO docs say published HTML is pre-rendered server-side so crawlers need no JavaScript, and every published page is cached and served through a global CDN.",
     "source_url": "https://gitbook.com/docs/publish/seo",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "GitBook builds a sitemap for every published site that is not set to unlisted and serves it at /sitemap-pages.xml under the site home URL.",
     "source_url": "https://gitbook.com/docs/publish/seo",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Moving or renaming a GitBook page creates an automatic HTTP 307 redirect from the old URL to the new one.",
     "source_url": "https://gitbook.com/docs/publish/seo",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "GitBook sets canonical URLs and fills meta and Open Graph descriptions from each page description, and it does not generate keyword meta tags at all.",
     "source_url": "https://gitbook.com/docs/publish/seo",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "GitBook's Free plan costs $0 per site a month for one user and already lists LLM optimizations, while custom domains and site redirects start on Essential.",
     "source_url": "https://gitbook.com/docs/account-and-billing/plans",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "GitBook charges $65 per site a month for Essential and $249 for Ultimate on annual billing, or $79 and $299 monthly, with 2,000 and 10,000 AI credits a month.",
     "source_url": "https://gitbook.com/docs/account-and-billing/plans",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "GitBook's Broken links report, a beta on the Ultimate plan, reads 30 days of 404 traffic, keeps URLs hit at least three times and suggests redirects for the 60 most-visited.",
     "source_url": "https://gitbook.com/docs/analytics/broken-links",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "GitBook's changelog of 2026-10-21 extended Broken links to outbound links, rechecking links to other websites and naming the failure, such as a dead domain or a timeout.",
     "source_url": "https://gitbook.com/docs/changelog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-21"
    },
    {
     "claim": "GitBook's changelog of 2026-09-30 says published sites now send Markdown to the ChatGPT Search crawler.",
     "source_url": "https://gitbook.com/docs/changelog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-09-30"
    },
    {
     "claim": "Since GitBook's 2026-09-30 release, each part of a paginated llms-full.txt names its part number at the top and links the previous and next parts.",
     "source_url": "https://gitbook.com/docs/changelog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-09-30"
    },
    {
     "claim": "GitBook's changelog of 2026-07-29 added an askQuestion tool to published-site MCP servers with AI enabled, next to the ask query parameter that markdown routes already took.",
     "source_url": "https://gitbook.com/docs/changelog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-07-29"
    },
    {
     "claim": "A curl GET of a made-up .md path under gitbook.com/docs on 2026-11-05 returned HTTP 200 text/markdown with a Page Not Found body, while the same path without .md returned 404.",
     "source_url": "https://gitbook.com/docs/getting-started/llm-ready-docs",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 gitbook.com/docs sent Vary with Accept and an x-robots-tag: noindex only on the markdown answer; the HTML answer for the same URL listed Next.js router headers and accept-encoding but no Accept.",
     "source_url": "https://gitbook.com/docs/getting-started/llm-ready-docs",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "The initial HTML of gitbook.com/docs/publish/seo carried no application/ld+json block when fetched with curl on 2026-11-05.",
     "source_url": "https://gitbook.com/docs/publish/seo",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "GitBook Free",
     "what": "One-user docs site with Git sync, API playgrounds, preview deployments and LLM optimizations.",
     "pricing": {
      "model": "freemium",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://gitbook.com/docs/account-and-billing/plans",
      "note": "Free plan, $0 per site a month, one user"
     }
    },
    {
     "name": "GitBook Essential",
     "what": "Branded public docs with custom domain, AI Assistant Ask, analytics, site redirects and 2,000 AI credits a month.",
     "pricing": {
      "model": "subscription",
      "from": 65,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://gitbook.com/docs/account-and-billing/plans",
      "note": "Essential, per site a month billed annually plus $12 per user; $79 monthly"
     }
    },
    {
     "name": "GitBook Ultimate",
     "what": "Adds AI Assistant Chat, AI insights, GitBook Agent, adaptive content, authenticated access and 10,000 AI credits a month.",
     "pricing": {
      "model": "subscription",
      "from": 249,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://gitbook.com/docs/account-and-billing/plans",
      "note": "Ultimate, per site a month billed annually plus $12 per user; $299 monthly"
     }
    },
    {
     "name": "GitBook Enterprise",
     "what": "Adds SAML SSO, migration service, custom integrations and Git Sync IP allowlisting.",
     "pricing": {
      "model": "enterprise quote",
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://gitbook.com/docs/account-and-billing/plans",
      "note": "Custom pricing"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "supports",
     "evidence": "The LLM-ready docs page lists llms.txt and llms-full.txt among the formats GitBook publishes on its own for each site.",
     "source_url": "https://gitbook.com/docs/getting-started/llm-ready-docs"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement on Accept: text/markdown found in the LLM-ready docs page, which describes .md URLs; a curl with that header on 2026-11-05 did get text/markdown.",
     "source_url": "https://gitbook.com/docs/getting-started/llm-ready-docs"
    },
    {
     "id": "markdown-twin",
     "status": "supports",
     "evidence": "GitBook's LLM-ready docs page documents a Markdown copy of each published page at the page URL plus .md.",
     "source_url": "https://gitbook.com/docs/getting-started/llm-ready-docs"
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "HTML is pre-rendered server-side so crawlers do not need JavaScript.",
     "source_url": "https://gitbook.com/docs/publish/seo"
    },
    {
     "id": "real-404",
     "status": "partial",
     "evidence": "HTML paths that do not exist return 404 and feed the Broken links report, but a made-up .md path returned 200 text/markdown on 2026-11-05.",
     "source_url": "https://gitbook.com/docs/analytics/broken-links"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement on Vary found in the LLM-ready or SEO docs; on 2026-11-05 the markdown answer listed Accept in Vary and the HTML answer did not.",
     "source_url": "https://gitbook.com/docs/getting-started/llm-ready-docs"
    }
   ],
   "checks": {
    "domain": "gitbook.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 1581,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "Accept-Encoding, Accept"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 15146,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 86,
     "grade": "A",
     "scanned_at": "2026-11-01T22:43:01.739+00:00",
     "via": "GET https://ora.ai/api/score/gitbook.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 67,
     "level": "L5 Agent-Native",
     "scanned_at": "2026-11-05T13:54:09.175Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 7432,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 1602,
     "js_shell": false,
     "jsonld_types": [
      "Organization",
      "WebSite",
      "SoftwareApplication"
     ],
     "home_links_llms_txt": true,
     "markdown_alternate_link": true,
     "generator": "Framer 59a7cb8",
     "answers_markdown": true,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 15146,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "A missing .md URL on a GitBook site answers 200 with a Page Not Found markdown body, so an agent that trusts status codes reads it as a real page.",
    "Broken links redirect suggestions and AI Assistant Chat are not on GitBook's Free or Essential plans; both sit on Ultimate.",
    "GitBook's SEO page describes canonical, Open Graph and sitemap output but no JSON-LD, and the gitbook.com/docs SEO page itself had no ld+json block."
   ],
   "does_not_do_basis": [
    {
     "fact": 11,
     "keep": "both"
    },
    null,
    {
     "fact": 13,
     "keep": "both"
    }
   ],
   "related": [
    "gitbook"
   ],
   "page": "https://agentreadyhtml.com/vendors/gitbook/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "readme",
   "name": "ReadMe",
   "type": "docs-platform",
   "homepage": "https://readme.com/",
   "one_line": "ReadMe is a hosted API docs hub that builds llms.txt from the sidebar, serves .md copies of pages, sends markdown on Accept: text/markdown once Markdown for Agents is switched on, and gives paid plans custom 404 pages and redirects.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "ReadMe's changelog of 2025-05-09 added llms.txt, switched on from a setting in the AI dropdown on Refactored projects, and made every page readable as plain markdown by adding .md to its URL.",
     "source_url": "https://docs.readme.com/main/changelog/ask-ai-llms-txt",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-05-09"
    },
    {
     "claim": "ReadMe's AI Discoverability release of 2026-08-03 brought agent link headers and content signals and turned on an MCP server by default for new projects.",
     "source_url": "https://docs.readme.com/main/changelog/ai-discoverability",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-08-03"
    },
    {
     "claim": "ReadMe's Markdown for Agents feature, on all plans, returns clean Markdown when an agent sends Accept: text/markdown, after an admin turns it on in the Markdown Availability group of AI Discoverability.",
     "source_url": "https://docs.readme.com/main/docs/ai-ready-docs",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "ReadMe's generic 404 page has a Suggest similar pages toggle, on by default, that shows up to three matching links in the first page load without an extra client request.",
     "source_url": "https://docs.readme.com/main/docs/error-pages",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "ReadMe limits its custom error page choice and redirect rules, found under Settings, Errors & Redirects, to the Pro and Enterprise plans.",
     "source_url": "https://docs.readme.com/main/docs/error-pages",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "ReadMe redirect rules accept JavaScript-style regular expressions with $1 captures, run in written order, and fire only for URLs where no page exists.",
     "source_url": "https://docs.readme.com/main/docs/error-pages",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Once a ReadMe project has a custom domain, visitors to its original readme.io subdomain are redirected to that domain, and links to the main version path redirect to the unversioned URL.",
     "source_url": "https://docs.readme.com/main/docs/redirect-scenarios",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "ReadMe's technical FAQ says pages are cached for 15 minutes for logged-out readers, while signed-in users always get the latest content.",
     "source_url": "https://docs.readme.com/main/docs/technical-faq",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "ReadMe's Starter plan is $0 a month for one project and already includes the AI Dropdown, LLMs.txt and an MCP server, with Ask AI sold at $150 a month.",
     "source_url": "https://docs.readme.com/main/docs/plans-and-pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "ReadMe Pro costs $250 a month for one project and adds Ask AI Lite, AI Linting, a Docs Audit preview, the AI Writer, branching and custom HTML and CSS.",
     "source_url": "https://docs.readme.com/main/docs/plans-and-pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "ReadMe's changelog of 2026-01-05 made every Docs Audit run check the documentation for broken links.",
     "source_url": "https://docs.readme.com/main/changelog/broken-link-checker",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-01-05"
    },
    {
     "claim": "A curl GET of a made-up docs.readme.com page with Accept: text/markdown on 2026-11-05 returned HTTP 404 with a text/markdown body of 430 bytes.",
     "source_url": "https://docs.readme.com/main/docs/ai-ready-docs",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "ReadMe's markdown answer for docs.readme.com/main/docs/ai-ready-docs on 2026-11-05 carried vary: Accept, Accept-Encoding and x-robots-tag: noindex, nofollow.",
     "source_url": "https://docs.readme.com/main/docs/ai-ready-docs",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "The HTML response of a ReadMe docs page on 2026-11-05 carried a Link header pointing to its .md copy with rel alternate and type text/markdown.",
     "source_url": "https://docs.readme.com/main/docs/ai-ready-docs",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "ReadMe's error-pages article shipped one TechArticle JSON-LD block in its initial HTML when fetched with curl on 2026-11-05.",
     "source_url": "https://docs.readme.com/main/docs/error-pages",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "ReadMe Starter",
     "what": "One-project API hub with bidirectional sync, interactive API reference, custom domain, LLMs.txt, AI Dropdown and MCP server.",
     "pricing": {
      "model": "free",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://docs.readme.com/main/docs/plans-and-pricing",
      "note": "Starter, $0 per month"
     }
    },
    {
     "name": "ReadMe Pro",
     "what": "Adds reviews, branching, custom HTML and CSS, reusable content, AI Linting and the AI Writer.",
     "pricing": {
      "model": "subscription",
      "from": 250,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://docs.readme.com/main/docs/plans-and-pricing",
      "note": "Pro, per month, 1 project; 14-day trial of Pro features"
     }
    },
    {
     "name": "ReadMe Ask AI",
     "what": "Assistant that answers reader questions from published content inside the hub.",
     "pricing": {
      "model": "subscription",
      "from": 150,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://docs.readme.com/main/docs/plans-and-pricing",
      "note": "Add-on listed at $150 per month on Starter"
     }
    },
    {
     "name": "ReadMe Enterprise",
     "what": "Multiple combined projects, full docs audit with history, Ask AI API access and custom SLAs.",
     "pricing": {
      "model": "enterprise quote",
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://docs.readme.com/main/docs/plans-and-pricing",
      "note": "Custom pricing"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "supports",
     "evidence": "ReadMe builds llms.txt from the sidebar and publishes it at the project root, with a toggle under AI Discoverability.",
     "source_url": "https://docs.readme.com/main/docs/ai-ready-docs"
    },
    {
     "id": "markdown-negotiation",
     "status": "partial",
     "evidence": "Markdown for Agents answers Accept: text/markdown on all plans once an admin switches it on.",
     "source_url": "https://docs.readme.com/main/docs/ai-ready-docs"
    },
    {
     "id": "markdown-twin",
     "status": "supports",
     "evidence": "Every page can be read as plaintext markdown by adding .md to its URL.",
     "source_url": "https://docs.readme.com/main/changelog/ask-ai-llms-txt"
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "No rendering statement found in the plans, error-pages or AI-ready docs; the error-pages HTML fetched on 2026-11-05 held the article text."
    },
    {
     "id": "real-404",
     "status": "supports",
     "evidence": "ReadMe serves a 404 page by default for broken links, and a made-up path returned 404 on 2026-11-05.",
     "source_url": "https://docs.readme.com/main/docs/error-pages"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement on Vary found in the AI-ready docs; responses on 2026-11-05 carried vary: Accept, Accept-Encoding.",
     "source_url": "https://docs.readme.com/main/docs/ai-ready-docs"
    }
   ],
   "checks": {
    "domain": "readme.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": false,
     "words_in_initial_html": 2179,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "Accept"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 61057,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 64,
     "grade": "C",
     "scanned_at": "2026-11-01T23:13:54.023+00:00",
     "via": "GET https://ora.ai/api/score/readme.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 33,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T13:54:22.452Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": null,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": false,
     "words": 2292,
     "js_shell": false,
     "jsonld_types": [],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": true,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 61057,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Markdown for Agents is a switch in AI Discoverability, so a ReadMe project that never flips it keeps sending HTML to agents asking for markdown.",
    "ReadMe cannot redirect a URL that still has a page behind it; its redirect list only catches paths that would otherwise 404.",
    "A logged-out reader or crawler can get a ReadMe page up to 15 minutes old, because cached copies are served to anyone not signed in."
   ],
   "does_not_do_basis": [
    null,
    null,
    {
     "fact": 7,
     "keep": "fact"
    }
   ],
   "related": [
    "readme"
   ],
   "page": "https://agentreadyhtml.com/vendors/readme/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "fern",
   "name": "Fern",
   "type": "docs-platform",
   "operator": "Postman",
   "homepage": "https://buildwithfern.com/",
   "hq": "United States",
   "one_line": "Fern, now a Postman company, builds API docs sites that are prebuilt as static pages at the edge and ship llms.txt, .md copies, markdown on Accept: text/markdown, JSON-LD, sitemaps and an agent directive on every page.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Fern announced on 2026-01-08 that it has joined Postman, that the entire Fern team moved to Postman and that Fern keeps running as an independent product under its own brand.",
     "source_url": "https://buildwithfern.com/post/postman-acquires-fern",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-01-08"
    },
    {
     "claim": "Fern dates its founding to 2022, when it set out to help businesses ship better public APIs, and says both Fern Docs and its SDK generator are open source.",
     "source_url": "https://buildwithfern.com/post/postman-acquires-fern",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Fern generates meta tags, social previews, canonical URLs, JSON-LD structured data, clean slugs and llms.txt content for every indexable page with no configuration.",
     "source_url": "https://buildwithfern.com/learn/docs/seo/overview",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Fern's sitemap.xml gives each page a lastmod value that changes only when the content changes, so whitespace or capitalization edits do not bump it.",
     "source_url": "https://buildwithfern.com/learn/docs/seo/overview",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Fern serves a default robots.txt that allows all crawlers; a custom file set with the agents.robots-txt key in docs.yml is served verbatim with a Fern-managed block appended.",
     "source_url": "https://buildwithfern.com/learn/docs/seo/robots-txt",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Fern's <llms-only> and <llms-ignore> tags split one page between readers and agents, so llms-only text reaches llms.txt and the .md copy but stays hidden in the rendered page.",
     "source_url": "https://buildwithfern.com/learn/docs/ai-features/customize-llm-output",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Fern prepends a default directive to every page's agent markdown that points to the .md URLs and llms.txt; the page-directive key in docs.yml replaces it or turns it off.",
     "source_url": "https://buildwithfern.com/learn/docs/ai-features/agent-directives",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Fern renders custom React components on the server so their output lands in the HTML, but custom components are an Enterprise plan feature.",
     "source_url": "https://buildwithfern.com/learn/docs/customization/custom-react-components",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Fern's self-hosting, an Enterprise feature, ships the docs site as the fernenterprise/fern-self-hosted Docker image, and offline AI chat was still in development.",
     "source_url": "https://buildwithfern.com/learn/docs/self-hosted/overview",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Fern's post of 2026-10-26 says the old renderer sent each page twice, as HTML and as a data payload worth 72% to 75% of the HTML, and the new static pages are 2 to 4 times smaller.",
     "source_url": "https://buildwithfern.com/post/static-docs",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-26"
    },
    {
     "claim": "Fern's changelog of 2026-10-08 turned on dynamic Open Graph images by default for sites with no site-wide og:image, switchable off with og:dynamic: false.",
     "source_url": "https://buildwithfern.com/learn/docs/changelog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-08"
    },
    {
     "claim": "Fern's free Docs plan allows 10 team members, 1,000 pages, 250 AI credits and 2,000 page generations a month, with custom domain or subpath, Ask Fern and an MCP server.",
     "source_url": "https://buildwithfern.com/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "A curl GET of a made-up .md URL under buildwithfern.com/learn/docs on 2026-11-05 returned HTTP 200 text/plain listing similar pages, while the HTML path returned 404.",
     "source_url": "https://buildwithfern.com/learn/docs/changelog",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Served through Cloudflare, Fern's text/markdown response for the SEO overview page named Accept as its Vary value on 2026-11-05.",
     "source_url": "https://buildwithfern.com/learn/docs/seo/overview",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "The initial HTML of Fern's SEO overview page held a JSON-LD block typed TechArticle, BreadcrumbList and WebSite when fetched with curl on 2026-11-05.",
     "source_url": "https://buildwithfern.com/learn/docs/seo/overview",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Fern Docs Free",
     "what": "Hosted docs with guides, API references, changelogs, custom domain or subpath, Ask Fern, Fern Agent and an MCP server.",
     "pricing": {
      "model": "free",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://buildwithfern.com/pricing",
      "note": "Free forever, $0 per month; 1,000 pages, 250 AI credits a month"
     }
    },
    {
     "name": "Fern Docs Enterprise",
     "what": "Adds SSO, SCIM, RBAC, custom CSS, JavaScript and React components, multiple repos and self-hosting.",
     "pricing": {
      "model": "enterprise quote",
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://buildwithfern.com/pricing",
      "note": "Custom pricing"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "supports",
     "evidence": "Fern's SEO overview lists llms.txt output among the defaults generated for indexable pages.",
     "source_url": "https://buildwithfern.com/learn/docs/seo/overview"
    },
    {
     "id": "markdown-negotiation",
     "status": "supports",
     "evidence": "Fern's markdown access page documents content negotiation on the Accept: text/markdown header.",
     "source_url": "https://buildwithfern.com/learn/docs/ai-features/markdown"
    },
    {
     "id": "markdown-twin",
     "status": "supports",
     "evidence": "Each page has .md and .mdx variants per the markdown access docs.",
     "source_url": "https://buildwithfern.com/learn/docs/ai-features/markdown"
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "Every Fern Docs site is prebuilt as static pages, and custom React components are server-side rendered.",
     "source_url": "https://buildwithfern.com/post/static-docs"
    },
    {
     "id": "real-404",
     "status": "partial",
     "evidence": "HTML paths return 404, but a made-up .md path returned 200 text/plain with similar pages on 2026-11-05.",
     "source_url": "https://buildwithfern.com/learn/docs/changelog"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement on Vary found in the markdown access docs; Fern answered with vary: Accept on 2026-11-05.",
     "source_url": "https://buildwithfern.com/learn/docs/ai-features/markdown"
    }
   ],
   "checks": {
    "domain": "buildwithfern.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 2031,
     "jsonld_blocks": 4,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 45431,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 72,
     "grade": "B",
     "scanned_at": "2026-11-04T11:19:34.875+00:00",
     "via": "GET https://ora.ai/api/score/buildwithfern.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 27,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T13:54:35.739Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": null,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 1400,
     "js_shell": false,
     "jsonld_types": [
      "Organization",
      "WebSite"
     ],
     "home_links_llms_txt": true,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": false,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 45431,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "A missing .md URL on a Fern site answers 200 text/plain with an ask link and similar pages, so the markdown twin path never signals 404.",
    "Custom React components, custom CSS and JavaScript and self-hosting are not in Fern's free Docs plan; each needs an Enterprise agreement.",
    "A custom robots.txt on Fern is never served alone, since Fern appends its own User-Agent: * group and a block for internal API routes."
   ],
   "does_not_do_basis": [
    {
     "fact": 12,
     "keep": "fact"
    },
    {
     "fact": 7,
     "keep": "fact"
    },
    null
   ],
   "related": [
    "fern"
   ],
   "page": "https://agentreadyhtml.com/vendors/fern/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "redocly",
   "name": "Redocly",
   "type": "docs-platform",
   "homepage": "https://redocly.com/",
   "one_line": "Redocly is a docs-as-code platform for API docs whose sites ship llms.txt, clean .md copies, markdown on Accept: text/markdown, an MCP server and WebMCP tools, with sitemaps, canonical links and JSON-LD driven by redocly.yaml.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Redocly says Redoc began at Rebilly, a Texas payments company that wrote its own documentation tool after Swagger UI let it down, and that Redocly later launched as a paid SaaS.",
     "source_url": "https://redocly.com/about",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "Redocly writes /sitemap.xml and adds rel=canonical links only once siteUrl is set in redocly.yaml, and on versioned projects only the default version is marked canonical.",
     "source_url": "https://redocly.com/docs/platform/content/realm-seo",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Redocly emits JSON-LD only when the owner writes a jsonLd object in redocly.yaml or page front matter and picks the Schema.org type.",
     "source_url": "https://redocly.com/docs/platform/content/realm-seo",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Redocly validates links and redirects while content is added, and its built-in CI/CD jobs stop a project with link errors from publishing.",
     "source_url": "https://redocly.com/docs/platform/content/realm-seo",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Redocly's llmstxt.hide option switches off both llms.txt and the clean Markdown copies of the pages it lists, and it defaults to false.",
     "source_url": "https://redocly.com/docs/platform/config/seo",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Redocly's llmstxt.excludeFiles setting takes file paths or glob patterns such as docs/**/*.md, including negated globs, to keep pages out of llms.txt.",
     "source_url": "https://redocly.com/docs/platform/config/seo",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Redocly marks WebMCP experimental and publishes tools such as search_docs, read_page and navigate_page automatically; browser support is an origin trial in Chrome 149 and Edge 150.",
     "source_url": "https://redocly.com/docs/platform/customization/webmcp",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Redocly's Visibility tag targets a block at humans or at agents and decides what reaches the Markdown version of a page.",
     "source_url": "https://redocly.com/docs/platform/ai-ready",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Redocly's Realm changelog lists faster server-side rendering for OpenAPI reference pages with heavily reused schemas, confirming reference pages render on the server.",
     "source_url": "https://redocly.com/docs/platform/changelog-realm",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Redocly Pro costs $249 a month billed annually, $2,988 a year, with unlimited seats, readers and Git contributors and an MCP server for the docs.",
     "source_url": "https://redocly.com/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Redocly charges $390 a year for each project beyond the 3 in Pro or the 10 in Scale, the $729-a-month plan billed annually.",
     "source_url": "https://redocly.com/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 Redocly returned markdown for redocly.com/docs/platform/ai-ready when asked with Accept: text/markdown, yet the only Vary value it sent was Cookie.",
     "source_url": "https://redocly.com/docs/platform/ai-ready",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Appending .md to redocly.com/docs/platform/content/realm-seo on 2026-11-05 returned HTTP 200 text/markdown of 5,184 bytes.",
     "source_url": "https://redocly.com/docs/platform/config/seo",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "A made-up path under redocly.com/docs returned HTTP 404 text/html on 2026-11-05 even when the request asked for text/markdown.",
     "source_url": "https://redocly.com/docs/platform/content/realm-seo",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Redocly's own SEO docs page carried no application/ld+json block in its initial HTML on 2026-11-05, in line with JSON-LD being opt-in.",
     "source_url": "https://redocly.com/docs/platform/content/realm-seo",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Redocly Pro",
     "what": "Docs platform with 3 projects, protected docs, interactive API docs, custom domain, MCP server and an AI assistant.",
     "pricing": {
      "model": "subscription",
      "from": 249,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://redocly.com/pricing",
      "note": "Pro, per month billed annually ($2,988 a year); 30-day free trial"
     }
    },
    {
     "name": "Redocly Scale",
     "what": "Adds 10 projects, SSO, multi-product sites, API catalog and scorecards, remote content and project analytics.",
     "pricing": {
      "model": "subscription",
      "from": 729,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://redocly.com/pricing",
      "note": "Scale, per month billed annually ($8,748 a year)"
     }
    },
    {
     "name": "Redocly Enterprise",
     "what": "Adds unlimited projects, project RBAC, SCIM, MCP analytics and API monitoring.",
     "pricing": {
      "model": "enterprise quote",
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://redocly.com/pricing",
      "note": "Contact sales"
     }
    },
    {
     "name": "Redoc CE",
     "what": "Open source renderer that turns an API description into reference docs.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://redocly.com/about",
      "note": "Community edition, free"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "supports",
     "evidence": "The AI-ready docs page describes a generated llms.txt in the llmstxt.org shape.",
     "source_url": "https://redocly.com/docs/platform/ai-ready"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "Neither the AI-ready page nor the seo config reference mentions Accept-based negotiation, though redocly.com returned text/markdown to such a request on 2026-11-05.",
     "source_url": "https://redocly.com/docs/platform/ai-ready"
    },
    {
     "id": "markdown-twin",
     "status": "supports",
     "evidence": "llmstxt options govern the clean Markdown versions of pages listed in llms.txt.",
     "source_url": "https://redocly.com/docs/platform/config/seo"
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "The Realm changelog refers to server-side rendering of OpenAPI reference pages.",
     "source_url": "https://redocly.com/docs/platform/changelog-realm"
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "The SEO docs read do not cover status codes, and redocly.com/docs gave a made-up path a 404 status on 2026-11-05.",
     "source_url": "https://redocly.com/docs/platform/content/realm-seo"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Redocly docs never mention Vary, and both markdown and HTML responses on 2026-11-05 listed Cookie as the only varying header.",
     "source_url": "https://redocly.com/docs/platform/ai-ready"
    }
   ],
   "checks": {
    "domain": "redocly.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 1322,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "Cookie, Accept-Encoding"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 128108,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 69,
     "grade": "C",
     "scanned_at": "2026-08-22T05:46:23.57+00:00",
     "via": "GET https://ora.ai/api/score/redocly.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 47,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T13:54:48.589Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": null,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 1474,
     "js_shell": false,
     "jsonld_types": [],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": true,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 128106,
     "llms_full_valid": true,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Redocly serves markdown on Accept: text/markdown but did not list Accept in Vary on 2026-11-05, so shared caches are not told the body depends on that header.",
    "Redocly adds no JSON-LD by default; structured data appears only after someone writes a jsonLd object.",
    "Without siteUrl in redocly.yaml a Redocly build writes no sitemap and adds no canonical links."
   ],
   "does_not_do_basis": [
    {
     "fact": 11,
     "keep": "both"
    },
    {
     "fact": 2,
     "keep": "fact"
    },
    {
     "fact": 1,
     "keep": "fact"
    }
   ],
   "related": [
    "redocly"
   ],
   "page": "https://agentreadyhtml.com/vendors/redocly/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "scalar",
   "name": "Scalar",
   "type": "docs-platform",
   "homepage": "https://scalar.com/",
   "one_line": "Scalar Docs is a hosted docs product built on the open source Scalar API Reference that serves llms.txt, llms-full.txt and /index.md copies, answers Accept: text/markdown, and needs a paid plan to keep a site published.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Scalar describes itself as a team of ten engineers and designers that maintains open source API tooling.",
     "source_url": "https://scalar.com/company",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "Scalar Pro costs $150 a month or $125 billed yearly ($1,500 a year), and Business costs $600 a month or $500 billed yearly ($6,000 a year).",
     "source_url": "https://scalar.com/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Scalar gives every new team a 7-day trial with Pro limits, after which publishing a Scalar Docs site requires a paid plan.",
     "source_url": "https://scalar.com/pricing",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Scalar reserves subpath hosting such as example.com/docs and SSO for the Business plan, which also raises the limits to 25 APIs and 10 editor seats.",
     "source_url": "https://scalar.com/pricing",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Scalar requires a DNS-only CNAME for a custom docs domain, because it handles load balancing and TLS itself, so the owner's own CDN or WAF cannot sit in front.",
     "source_url": "https://scalar.com/products/docs/configuration/domains",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Scalar skips TXT verification for custom domains, and the first project that publishes with the domain while its CNAME points to Scalar reserves it.",
     "source_url": "https://scalar.com/products/docs/configuration/domains",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Scalar's @scalar/server-side-rendering package pre-renders the open source API Reference to HTML and hydrates it in the browser, and can run at build time for a static host.",
     "source_url": "https://scalar.com/products/api-references/server-side-rendering",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Scalar Docs renders every API page with the MIT-licensed Scalar API Reference, which Scalar says has 15.7k GitHub stars.",
     "source_url": "https://scalar.com/products/docs",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Scalar API Reference 1.71.0, released 2026-09-22, added Copy as Markdown buttons that turn the resolved OpenAPI operation or webhook into Markdown.",
     "source_url": "https://scalar.com/products/api-references/changelog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-09-22"
    },
    {
     "claim": "Scalar API Reference 1.71.0 also loads the API Client modal and agent chat only when first opened, cutting the initial bundle by about 28 percent for read-only setups.",
     "source_url": "https://scalar.com/products/api-references/changelog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-09-22"
    },
    {
     "claim": "Scalar Docs takes custom meta tags and scripts through siteConfig.head, and a configured script loads synchronously in the head, blocking first render unless async or defer is set.",
     "source_url": "https://scalar.com/products/docs/configuration/site-config",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "On 2026-11-05 the markdown response for Scalar's llms-txt docs page listed Accept as its only Vary value and came from Cloudflare.",
     "source_url": "https://scalar.com/products/docs/configuration/llms-txt",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Scalar serves the markdown copy of a page at /index.md under the page path; that URL for the llms-txt page returned HTTP 200 text/markdown on 2026-11-05.",
     "source_url": "https://scalar.com/products/docs/configuration/llms-txt",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Scalar returned a real HTTP 404 HTML page for a made-up docs path on 2026-11-05, and asking for text/markdown did not change that status.",
     "source_url": "https://scalar.com/products/docs/configuration/redirects",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "No JSON-LD script appeared in the server HTML of Scalar's site-config docs page on 2026-11-05, and Scalar's docs describe none.",
     "source_url": "https://scalar.com/products/docs/configuration/site-config",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Scalar Free",
     "what": "Hosted OpenAPI docs, built-in API client and landing pages for up to 3 APIs and 1 editor seat.",
     "pricing": {
      "model": "freemium",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://scalar.com/pricing",
      "note": "Free, $0; Docs publishing needs a paid plan after the 7-day trial"
     }
    },
    {
     "name": "Scalar Pro",
     "what": "Docs, SDKs and hosted MCP servers with custom domains, Git Sync, Markdown and MDX, up to 15 APIs and 5 editor seats.",
     "pricing": {
      "model": "subscription",
      "from": 150,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://scalar.com/pricing",
      "note": "Pro, per month billed monthly; $125 per month billed yearly"
     }
    },
    {
     "name": "Scalar Business",
     "what": "Adds SSO and subpath hosting, up to 25 APIs and 10 editor seats.",
     "pricing": {
      "model": "subscription",
      "from": 600,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://scalar.com/pricing",
      "note": "Business, per month billed monthly; $500 per month billed yearly"
     }
    },
    {
     "name": "Scalar Enterprise",
     "what": "Full developer portals, SSO/SAML and RBAC, unlimited APIs and SLAs.",
     "pricing": {
      "model": "enterprise quote",
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://scalar.com/pricing",
      "note": "Custom"
     }
    },
    {
     "name": "Scalar API Reference",
     "what": "MIT-licensed open source renderer for OpenAPI documents, with a separate server-side rendering package.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://scalar.com/products/docs",
      "note": "Free and open source"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "supports",
     "evidence": "Documented as automatic on all published Scalar Docs sites, with no author setup.",
     "source_url": "https://scalar.com/products/docs/configuration/llms-txt"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "The llms.txt, domains and site-config pages say nothing about Accept headers, yet scalar.com still sent text/markdown when curl asked for it on 2026-11-05."
    },
    {
     "id": "markdown-twin",
     "status": "supports",
     "evidence": "Page copies live at <path>/index.md, the URLs that the generated index links to.",
     "source_url": "https://scalar.com/products/docs/configuration/llms-txt"
    },
    {
     "id": "initial-html",
     "status": "partial",
     "evidence": "Hosted Scalar Docs pages held their text in HTML on 2026-11-05, but pre-rendered HTML for the self-hosted API Reference needs the server-side rendering package.",
     "source_url": "https://scalar.com/products/api-references/server-side-rendering"
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "Scalar's redirects and domains pages do not mention missing-page status, and a made-up docs path got 404 even with a markdown Accept header."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Vary is not covered in Scalar's docs, while the markdown response on 2026-11-05 listed Accept as its sole Vary value."
    }
   ],
   "checks": {
    "domain": "scalar.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 1218,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "Accept"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 77677,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 74,
     "grade": "B",
     "scanned_at": "2026-09-30T17:50:43.838+00:00",
     "via": "GET https://ora.ai/api/score/scalar.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 80,
     "level": "L5 Agent-Native",
     "scanned_at": "2026-11-05T13:55:04.752Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": null,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 1239,
     "js_shell": false,
     "jsonld_types": [],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": true,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 77677,
     "llms_full_valid": true,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Scalar Docs custom domains cannot run behind the owner's own CDN, WAF or a proxied Cloudflare record; traffic has to reach Scalar directly.",
    "A Scalar team on the Free plan cannot keep a Docs site published after the 7-day trial, and subpath hosting needs the Business plan.",
    "Scalar's single-file HTML and CDN build of the API Reference draws the reference in the browser; pre-rendered HTML comes only from the @scalar/server-side-rendering package."
   ],
   "does_not_do_basis": [
    {
     "fact": 4,
     "keep": "fact"
    },
    {
     "fact": 2,
     "keep": "fact"
    },
    {
     "fact": 6,
     "keep": "limit"
    }
   ],
   "related": [
    "scalar"
   ],
   "page": "https://agentreadyhtml.com/vendors/scalar/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "stoplight",
   "name": "Stoplight",
   "type": "docs-platform",
   "operator": "SmartBear",
   "homepage": "https://stoplight.io/",
   "hq": "United States",
   "one_line": "Stoplight is SmartBear's API design platform with hosted docs and the open source Elements renderer; its hosted docs pages reach a plain fetch as a near-empty JavaScript shell, and the docs pages read mention no llms.txt or markdown output.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "SmartBear's release on the deal described Stoplight as remote-first and based in Austin, Texas, with Harrison Yeager as its CEO at the time.",
     "source_url": "https://smartbear.com/news/news-releases/smartbear-to-acquire-stoplight/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2023-08-22"
    },
    {
     "claim": "SmartBear said it expected to start folding Stoplight features into its own API design, documentation and portal products in the first half of 2024.",
     "source_url": "https://smartbear.com/news/news-releases/smartbear-to-acquire-stoplight/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2023-08-22"
    },
    {
     "claim": "Stoplight renamed its Professional plan to Pro Team, and new Pro Team subscriptions include 15 seats instead of 10 but no longer bundle 50 free guests.",
     "source_url": "https://docs.stoplight.io/docs/whats-new/future-professional-plan-updates",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "On Stoplight Pro Team every guest is billed as a standard user, at $24 a month on monthly billing or $19 a month on annual billing.",
     "source_url": "https://docs.stoplight.io/docs/whats-new/future-professional-plan-updates",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Stoplight redirect rules for a workspace custom domain, one old path and new path per line with * wildcards, require the Startup plan or higher.",
     "source_url": "https://docs.stoplight.io/docs/platform/5603962774d07-redirects",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Stoplight publishes pages under stable-ID URLs, and adding a slug in the table of contents makes the old stable-ID URL redirect to the slug URL.",
     "source_url": "https://docs.stoplight.io/docs/platform/hosted-docs/stoplight-urls",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Stoplight Elements, the API reference toolkit built on OpenAPI and CommonMark, embeds in a CMS, portal or single-page app and needs no Stoplight account for basic use.",
     "source_url": "https://docs.stoplight.io/docs/elements/d6a8ba3f3c186-stoplight-elements",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Stoplight's free hosted docs plan renders documentation from a connected Git repository each time commits are pushed or merged.",
     "source_url": "https://docs.stoplight.io/docs/elements/d6a8ba3f3c186-stoplight-elements",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Stoplight's October 2026 release notes hold a single item, a fix for Daily Digest, billing and trial emails that stopped after an MJML 5.4 upgrade.",
     "source_url": "https://docs.stoplight.io/docs/whats-new/october-2026",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Stoplight's May 2026 release notes cover a Bitbucket Cloud project creation fix, a browser crash on circular $ref schemas and an API page that failed on a GraphStore error.",
     "source_url": "https://docs.stoplight.io/docs/whats-new/may-2026",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "stoplight.io/robots.txt on 2026-11-05 held one group for every user agent with Disallow: /, which asks all compliant crawlers and agents to skip the whole marketing site.",
     "source_url": "https://stoplight.io/robots.txt",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "A curl GET of a hosted Stoplight docs article on 2026-11-05 returned about 471 KB of HTML with only 5 visible words once scripts were stripped, so the article text arrives only through JavaScript.",
     "source_url": "https://docs.stoplight.io/docs/platform/hosted-docs/stoplight-urls",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "docs.stoplight.io/sitemap.xml lists /docs/platform/use-a-custom-domain, yet that URL returned HTTP 404 on 2026-11-05, so the sitemap points crawlers at a dead path.",
     "source_url": "https://docs.stoplight.io/sitemap.xml",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "A docs.stoplight.io article asked for with Accept: text/markdown on 2026-11-05 still came back as text/html, with Vary set to Origin and accept-encoding.",
     "source_url": "https://docs.stoplight.io/docs/platform/hosted-docs/stoplight-urls",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Stoplight Platform",
     "what": "Hosted API design, mocking, governance and documentation workspaces, with a free hosted docs plan.",
     "pricing": {
      "model": "freemium",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://docs.stoplight.io/docs/elements/d6a8ba3f3c186-stoplight-elements",
      "note": "Free plan stated in the Elements docs; stoplight.io/pricing is disallowed by robots.txt, so paid list prices were not read"
     }
    },
    {
     "name": "Stoplight Pro Team",
     "what": "Paid workspace plan with 15 included seats; guests are billed as standard users.",
     "pricing": {
      "model": "subscription",
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://docs.stoplight.io/docs/whats-new/future-professional-plan-updates",
      "note": "Seat price for guests $24 per month monthly or $19 per month annual; base plan price not stated on the page read"
     }
    },
    {
     "name": "Stoplight Elements",
     "what": "Open source API reference components for HTML, React and Angular, plus Elements Dev Portal.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://docs.stoplight.io/docs/elements/d6a8ba3f3c186-stoplight-elements",
      "note": "No Stoplight account needed for basic use"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "Not mentioned in the Elements, Stoplight URLs, redirects or 2026 release notes pages on docs.stoplight.io."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "Stoplight's docs read are silent on markdown output, and a docs article requested as text/markdown still came back as text/html on 2026-11-05."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "The Stoplight URLs page covers stable-ID and slug URLs only and mentions no markdown copy of pages."
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "Stoplight says nothing about rendering in the pages read, and hosted docs articles gave curl 5 visible words of HTML on 2026-11-05."
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "No Stoplight page read covers status codes, while a sitemap-listed docs URL and a made-up path both answered 404 on 2026-11-05."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Stoplight documents no content negotiation, and its docs responses listed Origin and accept-encoding in Vary."
    }
   ],
   "checks": {
    "domain": "stoplight.io",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "skipped": "robots.txt disallows the homepage path for this user agent"
    },
    "ora": {
     "unavailable": "GET /api/score returned 404 DOMAIN_NOT_SCANNED"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T13:55:15.331Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": null,
     "reachable": true,
     "skipped_by_robots": true,
     "note": "the shared crawl recorded no home page read for this domain",
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Stoplight's hosted docs send a near-empty HTML shell, so an agent that does not run JavaScript gets no article text from docs.stoplight.io.",
    "stoplight.io tells every crawler to stay out with a site-wide Disallow: /, so a compliant agent cannot read its product or pricing pages.",
    "Custom-domain redirect rules are not on Stoplight's free plan; the redirects doc lists them from the Startup plan up."
   ],
   "does_not_do_basis": [
    {
     "fact": 11,
     "keep": "fact"
    },
    {
     "fact": 10,
     "keep": "fact"
    },
    {
     "fact": 4,
     "keep": "limit"
    }
   ],
   "related": [
    "stoplight"
   ],
   "page": "https://agentreadyhtml.com/vendors/stoplight/",
   "homepage_status": {
    "status": null,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "docusaurus",
   "name": "Docusaurus",
   "type": "framework",
   "operator": "Meta",
   "homepage": "https://docusaurus.io/",
   "one_line": "Docusaurus is Meta's open source static site generator for docs that writes an HTML file per route at build time with sitemap, canonical and hreflang output; llms.txt, markdown copies and status codes are left to plugins and the host.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Docusaurus 3.10, announced on 2026-04-07, is the last release in the v3 line and adds future.v4 flags so sites can opt in to v4 breaking changes early.",
     "source_url": "https://docusaurus.io/blog/releases/3.10",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-04-07"
    },
    {
     "claim": "Docusaurus 3.10 marked Docusaurus Faster stable, its build stack of Rspack, SWC and LightningCSS, set with faster: true and planned as the v4 default.",
     "source_url": "https://docusaurus.io/blog/releases/3.10",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-04-07"
    },
    {
     "claim": "Docusaurus 3.10 added a basic AGENTS.md file to the repository and restated that any AI use in contributions to Docusaurus must be disclosed.",
     "source_url": "https://docusaurus.io/blog/releases/3.10",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-04-07"
    },
    {
     "claim": "Docusaurus 3.9, released on 2025-09-25, dropped Node.js 18 and added support for Algolia DocSearch v4 with its AskAI feature.",
     "source_url": "https://docusaurus.io/blog/releases/3.9",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-09-25"
    },
    {
     "claim": "Docusaurus adds title, description and canonical URL links to every Markdown page on its own, plus hreflang alternate links when i18n is configured.",
     "source_url": "https://docusaurus.io/docs/seo",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Docusaurus produces rich search result markup for blog posts out of the box, and site-wide JSON-LD is declared by hand through headTags or a <head> block.",
     "source_url": "https://docusaurus.io/docs/seo",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Docusaurus does not generate robots.txt, which owners add as a static asset, and its noIndex site option stamps noindex, nofollow on every page.",
     "source_url": "https://docusaurus.io/docs/seo",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Docusaurus's @docusaurus/plugin-sitemap ships in preset-classic, writes sitemap.xml after a production build and skips pages carrying a noindex robots meta tag.",
     "source_url": "https://docusaurus.io/docs/seo",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Docusaurus's trailingSlash option sets the file layout, emitting /docs/myDoc/index.html when left undefined and /docs/myDoc.html when set to false.",
     "source_url": "https://docusaurus.io/docs/api/docusaurus-config",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Docusaurus's onBrokenLinks setting throws by default, so a production build fails when it finds a broken link.",
     "source_url": "https://docusaurus.io/docs/api/docusaurus-config",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Docusaurus deployment guide tells Netlify users to switch off the Pretty Urls setting, which can cause lowercase URLs, extra redirects and 404 errors.",
     "source_url": "https://docusaurus.io/docs/deployment",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "docusaurus.io/docs/seo fetched with curl on 2026-11-05 returned 89,643 bytes of HTML with 1,342 visible words before any script ran.",
     "source_url": "https://docusaurus.io/docs/seo",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 docusaurus.io sent text/html to a request for /docs/seo with Accept: text/markdown, and /docs/seo.md returned HTTP 404.",
     "source_url": "https://docusaurus.io/docs/seo",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "The initial HTML of docusaurus.io/docs/seo on 2026-11-05 held one JSON-LD block of type BreadcrumbList.",
     "source_url": "https://docusaurus.io/docs/seo",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Docusaurus",
     "what": "Open source static site generator for documentation sites, blogs and pages, maintained by Meta Open Source.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://docusaurus.io/docs/seo",
      "note": "Free; version 3.10.2 current on 2026-11-05"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No llms.txt option in the docusaurus-config reference or SEO guide for 3.10.2; llms.txt comes from community plugins."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "Neither the SEO guide nor the config reference covers markdown output, and docusaurus.io sent text/html to a markdown request on 2026-11-05."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "Core Docusaurus documents no .md copies, and docusaurus.io/docs/seo.md answered 404 on 2026-11-05."
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "The SEO guide calls Docusaurus a static site generator that writes one HTML file per route.",
     "source_url": "https://docusaurus.io/docs/seo"
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "Docusaurus emits static files and leaves the status code to the host, and docusaurus.io gave a made-up path 404 on 2026-11-05."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Docusaurus has no negotiation to vary on, and docusaurus.io sent vary: Accept-Encoding only."
    }
   ],
   "checks": {
    "domain": "docusaurus.io",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 701,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding"
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 20059,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 43,
     "grade": "D",
     "scanned_at": "2026-11-03T13:36:29.706+00:00",
     "via": "GET https://ora.ai/api/score/docusaurus.io (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 7,
     "level": "L0 Not Ready",
     "scanned_at": "2026-11-05T13:55:27.979Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": null,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 762,
     "js_shell": false,
     "jsonld_types": [],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": "Docusaurus v4.0.0",
     "answers_markdown": false,
     "missing_path_status": 404,
     "llms_txt_valid": false,
     "llms_txt_bytes": 20059,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Docusaurus core writes no llms.txt and no .md twin of pages; both need a third-party plugin, and docusaurus.io/docs/seo.md returned 404.",
    "Docusaurus does not control HTTP status codes or headers; 404 handling, trailing-slash redirects and X-Robots-Tag depend on the static host.",
    "Docusaurus does not generate a robots.txt; the owner drops one into the static folder."
   ],
   "does_not_do_basis": [
    {
     "fact": 12,
     "keep": "both"
    },
    null,
    {
     "fact": 6,
     "keep": "fact"
    }
   ],
   "related": [
    "docusaurus"
   ],
   "page": "https://agentreadyhtml.com/vendors/docusaurus/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "document360",
   "name": "Document360",
   "type": "docs-platform",
   "homepage": "https://document360.com/",
   "one_line": "Hosted knowledge base and docs platform. Public projects get an auto-built /llms.txt that links a .md copy of every article, an XML sitemap, an editable robots.txt and a custom 404 page editor.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Document360 builds the llms.txt file itself from published articles and their GEO/SEO description field; authors cannot edit the file by hand, and it refreshes on every publish, update or removal.",
     "source_url": "https://docs.document360.com/docs/llms-txt",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Every entry in a Document360 llms.txt links the .md version of the article rather than its HTML URL, so an agent following the index lands on markdown without page chrome.",
     "source_url": "https://docs.document360.com/docs/llms-txt",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Each Document360 .md page opens with a Documentation Index block that points back to /llms.txt, so an agent that lands on one article can still find the full index.",
     "source_url": "https://docs.document360.com/docs/llms-txt",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Document360 only writes llms.txt for public knowledge bases and for the public part of mixed ones; fully private projects get neither llms.txt nor an active sitemap.",
     "source_url": "https://docs.document360.com/docs/llms-txt",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "In Document360 the per-article setting Exclude from external search engine results drops that article from sitemap.xml and llms.txt together, so both files follow one indexing rule.",
     "source_url": "https://docs.document360.com/docs/llms-txt",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Step by step guides in Document360 are served to agents through their .md page as an ordered list of steps with instruction text and image alt text, while readers see an interactive walkthrough.",
     "source_url": "https://docs.document360.com/docs/llms-txt",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Automatic llms.txt generation shipped in Document360 release 12.6.1, published on 2026-06-27 alongside Mermaid diagram support.",
     "source_url": "https://docs.document360.com/docs/june-2026-1261",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-06-27"
    },
    {
     "claim": "Document360's 404 page editor offers a Basic style (image, heading, paragraph, up to three link buttons) and a Custom style with your own HTML and CSS; once a custom 404 page is saved the default cannot be restored.",
     "source_url": "https://docs.document360.com/docs/404-page",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Document360 keeps robots.txt as one site-wide file that Owners and Admins edit under Settings, Knowledge base site, AI & search optimization (GEO/SEO), next to read-only sitemap and llms.txt URLs.",
     "source_url": "https://docs.document360.com/docs/robotstxt",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Document360 generates the XML sitemap for public and mixed projects automatically, with no file for authors to maintain.",
     "source_url": "https://docs.document360.com/docs/sitemap-generator",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Document360 runs a hosted MCP server with OAuth sign-in that follows the project's role-based access rules; it is limited to the Business and Enterprise plans.",
     "source_url": "https://docs.document360.com/docs/mcp",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Document360 release 12.11.1, published on 2026-11-02, added ten MCP tools covering tasks, glossary terms, review reminders and article feedback.",
     "source_url": "https://docs.document360.com/docs/november-2026-12-11-1",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-02"
    },
    {
     "claim": "Document360 says its Agent Score page audits any docs URL against 23 checks from the AFDocs ruleset, seven of them about llms.txt, and returns a 0 to 100 score with a letter grade.",
     "source_url": "https://document360.com/agent-score/",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "On 2026-11-05 a GET of an article URL on docs.document360.com with Accept: text/markdown returned 200 text/plain with Vary: Accept, 9,864 bytes, the same size as the article's .md twin, while the plain request returned 722,935 bytes of HTML.",
     "source_url": "https://docs.document360.com/docs/llms-txt",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 a made-up path under docs.document360.com/docs/ returned HTTP 404 with an HTML body, and /llms-full.txt also returned 404 while /llms.txt returned 200 at 171,199 bytes.",
     "source_url": "https://docs.document360.com/docs/404-page",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Document360 knowledge base",
     "what": "Hosted portal for writing docs plus a reader-facing knowledge base site with Eddy AI search, chatbot and an MCP server.",
     "pricing": {
      "model": "enterprise quote",
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://document360.com/pricing/",
      "note": "No list prices on the pricing page on 2026-11-05; it shows a three-step form under Customized pricing. MCP needs Business or Enterprise."
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "supports",
     "evidence": "Auto-generated /llms.txt for public projects, refreshed on publish.",
     "source_url": "https://docs.document360.com/docs/llms-txt"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the llms.txt, GEO/SEO settings or 12.6.1 release pages; on 2026-11-05 docs.document360.com did answer Accept: text/markdown with the markdown body as text/plain.",
     "source_url": "https://docs.document360.com/docs/llms-txt"
    },
    {
     "id": "markdown-twin",
     "status": "supports",
     "evidence": "llms.txt links the .md version of each article; pages carry a View as Markdown control.",
     "source_url": "https://docs.document360.com/docs/llms-txt"
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "No rendering statement found in the site customization or GEO/SEO docs; article text was present in the raw HTML fetched with curl on 2026-11-05."
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "The 404 page doc covers design only, not the status code; an invented /docs/ slug on docs.document360.com came back 404 on 2026-11-05.",
     "source_url": "https://docs.document360.com/docs/404-page"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No header statement found in the docs; HTML responses from docs.document360.com carried Vary: Accept, Accept-Encoding on 2026-11-05."
    }
   ],
   "checks": {
    "domain": "document360.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 13,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "Accept-Encoding, accept"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 17359,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 56,
     "grade": "C",
     "scanned_at": "2026-08-27T04:49:12.915+00:00",
     "via": "GET https://ora.ai/api/score/document360.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 73,
     "level": "L5 Agent-Native",
     "scanned_at": "2026-11-05T13:55:42.606Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "Document360 does not publish llms.txt for private projects, so an internal knowledge base behind reader login gives agents no index.",
    "Document360 builds llms.txt only from the GEO/SEO description field; articles without one appear by title alone and the file cannot be hand-edited.",
    "Document360's own docs site did not serve /llms-full.txt on 2026-11-05, and its docs describe only llms.txt and per-page .md files."
   ],
   "does_not_do_basis": [
    {
     "fact": 3,
     "keep": "limit"
    },
    {
     "fact": 0,
     "keep": "fact"
    },
    {
     "fact": 14,
     "keep": "fact"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/document360/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "archbee",
   "name": "Archbee",
   "type": "docs-platform",
   "homepage": "https://www.archbee.com/",
   "one_line": "Hosted docs and knowledge portal editor with Git sync. Published spaces serve llms.txt, llms-full.txt and .md copies by default, answer Accept: text/markdown on the page URL since the Q3 2026 update, and expose a per-space sitemap.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Archbee's January 2025 product update made llms.txt available by default on published docs, listed among that month's smaller changes next to Bitbucket two-way sync.",
     "source_url": "https://www.archbee.com/docs/changelog/january-2025-product-updates",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Archbee's August 2025 product update reworked llms.txt, llms-full.txt and the .md version of each doc, all on by default with no setting to switch on.",
     "source_url": "https://www.archbee.com/docs/changelog/august-2025-product-updates",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The same August 2025 Archbee update announced a ChatGPT connector and a Claude connector built on Archbee's MCP server, with their documentation marked as upcoming.",
     "source_url": "https://www.archbee.com/docs/changelog/august-2025-product-updates",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Archbee's Q3 2026 product update (changelog page dated 2026-10-02) lets public doc URLs return markdown when the client sends Accept: text/markdown or text/plain, with no .md suffix needed.",
     "source_url": "https://www.archbee.com/docs/changelog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-02"
    },
    {
     "claim": "Since the Q3 2026 Archbee update, a custom domain serves one llms.txt that lists every public space on that domain instead of only the space mapped to the root hostname, rebuilt on each publish or unpublish.",
     "source_url": "https://www.archbee.com/docs/changelog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-02"
    },
    {
     "claim": "Archbee's hosted MCP server gained write tools in the Q3 2026 update (create, update and delete documents, spaces and space groups), shipped in the npm package @archbee/mcp 2.4.0.",
     "source_url": "https://www.archbee.com/docs/changelog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-02"
    },
    {
     "claim": "Archbee can export a space as a Static HTML bundle from the Publish space menu, emailed as a download link, for offline copies or self-hosting on other infrastructure.",
     "source_url": "https://www.archbee.com/docs/changelog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-02"
    },
    {
     "claim": "Archbee gives each published space its own /sitemap.xml listing all of that space's URLs.",
     "source_url": "https://www.archbee.com/docs/sitemaps",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Archbee's Space settings General tab has an Indexable by search engines switch that is on by default for public spaces; turning it off adds noindex. Per-document SEO Meta Controls set URL key, title, description and preview image.",
     "source_url": "https://www.archbee.com/docs/seo-meta-controls",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Archbee supports serving docs under a subfolder of the main domain through a reverse proxy (Nginx and Apache samples given) and sets a custom canonical tag so the proxied copy is not treated as duplicate content.",
     "source_url": "https://www.archbee.com/docs/hosting-spaces-on-a-sub-folder",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Archbee's pricing page lists Growing from $80 per month and Scaling from $350 per month with a 14-day trial and no free plan; AI add-on usage beyond the plan's token allowance costs $1.2 per 1M tokens.",
     "source_url": "https://www.archbee.com/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Archbee runs on AWS in an EU region and a US region (us-east-2), per the Q3 2026 changelog.",
     "source_url": "https://www.archbee.com/docs/changelog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-02"
    },
    {
     "claim": "Archbee's AI connector for protected docs gives readers of Magic Link protected spaces a read-only MCP endpoint at api.archbee.com with a search tool and a fetch tool that returns a page as Markdown; a reader's access lasts 30 days.",
     "source_url": "https://www.archbee.com/docs/ai-connector-for-protected-docs",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Archbee says more than 3,000 companies use its knowledge portals.",
     "source_url": "https://www.archbee.com/",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "On 2026-11-05 www.archbee.com/docs/sitemaps answered Accept: text/markdown with 200 text/markdown at 988 bytes and Vary: Accept, identical to sitemaps.md, while the HTML version was 1,176,113 bytes.",
     "source_url": "https://www.archbee.com/docs/changelog",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 Archbee's own help center served /docs/llms-full.txt as text/markdown at 797,608 bytes, and a made-up path under /docs/ returned HTTP 404.",
     "source_url": "https://www.archbee.com/docs/changelog/august-2025-product-updates",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Archbee Growing",
     "what": "Entry paid plan with custom domain publishing, SEO and AI/LLM optimization listed as included features.",
     "pricing": {
      "model": "subscription",
      "from": 80,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.archbee.com/pricing",
      "note": "Starting at $80 per month as shown with the Annual Billing toggle; Scaling starts at $350; 14-day trial; free Growing plan for open source."
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "supports",
     "evidence": "llms.txt on by default since January 2025; one site-wide file per custom domain since Q3 2026.",
     "source_url": "https://www.archbee.com/docs/changelog/january-2025-product-updates"
    },
    {
     "id": "markdown-negotiation",
     "status": "supports",
     "evidence": "Q3 2026 update: public pages return Markdown for Accept: text/markdown or text/plain on the same URL.",
     "source_url": "https://www.archbee.com/docs/changelog"
    },
    {
     "id": "markdown-twin",
     "status": "supports",
     "evidence": "August 2025 update: .md version of docs on by default.",
     "source_url": "https://www.archbee.com/docs/changelog/august-2025-product-updates"
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "No rendering statement found in the hosted spaces docs; the sitemaps article text was in the raw HTML fetched with curl on 2026-11-05. A Static HTML export exists for self-hosting.",
     "source_url": "https://www.archbee.com/docs/changelog"
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "No statement found in the redirects and hosting docs; a made-up /docs/ path returned HTTP 404 on 2026-11-05."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "The Q3 2026 markdown note does not mention Vary; responses carried Vary: Accept, Accept-Encoding on 2026-11-05."
    }
   ],
   "checks": {
    "domain": "archbee.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 3622,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 351588,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 63,
     "grade": "C",
     "scanned_at": "2026-08-27T18:35:13.963+00:00",
     "via": "GET https://ora.ai/api/score/archbee.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T13:55:56.357Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": null,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 3665,
     "js_shell": false,
     "jsonld_types": [],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": false,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 351588,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Archbee offers no free plan for commercial teams: after the 14-day trial a paid plan is required, with free Growing reserved for open source projects.",
    "Archbee's reader-side MCP connector covers only Magic Link protected spaces; readers of SAML, OIDC or password-protected spaces get no agent connector from that feature.",
    "Archbee does not document JSON-LD output, and no ld+json block was in the sitemaps article HTML fetched on 2026-11-05."
   ],
   "does_not_do_basis": [
    {
     "fact": 10,
     "keep": "both"
    },
    {
     "fact": 12,
     "keep": "both"
    },
    null
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/archbee/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "read-the-docs",
   "name": "Read the Docs",
   "type": "docs-platform",
   "homepage": "https://about.readthedocs.com/",
   "one_line": "Build and hosting service for Sphinx, MkDocs and other static doc tools. Serves the tool's HTML, answers Accept: text/markdown on every hosted domain through Cloudflare, and serves a project's own llms.txt, robots.txt, sitemap.xml and 404.html from the default version.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Read the Docs converts hosted pages to markdown for any request carrying Accept: text/markdown, switched on for every documentation domain it hosts with no project setting; browsers still get HTML.",
     "source_url": "https://docs.readthedocs.com/platform/stable/reference/markdown-for-agents.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Read the Docs credits Cloudflare's Markdown for agents conversion for its markdown responses; the documented sample response shows vary: accept plus an x-markdown-tokens count and a content-signal header.",
     "source_url": "https://docs.readthedocs.com/platform/stable/reference/markdown-for-agents.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Read the Docs does not write llms.txt for a project; it serves a file the project's build puts in its output, at the domain root, taken from the default version, and does the same for llms-full.txt.",
     "source_url": "https://docs.readthedocs.com/platform/stable/reference/llms-txt.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "For generating llms.txt the Read the Docs docs point Sphinx users to the sphinx-llm extension or html_extra_path, and MkDocs users to the mkdocs-llmstxt plugin or docs_dir.",
     "source_url": "https://docs.readthedocs.com/platform/stable/reference/llms-txt.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Root-level llms.txt and llms-full.txt serving was announced on the Read the Docs blog on 2026-02-11 by Eric Holscher.",
     "source_url": "https://about.readthedocs.com/blog/2026/02/llms-txt-support/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-02-11"
    },
    {
     "claim": "A Read the Docs post of 2026-02-11 introduced Agent Skills for API v3 and .readthedocs.yaml work (installable with npx skills add readthedocs/skills) after the team tried MCP servers and llms.txt.",
     "source_url": "https://about.readthedocs.com/blog/2026/02/readthedocs-skills-api-config/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-02-11"
    },
    {
     "claim": "Read the Docs uses a project's own 404.html or 404/index.html as the not-found page, checking the current version first and then the default version; it maintains the sphinx-notfound-page extension for Sphinx.",
     "source_url": "https://docs.readthedocs.com/platform/stable/reference/404-not-found.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Read the Docs generates sitemap.xml per project covering public, non-hidden versions sorted by semantic version; a custom sitemap.xml in the default version's output replaces it as-is.",
     "source_url": "https://docs.readthedocs.com/platform/stable/reference/sitemaps.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The robots.txt that Read the Docs writes by default hides versions marked Hidden and allows all others; projects override it by shipping robots.txt in the default version's build.",
     "source_url": "https://docs.readthedocs.com/platform/stable/reference/robots.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Read the Docs hosts output from any tool that writes HTML, so whether a page's text is in the initial HTML depends on the tool: its tools page lists Sphinx and MkDocs next to Docusaurus, VitePress and Antora.",
     "source_url": "https://docs.readthedocs.com/platform/stable/intro/doctools.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Read the Docs' automated-access policy asks crawlers to stay under 4 requests per second, to put a domain or email in the user agent, and points bots to markdown responses.",
     "source_url": "https://docs.readthedocs.com/platform/stable/automated-access.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Read the Docs Business lists Basic at $50, Advanced at $150 and Pro at $250 per month with a 30-day trial; Enterprise starts at $10,000 per year. Read the Docs Community is free and ad-supported for open source.",
     "source_url": "https://about.readthedocs.com/pricing/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 an Accept: text/markdown request to a page under docs.readthedocs.com/platform/stable/ returned 200 text/markdown (3,822 bytes, Vary: Accept-Encoding, accept), while the HTML response for the same URL carried only Vary: Accept-Encoding.",
     "source_url": "https://docs.readthedocs.com/platform/stable/reference/markdown-for-agents.html",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 a community project, requests.readthedocs.io/en/latest/, also answered Accept: text/markdown with 200 text/markdown, while a .md suffix on a docs.readthedocs.com page returned 404.",
     "source_url": "https://docs.readthedocs.com/platform/stable/reference/markdown-for-agents.html",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 a made-up .html path under docs.readthedocs.com/platform/stable/reference/ returned HTTP 404 with the project's HTML not-found page.",
     "source_url": "https://docs.readthedocs.com/platform/stable/reference/404-not-found.html",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Read the Docs Community",
     "what": "Free, ad-supported hosting at readthedocs.io for open source projects with public repositories.",
     "pricing": {
      "model": "free",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://about.readthedocs.com/pricing/",
      "note": "Free for open-source software; ads supported."
     }
    },
    {
     "name": "Read the Docs Business",
     "what": "Paid hosting for private and public docs with team management, custom domains and SSO.",
     "pricing": {
      "model": "subscription",
      "from": 50,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://about.readthedocs.com/pricing/",
      "note": "Basic $50 per month billed monthly (annual available); Advanced $150; Pro $250; Enterprise from $10,000 per year."
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "Serves a project-supplied llms.txt and llms-full.txt at the root; the build tool or a plugin must generate them.",
     "source_url": "https://docs.readthedocs.com/platform/stable/reference/llms-txt.html"
    },
    {
     "id": "markdown-negotiation",
     "status": "supports",
     "evidence": "Accept: text/markdown returns markdown on all hosted domains, no configuration.",
     "source_url": "https://docs.readthedocs.com/platform/stable/reference/markdown-for-agents.html"
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No .md per-page URL found in the llms.txt or Markdown for AI agents docs; a .md suffix on a docs page returned 404 on 2026-11-05."
    },
    {
     "id": "initial-html",
     "status": "partial",
     "evidence": "Hosts the HTML any doc tool outputs; Sphinx and MkDocs write static pages, other tools may not.",
     "source_url": "https://docs.readthedocs.com/platform/stable/intro/doctools.html"
    },
    {
     "id": "real-404",
     "status": "supports",
     "evidence": "Serves the project's 404.html when its servers return a 404 Not Found error.",
     "source_url": "https://docs.readthedocs.com/platform/stable/reference/404-not-found.html"
    },
    {
     "id": "vary-accept",
     "status": "partial",
     "evidence": "Documented sample shows vary: accept on the markdown response; on 2026-11-05 the HTML response lacked Accept in Vary.",
     "source_url": "https://docs.readthedocs.com/platform/stable/reference/markdown-for-agents.html"
    }
   ],
   "checks": {
    "domain": "about.readthedocs.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 693,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "Accept-Encoding, accept"
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 14811,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "unavailable": "GET /api/score returned 404 DOMAIN_NOT_SCANNED"
    },
    "cloudflare": {
     "score": 27,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T13:56:09.702Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "Read the Docs does not generate llms.txt from a project's pages; without sphinx-llm, mkdocs-llmstxt or a hand-written file in the build, /llms.txt is absent.",
    "Read the Docs adds no prerendering of its own, so a client-rendered single-page app uploaded from any doc tool reaches crawlers as that tool's HTML shell.",
    "Read the Docs documents no MCP endpoint for readers of hosted projects; its AI agent skills page says the team tried MCP servers and llms.txt and now points agents to Agent Skills."
   ],
   "does_not_do_basis": [
    {
     "fact": 2,
     "keep": "fact"
    },
    {
     "fact": 9,
     "keep": "both"
    },
    {
     "fact": 5,
     "keep": "fact"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/read-the-docs/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "bump-sh",
   "name": "Bump.sh",
   "type": "docs-platform",
   "homepage": "https://bump.sh/",
   "one_line": "Hosted API reference portals built from OpenAPI and AsyncAPI files. With Ask AI on, each doc or hub gets /llms.txt, a .md copy of every page and a /mcp server; sitemaps and generated page titles and descriptions come by default.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Bump.sh ties its agent features to an Ask AI switch in each doc or hub's settings; turning it on adds a /mcp server, a .md copy of each page and a root llms.txt.",
     "source_url": "https://docs.bump.sh/help/documentation-experience/ask-ai-capabilities/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Bump.sh serves the markdown copy of an API doc page when .md is appended to its URL; on a custom domain the doc root uses /source.md instead.",
     "source_url": "https://docs.bump.sh/help/documentation-experience/ask-ai-capabilities/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The doc MCP server Bump.sh exposes at /mcp offers list, search (up to 20 results), get_pages (up to 10 URLs per call) and changelog tools, and only works for public docs and hubs.",
     "source_url": "https://docs.bump.sh/help/documentation-experience/ask-ai-capabilities/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Bump.sh shipped Ask AI links to ChatGPT and Claude, markdown rendering of API docs and llms.txt in one product update dated 2025-12-08.",
     "source_url": "https://docs.bump.sh/product-updates/2025/12/08/ask-ai-markdown-rendering/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-12-08"
    },
    {
     "claim": "A Bump.sh llms.txt lists topics, endpoint groups and operations with links to their .md pages, as shown in the train-travel-api example on its SEO & GEO help page.",
     "source_url": "https://docs.bump.sh/help/publish-documentation/seo-geo/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Bump.sh writes a sitemap.xml for every public API doc and a sitemap_index.xml for each hub that groups the sitemaps of the docs it contains.",
     "source_url": "https://docs.bump.sh/help/publish-documentation/seo-geo/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Bump.sh builds page titles as node title, API name plus API documentation, and branch name, and caps meta descriptions at 160 characters, falling back to a generated sentence when info.description is empty.",
     "source_url": "https://docs.bump.sh/help/publish-documentation/seo-geo/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Since a 2025-09-17 update Bump.sh reads an x-metaTags array in the OpenAPI definition and writes each name and content pair as a meta tag in the page head.",
     "source_url": "https://docs.bump.sh/product-updates/2025/09/17/custom-meta-tags/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-09-17"
    },
    {
     "claim": "Bump.sh's 2026-06-23 update reports doc pages up to 5 times faster, partly from deeper caching so most requests hit pre-generated content.",
     "source_url": "https://docs.bump.sh/product-updates/2026/06/23/doc-performance-enhancement/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-06-23"
    },
    {
     "claim": "Bump.sh launched a separate MCP platform on 2026-03-26 that turns Arazzo or Flower workflow files into MCP servers; the post called it a closed beta.",
     "source_url": "https://docs.bump.sh/product-updates/2026/03/26/introducing-bump-mcp-platform/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-03-26"
    },
    {
     "claim": "A Bump.sh update of 2026-07-15 added list_changes and get_change tools so AI clients on a doc MCP server can read the API changelog.",
     "source_url": "https://docs.bump.sh/product-updates/2026/07/15/mcp-server-changelog/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-07-15"
    },
    {
     "claim": "Bump.sh lists Basic at $50 per month (10 API docs, 5 MCP tools, custom domain) and Pro at $120 per month (30 API docs, 50 MCP tools, private MCP servers) with a 14-day trial; a Custom tier adds SSO and reverse proxy mode.",
     "source_url": "https://bump.sh/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Bump.sh says MongoDB, Elastic and Lightspeed are among the teams that publish APIs with it.",
     "source_url": "https://bump.sh/",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "On 2026-11-05 the operation page operation-get-stations in Bump.sh's train-travel-api example returned 200 text/markdown at 4,288 bytes for Accept: text/markdown, the same as its .md URL, with Vary: Accept,Accept-Encoding.",
     "source_url": "https://docs.bump.sh/help/documentation-experience/ask-ai-capabilities/",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 a made-up operation path in that Bump.sh example doc returned HTTP 404, and the HTML of the real operation page contained its title text six times with no JSON-LD block.",
     "source_url": "https://docs.bump.sh/help/publish-documentation/seo-geo/",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Bump.sh API docs",
     "what": "Hosted API reference and hub portals generated from OpenAPI, AsyncAPI and Arazzo files, deployed from CLI or CI.",
     "pricing": {
      "model": "subscription",
      "from": 50,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://bump.sh/pricing",
      "note": "Basic $50 per month; Pro $120 per month with 14-day trial; Custom on request."
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "Generated at the doc or hub root when the Ask AI setting is on.",
     "source_url": "https://docs.bump.sh/help/documentation-experience/ask-ai-capabilities/"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the Ask AI or SEO & GEO help pages; an example doc answered Accept: text/markdown with markdown on 2026-11-05."
    },
    {
     "id": "markdown-twin",
     "status": "partial",
     "evidence": "Every page available as Markdown by appending .md, as part of Ask AI.",
     "source_url": "https://docs.bump.sh/help/documentation-experience/ask-ai-capabilities/"
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "Bump.sh makes no SSR claim; the 2026-06-23 performance update mentions pre-generated content, and operation text was in the raw HTML fetched on 2026-11-05.",
     "source_url": "https://docs.bump.sh/product-updates/2026/06/23/doc-performance-enhancement/"
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "No 404 statement found in the publish-documentation help pages; a made-up operation path returned HTTP 404 on 2026-11-05."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Bump.sh documents no cache headers; the train-travel-api example pages sent Vary: Accept,Accept-Encoding on 2026-11-05."
    }
   ],
   "checks": {
    "domain": "bump.sh",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 992,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding"
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 172959,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 42,
     "grade": "D",
     "scanned_at": "2026-08-22T14:47:43.549+00:00",
     "via": "GET https://ora.ai/api/score/bump.sh (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 13,
     "level": "L0 Not Ready",
     "scanned_at": "2026-11-05T13:56:22.764Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "Bump.sh only renders API reference content from OpenAPI, AsyncAPI or Arazzo files plus topics, so it is not a general site builder for product guides or marketing pages.",
    "Bump.sh's doc MCP server stays off for private docs and hubs, even when Ask AI is enabled.",
    "Bump.sh's SEO & GEO page covers sitemaps, titles, descriptions and llms.txt but says nothing about robots.txt control or JSON-LD output."
   ],
   "does_not_do_basis": [
    null,
    {
     "fact": 2,
     "keep": "fact"
    },
    null
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/bump-sh/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "zuplo",
   "name": "Zuplo",
   "type": "docs-platform",
   "homepage": "https://zuplo.com/",
   "one_line": "API gateway vendor whose Developer Portal, built on the Zudoku framework, is statically prerendered by default, writes a .md copy per page, answers Accept: text/markdown with Vary: Accept, and can emit llms.txt and llms-full.txt when switched on.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Zuplo states that its hosted Dev Portal is prerendered to static HTML (SSG) by default; setting devPortal.serverSideRendering: true in zuplo.jsonc switches a deployment to per-request server rendering.",
     "source_url": "https://zuplo.com/docs/dev-portal/server-side-rendering",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Server-side rendering for the Zuplo Dev Portal is sold only as an Enterprise add-on, used mainly so protected routes are enforced on the server; deployments with the flag but without the add-on fail.",
     "source_url": "https://zuplo.com/docs/dev-portal/server-side-rendering",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "In the Zuplo Dev Portal the per-page .md export (publishMarkdown) is on by default, while llmsTxt and llmsTxtFull are opt-in switches in the docs section of the Zudoku config.",
     "source_url": "https://zuplo.com/docs/dev-portal/zudoku/configuration/llms",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Zuplo's llms.txt build leaves out redirect pages, the 400, 404 and 500 error pages, and protected routes unless includeProtected is set to true.",
     "source_url": "https://zuplo.com/docs/dev-portal/zudoku/configuration/llms",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Zuplo's November 2025 monthly changelog announced llms.txt generation and markdown output for the Dev Portal, alongside a Copy page button.",
     "source_url": "https://zuplo.com/changelog/2025/12/01/monthly-changelog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-12-01"
    },
    {
     "claim": "Zuplo's changelog of 2026-08-28 added markdown on the normal page URL for Accept: text/markdown requests, sent with Vary: Accept so caches keep the two formats apart, starting with Zudoku 0.86.0.",
     "source_url": "https://zuplo.com/changelog/2026/08/28/dev-portal-agent-ready-docs-mcp-catalog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-08-28"
    },
    {
     "claim": "The same Zuplo release lets a portal serve its processed OpenAPI file at a stable path through publish.path, and an agentQuality flag warns at build time about missing operationId values or untyped request bodies.",
     "source_url": "https://zuplo.com/changelog/2026/08/28/dev-portal-agent-ready-docs-mcp-catalog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-08-28"
    },
    {
     "claim": "Zuplo's Dev Portal renders an OpenAPI document marked x-zudoku-type: mcp-catalog as one searchable page of MCP server cards with install instructions and tool lists.",
     "source_url": "https://zuplo.com/changelog/2026/08/28/dev-portal-agent-ready-docs-mcp-catalog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-08-28"
    },
    {
     "claim": "Zuplo's x-zudoku-seo OpenAPI extension sets a tag page's title and meta description, and the docs say both are server-rendered into the prerendered HTML that crawlers see without JavaScript.",
     "source_url": "https://zuplo.com/docs/dev-portal/zudoku/openapi-extensions/x-zudoku-seo",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Zuplo's pricing page includes the developer portal in every plan: Free up to 100K requests a month, Builder at $25 per month, Enterprise from $1,000 per month on an annual contract.",
     "source_url": "https://zuplo.com/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 a Zuplo docs page (a Zudoku site) returned 200 text/markdown at 4,256 bytes for Accept: text/markdown with Vary: Accept, Accept-Encoding; its .md URL returned the same bytes without a Vary header.",
     "source_url": "https://zuplo.com/changelog/2026/08/28/dev-portal-agent-ready-docs-mcp-catalog",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 the HTML of Zuplo's llms export doc page carried a schema.org TechArticle JSON-LD block, and a made-up path under zuplo.com/docs/dev-portal/ returned HTTP 404.",
     "source_url": "https://zuplo.com/docs/dev-portal/zudoku/configuration/llms",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Zuplo Developer Portal",
     "what": "API reference and docs portal built on the open source Zudoku framework, bundled with the Zuplo API, AI and MCP gateway.",
     "pricing": {
      "model": "freemium",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://zuplo.com/pricing",
      "note": "Free up to 100K requests per month; Builder $25 per month; Enterprise from $1,000 per month, annual; SSR is an Enterprise add-on."
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "llms.txt and llms-full.txt generated at build when llmsTxt and llmsTxtFull are enabled; off by default.",
     "source_url": "https://zuplo.com/docs/dev-portal/zudoku/configuration/llms"
    },
    {
     "id": "markdown-negotiation",
     "status": "supports",
     "evidence": "Accept: text/markdown returns the page Markdown from its regular URL, on by default with Markdown export (Zudoku 0.86.0+).",
     "source_url": "https://zuplo.com/changelog/2026/08/28/dev-portal-agent-ready-docs-mcp-catalog"
    },
    {
     "id": "markdown-twin",
     "status": "supports",
     "evidence": "Per-page .md export enabled by default; .md URLs work on every portal.",
     "source_url": "https://zuplo.com/docs/dev-portal/zudoku/configuration/llms"
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "Zuplo-hosted Dev Portal is statically prerendered (SSG) by default.",
     "source_url": "https://zuplo.com/docs/dev-portal/server-side-rendering"
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "The llms export doc mentions a 404 error page but no status code statement was found; zuplo.com/docs/dev-portal/zz-no-such-page-8841 answered with status 404 on 2026-11-05.",
     "source_url": "https://zuplo.com/docs/dev-portal/zudoku/configuration/llms"
    },
    {
     "id": "vary-accept",
     "status": "supports",
     "evidence": "Markdown at the page URL is sent with Vary: Accept so caches keep HTML and Markdown apart.",
     "source_url": "https://zuplo.com/changelog/2026/08/28/dev-portal-agent-ready-docs-mcp-catalog"
    }
   ],
   "checks": {
    "domain": "zuplo.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 1655,
     "jsonld_blocks": 4,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "Accept, Accept-Encoding, User-Agent"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 9262,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 94,
     "grade": "A",
     "scanned_at": "2026-10-11T09:05:16.859+00:00",
     "via": "GET https://ora.ai/api/score/zuplo.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 80,
     "level": "L5 Agent-Native",
     "scanned_at": "2026-11-05T13:56:34.705Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "Zuplo leaves llms.txt and llms-full.txt off in a new Dev Portal; only the per-page .md files are produced until llmsTxt or llmsTxtFull is set.",
    "Zuplo's Builder plan is not a team plan: it caps at 2 custom domains, 2 developer seats and 1M requests a month.",
    "Zuplo keeps protected Dev Portal content out of the public JavaScript bundle only when the Enterprise SSR add-on is on, per its server-side rendering doc."
   ],
   "does_not_do_basis": [
    {
     "fact": 2,
     "keep": "fact"
    },
    {
     "fact": 9,
     "keep": "both"
    },
    {
     "fact": 1,
     "keep": "fact"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/zuplo/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "apidog",
   "name": "Apidog",
   "type": "docs-platform",
   "homepage": "https://apidog.com/",
   "one_line": "API design, testing and docs tool whose published documentation sites give every page a .md version, can write /llms.txt at the site root, and expose robots.txt, sitemap.xml, meta tag and redirect settings, plus an MCP button for public docs.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Apidog's published-docs AI settings live under Publish Docs, Publish Docs Sites, AI Features, where llms.txt generation, the Copy page button and the MCP button are switched on.",
     "source_url": "https://docs.apidog.com/ai-features-1097197m0",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "With the llms.txt option on, Apidog writes /llms.txt at the docs site root linking every markdown page with a short description.",
     "source_url": "https://docs.apidog.com/ai-features-1097197m0",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Apidog gives each published documentation page a markdown version at the same URL plus .md, which its docs suggest pasting into tools such as Cursor.",
     "source_url": "https://docs.apidog.com/ai-features-1097197m0",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Apidog keeps password, IP allowlist and email allowlist rules in force for llms.txt and .md files, so protected sites still ask agents to authenticate.",
     "source_url": "https://docs.apidog.com/ai-features-1097197m0",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Apidog's blog post of 2025-04-16 announced llms.txt and .md endpoints for published docs and described the llms.txt option as on by default.",
     "source_url": "https://apidog.com/blog/apidog-supports-llms-txt/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-04-16"
    },
    {
     "claim": "Apidog's MCP Server can read online docs published by Apidog through a site-id in the IDE's mcp.json, but only for publicly published sites without password or allowlist settings.",
     "source_url": "https://docs.apidog.com/connect-published-documentation-to-ai-901468m0",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Apidog's site-wide SEO settings for a docs site cover global meta tags with variables such as PAGE_TITLE, an editable robots.txt, a sitemap.xml switch, redirect rules and URL naming rules; pages can override title, description and slug.",
     "source_url": "https://docs.apidog.com/seo-settings-631392m0",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "In Apidog the sitemap.xml is a switch: turning it off removes the file and also drops the Sitemap line that the SITEMAP_URL variable fills in robots.txt.",
     "source_url": "https://docs.apidog.com/seo-settings-631392m0",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Apidog's docs present redirect rules as the way to keep old URLs from returning 404 after published doc URLs change.",
     "source_url": "https://docs.apidog.com/seo-settings-631392m0",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Apidog lists Free for up to 4 users, Basic at $9, Professional at $18 and Enterprise at $27 per user per month billed annually; the plan table ticks LLMs.txt support and unlimited custom domains for documentation.",
     "source_url": "https://apidog.com/pricing/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 a page on docs.apidog.com, whose footer shows Built with and the Apidog logo, returned 200 text/markdown at 13,662 bytes for Accept: text/markdown, the same as its .md URL, with no Accept in the Vary header.",
     "source_url": "https://docs.apidog.com/ai-features-1097197m0",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 a made-up path on docs.apidog.com returned HTTP 404, while a curl GET of the apidog.com marketing homepage returned 207,109 bytes of HTML with no title or h1 text, so the marketing pages rely on client-side rendering.",
     "source_url": "https://docs.apidog.com/seo-settings-631392m0",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Apidog",
     "what": "All-in-one API design, debugging, testing, mocking and documentation publishing tool with desktop and web apps.",
     "pricing": {
      "model": "freemium",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://apidog.com/pricing/",
      "note": "Free up to 4 users; Basic $9, Professional $18, Enterprise $27 per user per month billed annually; 14-day trial."
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "Generated at the docs site root when the llms.txt option under AI Features is on; a 2025 blog post called it on by default.",
     "source_url": "https://docs.apidog.com/ai-features-1097197m0"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the AI Features or SEO Settings docs; docs.apidog.com returned markdown for Accept: text/markdown on 2026-11-05."
    },
    {
     "id": "markdown-twin",
     "status": "supports",
     "evidence": "Each published documentation page has a Markdown version at its URL plus .md.",
     "source_url": "https://docs.apidog.com/ai-features-1097197m0"
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "Apidog's publishing and SEO docs say nothing about rendering; doc page text was in the raw HTML of docs.apidog.com on 2026-11-05."
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "SEO docs mention 404 errors only as the reason for redirect rules; docs.apidog.com/zz-no-such-page-8841 gave HTTP 404 when probed on 2026-11-05.",
     "source_url": "https://docs.apidog.com/seo-settings-631392m0"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Apidog's docs are silent on Vary; on 2026-11-05 the markdown and HTML responses from docs.apidog.com carried Vary: Accept-Encoding only."
    }
   ],
   "checks": {
    "domain": "apidog.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": false,
     "words_in_initial_html": 0,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/html",
      "bytes": 207109,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 302,
      "location": "http://apidog.com/",
      "final_status": 200
     }
    },
    "ora": {
     "score": 59,
     "grade": "C",
     "scanned_at": "2026-09-28T12:30:08.287+00:00",
     "via": "GET https://ora.ai/api/score/apidog.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 27,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T13:56:52.944Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "Apidog's markdown response on docs.apidog.com did not add Accept to Vary on 2026-11-05, so a shared cache could hand HTML and markdown to the wrong client.",
    "Apidog's documentation MCP connection skips sites behind a password or allowlist; for those its docs point to the Apidog Project data source instead.",
    "Apidog's own docs and pricing pages state no JSON-LD output, and no ld+json block was in the docs.apidog.com SEO page HTML fetched on 2026-11-05."
   ],
   "does_not_do_basis": [
    {
     "fact": 10,
     "keep": "both"
    },
    {
     "fact": 5,
     "keep": "both"
    },
    null
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/apidog/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "postman",
   "name": "Postman",
   "type": "docs-platform",
   "homepage": "https://www.postman.com/",
   "one_line": "Postman is an API platform that publishes reference docs straight from a collection to documenter.getpostman.com or a custom subdomain, renders those pages in the browser, and gets llms.txt and AI search only through the Fern documentation option it added after buying Fern.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Postman now offers two publishing paths for a collection: Postman documentation for quick API reference pages, and Fern documentation for full docs sites with guides.",
     "source_url": "https://learning.postman.com/docs/publishing-your-api/api-documentation-overview",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Postman's own comparison of the two paths lists Postbot for descriptions under Postman documentation, and Fern Writer, llms.txt and AI search under Fern documentation.",
     "source_url": "https://learning.postman.com/docs/publishing-your-api/api-documentation-overview",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Postman acquired Fern, a docs and SDK generator launched in 2022 with a team of 25 and more than 200 customers, announced on the Postman blog on 2026-01-08.",
     "source_url": "https://blog.postman.com/postman-acquires-fern/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-01-08"
    },
    {
     "claim": "Publishing a Postman Collection with Fern deploys a live site backed by a GitHub repository the team owns, with an API reference generated from the collection and an API explorer.",
     "source_url": "https://learning.postman.com/docs/fern/overview",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Postman's classic published documentation re-syncs automatically whenever the source collection changes, with no republish step.",
     "source_url": "https://learning.postman.com/docs/publishing-your-api/publishing-your-docs",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Postman's publish settings take an SEO title of up to 60 characters and a description of up to 160 characters for each published collection.",
     "source_url": "https://learning.postman.com/docs/publishing-your-api/publishing-your-docs",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "When an environment is attached at publish time, Postman publishes the shared values of all its variables with the docs, and the preview flags tokens it detects.",
     "source_url": "https://learning.postman.com/docs/publishing-your-api/publishing-your-docs",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Postman restricts publishing to collections made of HTTP requests, and on Enterprise plans a Community Manager must approve each publish request.",
     "source_url": "https://learning.postman.com/docs/publishing-your-api/publishing-your-docs",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Postman serves published docs on a customer subdomain through a CNAME to phs.getpostman.com with a Let's Encrypt certificate; root domains are not accepted and custom domains need a paid plan.",
     "source_url": "https://learning.postman.com/docs/publishing-your-api/custom-doc-domains",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Postman's pricing page lists Free at $0, Solo at $9 per month billed annually with custom-branded documentation and unlimited custom domains, Team at $19 per user per month, and Enterprise on request.",
     "source_url": "https://www.postman.com/pricing/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 a live documenter.getpostman.com page returned 48,806 bytes of HTML whose only visible text after removing scripts was the collection title, and an Accept: text/markdown request got the same HTML.",
     "source_url": "https://learning.postman.com/docs/publishing-your-api/publishing-your-docs",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "The Postman API documentation example linked from Postman's publishing guide, documenter.getpostman.com/view/12959542/UV5XjJV8, returned HTTP 404 on 2026-11-05.",
     "source_url": "https://learning.postman.com/docs/publishing-your-api/publishing-your-docs",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 Postman's own Fern-built help center, learning.postman.com, answered Accept: text/markdown with 200 text/markdown and Vary: Accept, served the same 10,354 bytes at the .md URL, and returned 404 for a made-up path.",
     "source_url": "https://learning.postman.com/docs/publishing-your-api/api-documentation-overview",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Postman documentation",
     "what": "Reference docs generated from a collection and published at documenter.getpostman.com or a custom subdomain, with a Run in Postman button.",
     "pricing": {
      "model": "freemium",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.postman.com/pricing/",
      "note": "Publishing on Free; custom-branded docs and custom domains from Solo at $9 per month billed annually; Team $19 per user per month."
     }
    },
    {
     "name": "Fern documentation (Postman)",
     "what": "Docs-as-code site generated from a Postman Collection, backed by a team-owned GitHub repo, with llms.txt and AI search.",
     "pricing": {
      "model": "enterprise quote",
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://learning.postman.com/docs/fern/overview",
      "note": "No Fern documentation price stated on the Postman pages read on 2026-11-05."
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "llms.txt is listed only for the Fern documentation option, not for Postman documentation.",
     "source_url": "https://learning.postman.com/docs/publishing-your-api/api-documentation-overview"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the publishing guides; a documenter.getpostman.com page returned HTML for Accept: text/markdown on 2026-11-05."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No .md output found in the Postman documentation publishing guides read on 2026-11-05."
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "Postman's publishing guides never say how pages render; a live documenter page carried only its title as text in the initial HTML on 2026-11-05."
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "Postman's guides are silent on missing pages; unknown documenter.getpostman.com view paths returned HTTP 404 on 2026-11-05."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Postman's guides do not mention Vary; documenter responses carried Vary: Accept-Encoding only on 2026-11-05."
    }
   ],
   "checks": {
    "domain": "postman.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 547,
     "jsonld_blocks": 3,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "Accept"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 21271,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 200
     }
    },
    "ora": {
     "score": 80,
     "grade": "B",
     "scanned_at": "2026-11-01T23:08:13.521+00:00",
     "via": "GET https://ora.ai/api/score/postman.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 27,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T13:57:07.734Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 3383,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 1284,
     "js_shell": false,
     "jsonld_types": [
      "Organization",
      "ItemList"
     ],
     "home_links_llms_txt": true,
     "markdown_alternate_link": true,
     "generator": null,
     "answers_markdown": true,
     "missing_path_status": 200,
     "llms_txt_valid": true,
     "llms_txt_bytes": 21271,
     "llms_full_valid": true,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Postman's classic published documentation puts only the collection title and meta description in its initial HTML; request details appear after JavaScript runs.",
    "Postman documentation itself does not produce llms.txt; Postman's comparison lists llms.txt only under the Fern documentation option.",
    "Postman's publish flow only accepts collections of HTTP requests, so a GraphQL, gRPC or WebSocket collection gets no published docs page."
   ],
   "does_not_do_basis": [
    {
     "fact": 10,
     "keep": "both"
    },
    {
     "fact": 1,
     "keep": "fact"
    },
    null
   ],
   "related": [
    "fern"
   ],
   "page": "https://agentreadyhtml.com/vendors/postman/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "theneo",
   "name": "Theneo",
   "type": "docs-platform",
   "homepage": "https://www.theneo.io/",
   "one_line": "API docs and developer portal platform that builds llms.txt from each page's SEO fields, adds llms-full.txt and a .md copy per section, and server-renders titles, meta tags and canonical links; a made-up path on its own docs site returned 200 instead of 404.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Theneo builds llms.txt from each published page's SEO Title, Description and Slug fields, and each entry links to the page's .md source; drafts and unpublished pages are left out.",
     "source_url": "https://docs.theneo.io/ai-in-theneo/llms-txt",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Theneo rebuilds llms.txt on every publish, and a page with no SEO description still appears with a blank description.",
     "source_url": "https://docs.theneo.io/ai-in-theneo/llms-txt",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Theneo serves every published section as markdown at its URL plus .md, holding both the API request and its prose, with no export step.",
     "source_url": "https://docs.theneo.io/ai-in-theneo/geo-ai-optimization",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Theneo's August 2026 release notes added llms-full.txt next to llms.txt, holding the whole documentation in one file.",
     "source_url": "https://docs.theneo.io/2026-release-notes-or-theneo-changelog/august",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Theneo's release of 2026-01-15 began serving an auto-generated robots.txt at the sitemap's base path; free users get the default rules and paying subscribers can edit them.",
     "source_url": "https://docs.theneo.io/2026-release-notes-or-theneo-changelog/january",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-01-15"
    },
    {
     "claim": "The same Theneo release moved page titles and meta tags into the server-rendered initial HTML so crawlers that skip JavaScript read them.",
     "source_url": "https://docs.theneo.io/2026-release-notes-or-theneo-changelog/january",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-01-15"
    },
    {
     "claim": "Since 2026-01-15 Theneo adds canonical tags to every public page and drops content-less header sections from sitemap.xml and llms.txt.",
     "source_url": "https://docs.theneo.io/2026-release-notes-or-theneo-changelog/january",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-01-15"
    },
    {
     "claim": "Theneo's SEO Management help page describes the sitemap as a file that Editors or Admins generate on demand and download, leaving out sections marked Private, rather than one kept current on the site.",
     "source_url": "https://docs.theneo.io/workspace-and-admin/project-management/seo-management",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Theneo projects can stay public while carrying a no-index flag, and per-section SEO titles, descriptions, keywords and Open Graph fields are edited in SEO Management.",
     "source_url": "https://docs.theneo.io/workspace-and-admin/project-management/seo-management",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Theneo generates a runnable MCP server from an OpenAPI spec at editor.theneo.io/mcp, with stdio, HTTP or SSE transport and a checkbox list of operations to expose as tools.",
     "source_url": "https://docs.theneo.io/ai-in-theneo/generate-mcp-server",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Theneo's pricing page JSON-LD lists a free Starter plan (1 public project), Business at $120 per month per workspace billed annually ($150 monthly) and Growth at $400 billed annually ($450 monthly).",
     "source_url": "https://www.theneo.io/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Theneo says more than 18,000 companies use it.",
     "source_url": "https://www.theneo.io/",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "On 2026-11-05 a made-up path on docs.theneo.io returned HTTP 200 with the What Is Theneo welcome page and a canonical tag pointing at the made-up URL, a soft 404.",
     "source_url": "https://docs.theneo.io/workspace-and-admin/project-management/seo-management",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 docs.theneo.io answered Accept: text/markdown with the normal HTML page, while the same page's .md URL returned 4,221 bytes of text/plain markdown and /llms-full.txt returned 1,100,994 bytes.",
     "source_url": "https://docs.theneo.io/ai-in-theneo/geo-ai-optimization",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Theneo",
     "what": "API reference, guides and developer portal platform with AI writing, Ask AI search, generated MCP servers and llms.txt.",
     "pricing": {
      "model": "freemium",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.theneo.io/pricing",
      "note": "Starter free; Business $120 per month per workspace billed annually or $150 monthly; Growth $400 annually or $450 monthly; Enterprise on request."
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "supports",
     "evidence": "llms.txt generated automatically from SEO fields and refreshed on every publish.",
     "source_url": "https://docs.theneo.io/ai-in-theneo/llms-txt"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the GEO, llms.txt or Markdown export pages; Accept: text/markdown returned HTML on 2026-11-05."
    },
    {
     "id": "markdown-twin",
     "status": "supports",
     "evidence": "Every published section available as Markdown by appending .md.",
     "source_url": "https://docs.theneo.io/ai-in-theneo/geo-ai-optimization"
    },
    {
     "id": "initial-html",
     "status": "partial",
     "evidence": "Titles and meta tags server-rendered since 2026-01-15; no statement covers body content.",
     "source_url": "https://docs.theneo.io/2026-release-notes-or-theneo-changelog/january"
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "No statement found in the SEO Management or redirect docs; docs.theneo.io served its welcome page with status 200 for an invented path on 2026-11-05."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No negotiation is documented; responses carried Vary: Accept-Encoding only on 2026-11-05."
    }
   ],
   "checks": {
    "domain": "theneo.io",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 625,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "accept-encoding"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 4939,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 67,
     "grade": "C",
     "scanned_at": "2026-09-09T15:31:33.296+00:00",
     "via": "GET https://ora.ai/api/score/theneo.io (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T13:57:20.819Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": null,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 727,
     "js_shell": false,
     "jsonld_types": [
      "Organization",
      "WebSite",
      "SoftwareApplication",
      "WebPage"
     ],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": false,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 4939,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Theneo's own docs site served a made-up URL as HTTP 200 with the welcome page and a self-referencing canonical on 2026-11-05, so missing pages can be indexed as duplicates.",
    "Theneo does not switch to markdown on Accept: text/markdown; agents have to request the .md URL instead.",
    "Theneo's help page describes the sitemap as a manual download from SEO Management, so authors regenerate it after each structural change."
   ],
   "does_not_do_basis": [
    {
     "fact": 12,
     "keep": "fact"
    },
    {
     "fact": 13,
     "keep": "fact"
    },
    {
     "fact": 7,
     "keep": "limit"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/theneo/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "stainless",
   "name": "Stainless",
   "type": "docs-platform",
   "homepage": "https://www.stainless.com/",
   "one_line": "SDK generator vendor whose Docs Platform (public beta since March 2026) builds each docs site as a static Astro and Starlight project with API and SDK reference, a markdown copy of every page at /index.md, and AI chat; it needs at least one Stainless SDK.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Stainless labels its Docs Platform a public beta and warns of breaking API changes before version 1.0.",
     "source_url": "https://www.stainless.com/docs/docs-platform/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Each Stainless Docs Platform site is a standalone Astro project in a Git repository the customer controls, and Astro outputs static HTML and CSS with opt-in interactive islands.",
     "source_url": "https://www.stainless.com/docs/docs-platform/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Stainless Docs Platform writes a markdown version of every page on the site, reached by adding a .md extension to the URL.",
     "source_url": "https://www.stainless.com/docs/docs-platform/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Stainless's public beta post of 2026-03-12 says every docs page is served as markdown through the Accept header or at /index.md, with SDK method signatures in the endpoint pages.",
     "source_url": "https://www.stainless.com/blog/stainless-docs-public-beta/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-03-12"
    },
    {
     "claim": "Stainless first opened its Docs Platform in early access on 2025-11-05, describing it as built on Astro with hosting on Cloudflare.",
     "source_url": "https://www.stainless.com/blog/stainless-docs-early-access/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-11-05"
    },
    {
     "claim": "The Stainless Docs Platform currently requires at least one Stainless-generated SDK; Stainless says that requirement should go away by 1.0.",
     "source_url": "https://www.stainless.com/blog/stainless-docs-public-beta/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-03-12"
    },
    {
     "claim": "Stainless docs sites can move off Stainless hosting to any static host such as Cloudflare Pages, Vercel, Netlify or GitHub Pages, given @stainless-api/docs 1.0.0-beta.143 or newer.",
     "source_url": "https://www.stainless.com/docs/docs-platform/hosting-and-deploys/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Stainless Docs uses Starlight's Pagefind index for guide search and offers optional Algolia search over the API reference; the beta post adds a vector search layer.",
     "source_url": "https://www.stainless.com/docs/docs-platform/hosting-and-deploys/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Stainless's pricing page counts a docs site as one generator; the Free plan at $0 covers up to 5 generators, and the docs feature list includes custom domain, AI markdown rendering, AI chat and password-protected docs.",
     "source_url": "https://www.stainless.com/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Stainless says its SDK generator serves API companies including Anthropic, Cloudflare and OpenAI.",
     "source_url": "https://www.stainless.com/blog/stainless-docs-early-access/",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "On 2026-11-05 Stainless's own docs at www.stainless.com/docs (generator meta Astro v6.3.1 and Starlight v0.38.5) served /docs/docs-platform/index.md as text/markdown at 6,256 bytes but answered Accept: text/markdown on the page URL with HTML.",
     "source_url": "https://www.stainless.com/docs/docs-platform/",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 a made-up path under www.stainless.com/docs/ returned HTTP 404, while the marketing site returned HTTP 200 with its homepage for unknown paths, including /llms.txt.",
     "source_url": "https://www.stainless.com/docs/docs-platform/hosting-and-deploys/",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Stainless Docs Platform",
     "what": "Astro and Starlight based docs framework and hosting that unifies API reference, SDK reference and MDX guides, in public beta.",
     "pricing": {
      "model": "freemium",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.stainless.com/pricing",
      "note": "Free plan $0 for up to 5 generators (an SDK, docs site or MCP server each); Starter, Pro and Enterprise prices were not in the fetched HTML."
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No llms.txt statement found in the Docs Platform overview, hosting or configuration pages or the two launch posts; Stainless's own docs serve /docs/llms.txt."
    },
    {
     "id": "markdown-negotiation",
     "status": "supports",
     "evidence": "Beta post says every page is available as markdown via the Accept header; Stainless's own docs returned HTML for Accept: text/markdown on 2026-11-05.",
     "source_url": "https://www.stainless.com/blog/stainless-docs-public-beta/"
    },
    {
     "id": "markdown-twin",
     "status": "supports",
     "evidence": "Markdown version of every page by adding .md (or /index.md) to the URL.",
     "source_url": "https://www.stainless.com/docs/docs-platform/"
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "Sites are Astro projects that generate static HTML; hosting docs call them multi-page static sites.",
     "source_url": "https://www.stainless.com/docs/docs-platform/"
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "No 404 statement found in the routing or hosting pages; an unknown path under www.stainless.com/docs/docs-platform/ answered 404 on 2026-11-05."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Stainless's docs pages do not cover response headers, and www.stainless.com/docs sent no Vary header on 2026-11-05."
    }
   ],
   "checks": {
    "domain": "stainless.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 211,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "accept-encoding"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/html",
      "bytes": 699298,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 200
     }
    },
    "ora": {
     "score": 58,
     "grade": "C",
     "scanned_at": "2026-09-10T12:43:08.381+00:00",
     "via": "GET https://ora.ai/api/score/stainless.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T13:57:32.005Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "Stainless does not yet let a team start a docs site without a Stainless-generated SDK, per its March 2026 beta post.",
    "Stainless's Docs Platform pages make no llms.txt promise, even though Stainless's own docs serve /docs/llms.txt.",
    "Stainless's marketing site answers unknown paths, /llms.txt included, with its homepage and HTTP 200, unlike its docs section."
   ],
   "does_not_do_basis": [
    {
     "fact": 5,
     "keep": "fact"
    },
    null,
    {
     "fact": 11,
     "keep": "fact"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/stainless/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "developerhub",
   "name": "DeveloperHub",
   "type": "docs-platform",
   "homepage": "https://developerhub.io/",
   "one_line": "Hosted docs and API reference platform that renders pages in the browser for people, serves cached bot-rendered HTML to crawlers, and when llms.txt is on gives AI assistants markdown at the page URL, .md copies, a per-version llms.txt and WebMCP tools.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "DeveloperHub turns llms.txt on by default for new projects, under Project Settings, AI, AI Agents & MCP, Readers, and labels the feature beta.",
     "source_url": "https://docs.developerhub.io/support-center/llms-txt.md",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "DeveloperHub writes a separate llms.txt for each published docs version, refreshes the files every 5 minutes, and does not offer llms-full.txt.",
     "source_url": "https://docs.developerhub.io/support-center/llms-txt.md",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "With llms.txt on, DeveloperHub serves any page as markdown at its URL plus .md, and its llms.txt links each API endpoint on its own.",
     "source_url": "https://docs.developerhub.io/support-center/llms-txt.md",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "DeveloperHub hands AI assistants such as ChatGPT, Claude and Perplexity the markdown at the page's own URL, while search and training crawlers still get the HTML page.",
     "source_url": "https://docs.developerhub.io/support-center/llms-txt.md",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "DeveloperHub's SEO page lists bot-friendly rendering among its defaults and says bot-rendered pages are cached for 7 days.",
     "source_url": "https://docs.developerhub.io/support-center/seo.md",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "DeveloperHub serves /robots.txt, /sitemap.xml and /sitemap.txt at the docs root, regenerates sitemaps every 6 hours, and treats the short unversioned URL as canonical unless Canonicalize Short URL Form is set.",
     "source_url": "https://docs.developerhub.io/support-center/seo.md",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "DeveloperHub fills a page's meta description from its first paragraph unless an author overrides it in Page Info, and builds the title tag from the seo.titleFormats pattern %page% - %project%.",
     "source_url": "https://docs.developerhub.io/support-center/seo.md",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Every DeveloperHub docs page offers WebMCP tools (search_docs, read_page, get_site_overview, navigate_page) to in-browser agents with no setup; read_page and get_site_overview need llms.txt switched on.",
     "source_url": "https://docs.developerhub.io/support-center/webmcp.md",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "DeveloperHub's read-only Reader MCP Server sits at /mcp on the docs URL with a single search tool over Streamable HTTP, needs AI Assistant on, and is limited to public projects.",
     "source_url": "https://docs.developerhub.io/support-center/reader-mcp-server.md",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "DeveloperHub's pricing page lists Free at $0 on a DeveloperHub subdomain, Plus at $99 per month billed annually ($129 monthly), Pro at $199 ($229 monthly) and Enterprise from $499 per month; paid plans include a custom domain and a 14-day trial.",
     "source_url": "https://developerhub.io/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 a DeveloperHub docs page fetched with a plain crawler user agent returned a 20,124-byte HTML shell with no article text and Vary: X-Bot, and a made-up path returned the same shell with HTTP 200.",
     "source_url": "https://docs.developerhub.io/support-center/seo.md",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 the same DeveloperHub page answered Accept: text/markdown with 200 text/markdown at 2,710 bytes and Vary: X-Bot, Accept, User-Agent, matching its .md URL.",
     "source_url": "https://docs.developerhub.io/support-center/llms-txt.md",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "DeveloperHub",
     "what": "Hosted documentation and API reference portal with an AI writing agent, AI search, reader and editor MCP servers and WebMCP.",
     "pricing": {
      "model": "freemium",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://developerhub.io/pricing",
      "note": "Free $0 on a subdomain; Plus $99 per month billed annually or $129 monthly; Pro $199 or $229; Enterprise from $499 per month billed annually."
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "supports",
     "evidence": "llms.txt enabled by default for new projects, one per published version, beta.",
     "source_url": "https://docs.developerhub.io/support-center/llms-txt.md"
    },
    {
     "id": "markdown-negotiation",
     "status": "partial",
     "evidence": "Docs describe markdown at the page URL for AI assistant fetches, keyed to the assistant rather than an Accept header; Accept: text/markdown also worked on 2026-11-05.",
     "source_url": "https://docs.developerhub.io/support-center/llms-txt.md"
    },
    {
     "id": "markdown-twin",
     "status": "supports",
     "evidence": "Pages readable as markdown by adding .md when llms.txt is enabled.",
     "source_url": "https://docs.developerhub.io/support-center/llms-txt.md"
    },
    {
     "id": "initial-html",
     "status": "partial",
     "evidence": "Bot-friendly rendering for crawlers, cached 7 days; a plain user agent got an empty HTML shell on 2026-11-05.",
     "source_url": "https://docs.developerhub.io/support-center/seo.md"
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "No 404 statement found in the SEO or hosting pages; a made-up path returned HTTP 200 to a plain user agent on 2026-11-05."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "DeveloperHub's docs say nothing on Vary; its markdown response carried Vary: X-Bot, Accept, User-Agent on 2026-11-05."
    }
   ],
   "checks": {
    "domain": "developerhub.io",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 2573,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 4273,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "unavailable": "GET /api/score returned 404 DOMAIN_NOT_SCANNED"
    },
    "cloudflare": {
     "score": 7,
     "level": "L0 Not Ready",
     "scanned_at": "2026-11-05T13:57:44.952Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "DeveloperHub does not produce llms-full.txt; its llms.txt doc says only llms.txt is supported for now.",
    "DeveloperHub sends an agent that is not recognised as a bot or assistant a JavaScript shell with no article text, so content in the initial HTML depends on user-agent detection.",
    "DeveloperHub's Reader MCP Server is not offered for private projects without contacting the company."
   ],
   "does_not_do_basis": [
    {
     "fact": 1,
     "keep": "fact"
    },
    {
     "fact": 10,
     "keep": "both"
    },
    {
     "fact": 8,
     "keep": "fact"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/developerhub/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "docsie",
   "name": "Docsie",
   "type": "docs-platform",
   "homepage": "https://www.docsie.io/",
   "one_line": "Docsie is a knowledge base and documentation portal platform with video-to-docs AI and a hosted MCP server for writers, and its own help portal answered every path, /robots.txt and /llms.txt included, with the same client-rendered HTML shell and HTTP 200.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Docsie says it runs a hosted MCP server at app.docsie.io/mcp for Claude, ChatGPT, Cursor, Codex and other remote MCP clients, signed in with OAuth.",
     "source_url": "https://www.docsie.io/solutions/documentation-mcp-server/",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "Docsie says its MCP server comes with every plan including Free, with AI jobs billed against AI credits.",
     "source_url": "https://www.docsie.io/solutions/documentation-mcp-server/",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "Docsie pitches its MCP server at people who write docs, and its setup notes say write access needs the Workspace create and edit permission ticked at sign-in, off by default.",
     "source_url": "https://www.docsie.io/solutions/documentation-mcp-server/",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "Docsie says its MCP server exposes more than 100 Docsie tools and 14 Docsie apps.",
     "source_url": "https://www.docsie.io/solutions/documentation-mcp-server/",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "Docsie's portal SEO guide, first published 2023-07-21 and updated 2026-06-23, says portals can sit on a subdomain or a subdirectory.",
     "source_url": "https://www.docsie.io/blog/articles/optimize-your-docsie-portal-for-seo/",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "The same Docsie guide claims support for schema markup and site map generation, and lets teams embed Google Analytics scripts in deployment settings, without naming the schema types or file paths.",
     "source_url": "https://www.docsie.io/blog/articles/optimize-your-docsie-portal-for-seo/",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "Docsie's pricing page lists Free at $0 with a knowledge base on your own domain, Hobby at $25, Premium at $170, Business at $249 and Organization at $699 per month billed yearly, plus custom Enterprise contracts.",
     "source_url": "https://www.docsie.io/pricing/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 Docsie's own help portal, help.docsie.io (footer: Powered by Docsie.io), returned the same 15,875-byte HTML with HTTP 200 for its home page, /robots.txt, /llms.txt and a made-up path; the visible text was only the title and footer links.",
     "source_url": "https://www.docsie.io/blog/articles/optimize-your-docsie-portal-for-seo/",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 the www.docsie.io marketing site returned HTTP 404 for /llms.txt and for a made-up path, so neither Docsie host served an llms.txt file.",
     "source_url": "https://www.docsie.io/blog/articles/optimize-your-docsie-portal-for-seo/",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Docsie",
     "what": "Documentation and knowledge base platform with publishable portals, video-to-docs AI, chatbots and a hosted MCP server.",
     "pricing": {
      "model": "freemium",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.docsie.io/pricing/",
      "note": "Free $0; Hobby $25; Premium $170; Business $249; Organization $699 per month billed yearly; Enterprise custom."
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No llms.txt statement found on the MCP, pricing or portal SEO pages; help.docsie.io/llms.txt returned the HTML shell on 2026-11-05."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "Docsie's site has no markdown negotiation claim; help.docsie.io returned HTML for Accept: text/markdown on 2026-11-05."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No per-page markdown URL found on the pages read; Markdown appears only as a paid video-to-docs export format."
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "Docsie's SEO guide says nothing about rendering; help.docsie.io sent an HTML shell with no article text on 2026-11-05."
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "Docsie states no 404 behaviour; help.docsie.io returned HTTP 200 for a made-up path on 2026-11-05."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Docsie documents no response headers; help.docsie.io responses carried no Vary header on 2026-11-05."
    }
   ],
   "checks": {
    "domain": "docsie.io",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 2136,
     "jsonld_blocks": 5,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding"
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 105636,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "unavailable": "GET /api/score returned 404 DOMAIN_NOT_SCANNED"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T13:57:52.938Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "Docsie's MCP server is a workspace tool for writers signed in to Docsie, not a public endpoint that readers of a published portal can query.",
    "Docsie's help portal did not serve a real robots.txt on 2026-11-05: the path returned the portal's HTML page with HTTP 200.",
    "Docsie's SEO guide names schema markup and site maps but gives no file paths, schema types or settings an integrator could check."
   ],
   "does_not_do_basis": [
    {
     "fact": 2,
     "keep": "both"
    },
    {
     "fact": 7,
     "keep": "fact"
    },
    {
     "fact": 5,
     "keep": "fact"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/docsie/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "vitepress",
   "name": "VitePress",
   "type": "framework",
   "operator": "Vue.js project (vuejs organization on GitHub)",
   "homepage": "https://vitepress.dev/",
   "one_line": "Vite and Vue static site generator that pre-renders each Markdown page to HTML and writes a root 404.html; sitemap.xml needs a hostname, and llms.txt or .md twins come only from the community vitepress-plugin-llms.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "VitePress takes Markdown source, applies a theme and writes static HTML pages, so page text is in the HTML file an agent fetches.",
     "source_url": "https://vitepress.dev/guide/what-is-vitepress",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "On a first visit VitePress serves the pre-rendered HTML, then loads a JavaScript bundle that hydrates the page into a Vue single page app for later navigation.",
     "source_url": "https://vitepress.dev/guide/what-is-vitepress",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The VitePress deploy guide says 404.html is generated for the root depth only, and hosts that serve that file for deep missing URLs render it without styles.",
     "source_url": "https://vitepress.dev/guide/deploy",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "VitePress 1.2.1 (2024-05-21) changed the 404 page to render completely on the client so the locale can be read from the browser path, which keeps its 404.html nearly empty of text.",
     "source_url": "https://raw.githubusercontent.com/vuejs/vitepress/main/CHANGELOG.md",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2024-05-21"
    },
    {
     "claim": "VitePress writes sitemap.xml only after sitemap.hostname is set in .vitepress/config, and adds lastmod tags when the lastUpdated option is on.",
     "source_url": "https://vitepress.dev/guide/sitemap-generation",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The VitePress default theme gets fuzzy full-text search from an in-browser MiniSearch index when themeConfig.search.provider is 'local'; Algolia DocSearch is the hosted alternative.",
     "source_url": "https://vitepress.dev/reference/default-theme-search",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The experimental mpa option builds a VitePress site in MPA mode, shipping 0 kB of JavaScript by default and dropping client-side navigation.",
     "source_url": "https://vitepress.dev/reference/site-config",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "VitePress has no structured data setting; its transformHead build hook returns extra head tags per page, which is where a site would add JSON-LD.",
     "source_url": "https://vitepress.dev/reference/site-config",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "With the cleanUrls option VitePress generates links without the .html extension, which needs a host that serves /foo.html for /foo.",
     "source_url": "https://vitepress.dev/guide/routing",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The config of vitepress.dev imports the community package vitepress-plugin-llms and calls llmstxt with workDir 'en' only in production builds.",
     "source_url": "https://raw.githubusercontent.com/vuejs/vitepress/main/docs/.vitepress/config.ts",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "vitepress.dev served a text/markdown twin at /guide/getting-started.md (6,275 bytes) on 2026-11-05, yet the same page requested with Accept: text/markdown came back as 56,191 bytes of HTML with only Vary: Accept-Encoding.",
     "source_url": "https://vitepress.dev/guide/getting-started",
     "read_date": "2026-11-05",
     "kind": "observed"
    },
    {
     "claim": "A default VitePress 1.6.4 site (npm add -D vitepress@1.6.4, npx vitepress init with every default, npm run docs:build) built on 2026-11-05 held 404.html and three page files but no llms.txt, robots.txt or sitemap.xml.",
     "source_url": "https://vitepress.dev/guide/getting-started",
     "read_date": "2026-11-05",
     "kind": "observed"
    },
    {
     "claim": "Under vitepress preview that 1.6.4 build kept the hero H1 'My Awesome Project' in the server HTML, answered a made-up path with 404, and returned text/html to Accept: text/markdown.",
     "source_url": "https://vitepress.dev/guide/getting-started",
     "read_date": "2026-11-05",
     "kind": "observed"
    },
    {
     "claim": "The VitePress changelog dates 2.0.0-alpha.21 to 2026-10-25, a pre-release that adds asset sharding and native RTL support in the theme.",
     "source_url": "https://raw.githubusercontent.com/vuejs/vitepress/main/CHANGELOG.md",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-25"
    },
    {
     "claim": "VitePress ships under the MIT License with copyright held by Yuxi (Evan) You since 2019.",
     "source_url": "https://raw.githubusercontent.com/vuejs/vitepress/main/LICENSE",
     "read_date": "2026-11-05",
     "kind": "primary"
    }
   ],
   "products": [
    {
     "name": "VitePress",
     "what": "Static site generator and default docs theme built on Vite and Vue.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://raw.githubusercontent.com/vuejs/vitepress/main/LICENSE",
      "note": "MIT licence, free; 1.6.4 is the stable line and 2.0 is in alpha"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "Core VitePress has no llms.txt option; the vitepress.dev config adds it with the community vitepress-plugin-llms package in production builds.",
     "source_url": "https://raw.githubusercontent.com/vuejs/vitepress/main/docs/.vitepress/config.ts"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the VitePress guide, site config or deploy pages; vitepress.dev returned HTML to Accept: text/markdown on 2026-11-05."
    },
    {
     "id": "markdown-twin",
     "status": "partial",
     "evidence": "vitepress.dev serves .md twins produced by vitepress-plugin-llms, which its own docs config imports; a default VitePress build writes none.",
     "source_url": "https://raw.githubusercontent.com/vuejs/vitepress/main/docs/.vitepress/config.ts"
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "VitePress says the initial visit to any page is served the static, pre-rendered HTML.",
     "source_url": "https://vitepress.dev/guide/what-is-vitepress"
    },
    {
     "id": "real-404",
     "status": "supports",
     "evidence": "The deploy guide documents a generated 404.html and nginx error_page 404 /404.html rules; the preview server returned 404 for a made-up path.",
     "source_url": "https://vitepress.dev/guide/deploy"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found in the VitePress site config, routing or deploy pages; VitePress does not negotiate, and vitepress.dev sent only Vary: Accept-Encoding."
    }
   ],
   "checks": {
    "domain": "vitepress.dev",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 99,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 5033,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 40,
     "grade": "D",
     "scanned_at": "2026-09-02T18:03:14.488+00:00",
     "via": "GET https://ora.ai/api/score/vitepress.dev (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 27,
     "level": "L2 Bot-Aware",
     "scanned_at": "2026-11-05T13:58:15.461Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "VitePress core writes no llms.txt and no .md copy of a page; vitepress.dev gets both from the separately maintained vitepress-plugin-llms.",
    "A VitePress build has no sitemap.xml until sitemap.hostname is configured, and no robots.txt unless the author adds one.",
    "VitePress does not switch a page URL to Markdown on Accept: text/markdown; even vitepress.dev answered that header with HTML."
   ],
   "does_not_do_basis": [
    {
     "fact": 9,
     "keep": "both"
    },
    {
     "fact": 4,
     "keep": "fact"
    },
    {
     "fact": 10,
     "keep": "fact"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/vitepress/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "starlight",
   "name": "Starlight",
   "type": "framework",
   "operator": "The Astro Technology Company (part of Cloudflare since January 2026)",
   "homepage": "https://starlight.astro.build/",
   "one_line": "Astro's documentation framework that pre-renders pages to static HTML with a built-in 404 page and Pagefind search; sitemap needs the Astro site URL, and llms.txt, .md.txt twins and JSON-LD come from community plugins.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Starlight's prerender option defaults to true, so pages are built as static HTML; prerender: false hands them to an SSR adapter instead.",
     "source_url": "https://starlight.astro.build/reference/configuration/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Starlight injects a default 404 page; disable404Route: true turns that off so a project can ship its own src/pages/404.astro.",
     "source_url": "https://starlight.astro.build/reference/configuration/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Starlight builds a sitemap only once the site URL is set in astro.config.mjs.",
     "source_url": "https://starlight.astro.build/guides/customization/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Search in Starlight is Pagefind with no setup step; a page drops out of the index with pagefind: false in its frontmatter.",
     "source_url": "https://starlight.astro.build/guides/site-search/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Starlight's plugins page lists starlight-llms-txt, a community plugin that adds llms.txt following llmstxt.org.",
     "source_url": "https://starlight.astro.build/resources/plugins/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The same Starlight plugins list carries starlight-md-txt, which exposes each page as raw Markdown at a .md.txt URL.",
     "source_url": "https://starlight.astro.build/resources/plugins/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "For structured data the Starlight plugins list points to starlight-seo, a community plugin that adds a connected JSON-LD graph and a build-time SEO audit.",
     "source_url": "https://starlight.astro.build/resources/plugins/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The starlight-llms-txt plugin site says the plugin generates llms.txt, llms-full.txt and llms-small.txt for a Starlight site.",
     "source_url": "https://delucis.github.io/starlight-llms-txt/",
     "read_date": "2026-11-05",
     "kind": "secondary"
    },
    {
     "claim": "A default Starlight project (npm create astro@5.3.1 -- starlight-test --template starlight --install --no-git --yes --skip-houston; npm run build) with @astrojs/starlight 0.42.9 and astro 7.4.1 skipped the sitemap on 2026-11-05 because site was unset.",
     "source_url": "https://starlight.astro.build/getting-started/",
     "read_date": "2026-11-05",
     "kind": "observed"
    },
    {
     "claim": "The Starlight 0.42.9 build output held 404.html, a pagefind index and the pages, with no llms.txt or robots.txt; the home H1 'Welcome to Starlight' was in the server HTML.",
     "source_url": "https://starlight.astro.build/getting-started/",
     "read_date": "2026-11-05",
     "kind": "observed"
    },
    {
     "claim": "Under astro preview a request for / sending only Accept: text/markdown got 404 text/html instead of the home page, a preview server quirk worth knowing before testing negotiation locally.",
     "source_url": "https://starlight.astro.build/getting-started/",
     "read_date": "2026-11-05",
     "kind": "observed"
    },
    {
     "claim": "starlight.astro.build itself returned 404 for /llms.txt and /robots.txt on 2026-11-05, while /sitemap-index.xml answered 200.",
     "source_url": "https://starlight.astro.build/guides/customization/",
     "read_date": "2026-11-05",
     "kind": "observed"
    },
    {
     "claim": "GitHub lists @astrojs/starlight 0.42.9 as released on 2026-11-04 by the astrobot-houston account.",
     "source_url": "https://github.com/withastro/starlight/releases/tag/%40astrojs/starlight%400.42.9",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-04"
    },
    {
     "claim": "The Astro Technology Company, which builds the Astro framework under Starlight, joined Cloudflare on 2026-01-16 and says Astro stays open source and MIT licensed.",
     "source_url": "https://astro.build/blog/joining-cloudflare/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-01-16"
    },
    {
     "claim": "Starlight's getting started page scaffolds a project with npm create astro@latest -- --template starlight.",
     "source_url": "https://starlight.astro.build/getting-started/",
     "read_date": "2026-11-05",
     "kind": "primary"
    }
   ],
   "products": [
    {
     "name": "Starlight (@astrojs/starlight)",
     "what": "Astro integration that turns a content folder into a documentation site.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://raw.githubusercontent.com/withastro/starlight/main/LICENSE",
      "note": "MIT licence, free; version 0.42.9 on 2026-11-04"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "Starlight's own plugins page lists the community plugin starlight-llms-txt for llms.txt; core Starlight writes none.",
     "source_url": "https://starlight.astro.build/resources/plugins/"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the Starlight configuration reference, customization guide or plugins list; starlight.astro.build returned HTML to Accept: text/markdown."
    },
    {
     "id": "markdown-twin",
     "status": "partial",
     "evidence": "The community plugin starlight-md-txt, listed by Starlight, exposes pages as Markdown at .md.txt URLs.",
     "source_url": "https://starlight.astro.build/resources/plugins/"
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "Starlight pages are pre-rendered by default (prerender defaults to true).",
     "source_url": "https://starlight.astro.build/reference/configuration/"
    },
    {
     "id": "real-404",
     "status": "supports",
     "evidence": "Starlight injects a default 404 page unless disable404Route is set, and astro preview returned 404 for a made-up path.",
     "source_url": "https://starlight.astro.build/reference/configuration/"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found in the Starlight configuration reference or site search guide; Starlight does not negotiate on Accept."
    }
   ],
   "checks": {
    "domain": "starlight.astro.build",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 537,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding"
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 21306,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 37,
     "grade": "D",
     "scanned_at": "2026-11-03T13:36:30.241+00:00",
     "via": "GET https://ora.ai/api/score/starlight.astro.build (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 7,
     "level": "L0 Not Ready",
     "scanned_at": "2026-11-05T13:58:23.644Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "Starlight does not write llms.txt itself; the starlight-llms-txt plugin has to be installed.",
    "Without site set in astro.config.mjs a Starlight build silently skips sitemap generation, as the 0.42.9 test build showed.",
    "Starlight emits no JSON-LD by default; the JSON-LD graph comes from the community starlight-seo plugin."
   ],
   "does_not_do_basis": [
    {
     "fact": 7,
     "keep": "fact"
    },
    {
     "fact": 2,
     "keep": "limit"
    },
    {
     "fact": 6,
     "keep": "fact"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/starlight/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "nextra",
   "name": "Nextra",
   "type": "framework",
   "homepage": "https://nextra.site/",
   "one_line": "Next.js App Router framework for docs and blogs whose pages use Next.js static rendering or a full static export, a NotFoundPage component fills not-found.jsx, and search needs a Pagefind postbuild step; no llms.txt or Markdown output is documented.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Nextra 4, announced on 2025-01-13 by maintainer Dimitri Postolov, works only with the Next.js App Router.",
     "source_url": "https://the-guild.dev/blog/nextra-4",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-01-13"
    },
    {
     "claim": "Nextra 4 moved search from the JavaScript FlexSearch library to Pagefind, which is written in Rust.",
     "source_url": "https://the-guild.dev/blog/nextra-4",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Nextra search needs pagefind as a dev dependency plus a postbuild script that indexes .next/server/app, writing to public/_pagefind or out/_pagefind for static exports.",
     "source_url": "https://nextra.site/docs/guide/search",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Nextra's docs describe Next.js static rendering as the default strategy, with routes rendered at build time or in the background after revalidation, so docs pages reach crawlers as HTML.",
     "source_url": "https://nextra.site/docs/guide/ssg",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "A fully static Nextra site sets output: 'export' and images.unoptimized: true in next.config.mjs and writes the export to the out directory.",
     "source_url": "https://nextra.site/docs/guide/static-exports",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "nextra-theme-docs provides a NotFoundPage component for app/not-found.jsx whose default top content is an H1 reading \"404: Page Not Found\", plus a link that opens a broken-link issue.",
     "source_url": "https://nextra.site/docs/docs-theme/built-ins/not-found",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Nextra 4.5.0 added a copyPageButton layout prop that shows or hides the copy page content button, the closest thing Nextra has to a Markdown export.",
     "source_url": "https://raw.githubusercontent.com/shuding/nextra/main/packages/nextra/CHANGELOG.md",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Nextra 4.6.2 fixed Pagefind search for sites deployed under a Next.js basePath, where the index base URL had been hardcoded to '/'.",
     "source_url": "https://raw.githubusercontent.com/shuding/nextra/main/packages/nextra/CHANGELOG.md",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Nextra's Ask AI guide adds Inkeep's chat component, which needs an Inkeep API key in NEXT_PUBLIC_INKEEP_API_KEY.",
     "source_url": "https://nextra.site/docs/guide/search/ai",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Nextra was started in 2020 by Vercel members Shu Ding and Paco Coursey; Dimitri Postolov of The Guild now maintains it.",
     "source_url": "https://nextra.site/about",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "nextra.site returned a 404 HTML page for /llms.txt and for /robots.txt on 2026-11-05, while /sitemap.xml answered 200 with application/xml.",
     "source_url": "https://nextra.site/docs",
     "read_date": "2026-11-05",
     "kind": "observed"
    },
    {
     "claim": "Asked for /docs with Accept: text/markdown on 2026-11-05, nextra.site sent 235,336 bytes of HTML whose Vary header named only rsc and next-router fields.",
     "source_url": "https://nextra.site/docs",
     "read_date": "2026-11-05",
     "kind": "observed"
    }
   ],
   "products": [
    {
     "name": "Nextra",
     "what": "Next.js framework with docs and blog themes for MDX content.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://raw.githubusercontent.com/shuding/nextra/main/LICENSE",
      "note": "MIT licence, free"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No statement found in the Nextra introduction, search, static exports, Ask AI and about pages or the nextra package changelog; nextra.site/llms.txt returned 404 on 2026-11-05."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the Nextra guides read; nextra.site answered Accept: text/markdown with HTML."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No statement found beyond a copy page content button (copyPageButton prop, 4.5.0); nextra.site/docs.md returned 404."
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "Nextra relies on Next.js static rendering, which its docs call the default rendering strategy, and offers output: 'export' for fully static sites.",
     "source_url": "https://nextra.site/docs/guide/ssg"
    },
    {
     "id": "real-404",
     "status": "partial",
     "evidence": "Nextra documents a NotFoundPage component for app/not-found.jsx; the HTTP status comes from Next.js, and nextra.site returned 404 for a made-up path.",
     "source_url": "https://nextra.site/docs/docs-theme/built-ins/not-found"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found in the Nextra guides read; nextra.site sent Vary with rsc and next-router fields only."
    }
   ],
   "checks": {
    "domain": "nextra.site",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 407,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch"
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 145086,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "unavailable": "GET /api/score returned 404 DOMAIN_NOT_SCANNED"
    },
    "cloudflare": {
     "score": 7,
     "level": "L0 Not Ready",
     "scanned_at": "2026-11-05T13:58:36.556Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "Nextra has no llms.txt generator in its docs or changelog, and nextra.site serves no /llms.txt.",
    "Nextra's search is not indexed at build by default; a project must add the pagefind postbuild script or the search box finds nothing.",
    "Nextra has no built-in Ask AI; the guide wires a third-party Inkeep widget that needs its own API key."
   ],
   "does_not_do_basis": [
    null,
    null,
    {
     "fact": 8,
     "keep": "fact"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/nextra/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "fumadocs",
   "name": "Fumadocs",
   "type": "framework",
   "operator": "Fuma Nama (maintainer) and contributors",
   "homepage": "https://www.fumadocs.dev/",
   "one_line": "React docs framework for Next.js, React Router, TanStack Start, Waku and Astro; a CLI adds llms.txt, llms-full.txt, .md routes and an MCP route, and its docs give a proxy recipe for Accept: text/markdown with Vary: Accept.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Fumadocs runs on Next.js, React Router, TanStack Start, Waku and Astro, and new projects start from npm create fumadocs-app.",
     "source_url": "https://www.fumadocs.dev/docs",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Running npx @fumadocs/cli feature llms switches on processed Markdown for the docs collection, adds docsLlms to lib/source.ts and creates the LLM routes.",
     "source_url": "https://www.fumadocs.dev/docs/integrations/llms",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "In Fumadocs, llms.txt and llms-full.txt are app routes (app/llms.txt/route.ts and app/llms-full.txt/route.ts) returning docsLlms.index() and docsLlms.full().",
     "source_url": "https://www.fumadocs.dev/docs/integrations/llms",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Fumadocs maps /docs/<slug>.md to the route /llms.mdx/docs/<slug>/content.md through a Next.js rewrite and answers with Content-Type text/markdown.",
     "source_url": "https://www.fumadocs.dev/docs/integrations/llms",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "For Accept-based negotiation fumadocs-core/negotiation exports isMarkdownPreferred and rewritePath, used in a proxy.ts that rewrites docs requests to the Markdown route.",
     "source_url": "https://www.fumadocs.dev/docs/integrations/llms",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Fumadocs guide tells sites to send Vary: Accept on negotiated pages, and warns that Next.js discards Vary on App Router page responses, so the header belongs at the CDN.",
     "source_url": "https://www.fumadocs.dev/docs/integrations/llms",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Fumadocs leaves Astro out of Accept negotiation because Astro middleware runs only for on-request pages and docs pages are prerendered.",
     "source_url": "https://www.fumadocs.dev/docs/integrations/llms",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "npx @fumadocs/cli feature mcp adds an /api/mcp route on the streamable HTTP transport with tools to list, search and read docs pages.",
     "source_url": "https://www.fumadocs.dev/docs/integrations/llms",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Fumadocs configures ZBSearch out of the box, served from a server API endpoint or from a statically cached JSON file on static sites.",
     "source_url": "https://www.fumadocs.dev/docs/search/orama",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "A Fumadocs site on Next.js becomes plain static HTML with output: 'export', which needs no Node.js server.",
     "source_url": "https://www.fumadocs.dev/docs/deploying/static",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Fumadocs calls its model server-first, built on React Server Components rather than a classic static generator.",
     "source_url": "https://www.fumadocs.dev/docs/what-is-fumadocs",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "www.fumadocs.dev returned Markdown for /docs/what-is-fumadocs under Accept: text/markdown on 2026-11-05, but its Vary header listed rsc and next-router fields, not Accept; /docs with the same header still returned HTML.",
     "source_url": "https://www.fumadocs.dev/docs/integrations/llms",
     "read_date": "2026-11-05",
     "kind": "observed"
    },
    {
     "claim": "fumadocs.dev answers every path with a 308 to www.fumadocs.dev, where llms-full.txt measured 950,600 bytes on 2026-11-05.",
     "source_url": "https://www.fumadocs.dev/docs/integrations/llms",
     "read_date": "2026-11-05",
     "kind": "observed"
    },
    {
     "claim": "GitHub shows fumadocs-core 16.18.0, fumadocs-ui 16.18.0 and @fumadocs/base-ui 16.18.0 released together on 2026-11-05.",
     "source_url": "https://github.com/fuma-nama/fumadocs/releases",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Fumadocs (fumadocs-core, fumadocs-ui, fumadocs-mdx)",
     "what": "Headless docs core, default UI and MDX content source for React frameworks.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://raw.githubusercontent.com/fuma-nama/fumadocs/dev/LICENSE",
      "note": "MIT licence, free"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "Fumadocs creates llms.txt and llms-full.txt routes after npx @fumadocs/cli feature llms; they are not present until that step.",
     "source_url": "https://www.fumadocs.dev/docs/integrations/llms"
    },
    {
     "id": "markdown-negotiation",
     "status": "partial",
     "evidence": "Fumadocs documents a proxy.ts with isMarkdownPreferred for Next.js, React Router and TanStack Start, and leaves Astro out.",
     "source_url": "https://www.fumadocs.dev/docs/integrations/llms"
    },
    {
     "id": "markdown-twin",
     "status": "partial",
     "evidence": "A rewrite of /docs/:slug*.md to /llms.mdx/docs/:slug*/content.md gives each page a Markdown URL once the LLM feature is added.",
     "source_url": "https://www.fumadocs.dev/docs/integrations/llms"
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "Fumadocs renders through React Server Components and keeps the host framework's static site generation.",
     "source_url": "https://www.fumadocs.dev/docs/what-is-fumadocs"
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "No statement found in the Fumadocs quick start, static build or AI pages; www.fumadocs.dev returned 404 for a made-up path on 2026-11-05."
    },
    {
     "id": "vary-accept",
     "status": "partial",
     "evidence": "Fumadocs says the negotiated response needs Vary: Accept but that Next.js drops Vary on App Router pages, so it must be set at the CDN.",
     "source_url": "https://www.fumadocs.dev/docs/integrations/llms"
    }
   ],
   "checks": {
    "domain": "fumadocs.dev",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 1762,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 16878,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 57,
     "grade": "C",
     "scanned_at": "2026-10-06T14:09:55.875+00:00",
     "via": "GET https://ora.ai/api/score/fumadocs.dev (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 27,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T13:58:46.805Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "Fumadocs does not create llms.txt or .md routes in a fresh project until npx @fumadocs/cli feature llms is run or the routes are written by hand.",
    "On Next.js, Fumadocs cannot attach Vary: Accept to App Router page responses; its docs push that header to the CDN.",
    "Fumadocs offers no Accept negotiation recipe for Astro, where prerendered docs pages bypass middleware."
   ],
   "does_not_do_basis": [
    {
     "fact": 1,
     "keep": "fact"
    },
    {
     "fact": 5,
     "keep": "limit"
    },
    {
     "fact": 6,
     "keep": "fact"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/fumadocs/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "zensical",
   "name": "Zensical (and Material for MkDocs)",
   "type": "framework",
   "operator": "Zensical LLC",
   "homepage": "https://zensical.org/",
   "one_line": "Rust-based static site generator from the Material for MkDocs team that builds mkdocs.yml projects to static HTML, writes llms.txt plus Markdown copies through its llmstxt plugin support, and replaces Material for MkDocs (end of life 2027-05-05).",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "The Material for MkDocs team announced Zensical on 2025-11-05 as its own static site generator, built to get past the technical limits of MkDocs.",
     "source_url": "https://squidfunk.github.io/mkdocs-material/blog/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-11-05"
    },
    {
     "claim": "Zensical's team page says the stack is written from first principles in Rust by the people behind Material for MkDocs and mkdocstrings.",
     "source_url": "https://zensical.org/about/team/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "zensical build writes a self-contained static site from Markdown that needs no database or server and can sit on GitHub Pages or any CDN.",
     "source_url": "https://zensical.org/docs/create-your-site/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Zensical reads an existing mkdocs.yml, keeps the standard MkDocs project layout and recognizes the configuration of supported MkDocs plugins.",
     "source_url": "https://zensical.org/docs/compatibility/mkdocs/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Since Zensical 0.0.67 the mkdocs-llmstxt plugin configuration is handled natively, and the build writes an llms.txt index and Markdown copies of the pages named in the required sections setting.",
     "source_url": "https://zensical.org/docs/compatibility/mkdocs/plugins/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Zensical's llmstxt support ignores the plugin's Python preprocess hook, and full_output (an optional llms-full style file) must be a relative path inside site_dir.",
     "source_url": "https://zensical.org/docs/compatibility/mkdocs/plugins/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Adding content.action.copy to the Zensical theme features shows a Copy as Markdown button on every page that has a Markdown copy.",
     "source_url": "https://zensical.org/docs/compatibility/mkdocs/plugins/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Zensical's roadmap lists the MkDocs llmstxt plugin replacement under Now available, described as publishing an llms.txt index and Markdown exports.",
     "source_url": "https://zensical.org/roadmap/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Zensical ships its own client-side search engine, on by default and usable offline, which the team plans to release as a standalone open source project in 2026.",
     "source_url": "https://zensical.org/docs/setup/search/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Zensical's site_url setting holds the canonical URL written into each page's HTML header and should be set unless the build is meant for offline use.",
     "source_url": "https://zensical.org/docs/setup/basics/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Zensical 0.0.74, released on GitHub on 2026-10-30, added support for the optimize plugin and fixed llms.txt output so images with URLs survive.",
     "source_url": "https://github.com/zensical/zensical/releases/tag/v0.0.74",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-30"
    },
    {
     "claim": "Material for MkDocs 9.8.0, released on 2026-10-24, states the theme reaches end of life on 2027-05-05, with only critical fixes and security updates until then.",
     "source_url": "https://github.com/squidfunk/mkdocs-material/releases/tag/9.8.0",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-24"
    },
    {
     "claim": "Material for MkDocs entered maintenance mode on 2025-11-11 with 9.7.0, which opened every former Insiders feature to all users.",
     "source_url": "https://squidfunk.github.io/mkdocs-material/blog/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-11-11"
    },
    {
     "claim": "Zensical Studio editions launched on 2026-11-05 at standard prices; Studio is free, Studio Pro costs 19 USD a month or 179 USD a year, and Studio Team costs 39 USD per seat a month.",
     "source_url": "https://zensical.org/studio/pricing/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Zensical Spark for organizations costs 399 USD a month or 3,999 USD a year with a two-business-day initial-response SLA; Spark Private starts at 7,499 USD a year.",
     "source_url": "https://zensical.org/spark/pricing/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "zensical.org served /docs/llms.txt (4,109 bytes) and a text/markdown copy at /docs/get-started/index.md on 2026-11-05, but answered Accept: text/markdown on the page URL with HTML and no Vary header.",
     "source_url": "https://zensical.org/docs/compatibility/mkdocs/plugins/",
     "read_date": "2026-11-05",
     "kind": "observed"
    },
    {
     "claim": "A made-up path on zensical.org first got a 302 to the same path with a trailing slash and only then a 404 on 2026-11-05; /llms.txt at the site root redirected the same way.",
     "source_url": "https://zensical.org/docs/publish-your-site/",
     "read_date": "2026-11-05",
     "kind": "observed"
    }
   ],
   "products": [
    {
     "name": "Zensical",
     "what": "Static site generator compatible with MkDocs and Material for MkDocs projects.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://zensical.org/license/",
      "note": "MIT licence, free; version 0.0.74 on 2026-10-30"
     }
    },
    {
     "name": "Material for MkDocs",
     "what": "MkDocs theme in maintenance mode until end of life on 2027-05-05.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://github.com/squidfunk/mkdocs-material/releases/tag/9.8.0",
      "note": "MIT licence, free; 9.8.0 on 2026-10-24"
     }
    },
    {
     "name": "Zensical Studio Pro",
     "what": "VS Code authoring environment with project-wide refactoring for Zensical and MkDocs projects.",
     "pricing": {
      "model": "subscription",
      "from": 19,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://zensical.org/studio/pricing/",
      "note": "per month, or 179 USD a year; Studio is free and Studio Team is 39 USD per seat a month"
     }
    },
    {
     "name": "Zensical Spark",
     "what": "Paid membership with direct support and early access for organizations.",
     "pricing": {
      "model": "subscription",
      "from": 399,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://zensical.org/spark/pricing/",
      "note": "Spark for organizations per month plus tax; Spark Community for individuals is 9 USD a month"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "Zensical generates llms.txt when the mkdocs-llmstxt plugin configuration, including its required sections list, is present.",
     "source_url": "https://zensical.org/docs/compatibility/mkdocs/plugins/"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the Zensical create, publish, basics, search and plugin compatibility pages; zensical.org returned HTML to Accept: text/markdown."
    },
    {
     "id": "markdown-twin",
     "status": "partial",
     "evidence": "The llmstxt support writes Markdown copies of the selected pages only.",
     "source_url": "https://zensical.org/docs/compatibility/mkdocs/plugins/"
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "zensical build writes a static site from Markdown files that is completely self-contained.",
     "source_url": "https://zensical.org/docs/create-your-site/"
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "No statement found in the Zensical docs pages read; zensical.org/docs/ returned 404 for a made-up path while the site root first redirected with 302."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found in the Zensical docs pages read; zensical.org sent no Vary header."
    }
   ],
   "checks": {
    "domain": "zensical.org",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 52,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": null
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 37153,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 302,
      "location": "https://zensical.org/agent-ready-check-je4acgr5/",
      "final_status": 404
     }
    },
    "ora": {
     "score": 35,
     "grade": "D",
     "scanned_at": "2026-05-06T16:25:08.825+00:00",
     "via": "GET https://ora.ai/api/score/zensical.org (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 7,
     "level": "L0 Not Ready",
     "scanned_at": "2026-11-05T13:58:58.893Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "Zensical writes no llms.txt for a project that lacks the llmstxt plugin block and its sections list.",
    "Zensical's Markdown copies cover only the pages chosen for llms.txt, not every page of the site.",
    "Material for MkDocs gets no new features after 9.7.0; only critical and security fixes continue until 2027-05-05."
   ],
   "does_not_do_basis": [
    {
     "fact": 4,
     "keep": "limit"
    },
    {
     "fact": 6,
     "keep": "both"
    },
    {
     "fact": 11,
     "keep": "fact"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/zensical/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "sphinx",
   "name": "Sphinx",
   "type": "framework",
   "operator": "Sphinx team (sphinx-doc)",
   "homepage": "https://www.sphinx-doc.org/",
   "one_line": "Python documentation generator whose html builders write a static HTML file per page and copy page sources into _sources/; llms.txt, 404 pages and sitemaps come from third-party extensions.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Sphinx's standard html builder writes a directory of HTML files with style sheets and, optionally, the reStructuredText sources.",
     "source_url": "https://www.sphinx-doc.org/en/master/usage/builders/index.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Sphinx's dirhtml builder writes each page as <name>/index.html, so links read like markup/rest/ without the file name.",
     "source_url": "https://www.sphinx-doc.org/en/master/usage/builders/index.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Sphinx's built-in text builder writes one plain text file per reStructuredText file with much of the markup stripped; Sphinx core lists no Markdown builder.",
     "source_url": "https://www.sphinx-doc.org/en/master/usage/builders/index.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "html_copy_source defaults to True, so Sphinx copies each page's source into _sources/ with a .txt suffix, a plain source twin rather than rendered Markdown.",
     "source_url": "https://www.sphinx-doc.org/en/master/usage/configuration.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Sphinx's html_baseurl, empty by default and added in 1.8, sets the documentation root used for the canonical link relation.",
     "source_url": "https://www.sphinx-doc.org/en/master/usage/configuration.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Sphinx 9.2.0, released on 2026-10-20, dropped Python 3.12 and added support for Docutils 0.23.",
     "source_url": "https://www.sphinx-doc.org/en/master/changes/index.html",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-20"
    },
    {
     "claim": "Sphinx lists HTML, LaTeX for PDF, ePub and Texinfo among its output formats, with authoring in reStructuredText or MyST Markdown.",
     "source_url": "https://www.sphinx-doc.org/en/master/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The community extension sphinx-llms-txt writes llms.txt in Markdown and a combined llms-full.txt in reStructuredText during a normal Sphinx build once added to conf.py.",
     "source_url": "https://sphinx-llms-txt.readthedocs.io/en/latest/",
     "read_date": "2026-11-05",
     "kind": "secondary"
    },
    {
     "claim": "The sphinx-llms-txt docs point readers to sphinx-llm from NVIDIA for stronger default output without configuration.",
     "source_url": "https://sphinx-llms-txt.readthedocs.io/en/latest/",
     "read_date": "2026-11-05",
     "kind": "secondary"
    },
    {
     "claim": "Sphinx makes no 404 page of its own; Read the Docs' sphinx-notfound-page extension builds one whose CSS, JS and image links still resolve on deep URLs.",
     "source_url": "https://sphinx-notfound-page.readthedocs.io/en/latest/",
     "read_date": "2026-11-05",
     "kind": "secondary"
    },
    {
     "claim": "Sitemaps for Sphinx come from the third-party sphinx-sitemap extension, which writes sitemaps.org files across versions and languages.",
     "source_url": "https://sphinx-sitemap.readthedocs.io/en/latest/",
     "read_date": "2026-11-05",
     "kind": "secondary"
    },
    {
     "claim": "www.sphinx-doc.org, built by Sphinx and hosted on Read the Docs, answered Accept: text/markdown on the quickstart page with text/markdown and Vary: Accept-Encoding, accept on 2026-11-05; x-rtd headers show Read the Docs produced that variant.",
     "source_url": "https://www.sphinx-doc.org/en/master/usage/builders/index.html",
     "read_date": "2026-11-05",
     "kind": "observed"
    },
    {
     "claim": "The quickstart source copy at /en/master/_sources/usage/quickstart.rst.txt on www.sphinx-doc.org answered 200 text/plain on 2026-11-05, while /llms.txt on the same host was a 404.",
     "source_url": "https://www.sphinx-doc.org/en/master/usage/configuration.html",
     "read_date": "2026-11-05",
     "kind": "observed"
    },
    {
     "claim": "Sphinx code is licensed under the two-clause BSD licence, copyright 2007-2026 the Sphinx team.",
     "source_url": "https://raw.githubusercontent.com/sphinx-doc/sphinx/master/LICENSE.rst",
     "read_date": "2026-11-05",
     "kind": "primary"
    }
   ],
   "products": [
    {
     "name": "Sphinx",
     "what": "Python documentation generator with HTML, LaTeX, ePub and text builders.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://raw.githubusercontent.com/sphinx-doc/sphinx/master/LICENSE.rst",
      "note": "BSD 2-clause licence, free; 9.2.0 on 2026-10-20"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "Only through the third-party sphinx-llms-txt extension (or NVIDIA's sphinx-llm); Sphinx itself writes no llms.txt.",
     "source_url": "https://sphinx-llms-txt.readthedocs.io/en/latest/"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the Sphinx builders or configuration pages; the Markdown answer seen on www.sphinx-doc.org comes from Read the Docs hosting."
    },
    {
     "id": "markdown-twin",
     "status": "partial",
     "evidence": "html_copy_source puts each page's source under _sources/ as .txt, which is Markdown only when the project is written in MyST.",
     "source_url": "https://www.sphinx-doc.org/en/master/usage/configuration.html"
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "The standard html builder outputs a directory of HTML files.",
     "source_url": "https://www.sphinx-doc.org/en/master/usage/builders/index.html"
    },
    {
     "id": "real-404",
     "status": "partial",
     "evidence": "Sphinx creates no 404 page by default; the sphinx-notfound-page extension adds one, and the status code depends on the host.",
     "source_url": "https://sphinx-notfound-page.readthedocs.io/en/latest/"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found in the Sphinx builders, configuration or changelog pages; Sphinx outputs files and sets no headers."
    }
   ],
   "checks": {
    "domain": "sphinx-doc.org",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 777,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "Accept-Encoding, accept"
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 2353,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "unavailable": "GET /api/score returned 404 DOMAIN_NOT_SCANNED"
    },
    "cloudflare": {
     "score": 27,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T13:59:21.177Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 8556,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 780,
     "js_shell": false,
     "jsonld_types": [],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": true,
     "missing_path_status": 404,
     "llms_txt_valid": false,
     "llms_txt_bytes": 2353,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Sphinx core has no Markdown output builder; its text builder strips markup to plain text instead.",
    "Sphinx does not write a 404.html, a sitemap.xml or an llms.txt without extensions such as sphinx-notfound-page, sphinx-sitemap and sphinx-llms-txt.",
    "The Markdown that www.sphinx-doc.org returns to Accept: text/markdown is produced by Read the Docs, not by a Sphinx setting."
   ],
   "does_not_do_basis": [
    {
     "fact": 2,
     "keep": "fact"
    },
    null,
    {
     "fact": 11,
     "keep": "fact"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/sphinx/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "rspress",
   "name": "Rspress",
   "type": "framework",
   "operator": "ByteDance (web-infra-dev team)",
   "homepage": "https://rspress.rs/",
   "one_line": "Rsbuild and React static site generator that pre-renders every page to HTML and, since 2.1.0, writes llms.txt, llms-full.txt, a .md twin per page, sitemap.xml and 404.html by default; Accept: text/markdown needs a host rewrite.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Rspress pre-renders each page into an HTML file with full content during rspress build; ssg: false switches to client rendering with an empty page container.",
     "source_url": "https://rspress.rs/guide/basic/ssg",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Rspress 2.1.0, announced on 2026-11-02, turns SSG-MD on by default, so production builds write llms.txt, llms-full.txt and a .md file beside each HTML page without llms: true.",
     "source_url": "https://rspress.rs/blog/rspress-v2-1",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-02"
    },
    {
     "claim": "Rspress SSG-MD renders MDX and React components straight to Markdown with a renderToMarkdownString method instead of converting finished HTML.",
     "source_url": "https://rspress.rs/blog/agent-friendly-website",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Rspress 2.1.0 writes sitemap.xml on every production build and takes siteOrigin plus base for absolute URLs, replacing @rspress/plugin-sitemap.",
     "source_url": "https://rspress.rs/blog/rspress-v2-1",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Rspress 2.1.0 changed route.cleanUrls to true, so links drop .html and the host has to serve /foo.html when /foo is requested.",
     "source_url": "https://rspress.rs/blog/rspress-v2-1",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Rspress's injectLlmsHint, on by default with SSG-MD, places visually hidden plain text near the top of each HTML page that points agents to /llms.txt and the page's Markdown URL.",
     "source_url": "https://rspress.rs/blog/agent-friendly-website",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Rspress has no server of its own to pick HTML or Markdown by Accept header; rspress.rs relies on a Cloudflare rewrite that sends Accept: text/markdown requests to the .md file.",
     "source_url": "https://rspress.rs/blog/agent-friendly-website",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Rspress 2.1.0 exposes six WebMCP tools by default, among them get_page, search_docs and navigate, for agents running in the browser.",
     "source_url": "https://rspress.rs/blog/rspress-v2-1",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "@rspress/plugin-llms is kept only as a fallback for sites whose code cannot run under SSR, so SSG and SSG-MD stay off.",
     "source_url": "https://rspress.rs/plugin/official-plugins/llms",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Rspress 2.0, announced on 2026-01-30, introduced built-in llms.txt generation and SSG-MD alongside a new default theme.",
     "source_url": "https://rspress.rs/blog/rspress-v2",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-01-30"
    },
    {
     "claim": "Rspress says its own website scored 100/100 in the AFDocs agent-friendly documentation evaluation.",
     "source_url": "https://rspress.rs/blog/rspress-v2-1",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "A default Rspress project (npm create rspress@2.1.0 -- --dir rspress-test --template basic --no-git; npm install; npm run build with @rspress/core 2.1.0) on 2026-11-05 wrote llms.txt, llms-full.txt, index.md, sitemap.xml and 404.html with no added config.",
     "source_url": "https://rspress.rs/guide/basic/ssg-md",
     "read_date": "2026-11-05",
     "kind": "observed"
    },
    {
     "claim": "Each .md file in that Rspress 2.1.0 build opened with a blockquote naming /llms.txt and /llms-full.txt, and sitemap.xml held relative loc values such as /api/commands because siteOrigin was unset.",
     "source_url": "https://rspress.rs/guide/basic/ssg-md",
     "read_date": "2026-11-05",
     "kind": "observed"
    },
    {
     "claim": "Under rspress preview the same build answered Accept: text/markdown on / with HTML, served the home page with status 200 for a made-up path, and put the hero title in a span with no H1.",
     "source_url": "https://rspress.rs/guide/basic/ssg",
     "read_date": "2026-11-05",
     "kind": "observed"
    },
    {
     "claim": "rspress.rs returned text/markdown for Accept: text/markdown on /guide/start/introduction on 2026-11-05 but sent no Vary header with it.",
     "source_url": "https://rspress.rs/blog/agent-friendly-website",
     "read_date": "2026-11-05",
     "kind": "observed"
    },
    {
     "claim": "Rspress is released under the MIT License, copyright Bytedance, Inc. and its affiliates.",
     "source_url": "https://raw.githubusercontent.com/web-infra-dev/rspress/main/LICENSE",
     "read_date": "2026-11-05",
     "kind": "primary"
    }
   ],
   "products": [
    {
     "name": "Rspress",
     "what": "Static site generator for documentation built on Rsbuild and React.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://raw.githubusercontent.com/web-infra-dev/rspress/main/LICENSE",
      "note": "MIT licence, free; @rspress/core 2.1.0"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "supports",
     "evidence": "Since 2.1.0 SSG-MD is on by default and production builds write llms.txt and llms-full.txt.",
     "source_url": "https://rspress.rs/blog/rspress-v2-1"
    },
    {
     "id": "markdown-negotiation",
     "status": "partial",
     "evidence": "Rspress says it has no server to choose Markdown by Accept header; the host needs a rewrite rule, as rspress.rs does on Cloudflare.",
     "source_url": "https://rspress.rs/blog/agent-friendly-website"
    },
    {
     "id": "markdown-twin",
     "status": "supports",
     "evidence": "Production builds write a .md file next to each HTML page (getting-started.html and getting-started.md).",
     "source_url": "https://rspress.rs/blog/rspress-v2-1"
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "Rspress enables SSG by default and pre-renders each page into an HTML file with complete content.",
     "source_url": "https://rspress.rs/guide/basic/ssg"
    },
    {
     "id": "real-404",
     "status": "supports",
     "evidence": "The SSG output listing includes 404.html, and rspress.rs returned 404 for a made-up path; rspress preview, by contrast, served the home page with 200.",
     "source_url": "https://rspress.rs/guide/basic/ssg"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found in the agent-friendly website post or the 2.1.0 announcement; rspress.rs sent no Vary header with its Markdown responses on 2026-11-05."
    }
   ],
   "checks": {
    "domain": "rspress.rs",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 708,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "accept-encoding"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 19291,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 45,
     "grade": "D",
     "scanned_at": "2026-08-24T03:17:01.102+00:00",
     "via": "GET https://ora.ai/api/score/rspress.rs (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L0 Not Ready",
     "scanned_at": "2026-11-05T13:59:30.172Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "Rspress cannot answer Accept: text/markdown by itself; the hosting layer has to rewrite those requests to the .md file.",
    "Rspress builds without siteOrigin write sitemap.xml with relative loc paths, which sitemap consumers expect as absolute URLs.",
    "The rspress preview server does not mirror production 404 handling and served the home page with 200 for a missing path."
   ],
   "does_not_do_basis": [
    {
     "fact": 6,
     "keep": "fact"
    },
    {
     "fact": 12,
     "keep": "both"
    },
    {
     "fact": 13,
     "keep": "fact"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/rspress/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "docus",
   "name": "Docus",
   "type": "framework",
   "homepage": "https://docus.dev/",
   "one_line": "Nuxt documentation theme that ships llms.txt and llms-full.txt through nuxt-llms, a .md twin and /raw/ Markdown for every page, Accept: text/markdown negotiation with Vary: Accept, User-Agent, Markdown 404s for agents, JSON-LD and an MCP server.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Docus is a Nuxt documentation theme built with Nuxt UI and Nuxt Content, and new projects start from npx create-docus my-docs.",
     "source_url": "https://docus.dev/en/getting-started/introduction",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Docus includes the nuxt-llms module by default, which generates and pre-renders /llms.txt and /llms-full.txt from every documentation page.",
     "source_url": "https://docus.dev/en/ai/llms",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Docus switches a page to Markdown when the URL ends in .md, when the Accept header prefers text/markdown over text/html, or when the User-Agent is a known AI crawler such as ClaudeBot or GPTBot.",
     "source_url": "https://docus.dev/en/ai/llms",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Every Docus response that can be HTML or Markdown carries Vary: Accept, User-Agent so a CDN never hands the wrong variant to a browser or an agent.",
     "source_url": "https://docus.dev/en/ai/llms",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Docus negotiation runs in a Nitro middleware and, on Vercel, at the edge; on other hosts a prerendered page stays HTML and agents reach its Markdown through the .md URL.",
     "source_url": "https://docus.dev/en/ai/llms",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Docus serves source Markdown at /raw/<content-path>.md with text/markdown and a Link header back to the HTML page, and rewrites llms.txt links to those raw files.",
     "source_url": "https://docus.dev/en/ai/llms",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "For agent requests to missing pages Docus keeps the 404 status but returns a short Markdown document listing llms.txt, the MCP endpoint and other entry points; requests accepting text/html still get the theme error page.",
     "source_url": "https://docus.dev/en/ai/llms",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Docus emits JSON-LD through nuxt-schema-org, with WebSite and WebPage on every page and TechArticle and BreadcrumbList on documentation pages.",
     "source_url": "https://docus.dev/en/concepts/configuration",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Docus generates /sitemap.xml with @nuxtjs/sitemap and turns it into a sitemap index with one sitemap per locale on multilingual sites.",
     "source_url": "https://docus.dev/en/concepts/configuration",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Each Docus site exposes an MCP server at the /mcp path of its documentation URL.",
     "source_url": "https://docus.dev/en/ai/mcp",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Docus v5.15.0, released on GitHub on 2026-10-14, lazy-loads components and tree-shakes schema.org composables out of the client bundle.",
     "source_url": "https://github.com/nuxt-content/docus/releases",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-14"
    },
    {
     "claim": "docus.dev answered Accept: text/markdown on /en/getting-started/installation with 2,209 bytes of text/markdown and Vary: Accept, User-Agent on 2026-11-05.",
     "source_url": "https://docus.dev/en/ai/llms",
     "read_date": "2026-11-05",
     "kind": "observed"
    },
    {
     "claim": "With curl's default Accept, a made-up docus.dev path returned status 404 with a 1,236-byte Markdown body on 2026-11-05; the same kind of path requested with Accept: text/html returned a 404 HTML page.",
     "source_url": "https://docus.dev/en/ai/llms",
     "read_date": "2026-11-05",
     "kind": "observed"
    }
   ],
   "products": [
    {
     "name": "Docus",
     "what": "Nuxt layer and theme for Markdown documentation sites.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://raw.githubusercontent.com/nuxt-content/docus/main/LICENSE",
      "note": "MIT licence, free; v5.15.0 on 2026-10-14"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "supports",
     "evidence": "Docus integrates nuxt-llms by default and generates and pre-renders /llms.txt and /llms-full.txt.",
     "source_url": "https://docus.dev/en/ai/llms"
    },
    {
     "id": "markdown-negotiation",
     "status": "partial",
     "evidence": "Docus negotiates on the page URL through a Nitro middleware, but outside Vercel prerendered pages stay HTML and agents need the .md URL.",
     "source_url": "https://docus.dev/en/ai/llms"
    },
    {
     "id": "markdown-twin",
     "status": "supports",
     "evidence": "Every page has a markdown twin by default at the page URL plus .md, backed by /raw/<path>.md.",
     "source_url": "https://docus.dev/en/ai/llms"
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "Docus pages are prerendered; its docs describe prerendered pages being served ahead of the middleware.",
     "source_url": "https://docus.dev/en/ai/llms"
    },
    {
     "id": "real-404",
     "status": "supports",
     "evidence": "Docus keeps the 404 status on missing pages, as Markdown for agents and as the theme error page for browsers.",
     "source_url": "https://docus.dev/en/ai/llms"
    },
    {
     "id": "vary-accept",
     "status": "supports",
     "evidence": "Docus sends Vary: Accept, User-Agent on every response that negotiates.",
     "source_url": "https://docus.dev/en/ai/llms"
    }
   ],
   "checks": {
    "domain": "docus.dev",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 458,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "Accept, User-Agent"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 8642,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 55,
     "grade": "C",
     "scanned_at": "2026-09-15T09:26:23.953+00:00",
     "via": "GET https://ora.ai/api/score/docus.dev (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 53,
     "level": "L5 Agent-Native",
     "scanned_at": "2026-11-05T13:59:47.111Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "Docus does not negotiate prerendered pages outside Vercel; on other hosts the same URL stays HTML and agents must use the .md twin.",
    "Docus does not send its Markdown 404 to browsers or JSON clients; requests accepting text/html or application/json keep the regular error responses."
   ],
   "does_not_do_basis": [
    {
     "fact": 4,
     "keep": "fact"
    },
    {
     "fact": 6,
     "keep": "limit"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/docus/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "mkdocs",
   "name": "MkDocs",
   "type": "framework",
   "homepage": "https://www.mkdocs.org/",
   "one_line": "Python static site generator that turns Markdown and one mkdocs.yml into HTML pages with a 404.html and a compressed sitemap; no llms.txt or Markdown output is documented, and the newest 1.x release dates from 2024-08-30.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "MkDocs builds a static documentation site from Markdown source files configured by a single YAML file.",
     "source_url": "https://www.mkdocs.org/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Every MkDocs build includes a 404.html in the build directory.",
     "source_url": "https://www.mkdocs.org/user-guide/deploying-your-docs/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "MkDocs warns that GitHub Pages picks up its 404.html automatically only on a custom domain, and other servers need their own configuration to use it.",
     "source_url": "https://www.mkdocs.org/user-guide/deploying-your-docs/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "MkDocs's site_url, null by default, adds a canonical link tag to the head of each HTML page.",
     "source_url": "https://www.mkdocs.org/user-guide/configuration/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "use_directory_urls defaults to true in MkDocs, so a page such as about.md is published as about/index.html with a trailing-slash URL.",
     "source_url": "https://www.mkdocs.org/user-guide/configuration/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "MkDocs turns on its bundled search plugin by default, but any plugins list in mkdocs.yml replaces the defaults, so search must be listed again.",
     "source_url": "https://www.mkdocs.org/user-guide/configuration/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "MkDocs 1.6.0 (2024-04-20) made sitemap.xml.gz change at most once per day instead of on every build.",
     "source_url": "https://www.mkdocs.org/about/release-notes/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2024-04-20"
    },
    {
     "claim": "The MkDocs release notes still list 1.6.1 of 2024-08-30 as the newest version on 2026-11-05.",
     "source_url": "https://www.mkdocs.org/about/release-notes/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2024-08-30"
    },
    {
     "claim": "The Material for MkDocs team wrote on 2026-02-18 that MkDocs 1.x is unmaintained, with no releases in the 18 months before, and that MkDocs 2.0 was still a pre-release.",
     "source_url": "https://squidfunk.github.io/mkdocs-material/blog/",
     "read_date": "2026-11-05",
     "kind": "secondary",
     "fact_date": "2026-02-18"
    },
    {
     "claim": "MkDocs is distributed under a BSD licence, copyright 2014 Tom Christie.",
     "source_url": "https://www.mkdocs.org/about/license/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "www.mkdocs.org returned a 404 HTML page for /llms.txt on 2026-11-05 while /sitemap.xml and /sitemap.xml.gz both answered 200.",
     "source_url": "https://www.mkdocs.org/user-guide/configuration/",
     "read_date": "2026-11-05",
     "kind": "observed"
    },
    {
     "claim": "Requested with Accept: text/markdown on 2026-11-05, the MkDocs configuration page on www.mkdocs.org still came back as 72,736 bytes of HTML.",
     "source_url": "https://www.mkdocs.org/user-guide/configuration/",
     "read_date": "2026-11-05",
     "kind": "observed"
    }
   ],
   "products": [
    {
     "name": "MkDocs",
     "what": "Static site generator for project documentation written in Markdown.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.mkdocs.org/about/license/",
      "note": "BSD licence, free; 1.6.1 is the newest release listed"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No statement found in the MkDocs configuration, deploying and release notes pages; www.mkdocs.org/llms.txt returned 404, and llms.txt comes only from third-party plugins such as mkdocs-llmstxt."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the MkDocs user guide pages read; the configuration page answered Accept: text/markdown with HTML."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No statement found in the MkDocs configuration reference or release notes about publishing Markdown copies of pages."
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "MkDocs describes itself as a static site generator whose build writes HTML pages from Markdown.",
     "source_url": "https://www.mkdocs.org/"
    },
    {
     "id": "real-404",
     "status": "supports",
     "evidence": "MkDocs includes a 404.html in every build; whether a host serves it depends on the host, per the deploying guide.",
     "source_url": "https://www.mkdocs.org/user-guide/deploying-your-docs/"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found in the MkDocs deploying or configuration pages; MkDocs writes files and sets no response headers."
    }
   ],
   "checks": {
    "domain": "mkdocs.org",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 276,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding"
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 9998,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "unavailable": "GET /api/score returned 404 DOMAIN_NOT_SCANNED"
    },
    "cloudflare": {
     "unavailable": "scanner could not fetch the site: HTTP 526 <none>"
    }
   },
   "does_not_do": [
    "MkDocs core generates no llms.txt and no per-page Markdown copy; projects add the third-party mkdocs-llmstxt plugin for that.",
    "MkDocs cannot make every host serve its 404.html; GitHub Pages uses it automatically only on a custom domain.",
    "MkDocs has shipped no release since 1.6.1 on 2024-08-30, according to its own release notes."
   ],
   "does_not_do_basis": [
    null,
    {
     "fact": 2,
     "keep": "fact"
    },
    {
     "fact": 7,
     "keep": "fact"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/mkdocs/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "writerside",
   "name": "Writerside",
   "type": "framework",
   "operator": "JetBrains",
   "homepage": "https://www.jetbrains.com/writerside/",
   "one_line": "JetBrains documentation authoring tool, now a free IDE plugin, whose builder publishes help websites; buildprofiles.xml switches on llms.txt with .html.md Markdown copies and a sitemap, and instances stay out of search indexes unless allowed.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "JetBrains retired the standalone Writerside IDE on 2025-03-20; Writerside lives on as a free plugin for JetBrains IDEs.",
     "source_url": "https://blog.jetbrains.com/writerside/2025/03/sunsetting-writerside-ide/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-03-20"
    },
    {
     "claim": "JetBrains launched the Writerside Early Access Program in October 2023, built on the IntelliJ Platform.",
     "source_url": "https://blog.jetbrains.com/writerside/2025/03/sunsetting-writerside-ide/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "JetBrains says it has no plans to open-source the Writerside IDE, so unlike most tools in this group Writerside is free but closed source.",
     "source_url": "https://www.jetbrains.com/writerside/",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "Writerside can generate an llms.txt listing every topic in a help instance, each linked to a .html.md Markdown version of the topic.",
     "source_url": "https://www.jetbrains.com/help/writerside/generate-llms-txt.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "With llms.txt switched on through <llms-txt>true</llms-txt> in buildprofiles.xml, Writerside adds references to llms.txt and the page's Markdown version to every HTML head.",
     "source_url": "https://www.jetbrains.com/help/writerside/generate-llms-txt.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Writerside also lists /llms.txt as a <url> entry in sitemap.xml once the feature is enabled.",
     "source_url": "https://www.jetbrains.com/help/writerside/generate-llms-txt.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Writerside writes no sitemap by default; a <sitemap> tag in buildprofiles.xml, with optional priority and change-frequency, turns it on.",
     "source_url": "https://www.jetbrains.com/help/writerside/generate-sitemap.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Writerside keeps published content out of search engines unless the noindex-content variable is set to false or Allow search engine indexing is ticked for the instance.",
     "source_url": "https://www.jetbrains.com/help/writerside/allow-search-engine-indexing.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Writerside builds help websites with its bundled builder locally or with a Docker image of the builder in CI.",
     "source_url": "https://www.jetbrains.com/help/writerside/build-and-publish.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Writerside help site on jetbrains.com redirected /llms.txt with a 302 to /llms.txt/ on 2026-11-05, where a 9,328-byte text/plain index answered.",
     "source_url": "https://www.jetbrains.com/help/writerside/generate-llms-txt.html",
     "read_date": "2026-11-05",
     "kind": "observed"
    },
    {
     "claim": "After the same trailing-slash redirect, the Writerside help page getting-started.html.md/ was served on 2026-11-05 with the content type */* rather than text/markdown.",
     "source_url": "https://www.jetbrains.com/help/writerside/generate-llms-txt.html",
     "read_date": "2026-11-05",
     "kind": "observed"
    },
    {
     "claim": "Asked for getting-started.html with Accept: text/markdown on 2026-11-05, the Writerside help site sent 24,116 bytes of HTML whose H1 Getting started was already in the markup.",
     "source_url": "https://www.jetbrains.com/help/writerside/generate-llms-txt.html",
     "read_date": "2026-11-05",
     "kind": "observed"
    }
   ],
   "products": [
    {
     "name": "Writerside plugin",
     "what": "JetBrains IDE plugin for writing, testing and building documentation websites.",
     "pricing": {
      "model": "free",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.jetbrains.com/writerside/",
      "note": "free plugin on JetBrains Marketplace; standalone IDE retired 2025-03-20; not open source"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "Writerside generates llms.txt once <llms-txt>true</llms-txt> is set in buildprofiles.xml.",
     "source_url": "https://www.jetbrains.com/help/writerside/generate-llms-txt.html"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the Generate llms.txt, sitemap, indexing or build topics; the help site answered Accept: text/markdown with HTML."
    },
    {
     "id": "markdown-twin",
     "status": "partial",
     "evidence": "With llms.txt enabled each topic gets a .html.md Markdown version linked from llms.txt and the page head.",
     "source_url": "https://www.jetbrains.com/help/writerside/generate-llms-txt.html"
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "No statement found on output rendering in the build and publish topic; the jetbrains.com help page carried its H1 in the served HTML."
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "No statement found in the Writerside topics read; jetbrains.com/help/writerside returned 404 for a made-up topic on 2026-11-05."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found in the Writerside topics read; Writerside output does not negotiate on Accept."
    }
   ],
   "checks": {
    "domain": "jetbrains.com",
    "read_on": "2026-11-05",
    "scope": "Plain-fetch checks ran on https://www.jetbrains.com/writerside/; the Ora and Cloudflare scores cover the whole host jetbrains.com.",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": false,
     "words_in_initial_html": 10,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": null
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 42930,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 301,
      "location": "/agent-ready-check-yk8b93em/",
      "final_status": 404
     }
    },
    "ora": {
     "score": 62,
     "grade": "C",
     "scanned_at": "2026-10-29T15:35:43.73+00:00",
     "via": "GET https://ora.ai/api/score/jetbrains.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T14:00:10.233Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 958,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 1329,
     "js_shell": false,
     "jsonld_types": [
      "WebPage"
     ],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": false,
     "missing_path_status": 404,
     "llms_txt_valid": false,
     "llms_txt_bytes": 42226,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Writerside does not let search engines index a new instance unless indexing is allowed in the instance settings or buildprofiles.xml.",
    "Writerside writes no sitemap and no llms.txt until the sitemap and llms-txt tags are added to buildprofiles.xml.",
    "Writerside is not open source and is no longer sold as a standalone IDE."
   ],
   "does_not_do_basis": [
    {
     "fact": 7,
     "keep": "fact"
    },
    {
     "fact": 6,
     "keep": "fact"
    },
    null
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/writerside/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "nextjs",
   "name": "Next.js",
   "type": "framework",
   "operator": "Vercel",
   "homepage": "https://nextjs.org/",
   "one_line": "React framework from Vercel. Its App Router renders on the server and prerenders static routes, so page text is in the first HTML response; robots.txt, sitemaps and JSON-LD come from file conventions and code the site owner writes.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Next.js 16 came out on 2025-10-21 with Turbopack as the default bundler for new projects and proxy.ts replacing middleware.ts as the file that runs before a request reaches a route.",
     "source_url": "https://nextjs.org/blog/next-16",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-10-21"
    },
    {
     "claim": "Next.js 16.4, released on 2026-10-06, switches Cache Components on for every app made with create-next-app, and the release post says that model becomes the default in Next.js 17.",
     "source_url": "https://nextjs.org/blog/next-16-4",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-06"
    },
    {
     "claim": "Next.js fixes the HTTP status the moment a streamed response starts, at the first Suspense fallback or loading.tsx render; a notFound() reached later leaves the page at 200 with a noindex meta tag, which the docs admit some crawlers file as a soft 404.",
     "source_url": "https://nextjs.org/docs/app/api-reference/file-conventions/loading",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Next.js 15.4.0 added an experimental app/global-not-found.js that answers URLs matching no route at all and skips layouts, aimed at apps with several root layouts or a dynamic segment such as app/[country] at the top.",
     "source_url": "https://nextjs.org/docs/app/api-reference/file-conventions/not-found",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "For pages whose generateMetadata waits on data, Next.js sends the UI first and appends the title and meta tags to the body when they resolve; only user agents it classes as HTML-limited bots, such as facebookexternalhit, get them inside the head.",
     "source_url": "https://nextjs.org/docs/app/api-reference/functions/generate-metadata",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The htmlLimitedBots key in next.config takes a regular expression that replaces the built-in bot list (Google crawlers, Bingbot, Twitterbot, Slackbot); setting it to /.*/ turns streaming metadata off, so an AI fetcher missing from the default list also gets metadata in the head.",
     "source_url": "https://nextjs.org/docs/app/api-reference/config/next-config-js/htmlLimitedBots",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Next.js has generated robots.txt and sitemap.xml from app/robots.ts and app/sitemap.ts since version 13.3.0, while its documentation index lists no matching file convention for llms.txt.",
     "source_url": "https://nextjs.org/docs/app/api-reference/file-conventions/metadata/robots",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Next.js leaves JSON-LD to the developer, and its guide says to write a native script tag in layout.js or page.js instead of next/script, and to swap the < character for \\u003c because JSON.stringify does not sanitize XSS strings.",
     "source_url": "https://nextjs.org/docs/app/guides/json-ld",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Since Next.js 16.2 (2026-03-18), create-next-app writes an AGENTS.md that sends coding agents to Markdown docs bundled in node_modules/next/dist/docs; that file serves agents editing the code, not agents reading the published site.",
     "source_url": "https://nextjs.org/blog/next-16-2-ai",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-03-18"
    },
    {
     "claim": "Next.js is released under the MIT License with the copyright held by Vercel, Inc., so the framework itself costs nothing to use or self-host.",
     "source_url": "https://raw.githubusercontent.com/vercel/next.js/canary/license.md",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "On 2026-11-05 nextjs.org/blog answered a curl request carrying Accept: */* with 19,216 bytes of text/markdown and Vary: Accept, and sent 1,052,520 bytes of HTML only when Accept named text/html; that HTML response's Vary header did not list Accept.",
     "source_url": "https://nextjs.org/blog",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 nextjs.org had no robots.txt (/robots.txt answered 404), a made-up path answered 404, /llms.txt answered 200 with a 14,592-byte index, and blog posts answered at a .md twin such as /blog/next-16.md with text/markdown.",
     "source_url": "https://nextjs.org/robots.txt",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Next.js",
     "what": "Open-source React framework with server rendering, static prerendering and file conventions for robots.txt, sitemaps and not-found pages.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://raw.githubusercontent.com/vercel/next.js/canary/license.md",
      "note": "MIT License; hosting is billed by whichever host runs it"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No llms.txt file convention in the Next.js docs index read on 2026-11-05; only robots and sitemap conventions exist. nextjs.org serves its own file.",
     "source_url": "https://nextjs.org/docs/llms.txt"
    },
    {
     "id": "markdown-negotiation",
     "status": "partial",
     "evidence": "Nothing built in; Vercel documents a next.config.ts rewrite plus a route handler for its own Next.js blog.",
     "source_url": "https://vercel.com/blog/making-agent-friendly-pages-with-content-negotiation"
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No .md route convention found in the Next.js docs index; the .md URLs on nextjs.org come from Vercel's own site code."
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "Server rendering and prerendering by default; with Cache Components a prerendered static shell is sent first.",
     "source_url": "https://nextjs.org/docs/app/api-reference/functions/generate-metadata"
    },
    {
     "id": "real-404",
     "status": "partial",
     "evidence": "A 404 status before streaming starts; once streaming has begun the status stays 200 with a noindex tag.",
     "source_url": "https://nextjs.org/docs/app/api-reference/file-conventions/not-found"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found in the Next.js docs on Vary: Accept; nextjs.org sends it only on its markdown responses."
    }
   ],
   "checks": {
    "domain": "nextjs.org",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 516,
     "jsonld_blocks": 2,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "Accept"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 14592,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 79,
     "grade": "B",
     "scanned_at": "2026-11-02T16:44:05.387+00:00",
     "via": "GET https://ora.ai/api/score/nextjs.org (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 27,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T14:00:31.786Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": null,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 653,
     "js_shell": false,
     "jsonld_types": [
      "SoftwareApplication",
      "WebSite",
      "Organization"
     ],
     "home_links_llms_txt": false,
     "markdown_alternate_link": true,
     "generator": null,
     "answers_markdown": true,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 14592,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Next.js ships no llms.txt or markdown route of its own; the markdown that nextjs.org returns comes from code Vercel wrote for that site, not from a framework setting.",
    "A notFound() call reached after a loading.tsx fallback has rendered cannot turn the response into a 404, so Next.js apps that stream can still answer missing records with 200."
   ],
   "does_not_do_basis": [
    null,
    {
     "fact": 2,
     "keep": "fact"
    }
   ],
   "related": [
    "nextjs-app-router"
   ],
   "page": "https://agentreadyhtml.com/vendors/nextjs/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "astro",
   "name": "Astro",
   "type": "framework",
   "operator": "Cloudflare",
   "homepage": "https://astro.build/",
   "one_line": "Open-source framework for content sites, owned by Cloudflare since January 2026. Pages prerender to static HTML with client JavaScript stripped unless a component opts in, so the text is in the first response; sitemaps come from an add-on.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Astro's blog announced on 2026-01-16 that The Astro Technology Company had joined Cloudflare, and that all of its full-time staff became Cloudflare employees who keep working on Astro.",
     "source_url": "https://astro.build/blog/joining-cloudflare/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-01-16"
    },
    {
     "claim": "Astro's post on joining Cloudflare commits the framework to staying MIT-licensed and platform-agnostic, with continued support for deployment targets other than Cloudflare.",
     "source_url": "https://astro.build/blog/joining-cloudflare/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Astro Technology Company was formed in 2021 after a funding round; its founders write that paid hosted add-ons such as Astro DB never took off, and Astro DB lives on as the database client in core.",
     "source_url": "https://astro.build/blog/joining-cloudflare/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Four months before the acquisition, on 2025-09-23, Cloudflare gave Astro a $150,000 donation and became an official hosting partner.",
     "source_url": "https://astro.build/blog/cloudflare-official-partner/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-09-23"
    },
    {
     "claim": "Astro 6.0 shipped on 2026-03-10 with a built-in Fonts API, a Content Security Policy API and live content collections, and its dev server can now run the production runtime, such as Cloudflare's workerd, through Vite's Environment API.",
     "source_url": "https://astro.build/blog/astro-6/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-03-10"
    },
    {
     "claim": "Astro 7.0 (2026-06-22) rewrote the .astro compiler in Rust and made Satteri, a Rust Markdown and MDX processor, the default pipeline; projects relying on remark or rehype plugins switch to @astrojs/markdown-remark.",
     "source_url": "https://astro.build/blog/astro-7/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-06-22"
    },
    {
     "claim": "Before Astro 7.4 (2026-10-15), a server or worker entrypoint built from the pages() handler in astro/fetch or astro/hono answered unmatched URLs with an empty 404 body; the new notFound() handler serves the site's 404.astro page instead.",
     "source_url": "https://astro.build/blog/astro-740/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-15"
    },
    {
     "claim": "For each redirect in a static build, Astro writes a small HTML page with a meta refresh tag, so on a plain static host an agent gets a page rather than a 3xx response; Astro 7.4 added experimental.redirectPage and src/pages/3xx.astro to restyle that page.",
     "source_url": "https://astro.build/blog/astro-740/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-15"
    },
    {
     "claim": "Astro renders UI components from React, Vue, Svelte and similar libraries to HTML and CSS at build time and drops their client JavaScript unless the component carries a client:* directive.",
     "source_url": "https://docs.astro.build/en/concepts/islands/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Sitemaps in Astro come from the official @astrojs/sitemap integration (npx astro add sitemap), which needs the site option set to the deployed URL and then writes sitemap-index.xml plus numbered files such as sitemap-0.xml.",
     "source_url": "https://docs.astro.build/en/guides/integrations-guide/sitemap/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Matthew Phillips took over as Project Steward of Astro from Fred, the previous holder of the role, according to the August 2026 Astro newsletter.",
     "source_url": "https://astro.build/blog/whats-new-august-2026/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-08-31"
    },
    {
     "claim": "On 2026-11-05 the 302 from astro.build/llms.txt pointed at docs.astro.build/llms.txt, so an agent following it ended on a 404; llms-full.txt and llms-small.txt on the docs host also returned 404, and docs pages answered Accept: text/markdown with text/html.",
     "source_url": "https://astro.build/llms.txt",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Astro",
     "what": "Open-source framework that prerenders content sites to static HTML and adds on-demand rendering through server adapters.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://astro.build/blog/joining-cloudflare/",
      "note": "MIT License, free"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No llms.txt feature in the Astro docs and release posts read on 2026-11-05; astro.build/llms.txt redirects to a docs URL that answered 404."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the Astro 6.0, 7.0 and 7.4 posts; docs.astro.build answered Accept: text/markdown with text/html."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No .md output per page found in the Astro docs read; Markdown sources are compiled to HTML."
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "Components render to HTML and CSS at build time; client JavaScript only for client:* islands.",
     "source_url": "https://docs.astro.build/en/concepts/islands/"
    },
    {
     "id": "real-404",
     "status": "supports",
     "evidence": "404.astro serves unmatched routes; hand-built entrypoints need the notFound() handler added in 7.4.",
     "source_url": "https://astro.build/blog/astro-740/"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found on Vary: Accept in the Astro docs pages and release posts read."
    }
   ],
   "checks": {
    "domain": "astro.build",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 809,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": null
     },
     "llms_txt": {
      "status": 404,
      "content_type": "",
      "bytes": 0,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 52,
     "grade": "C",
     "scanned_at": "2026-08-29T02:23:26.025+00:00",
     "via": "GET https://ora.ai/api/score/astro.build (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T14:00:44.681Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": null,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 992,
     "js_shell": false,
     "jsonld_types": [],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": "Astro v7.3.5",
     "answers_markdown": false,
     "missing_path_status": 404,
     "llms_txt_valid": false,
     "llms_txt_bytes": 0,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Astro's default build writes no llms.txt and no markdown copy of a page, and the Astro 7.0 and 7.4 release posts add neither despite the Cloudflare ownership.",
    "Redirects in a static Astro build are HTML pages with a meta refresh, so an agent that ignores that tag reads a short 200 page instead of following a 301.",
    "Astro does not tie hosting to Cloudflare, and the acquisition post promises continued work on deployments to every target."
   ],
   "does_not_do_basis": [
    null,
    {
     "fact": 7,
     "keep": "fact"
    },
    {
     "fact": 1,
     "keep": "fact"
    }
   ],
   "related": [
    "astro"
   ],
   "page": "https://agentreadyhtml.com/vendors/astro/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "nuxt",
   "name": "Nuxt",
   "type": "framework",
   "operator": "Vercel",
   "homepage": "https://nuxt.com/",
   "one_line": "Open-source Vue framework whose core team works at NuxtLabs, part of Vercel since July 2025. Pages render on the server or prerender with nuxt generate; llms.txt comes from the nuxt-llms module and static 404 status depends on host setup.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Vercel announced on 2025-07-08 that NuxtLabs, the company led by Nuxt creator Sebastien Chopin that funds Daniel Roe, Pooya Parsa and Anthony Fu, was joining Vercel.",
     "source_url": "https://vercel.com/blog/nuxtlabs-joins-vercel",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-07-08"
    },
    {
     "claim": "In the same announcement Vercel said Nuxt and Nitro keep the MIT license and open governance, and that Nuxt Studio MDC, Nuxt UI Pro and NuxtHub Admin would become free and open source.",
     "source_url": "https://vercel.com/blog/nuxtlabs-joins-vercel",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-07-08"
    },
    {
     "claim": "Nuxt UI v4, posted on 2025-09-22, folded the paid Nuxt UI Pro into a single free library of more than 110 components and 12 templates, plus a Figma kit.",
     "source_url": "https://nuxt.com/blog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-09-22"
    },
    {
     "claim": "Nuxt 4.0 was announced by Daniel Roe on 2025-07-15, the week after the NuxtLabs news, with a new project structure and changes to data fetching and TypeScript support.",
     "source_url": "https://nuxt.com/blog/v4",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-07-15"
    },
    {
     "claim": "Nuxt 4.5 (2026-07-18) added experimental SSR streaming behind ssrStreaming: true; it is off by default, and Nuxt switches it off for user agents it treats as bots and crawlers, a list owners can tune.",
     "source_url": "https://nuxt.com/blog/v4-5",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-07-18"
    },
    {
     "claim": "The Nuxt 4.5 post warns that with streaming on, a setResponseStatus() inside script setup cannot change the status already sent, so a missing record can go out with the status chosen before rendering began.",
     "source_url": "https://nuxt.com/blog/v4-5",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-07-18"
    },
    {
     "claim": "nuxt generate and nuxt build --prerender emit 200.html and 404.html fallbacks that are empty shells unless experimental.prerenderErrorPages server-renders error.vue into 404.html, and the 404 status holds only when the host is set to serve that file for missing routes.",
     "source_url": "https://nuxt.com/docs/4.x/getting-started/deployment",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Nuxt sends a fatal server error as JSON when the request carries Accept: application/json and as the full-screen error page otherwise; throwing createError({ status: 404 }) in a page is the documented way to return a not-found.",
     "source_url": "https://nuxt.com/docs/4.x/getting-started/error-handling",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The nuxt-llms module, maintained in the nuxt-content GitHub organisation under a NuxtLabs copyright, generates and prerenders /llms.txt and, when enabled, /llms-full.txt; on 2026-11-05 its module page showed version 0.3.1 and 174.3K downloads.",
     "source_url": "https://nuxt.com/modules/llms",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Nuxt put a beta Nuxt Agent on nuxt.com on 2026-04-29, opened with Cmd+I or at /chat, built on the AI SDK and grounded through the Nuxt MCP server shipped in November 2025.",
     "source_url": "https://nuxt.com/blog/introducing-nuxt-agent",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-04-29"
    },
    {
     "claim": "On 2026-11-05 nuxt.com's robots.txt, written by the nuxt-robots module, listed 26 AI user agents by name with Allow: /, among them ClaudeBot, GPTBot, PerplexityBot and FirecrawlAgent, under a Content-Signal line allowing search, ai-train and ai-input.",
     "source_url": "https://nuxt.com/robots.txt",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "The 307 that nuxt.com sent on 2026-11-05 to a docs request carrying Accept: text/markdown pointed to the same path under /raw/ with a .md ending and carried Vary: Accept, User-Agent; that day nuxt.com/llms-full.txt was 5,389,605 bytes and a made-up path returned 404.",
     "source_url": "https://nuxt.com/llms-full.txt",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Nuxt",
     "what": "Open-source Vue framework with universal rendering, route rules and static generation through nuxt generate.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://vercel.com/blog/nuxtlabs-joins-vercel",
      "note": "MIT License"
     }
    },
    {
     "name": "Nuxt UI",
     "what": "Vue component library that absorbed the former paid Nuxt UI Pro in version 4.",
     "pricing": {
      "model": "free",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://nuxt.com/blog",
      "note": "free since Nuxt UI v4, 2025-09-22"
     }
    },
    {
     "name": "nuxt-llms",
     "what": "Nuxt module that builds and prerenders llms.txt and an optional llms-full.txt from hooks fed by Nuxt Content or a CMS.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://nuxt.com/modules/llms",
      "note": "version 0.3.1 on the module page"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "Through the separate nuxt-llms module, which prerenders /llms.txt and optionally /llms-full.txt.",
     "source_url": "https://nuxt.com/modules/llms"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the Nuxt docs read; nuxt.com itself answers Accept: text/markdown with a 307 to a /raw/ .md path rather than markdown on the same URL."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No .md output per page in Nuxt core docs read; the /raw/ .md copies are a feature of the nuxt.com site."
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "ssr: true is the default and nuxt generate prerenders routes at build time.",
     "source_url": "https://nuxt.com/docs/4.x/getting-started/deployment"
    },
    {
     "id": "real-404",
     "status": "partial",
     "evidence": "The Nitro server returns real errors via createError; static output relies on the host serving 404.html, an empty shell by default.",
     "source_url": "https://nuxt.com/docs/4.x/getting-started/deployment"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found in the Nuxt docs read, although fatal errors change format with the Accept header."
    }
   ],
   "checks": {
    "domain": "nuxt.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 951,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "Accept, User-Agent"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 69963,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 79,
     "grade": "B",
     "scanned_at": "2026-11-05T09:40:10.052+00:00",
     "via": "GET https://ora.ai/api/score/nuxt.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 53,
     "level": "L4 Agent-Integrated",
     "scanned_at": "2026-11-05T14:01:02.458Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": null,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 1071,
     "js_shell": false,
     "jsonld_types": [
      "WebSite",
      "WebPage",
      "Organization",
      "SoftwareApplication",
      "ImageObject"
     ],
     "home_links_llms_txt": false,
     "markdown_alternate_link": true,
     "generator": null,
     "answers_markdown": true,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 69963,
     "llms_full_valid": true,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "nuxt generate writes 404.html as an empty shell unless experimental.prerenderErrorPages is on, so an agent hitting a missing URL on a static Nuxt host may get no readable not-found text.",
    "Nuxt core has no llms.txt setting; the file comes from the separate nuxt-llms module at version 0.3.1, which a fresh nuxi init project does not include."
   ],
   "does_not_do_basis": [
    {
     "fact": 6,
     "keep": "fact"
    },
    null
   ],
   "related": [
    "nuxt"
   ],
   "page": "https://agentreadyhtml.com/vendors/nuxt/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "cloudflare",
   "name": "Cloudflare",
   "type": "host-or-cdn",
   "homepage": "https://www.cloudflare.com/",
   "hq": "United States",
   "one_line": "Edge network and host (Pages, Workers static assets) that can convert pages to markdown for agents on paid plans, sells Browser Run endpoints that render any URL to markdown or crawl a site, and lets owners allow or block AI crawlers per bot.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Cloudflare lists San Francisco, 101 Townsend St., as its headquarters and says its network serves data from 335 cities in more than 125 countries.",
     "source_url": "https://www.cloudflare.com/about-overview/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Cloudflare's own post of 2026-01-16 on the Astro deal names Webflow Cloud, Wix Vibe and Stainless docs as products whose sites are Astro projects deployed on Cloudflare's network.",
     "source_url": "https://blog.cloudflare.com/astro-joins-cloudflare/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-01-16"
    },
    {
     "claim": "Cloudflare's plans page on 2026-11-05 priced Free at $0, Pro at $20 a month billed annually or $25 monthly, and Business at $200 a month billed annually or $250 monthly, with Enterprise billed annually on a quote.",
     "source_url": "https://www.cloudflare.com/plans/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Cloudflare Pages switches to single-page-app mode when a project has no top-level 404.html and serves the root page for any path that matches no file, so missing URLs on such a site come back as the home page instead of a not-found response.",
     "source_url": "https://developers.cloudflare.com/pages/configuration/serving-pages/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Setting assets.not_found_handling to \"404-page\" in the Wrangler file makes Workers static assets walk up the directory tree to the nearest 404.html and serve it with a 404 status, falling back to an empty-bodied 404 when no such file exists.",
     "source_url": "https://developers.cloudflare.com/workers/static-assets/routing/static-site-generation/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "With not_found_handling set and a compatibility date of 2025-04-01 or later, Workers answers browser navigations (Sec-Fetch-Mode: navigate) straight from static assets without running the Worker script, so a plain curl or agent request that lacks that header can take a different path through the Worker.",
     "source_url": "https://developers.cloudflare.com/workers/static-assets/routing/static-site-generation/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Browser Run, the product formerly named Browser Rendering, has a /markdown Quick Action that loads a URL or raw HTML in headless Chrome and returns markdown through a POST to the account's browser-run/markdown API path.",
     "source_url": "https://developers.cloudflare.com/browser-run/quick-actions/markdown-endpoint/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Cloudflare added a /crawl endpoint to the Browser Run REST API as a beta on 2026-03-10; it follows links from a start URL to a set depth or page limit and returns HTML, Markdown or structured JSON.",
     "source_url": "https://developers.cloudflare.com/browser-run/changelog/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-03-10"
    },
    {
     "claim": "Each /crawl job declares crawlPurposes (search, ai-input, ai-train by default), and Cloudflare refuses the job with HTTP 400 when the target's robots.txt carries a Content-Signal setting one of those purposes to no; URLs blocked by robots.txt rules are reported as robots_disallowed.",
     "source_url": "https://developers.cloudflare.com/browser-run/quick-actions/crawl-endpoint/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Browser Run on Workers Paid includes 10 browser hours a month and then bills $0.09 per hour, plus $2.00 per concurrent browser above 10; Workers Free gets 10 minutes a day.",
     "source_url": "https://developers.cloudflare.com/browser-run/pricing/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "A Browser Run changelog entry of 2026-06-12 added a tutorial for pre-rendering JavaScript-heavy pages with a Worker that calls the /content Quick Action and hands crawler-ready HTML to search crawlers and link-preview bots.",
     "source_url": "https://developers.cloudflare.com/browser-run/changelog/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-06-12"
    },
    {
     "claim": "AI Crawl Control, renamed from AI Audit and available on every Cloudflare plan, shows which AI crawlers hit a zone, sets allow or block rules per crawler, tracks robots.txt compliance and offers pay per crawl as a private beta.",
     "source_url": "https://developers.cloudflare.com/ai-crawl-control/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "On 2026-11-05 www.cloudflare.com served a 17,173-byte llms.txt, a 4,762-byte /.well-known/agents.json and a .md twin of its plans page (11,858 bytes of text/markdown with Vary: Accept), and its robots.txt comments point agents to all three.",
     "source_url": "https://www.cloudflare.com/llms.txt",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Cloudflare application services plans",
     "what": "CDN, DNS and security plans for a zone, priced per month with annual discounts.",
     "pricing": {
      "model": "freemium",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.cloudflare.com/plans/",
      "note": "Free $0; Pro $20/mo billed annually ($25 monthly); Business $200/mo billed annually ($250 monthly); Enterprise quote"
     }
    },
    {
     "name": "Browser Run (formerly Browser Rendering)",
     "what": "Headless Chrome service with Quick Actions such as /markdown, /content and the /crawl beta.",
     "pricing": {
      "model": "usage-based",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://developers.cloudflare.com/browser-run/pricing/",
      "note": "Workers Free 10 min/day; Workers Paid 10 h/month then $0.09 per hour, 10 concurrent browsers then $2.00 each"
     }
    },
    {
     "name": "AI Crawl Control",
     "what": "Dashboard and rules for monitoring, allowing or blocking AI crawlers per zone, with pay per crawl in private beta.",
     "pricing": {
      "model": "free",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://developers.cloudflare.com/ai-crawl-control/",
      "note": "available on all plans"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No llms.txt generator for customer zones found in the docs read on 2026-11-05; the files on cloudflare.com and the docs host are Cloudflare's own."
    },
    {
     "id": "markdown-negotiation",
     "status": "partial",
     "evidence": "Markdown for Agents converts HTML to markdown on Accept: text/markdown, on Pro, Business and Enterprise only.",
     "source_url": "https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/"
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No per-page .md feature for customer sites found; the .md URLs on cloudflare.com and its docs are Cloudflare's own site code."
    },
    {
     "id": "initial-html",
     "status": "partial",
     "evidence": "Hosting serves whatever HTML the site builds; for JavaScript-heavy pages Cloudflare documents a Browser Run pre-render Worker.",
     "source_url": "https://developers.cloudflare.com/browser-run/changelog/"
    },
    {
     "id": "real-404",
     "status": "partial",
     "evidence": "Workers assets serve the nearest 404.html with a 404 under not_found_handling \"404-page\"; Pages without a top-level 404.html falls back to the root page.",
     "source_url": "https://developers.cloudflare.com/pages/configuration/serving-pages/"
    },
    {
     "id": "vary-accept",
     "status": "supports",
     "evidence": "Converted responses add Accept to Vary and keep any Vary values the origin set.",
     "source_url": "https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/"
    }
   ],
   "checks": {
    "domain": "cloudflare.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 1104,
     "jsonld_blocks": 3,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "Accept, accept-encoding"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 17173,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 301,
      "location": "https://www.cloudflare.com/agent-ready-check-yidpw7qj/",
      "final_status": 404
     }
    },
    "ora": {
     "score": 82,
     "grade": "B",
     "scanned_at": "2026-11-05T12:01:06.497+00:00",
     "via": "GET https://ora.ai/api/score/cloudflare.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 60,
     "level": "L4 Agent-Integrated",
     "scanned_at": "2026-11-05T14:01:12.625Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 2,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 1250,
     "js_shell": false,
     "jsonld_types": [
      "Organization",
      "WebSite",
      "WebPage"
     ],
     "home_links_llms_txt": true,
     "markdown_alternate_link": true,
     "generator": "Astro v6.3.7",
     "answers_markdown": true,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 17173,
     "llms_full_valid": true,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Cloudflare Pages does not return a 404 for missing paths when the build lacks a top-level 404.html; it serves the site root, which agents read as a real page.",
    "Browser Run's /markdown and /crawl are paid API calls made by whoever is fetching, so turning them on changes nothing about what a visiting agent receives from a Cloudflare-hosted site.",
    "Cloudflare writes no llms.txt for customer zones; the 17,173-byte file on www.cloudflare.com is Cloudflare's own."
   ],
   "does_not_do_basis": [
    {
     "fact": 3,
     "keep": "fact"
    },
    {
     "fact": 7,
     "keep": "both"
    },
    null
   ],
   "related": [
    "cloudflare-markdown-for-agents"
   ],
   "page": "https://agentreadyhtml.com/vendors/cloudflare/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "vercel",
   "name": "Vercel",
   "type": "host-or-cdn",
   "homepage": "https://vercel.com/",
   "one_line": "Cloud host and CDN behind Next.js. Its own docs answer Accept: text/markdown and .md URLs with Vary: Accept, and its firewall has a free AI Bots ruleset that can block training crawlers while letting assistant fetches through.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Vercel's pricing page on 2026-11-05 listed Hobby at $0 a month, Pro at $20 a month and Enterprise at a custom price, with Pro usage beyond its included edge requests and data transfer billed per unit.",
     "source_url": "https://vercel.com/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "A Vercel changelog entry dated 2026-01-13 made the Vercel documentation answer Accept: text/markdown with Markdown, each response ending in a link to sitemap.md so agents can find further pages.",
     "source_url": "https://vercel.com/changelog/docs-pages-support-markdown-responses",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-01-13"
    },
    {
     "claim": "Vercel's docs return Markdown on the canonical URL to clients that prefer it and also to a recognised AI agent that states no format preference, while an agent that asks for text/html still gets HTML.",
     "source_url": "https://vercel.com/docs/agent-resources/markdown-access",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Every Vercel docs page also has a .md URL, advertised from the HTML through a rel=alternate link of type text/markdown, and each Markdown copy opens with YAML frontmatter carrying title, canonical_url, last_updated, type, prerequisites and a one-sentence summary.",
     "source_url": "https://vercel.com/docs/agent-resources/markdown-access",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Vercel's CDN puts the Accept header into its cache key for the docs, so HTML and Markdown copies of one URL are stored apart at the edge as well as in downstream caches.",
     "source_url": "https://vercel.com/docs/agent-resources/markdown-access",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Beyond llms.txt (also served as /agent.txt), Vercel publishes /docs/graph.json, a link graph rebuilt nightly across its docs, Knowledge Base, nextjs.org and ai-sdk.dev, plus /.well-known/ai-catalog.json and an RFC 9727 /.well-known/api-catalog.",
     "source_url": "https://vercel.com/docs/agent-resources/markdown-access",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "On 2025-05-13 Vercel added a one-toggle AI bot managed ruleset to its firewall, free on all plans and kept up to date by Vercel, that blocks GPTBot, ClaudeBot, PerplexityBot, Bytespider and similar crawlers.",
     "source_url": "https://vercel.com/changelog/new-one-click-ai-bot-managed-ruleset",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-05-13"
    },
    {
     "claim": "Since 2026-10-29 the AI Bots ruleset in Vercel Firewall splits AI crawlers, which collect content for indexing and training, from AI assistants, which fetch pages for a user's request, so a project can deny the first group and only log the second.",
     "source_url": "https://vercel.com/changelog/block-ai-crawlers-and-assistants-independently-with-managed-rules",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-29"
    },
    {
     "claim": "Vercel's Knowledge Base guide on agentic commerce, published 2026-10-01, ranks an llms.txt file below Schema.org Product JSON-LD, Open Graph tags and a product feed for getting a catalogue read by AI agents.",
     "source_url": "https://vercel.com/kb/guide/agentic-commerce-readiness",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-01"
    },
    {
     "claim": "The same Vercel guide reports that in December 2024 GPTBot made 569 million requests across Vercel's network and Anthropic's Claude crawlers 370 million, crawlers that fetch HTML without executing it.",
     "source_url": "https://vercel.com/kb/guide/agentic-commerce-readiness",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "For multi-tenant Next.js platforms, Vercel's docs show route handlers that build robots.txt, sitemap.xml and llms.txt per tenant at request time rather than as one shared static file.",
     "source_url": "https://vercel.com/docs/platforms/multi-tenant-platforms/serving-static-files",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Vercel announced on 2025-07-08 that NuxtLabs, the stewards of Nuxt and Nitro, were joining the company, which puts the maintainers of a second framework under the same roof as the Next.js team.",
     "source_url": "https://vercel.com/blog/nuxtlabs-joins-vercel",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-07-08"
    },
    {
     "claim": "On 2026-11-05 vercel.com/docs/functions sent 12,225 bytes of text/markdown to a curl request with Accept: */* and 976,893 bytes of HTML to Accept: text/html; vercel.com/docs/llms-full.txt was 11,995,638 bytes, and a made-up top-level path redirected twice to the login page when the request asked for text/html, instead of returning 404, while the same path with no Accept header returned 404.",
     "source_url": "https://vercel.com/docs/functions",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Vercel platform",
     "what": "Hosting, CDN and functions for Next.js and other frameworks, with preview and production deployments.",
     "pricing": {
      "model": "freemium",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://vercel.com/pricing",
      "note": "Hobby $0/mo; Pro $20/mo plus usage; Enterprise custom"
     }
    },
    {
     "name": "Vercel Firewall AI Bots ruleset",
     "what": "Managed firewall rule that logs or blocks AI crawlers and, since October 2026, AI assistants as a separate category.",
     "pricing": {
      "model": "free",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://vercel.com/changelog/new-one-click-ai-bot-managed-ruleset",
      "note": "free on all plans"
     }
    },
    {
     "name": "BotID",
     "what": "Bot detection for protected routes, with basic checks on every plan and paid Deep Analysis.",
     "pricing": {
      "model": "usage-based",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://vercel.com/pricing",
      "note": "basic checks included; Deep Analysis $1 per 1,000 checks on Pro"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "No automatic file for customer projects; docs show route handlers that serve llms.txt per tenant.",
     "source_url": "https://vercel.com/docs/platforms/multi-tenant-platforms/serving-static-files"
    },
    {
     "id": "markdown-negotiation",
     "status": "partial",
     "evidence": "Vercel's own docs negotiate on Accept; customer sites need their own rewrite and route handler.",
     "source_url": "https://vercel.com/docs/agent-resources/markdown-access"
    },
    {
     "id": "markdown-twin",
     "status": "partial",
     "evidence": "Vercel docs pages have .md URLs; there is no platform switch that adds them to customer sites.",
     "source_url": "https://vercel.com/docs/agent-resources/markdown-access"
    },
    {
     "id": "initial-html",
     "status": "partial",
     "evidence": "Serves what the framework builds; Vercel's commerce guide tells sites to server-render the catalogue into the first response.",
     "source_url": "https://vercel.com/kb/guide/agentic-commerce-readiness"
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "No host-level 404 statement found in the docs index searched; on vercel.com itself /docs paths 404 while a made-up top-level path redirects to login for a request that asks for text/html and returns 404 otherwise."
    },
    {
     "id": "vary-accept",
     "status": "supports",
     "evidence": "Every Markdown response from the docs sets Vary: Accept and the CDN keys its cache on Accept.",
     "source_url": "https://vercel.com/docs/agent-resources/markdown-access"
    }
   ],
   "checks": {
    "domain": "vercel.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 155,
     "jsonld_blocks": 6,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "Accept"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 5397,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 91,
     "grade": "A",
     "scanned_at": "2026-11-05T08:10:18.218+00:00",
     "via": "GET https://ora.ai/api/score/vercel.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 60,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T14:01:20.401Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 3040,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 546,
     "js_shell": false,
     "jsonld_types": [
      "Organization",
      "Service",
      "SoftwareApplication"
     ],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": true,
     "missing_path_status": 200,
     "llms_txt_valid": true,
     "llms_txt_bytes": 5397,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Vercel has no project setting that turns on markdown or .md URLs for a customer site; the negotiation on vercel.com/docs is Vercel's own code, which customers reproduce with rewrites and route handlers.",
    "The AI Bots ruleset is opt-in, so Vercel does not block GPTBot or ClaudeBot on a project until its owner enables AI Bots under Bot Management.",
    "A made-up top-level path on vercel.com does not answer 404 to a request for text/html; it passes through /auth-redirect/ to the login page, while the same path with no Accept header gets 404."
   ],
   "does_not_do_basis": [
    null,
    null,
    {
     "fact": 12,
     "keep": "fact"
    }
   ],
   "ora_relation": "Vercel sits on the AgentReady committee for infrastructure and web essentials, and Ora built is-agentic.com with Vercel.",
   "related": [
    "vercel-markdown",
    "nextjs-app-router"
   ],
   "page": "https://agentreadyhtml.com/vendors/vercel/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "scrunch",
   "name": "Scrunch",
   "type": "host-or-cdn",
   "operator": "Sitecore",
   "homepage": "https://scrunch.com/",
   "one_line": "AI search visibility platform owned by Sitecore since June 2026. Its AXP product sits at the CDN and serves AI agents a simplified, JavaScript-free HTML copy of existing pages while people get the normal site; AXP is sold only on Enterprise contracts.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Sitecore announced from New York on 2026-06-03 that it had acquired Scrunch, and the release signs Chris Andrew as CEO of Scrunch, a Sitecore company.",
     "source_url": "https://www.sitecore.com/company/newsroom/press-releases/2026/06/sitecore-acquires-scrunch-to-help-brands-influence-discovery--and-buying-decisions",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-06-03"
    },
    {
     "claim": "In the acquisition release Sitecore says an Akamai study of AXP-enabled pages against comparable pages without AXP found a 364% rise in how often Akamai showed up in AI answers to non-branded prompts.",
     "source_url": "https://www.sitecore.com/company/newsroom/press-releases/2026/06/sitecore-acquires-scrunch-to-help-brands-influence-discovery--and-buying-decisions",
     "read_date": "2026-11-05",
     "kind": "vendor_claim",
     "fact_date": "2026-06-03"
    },
    {
     "claim": "Scrunch's Core plan cost $250 a month on 2026-11-05 for 125 tracked prompts, 5,000 AI responses a month, 5 site audits a month and four answer engines (ChatGPT, Perplexity, Google AI Overviews, Copilot), with a 7-day free trial.",
     "source_url": "https://scrunch.com/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "AXP appears only in the Enterprise column of Scrunch's pricing, a custom-priced tier that also adds nine answer engines, API and MCP access and SAML or OIDC single sign-on.",
     "source_url": "https://scrunch.com/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "In a post of 2026-07-08 Scrunch CEO Chris Andrew recast the whole product as an Agent Experience Platform and launched two monitoring features, Signals and Explorer, in beta for customers on every plan.",
     "source_url": "https://scrunch.com/blog/agent-experience-platform/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-07-08"
    },
    {
     "claim": "Scrunch's Universal Optimization mode strips analytics scripts, tracking pixels, layout shells and lazy-loaded UI from the agent-facing copy, fixes heading order and landmarks, and prerenders the pages agents request most while rendering the rest on demand.",
     "source_url": "https://scrunch.com/blog/agent-experience-platform/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-07-08"
    },
    {
     "claim": "Scrunch's Adaptive Optimization mode goes further than Universal, applying approved Site Optimization recommendations to the agent copy and rewriting that content every week as the tracking data changes.",
     "source_url": "https://scrunch.com/blog/agent-experience-platform/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-07-08"
    },
    {
     "claim": "Scrunch's Site Optimization gives page-by-page fixes without any CDN integration and can hand them off as a ticket, a push to the CMS, delivery at the edge, or a Markdown export meant for a coding agent.",
     "source_url": "https://scrunch.com/blog/agent-experience-platform/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-07-08"
    },
    {
     "claim": "Scrunch's help center lists Cloudflare, Akamai and AWS CloudFront as the edges AXP deploys on, and states that AXP is sold separately from its Monitoring and Insights platform.",
     "source_url": "https://helpcenter.scrunchai.com/en/articles/13656392-agent-experience-platform-axp",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Scrunch describes AXP's agent copy as HTML, usually much simplified, returned at the CDN layer; nothing in the AXP article says it serves markdown or reacts to an Accept header.",
     "source_url": "https://helpcenter.scrunchai.com/en/articles/13656392-agent-experience-platform-axp",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "AXP's bot classifier sorts AI traffic by platform and by purpose, separating training collection, search indexing and real-time retrieval, so routing rules can treat a live answer fetch differently from a training crawl.",
     "source_url": "https://helpcenter.scrunchai.com/en/articles/13656392-agent-experience-platform-axp",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Scrunch's help center says AXP does not use llms.txt by default and that Scrunch generates and serves one on request, which it calls optional.",
     "source_url": "https://helpcenter.scrunchai.com/en/articles/12845899-how-axp-serves-content-to-ai-agents",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "On 2026-11-05 scrunch.com served its own 16,462-byte llms.txt, its home page answered Accept: text/markdown with HTML, and a made-up path returned a 222-byte 404.",
     "source_url": "https://scrunch.com/llms.txt",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Scrunch Core",
     "what": "AI search monitoring for one brand: tracked prompts, responses from four answer engines, site audits and bot traffic.",
     "pricing": {
      "model": "subscription",
      "from": 250,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://scrunch.com/pricing",
      "note": "per month, Core plan, 7-day free trial"
     }
    },
    {
     "name": "Scrunch Enterprise with AXP",
     "what": "Custom contract that adds AXP, the agent-facing HTML layer at the CDN, plus API, MCP and SSO.",
     "pricing": {
      "model": "enterprise quote",
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://scrunch.com/pricing",
      "note": "AXP listed only under Enterprise"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "Scrunch's help center says AXP does not use llms.txt by default and generates one on request; scrunch.com nonetheless serves its own file.",
     "source_url": "https://helpcenter.scrunchai.com/en/articles/12845899-how-axp-serves-content-to-ai-agents"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found; the AXP article describes HTML chosen by agent detection at the CDN, not by Accept.",
     "source_url": "https://helpcenter.scrunchai.com/en/articles/13656392-agent-experience-platform-axp"
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No per-page .md output found; the only Markdown mentioned is an export of recommendations for coding agents."
    },
    {
     "id": "initial-html",
     "status": "partial",
     "evidence": "AXP serves JavaScript-free HTML to detected agents, prerendering the most requested pages, on Enterprise plans only.",
     "source_url": "https://scrunch.com/blog/agent-experience-platform/"
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "No statement found in the AXP help article or the July 2026 AXP post."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found; AXP routes by user agent, and no Vary header is documented."
    }
   ],
   "checks": {
    "domain": "scrunch.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 5987,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "accept-encoding"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 16462,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 55,
     "grade": "C",
     "scanned_at": "2026-09-16T16:40:56.791+00:00",
     "via": "GET https://ora.ai/api/score/scrunch.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T14:01:34.385Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": null,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 5233,
     "js_shell": false,
     "jsonld_types": [],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": false,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 16285,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "AXP does not answer Accept: text/markdown; it detects AI user agents at the CDN and hands them simplified HTML at the same URL.",
    "AXP is not part of Scrunch's $250-a-month Core plan; only custom Enterprise contracts include it.",
    "Signals and Explorer, the beta features of July 2026, watch how answer engines describe a brand and change nothing an agent fetches from the site."
   ],
   "does_not_do_basis": [
    {
     "fact": 9,
     "keep": "fact"
    },
    null,
    {
     "fact": 4,
     "keep": "both"
    }
   ],
   "related": [
    "scrunch-agent-pages"
   ],
   "page": "https://agentreadyhtml.com/vendors/scrunch/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "firecrawl",
   "name": "Firecrawl",
   "type": "markdown-tooling",
   "homepage": "https://www.firecrawl.dev/",
   "one_line": "Paid web data API that fetches and renders pages and returns them as markdown, cleaned HTML, raw HTML or JSON, with crawl, map and search endpoints; it honours robots.txt by default and reports each page's HTTP status, so 404s stay visible.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Firecrawl announced a $75M Series B on 2026-09-22, led by Smash Capital with Altos Ventures, Nexus Venture Partners and Y Combinator among the backers, alongside Alexandria, a layer that puts official data providers, custom connectors and Firecrawl's own indexes next to the live web.",
     "source_url": "https://www.firecrawl.dev/blog/introducing-alexandria-series-b",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-09-22"
    },
    {
     "claim": "Firecrawl's founders say they built Mendable, a documentation chat product, before Firecrawl, and that more than 1.5 million users now build with Firecrawl.",
     "source_url": "https://www.firecrawl.dev/blog/introducing-alexandria-series-b",
     "read_date": "2026-11-05",
     "kind": "vendor_claim",
     "fact_date": "2026-09-22"
    },
    {
     "claim": "Under Firecrawl pricing effective 2026-09-04, the free tier gives 1,000 credits a month with no card, Hobby costs $16 a month billed annually ($19 monthly) for 5,000 credits, Standard $83 ($99) for 100,000, Growth $333 ($399) for 500,000 and Scale $599 ($749) for 1,000,000.",
     "source_url": "https://www.firecrawl.dev/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-09-04"
    },
    {
     "claim": "Firecrawl bills 1 credit per page scraped or crawled and per Map call, 2 credits per 10 search results, and 4 more per page for JSON, Question or Highlight output; a target page that answers 403 or 404 is still returned and still costs a credit.",
     "source_url": "https://www.firecrawl.dev/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-09-04"
    },
    {
     "claim": "Firecrawl's /scrape can return markdown, a summary, cleaned HTML, rawHtml exactly as the server sent it, Base64 of the original body, links, images, screenshots, JSON, product and branding extracts, so a caller can compare the server HTML with the converted markdown.",
     "source_url": "https://docs.firecrawl.dev/features/scrape",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Firecrawl serves a cached copy by default when it is younger than maxAge = 172,800,000 ms (two days), so a page changed yesterday can come back stale unless the caller sets maxAge to 0.",
     "source_url": "https://docs.firecrawl.dev/features/scrape",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Firecrawl's crawler obeys robots.txt and lists refused URLs as robotsBlocked; the ignoreRobotsTxt and robotsUserAgent overrides exist only on Enterprise plans.",
     "source_url": "https://docs.firecrawl.dev/features/crawl",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "A Firecrawl crawl stays under the start path unless crawlEntireDomain is set, reads the sitemap as well as links by default (sitemap: \"include\"), and stops at 10,000 pages unless limit says otherwise.",
     "source_url": "https://docs.firecrawl.dev/features/crawl",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Crawl results from Firecrawl keep pages whose server answered with an error such as 404 and record the target's status in metadata.statusCode, which lets a site owner list every URL that returns a real 404 in one crawl.",
     "source_url": "https://docs.firecrawl.dev/features/crawl",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Firecrawl v2.10, released on 2026-05-15, added a /parse endpoint for uploaded documents, a Lockdown Mode and the Question and Highlights output formats.",
     "source_url": "https://www.firecrawl.dev/changelog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-05-15"
    },
    {
     "claim": "The Firecrawl source repository on GitHub carries the GNU Affero General Public License version 3, which covers the self-hosted version separately from the paid cloud API.",
     "source_url": "https://raw.githubusercontent.com/firecrawl/firecrawl/main/LICENSE",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "On 2026-11-05 docs.firecrawl.dev, a Mintlify-built docs site, served a 9,770-byte llms.txt, answered Accept: text/markdown on /features/crawl with 29,228 bytes of markdown and Vary: accept-encoding, Accept, User-Agent, served the same text at /features/crawl.md, and returned 404 for a made-up path.",
     "source_url": "https://docs.firecrawl.dev/llms.txt",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Firecrawl API (cloud)",
     "what": "Scrape, crawl, map, search and related endpoints that return pages as markdown, HTML or JSON, billed in credits.",
     "pricing": {
      "model": "freemium",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.firecrawl.dev/pricing",
      "note": "Free 1,000 credits/month; Hobby $16/mo billed annually ($19 monthly); Standard $83; Growth $333; Scale $599; Enterprise custom"
     }
    },
    {
     "name": "Firecrawl (self-hosted)",
     "what": "The AGPL-3.0 source of Firecrawl run on your own infrastructure with Docker Compose.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://raw.githubusercontent.com/firecrawl/firecrawl/main/LICENSE",
      "note": "AGPL-3.0"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "The alpha /llmstxt endpoint still answers but is no longer maintained; Firecrawl points to the create-llmstxt-py script instead.",
     "source_url": "https://docs.firecrawl.dev/features/alpha/llmstxt"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "Firecrawl converts pages to markdown inside its own API; nothing in the scrape or crawl docs adds Accept handling to a customer's site."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No feature that publishes .md copies on a site; markdown is returned to the API caller only."
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "Firecrawl is a fetcher, not a site renderer; its rawHtml format shows what the server sent before rendering."
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "No statement about serving 404s; crawl results report each target page's status in metadata.statusCode."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found in the scrape, crawl and pricing pages read on 2026-11-05."
    }
   ],
   "checks": {
    "domain": "firecrawl.dev",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 3867,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "Accept"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 22575,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 85,
     "grade": "B",
     "scanned_at": "2026-11-05T08:39:12.72+00:00",
     "via": "GET https://ora.ai/api/score/firecrawl.dev (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 53,
     "level": "L5 Agent-Native",
     "scanned_at": "2026-11-05T14:01:48.915Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": null,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 4052,
     "js_shell": false,
     "jsonld_types": [],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": true,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 22575,
     "llms_full_valid": true,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Firecrawl does not make a site agent-readable on its own; the markdown it builds goes to the API caller and nothing changes on the site that was scraped.",
    "Firecrawl's two-day default cache means a scrape is not always a live fetch, so testing a fresh deploy needs maxAge set to 0.",
    "Ordinary Firecrawl plans cannot skip robots.txt, because ignoreRobotsTxt is an Enterprise-only switch."
   ],
   "does_not_do_basis": [
    null,
    null,
    {
     "fact": 6,
     "keep": "fact"
    }
   ],
   "related": [
    "firecrawl-llmstxt"
   ],
   "page": "https://agentreadyhtml.com/vendors/firecrawl/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "yoast",
   "name": "Yoast",
   "type": "markdown-tooling",
   "operator": "Newfold Digital",
   "homepage": "https://yoast.com/",
   "hq": "Netherlands",
   "one_line": "Dutch maker of the Yoast SEO plugin for WordPress and app for Shopify, part of Newfold Digital. Both can write an llms.txt, and the WordPress plugin adds a Schema Aggregation endpoint that serves a whole site's JSON-LD graph as one schemamap.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Yoast was founded in 2010 by Joost de Valk and says its team is about 110 people, around 70 of them at its office in Wijchen, the Netherlands.",
     "source_url": "https://yoast.com/about-us/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Yoast's press page states that the company has belonged to Newfold Digital since 2021 and sends press questions to the Newfold Digital newsroom.",
     "source_url": "https://yoast.com/press/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Yoast SEO Premium for WordPress cost $118.80 a year before VAT on 2026-11-05 for one seat, with more seats at $5 a month each.",
     "source_url": "https://yoast.com/product/yoast-seo-premium-wordpress/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Yoast SEO AI+ cost $358.80 a year before VAT on 2026-11-05 and bundles Yoast WooCommerce SEO, the News, Video and Local SEO plugins, and AI Brand Insights, which tracks how answer engines mention a brand and which sources they cite.",
     "source_url": "https://yoast.com/product/yoast-seo-ai-plus/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Yoast SEO for Shopify costs $19 per 30 days and Yoast SEO AI+ for Shopify $45, each with a 14-day trial, and the plan table lists llms.txt generation in both tiers.",
     "source_url": "https://yoast.com/shopify/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Yoast's Shopify llms.txt, introduced on 2026-03-31, is off until the merchant opts in; by default it lists the store's 10 most-sold products, up to 5 of its largest collections, policies and key pages, refreshes weekly, and leaves an existing /llms.txt redirect alone.",
     "source_url": "https://yoast.com/yoast-seo-for-shopify-march-31-2026/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-03-31"
    },
    {
     "claim": "Yoast announced from Wijchen on 2025-11-25 a collaboration with NLWeb, Microsoft's open framework for letting AI systems query websites, built on the structured data Yoast already writes.",
     "source_url": "https://yoast.com/press/yoast-nlweb-microsoft-251125/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-11-25"
    },
    {
     "claim": "Yoast SEO 27.1, released 2026-03-03, added Schema Aggregation to the free plugin as an opt-in endpoint, switched on with a toggle, that returns the whole site's structured data as one deduplicated graph Yoast calls a schemamap.",
     "source_url": "https://yoast.com/yoast-seo-march-3-2026/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-03-03"
    },
    {
     "claim": "Yoast SEO 28.8, dated 2026-10-27, added Yoast abilities through which an AI agent can switch llms.txt, the Schema Aggregator, XML sitemaps and Open Graph output on or off, added NLWeb's sf:contentType element to the schema map, and raised the minimum WordPress version to 7.0.",
     "source_url": "https://developer.yoast.com/changelog/yoast-seo/28.8/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-27"
    },
    {
     "claim": "Yoast's developer spec for the WordPress llms.txt says markdown code blocks containing special markdown characters are not yet supported and those characters are escaped in the file.",
     "source_url": "https://developer.yoast.com/features/llms-txt/functional-specification/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "On 2026-11-05 yoast.com's robots.txt advertised its schemamap with a non-standard Schemamap: line pointing under /wp-json/, the same path the file disallows for every user agent, so a crawler that obeys robots.txt is told not to fetch it.",
     "source_url": "https://yoast.com/robots.txt",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "On 2026-11-05 yoast.com served a 7,682-byte llms.txt laid out as a product index under a Products heading, answered Accept: text/markdown on its home page with HTML, and returned 404 for a made-up path.",
     "source_url": "https://yoast.com/llms.txt",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Yoast SEO (WordPress)",
     "what": "Free WordPress SEO plugin with meta tags, XML sitemaps, schema output, an opt-in llms.txt and the Schema Aggregation endpoint.",
     "pricing": {
      "model": "freemium",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://yoast.com/yoast-seo-march-3-2026/",
      "note": "free plugin; Schema Aggregation included in the free version"
     }
    },
    {
     "name": "Yoast SEO Premium",
     "what": "Paid WordPress plugin adding internal linking suggestions, AI features and support.",
     "pricing": {
      "model": "subscription",
      "from": 118.8,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://yoast.com/product/yoast-seo-premium-wordpress/",
      "note": "per year ex VAT, one seat; extra seats $5/month"
     }
    },
    {
     "name": "Yoast SEO AI+",
     "what": "Bundle of Premium-level WordPress plugins, WooCommerce SEO and AI Brand Insights monitoring.",
     "pricing": {
      "model": "subscription",
      "from": 358.8,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://yoast.com/product/yoast-seo-ai-plus/",
      "note": "per year ex VAT"
     }
    },
    {
     "name": "Yoast SEO for Shopify",
     "what": "Shopify app with SEO analysis, product structured data and an opt-in llms.txt.",
     "pricing": {
      "model": "subscription",
      "from": 19,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://yoast.com/shopify/",
      "note": "per 30 days ex VAT; AI+ for Shopify $45; 14-day trial"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "supports",
     "evidence": "The WordPress plugin and the Shopify app each generate llms.txt once the owner switches it on.",
     "source_url": "https://developer.yoast.com/features/llms-txt/functional-specification/"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the Yoast product, release and spec pages read; yoast.com answered Accept: text/markdown with HTML."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No per-page .md output found in Yoast's feature list or the 27.1 and 28.8 release notes."
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "No statement found; Yoast relies on the host CMS rendering pages on the server."
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "No statement found on 404 status handling in the pages read."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found; Yoast does not negotiate formats."
    }
   ],
   "checks": {
    "domain": "yoast.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 1080,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding, Cookie"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 7682,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 41,
     "grade": "D",
     "scanned_at": "2026-04-19T02:10:00.965+00:00",
     "via": "GET https://ora.ai/api/score/yoast.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T14:01:56.377Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 6834,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 1527,
     "js_shell": false,
     "jsonld_types": [
      "WebPage",
      "ImageObject",
      "BreadcrumbList",
      "WebSite",
      "Organization",
      "Brand"
     ],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": false,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 7682,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Yoast SEO does not convert pages to markdown or answer Accept: text/markdown; even yoast.com returned HTML to that request on 2026-11-05.",
    "The Shopify llms.txt from Yoast stays off until the merchant flips its toggle, and a store that already redirects /llms.txt keeps that redirect.",
    "Schema Aggregation in Yoast SEO 27.1 is not on by default, and Yoast's own robots.txt keeps the /wp-json/ path of its schemamap closed to crawlers."
   ],
   "does_not_do_basis": [
    null,
    {
     "fact": 5,
     "keep": "fact"
    },
    {
     "fact": 10,
     "keep": "fact"
    }
   ],
   "related": [
    "wordpress-llmstxt-plugins",
    "wordpress-elementor"
   ],
   "page": "https://agentreadyhtml.com/vendors/yoast/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "sveltekit",
   "name": "SvelteKit",
   "type": "framework",
   "homepage": "https://svelte.dev/docs/kit",
   "one_line": "SvelteKit is the official application framework for Svelte. Pages are server-rendered or prerendered by default, so an agent fetching the raw HTML gets the content, and unmatched routes return a real 404.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "SvelteKit 3.0 was announced on the Svelte blog on 1 October 2026, which calls SvelteKit the official application framework for Svelte.",
     "source_url": "https://svelte.dev/blog/sveltekit-3-is-here",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-01"
    },
    {
     "claim": "SvelteKit 3 moved project configuration out of svelte.config.js into the Vite config file, and renamed the $lib alias to #lib.",
     "source_url": "https://svelte.dev/blog/sveltekit-3-is-here",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-01"
    },
    {
     "claim": "The @sveltejs/kit 3.1.1 patch release was published on GitHub on 29 October 2026; one listed fix makes reroute return HTTP 400 for a malformed pathname instead of throwing.",
     "source_url": "https://github.com/sveltejs/kit/releases/tag/%40sveltejs%2Fkit%403.1.1",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-29"
    },
    {
     "claim": "SvelteKit's page options docs say every component is rendered (or prerendered) on the server first and sent as HTML, then hydrated in the browser by a client-side router.",
     "source_url": "https://svelte.dev/docs/kit/page-options",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "SvelteKit prerendering is set per route with export const prerender = true, false or 'auto'; adapter-static prerenders the whole site into files for any static web server.",
     "source_url": "https://svelte.dev/docs/kit/page-options",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The SvelteKit SEO page says SSR is on by default and can be switched off in the handle hook, and advises leaving it on.",
     "source_url": "https://svelte.dev/docs/kit/seo",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "SvelteKit sets titles and meta descriptions through a <svelte:head> block, with SEO data usually returned from load functions and read in the root layout.",
     "source_url": "https://svelte.dev/docs/kit/seo",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "SvelteKit has no built-in sitemap generator; the SEO docs show a hand-written src/routes/sitemap.xml/+server endpoint that returns XML.",
     "source_url": "https://svelte.dev/docs/kit/seo",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "SvelteKit itself answers a request that matches no route with status 404 and passes it to the handleError hook with kind 'framework'; the error(404) helper does the same from a load function and renders +error.svelte.",
     "source_url": "https://svelte.dev/docs/kit/errors",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "SvelteKit's adapter-static fallback option turns the site into a single-page app served from a page such as 200.html, and the adapter docs warn this hurts performance and SEO.",
     "source_url": "https://svelte.dev/docs/kit/adapter-static",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "SvelteKit redirects URLs to one trailing-slash form (with or without, per the trailingSlash option) so duplicate URLs are not indexed.",
     "source_url": "https://svelte.dev/docs/kit/seo",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "A default SvelteKit 3.1.1 app made on 2026-11-05 with `npx sv@1.3.0 create --template minimal --types ts --no-add-ons --install npm sk-app`, then `npm run build` and `npx vite preview`, served the home page H1 \"Welcome to SvelteKit\" in the raw HTML and answered /made-up-path-xyz with status 404.",
     "source_url": "https://svelte.dev/docs/kit/page-options",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "In the same SvelteKit 3.1.1 preview on 2026-11-05, a request for / with Accept: text/markdown still got text/html with only Vary: Origin, and /llms.txt, /sitemap.xml and /404.html all returned 404; the template ships a static/robots.txt that allows all crawling.",
     "source_url": "https://svelte.dev/docs/kit/seo",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "The default SvelteKit template uses @sveltejs/adapter-auto, which on a local `npm run build` on 2026-11-05 printed a warning that no supported production environment was detected.",
     "source_url": "https://svelte.dev/docs/kit/adapters",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "svelte.dev states support for the llms.txt convention and publishes /llms.txt plus llms-full.txt, llms-medium.txt and llms-small.txt, with package files such as /docs/kit/llms.txt.",
     "source_url": "https://svelte.dev/docs/llms",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "On 2026-11-05 https://svelte.dev/llms.txt returned 200 text/plain at 1,676 bytes and https://svelte.dev/llms-full.txt returned 1,272,878 bytes, while the svelte.dev home page answered Accept: text/markdown with text/html.",
     "source_url": "https://svelte.dev/docs/llms",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "The Svelte team maintains an official MCP server for coding agents, alongside agent instructions, skills and subagents, documented under svelte.dev/docs/ai.",
     "source_url": "https://svelte.dev/docs/ai/overview",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The sveltejs/kit repository is published under the MIT license, with a copyright line dating from 2020.",
     "source_url": "https://github.com/sveltejs/kit",
     "read_date": "2026-11-05",
     "kind": "primary"
    }
   ],
   "products": [
    {
     "name": "SvelteKit",
     "what": "Open source application framework for Svelte with server rendering, prerendering and deploy adapters.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://github.com/sveltejs/kit",
      "note": "MIT license"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No statement found in the SvelteKit page options, SEO, adapters or adapter-static docs about generating llms.txt for an app; svelte.dev serves its own /llms.txt for the Svelte docs."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the SvelteKit page options, SEO, errors or adapter docs; a default 3.1.1 vite preview answered Accept: text/markdown with text/html on 2026-11-05."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No statement found in the SvelteKit page options, SEO or adapter docs about .md copies of app pages."
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "The page options docs say components render on the server first and are sent as HTML; prerender and adapter-static write static HTML.",
     "source_url": "https://svelte.dev/docs/kit/page-options"
    },
    {
     "id": "real-404",
     "status": "supports",
     "evidence": "The errors docs class a request that matches no route as a framework error with status 404; error(404) in load sets the response status.",
     "source_url": "https://svelte.dev/docs/kit/errors"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found in the SvelteKit SEO or adapter docs; the vite preview server for the default template sent Vary: Origin only."
    }
   ],
   "checks": {
    "domain": "svelte.dev",
    "read_on": "2026-11-05",
    "scope": "Plain-fetch checks ran on https://svelte.dev/docs/kit; the Ora and Cloudflare scores cover the whole host svelte.dev.",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 397,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": null
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 1676,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 58,
     "grade": "C",
     "scanned_at": "2026-09-13T12:40:18.418+00:00",
     "via": "GET https://ora.ai/api/score/svelte.dev (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 13,
     "level": "L0 Not Ready",
     "scanned_at": "2026-11-05T14:02:03.687Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "SvelteKit has no setting that writes an llms.txt for your app; the llms.txt files on svelte.dev cover the Svelte documentation only.",
    "SvelteKit leaves sitemap.xml to the developer; the SEO page shows a hand-written +server endpoint, and a default build serves no sitemap.",
    "A SvelteKit app switched to SPA mode with an adapter-static fallback page sends a near-empty HTML shell for unprerendered URLs, which the docs warn hurts SEO."
   ],
   "does_not_do_basis": [
    {
     "fact": 14,
     "keep": "both"
    },
    {
     "fact": 7,
     "keep": "fact"
    },
    {
     "fact": 9,
     "keep": "fact"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/sveltekit/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "react-router",
   "name": "React Router",
   "type": "framework",
   "operator": "Shopify",
   "homepage": "https://reactrouter.com/",
   "one_line": "React Router v7 and later is the merged successor of Remix. In framework mode it server-renders documents by default (ssr: true), can prerender listed paths to static HTML, and sets 404 status codes from loaders.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "React Router 8.0.0 shipped on 2026-06-17 as the first major release on a yearly cadence under the project's Open Governance model, per the React Router changelog.",
     "source_url": "https://reactrouter.com/changelog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-06-17"
    },
    {
     "claim": "React Router 8.5.1, the npm latest on 2026-11-05, is dated 2026-10-27 in the changelog; the 7.x line is still patched alongside it (7.18.5).",
     "source_url": "https://reactrouter.com/changelog",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-27"
    },
    {
     "claim": "The reactrouter.com home page lists the v8 baseline as Node 22+, Vite 7+, React 19+ and ESM-only packages, and calls the upgrade from v7 non-breaking.",
     "source_url": "https://reactrouter.com/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Remix team announced on 15 May 2024 that the release planned as Remix v3 would ship as React Router v7, and the post was later updated to say v7 was out (December 2024).",
     "source_url": "https://remix.run/blog/merging-remix-and-react-router",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2024-05-15"
    },
    {
     "claim": "React Router framework mode supports prerendering alongside a runtime server with ssr:true, which the pre-rendering guide names as the default value, or on a static file server with ssr:false.",
     "source_url": "https://reactrouter.com/how-to/pre-rendering",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Setting prerender: true in react-router.config.ts prerenders only the static paths from routes.ts; dynamic routes such as /blog/:slug need an explicit path list or a prerender function.",
     "source_url": "https://reactrouter.com/how-to/pre-rendering",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "React Router SPA Mode (ssr:false) still renders the root route at build time into index.html, so the shell carries the root HydrateFallback markup rather than an empty div.",
     "source_url": "https://reactrouter.com/how-to/spa",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "React Router's experimental ssr: \"unstable_api-only\" mode keeps a server for loaders and actions but builds a root-only index.html shell, and its production handler returns 404 for document requests.",
     "source_url": "https://reactrouter.com/start/framework/rendering",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "React Router sets HTTP status codes from loaders and actions with the data() helper; the status code guide throws data(\"Not Found\", { status: 404 }) to reach the route ErrorBoundary.",
     "source_url": "https://reactrouter.com/how-to/status",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "React Router's route module docs recommend React 19's built-in <title> and <meta> elements over the older meta export, which the <Meta /> component renders in the document head.",
     "source_url": "https://reactrouter.com/start/framework/route-module",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "A default app made on 2026-11-05 with `npx create-react-router@8.5.1 rr-app --yes --no-git-init --install --package-manager npm`, built with `npm run build` and served with react-router-serve, returned status 404 with an H1 of \"404\" for /made-up-path-xyz; the home page HTML carried <title>New React Router App</title> but no H1 element.",
     "source_url": "https://reactrouter.com/how-to/status",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "The same React Router 8.5.1 build answered Accept: text/markdown on / with text/html and Vary: Accept-Encoding only, and served no robots.txt, llms.txt or sitemap.xml (all 404) on 2026-11-05.",
     "source_url": "https://reactrouter.com/start/framework/rendering",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "create-react-router can set up the React Router Agent Skill in a new project, and the --no-agent-skills flag skips copying it; the default template scaffolded on 2026-11-05 held .agents/skills/react-router/SKILL.md.",
     "source_url": "https://reactrouter.com/changelog",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "The reactrouter.com docs site negotiates markdown for its own pages; on 2026-11-05 /how-to/status with Accept: text/markdown returned text/markdown (1,514 bytes) with Vary: Accept, and /how-to/status.md served the same file.",
     "source_url": "https://reactrouter.com/how-to/status",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "reactrouter.com served no llms.txt on 2026-11-05 (status 404), although each docs page carries a Copy Page as Markdown control.",
     "source_url": "https://reactrouter.com/how-to/status",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "The reactrouter.com home page footer reads \"© 2026 Shopify, Inc.\", and the same page says React Router is run under an Open Governance model.",
     "source_url": "https://reactrouter.com/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "React Router is MIT licensed; the LICENSE file lists copyright holders React Training LLC (2015 to 2019), Remix Software Inc. (2020 to 2021) and Shopify Inc. (2022 to 2023).",
     "source_url": "https://github.com/remix-run/react-router/blob/main/LICENSE.md",
     "read_date": "2026-11-05",
     "kind": "primary"
    }
   ],
   "products": [
    {
     "name": "React Router",
     "what": "Open source routing library and full-stack React framework (framework, data and declarative modes), the successor to Remix.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://github.com/remix-run/react-router/blob/main/LICENSE.md",
      "note": "MIT License"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No statement found in the React Router rendering, pre-rendering, SPA or route module docs about generating llms.txt; reactrouter.com itself returned 404 for /llms.txt on 2026-11-05."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No framework feature found in the rendering or route module docs; the reactrouter.com docs site answers Accept: text/markdown for its own pages, but a default 8.5.1 app did not."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No statement found in the React Router framework docs read; the .md copies on reactrouter.com belong to the docs site, not to apps built with the framework."
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "The pre-rendering guide names ssr:true as the default value for a runtime SSR server; prerender writes static HTML at build time.",
     "source_url": "https://reactrouter.com/how-to/pre-rendering"
    },
    {
     "id": "real-404",
     "status": "supports",
     "evidence": "The status codes guide throws data(\"Not Found\", { status: 404 }) from a loader; a default build returned 404 for an unknown path.",
     "source_url": "https://reactrouter.com/how-to/status"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found in the framework docs read; the default react-router-serve response carried Vary: Accept-Encoding only."
    }
   ],
   "checks": {
    "domain": "reactrouter.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 192,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "cookie, accept-encoding, Accept-Encoding"
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 6890,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 31,
     "grade": "D",
     "scanned_at": "2026-08-28T08:24:45.381+00:00",
     "via": "GET https://ora.ai/api/score/reactrouter.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 0,
     "level": "L0 Not Ready",
     "scanned_at": "2026-11-05T14:02:26.335Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "React Router's default create-react-router template ships no robots.txt, sitemap.xml or llms.txt, and its welcome page has no H1 element.",
    "The markdown negotiation seen on reactrouter.com is the docs site's own setup; React Router apps answer Accept: text/markdown with HTML unless you add a resource route.",
    "With prerender: true, React Router skips dynamic routes such as /blog/:slug unless their paths are listed in react-router.config.ts."
   ],
   "does_not_do_basis": [
    {
     "fact": 11,
     "keep": "fact"
    },
    {
     "fact": 13,
     "keep": "limit"
    },
    {
     "fact": 5,
     "keep": "fact"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/react-router/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "gatsby",
   "name": "Gatsby",
   "type": "framework",
   "operator": "Netlify",
   "homepage": "https://www.gatsbyjs.com/",
   "one_line": "Gatsby is a React framework that prerenders every page to static HTML at build time by default (SSG), with deferred generation and SSR per page. It builds a 404.html, while llms.txt and sitemaps come from plugins.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Gatsby's rendering options guide names static site generation as the default, so every page is prerendered to HTML, CSS and JavaScript at build time.",
     "source_url": "https://www.gatsbyjs.com/docs/conceptual/rendering-options/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Since Gatsby 4, pages can opt into Deferred Static Generation or SSR per page; DSG needs the build server kept running with gatsby serve.",
     "source_url": "https://www.gatsbyjs.com/docs/conceptual/rendering-options/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Gatsby builds the page at src/pages/404.js into a 404.html file, the name many static hosts use for their not-found page.",
     "source_url": "https://www.gatsbyjs.com/docs/how-to/adding-common-features/add-404-page/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Gatsby's 404 guide leaves the status code to the host, and sites served another way need a custom rule to serve 404.html for missing paths.",
     "source_url": "https://www.gatsbyjs.com/docs/how-to/adding-common-features/add-404-page/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Gatsby's built-in Head export sets page titles and meta tags; support arrived in gatsby@4.19.0, and the docs allow JSON-LD script blocks inside it.",
     "source_url": "https://www.gatsbyjs.com/docs/reference/built-in-components/gatsby-head/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The official gatsby-plugin-sitemap writes sitemap-index.xml for all pages, but only in production builds.",
     "source_url": "https://www.gatsbyjs.com/plugins/gatsby-plugin-sitemap/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Gatsby plugin library lists gatsby-plugin-llms-txt, marked as a Community Plugin, which writes an llms.txt from CMS or other source data at build time.",
     "source_url": "https://www.gatsbyjs.com/plugins/gatsby-plugin-llms-txt/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Gatsby 5.16.0 (January 2026) added React 19 and Node.js 24 support as a non-breaking release, per the Gatsby release notes.",
     "source_url": "https://www.gatsbyjs.com/docs/reference/release-notes/v5.16/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-01-26"
    },
    {
     "claim": "On 2026-11-05 `npm view gatsby` reported 5.16.1, published 10 February 2026, as the latest Gatsby release.",
     "source_url": "https://www.gatsbyjs.com/docs/reference/release-notes/v5.16/",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-02-10"
    },
    {
     "claim": "Gatsby's version support page lists v5 as the Active Long-term support line since November 8, 2022, and v4 as maintenance until Q4 2023.",
     "source_url": "https://www.gatsbyjs.com/docs/reference/release-notes/gatsby-version-support/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Netlify announced on February 1, 2023 that it had acquired Gatsby Inc., the company behind the open source Gatsby framework.",
     "source_url": "https://www.netlify.com/press/netlify-acquires-gatsby-inc-to-accelerate-adoption-of-composable-web-architectures/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2023-02-01"
    },
    {
     "claim": "gatsbyjs.com carries a site-wide banner moving Gatsby Cloud customers to Netlify, while its footer still reads \"© 2026 Gatsby, Inc.\".",
     "source_url": "https://www.gatsbyjs.com/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "On 2026-11-05 gatsbyjs.com returned 404 for /llms.txt, answered Accept: text/markdown on the home page with text/html, and returned a real 404 for a made-up path.",
     "source_url": "https://www.gatsbyjs.com/",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "The gatsbyjs/gatsby repository on GitHub is published under the MIT license.",
     "source_url": "https://github.com/gatsbyjs/gatsby",
     "read_date": "2026-11-05",
     "kind": "primary"
    }
   ],
   "products": [
    {
     "name": "Gatsby",
     "what": "Open source React framework that prerenders sites to static HTML, with optional deferred static generation and SSR.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://github.com/gatsbyjs/gatsby",
      "note": "MIT license"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "Only through gatsby-plugin-llms-txt, which the Gatsby plugin library marks as a Community Plugin; no official plugin found.",
     "source_url": "https://www.gatsbyjs.com/plugins/gatsby-plugin-llms-txt/"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the rendering options, Head API, 404 or release notes pages; gatsbyjs.com answered Accept: text/markdown with HTML."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No statement found in the Gatsby docs or official plugin pages read about .md copies of pages."
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "The rendering options guide calls SSG the default, with the entire site pre-rendered into HTML at build time.",
     "source_url": "https://www.gatsbyjs.com/docs/conceptual/rendering-options/"
    },
    {
     "id": "real-404",
     "status": "partial",
     "evidence": "Gatsby builds 404.html, but the 404 guide says hosts outside the default convention need a custom rule to serve it for 404 errors.",
     "source_url": "https://www.gatsbyjs.com/docs/how-to/adding-common-features/add-404-page/"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found in the Gatsby rendering options, 404, Head API or gatsby-plugin-sitemap pages about a Vary header."
    }
   ],
   "checks": {
    "domain": "gatsbyjs.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 129,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding"
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 39260,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 34,
     "grade": "D",
     "scanned_at": "2026-09-04T09:15:39.862+00:00",
     "via": "GET https://ora.ai/api/score/gatsbyjs.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T14:02:39.449Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "Gatsby writes 404.html but does not set the HTTP status itself; the host decides whether a missing path gets that page with a 404 code.",
    "Gatsby has no official llms.txt plugin; the gatsby-plugin-llms-txt listing in its plugin library is a Community Plugin.",
    "Gatsby ships no sitemap until gatsby-plugin-sitemap is added, and that plugin produces nothing in gatsby develop."
   ],
   "does_not_do_basis": [
    {
     "fact": 3,
     "keep": "fact"
    },
    {
     "fact": 6,
     "keep": "fact"
    },
    null
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/gatsby/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "angular",
   "name": "Angular",
   "type": "framework",
   "operator": "Google",
   "homepage": "https://angular.dev/",
   "one_line": "Angular is Google's TypeScript web framework that client-renders apps by default, and adding @angular/ssr turns on hybrid rendering, which prerenders every route unless server routes say otherwise and lets each route set its own HTTP status.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Angular's server and hybrid rendering guide states that Angular apps are client-side rendered by default.",
     "source_url": "https://angular.dev/guide/ssr",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Angular turns on hybrid rendering with `ng new --ssr` for a new project or `ng add @angular/ssr` for an existing one.",
     "source_url": "https://angular.dev/guide/ssr",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Once @angular/ssr is added, Angular prerenders the whole app and writes a server file; routes switch to on-request SSR only when app.routes.server.ts sets RenderMode.Server.",
     "source_url": "https://angular.dev/guide/ssr",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Angular server routes take headers and status properties in the ServerRoute config, which is how a route returns a code other than 200.",
     "source_url": "https://angular.dev/guide/ssr",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "In prerendered (SSG) Angular output, redirectTo routes become meta refresh tags, while on-request SSR sends real HTTP 301 or 302 redirects.",
     "source_url": "https://angular.dev/guide/ssr",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "For Angular prerendered routes with parameters, paths not produced by getPrerenderParams fall back to server rendering unless the fallback is set to Client or None.",
     "source_url": "https://angular.dev/guide/ssr",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Angular manages page titles and meta tags through its Title and Meta services, which the SSR guide points to for meta tag handling.",
     "source_url": "https://angular.dev/guide/ssr",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Angular 22 was released on 2026-06-03 and is in active support until 2027-06, with long-term support to 2028-06, per the Angular releases page.",
     "source_url": "https://angular.dev/reference/releases",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-06-03"
    },
    {
     "claim": "Starting with v22 Angular moved from a six-month to a twelve-month major release cycle, with v23.0 pencilled in for about June 2027.",
     "source_url": "https://angular.dev/reference/releases",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Angular v22 release page lists Signal Forms, Asynchronous Signals and Angular Aria as now stable, alongside template and AI tooling updates.",
     "source_url": "https://angular.dev/events/v22",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "On 2026-11-05 `npm view` reported @angular/core 22.2.4 (published 2026-10-29) and @angular/ssr 22.2.6 (published 2026-11-04) as the latest Angular releases.",
     "source_url": "https://angular.dev/reference/releases",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-04"
    },
    {
     "claim": "The Angular team publishes llms.txt as an index and llms-full.txt as a compiled reference for code-generating LLMs; the full file sits at /assets/context/llms-full.txt (859,329 bytes on 2026-11-05).",
     "source_url": "https://angular.dev/ai/develop-with-ai",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Angular CLI ships a Model Context Protocol server, started with `npx @angular/cli mcp`, that lets coding assistants run code generation, workspace analysis, builds and tests.",
     "source_url": "https://angular.dev/ai/mcp",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Angular has experimental WebMCP support, where provideExperimentalWebMcpTools registers in-browser tools for AI agents, and Signal Forms can be exposed as tools.",
     "source_url": "https://angular.dev/ai/webmcp",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "On 2026-11-05 angular.dev answered a made-up path with status 200 and an HTML page, and the root /llms-full.txt also returned 200 text/html rather than the text file.",
     "source_url": "https://angular.dev/llms.txt",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Angular is MIT licensed with copyright held by Google LLC, and angular.dev's footer reads \"Super-powered by Google ©2010-2026.\"",
     "source_url": "https://angular.dev/license",
     "read_date": "2026-11-05",
     "kind": "primary"
    }
   ],
   "products": [
    {
     "name": "Angular (with @angular/ssr)",
     "what": "Open source TypeScript web framework from Google; the @angular/ssr package adds server rendering, prerendering and per-route render modes.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://angular.dev/license",
      "note": "MIT License"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No statement found in the SSR guide or the Build with AI pages about generating llms.txt for an app; angular.dev publishes its own llms.txt and llms-full.txt for the Angular docs."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the SSR guide or AI pages; angular.dev answered Accept: text/markdown with text/html on 2026-11-05."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No statement found in the Angular SSR or AI docs read about .md copies of app pages."
    },
    {
     "id": "initial-html",
     "status": "partial",
     "evidence": "CSR is the default; server HTML needs ng new --ssr or ng add @angular/ssr, after which routes are prerendered by default.",
     "source_url": "https://angular.dev/guide/ssr"
    },
    {
     "id": "real-404",
     "status": "partial",
     "evidence": "ServerRoute config takes a status property per route; nothing in the guide sets 404 for unknown paths on its own.",
     "source_url": "https://angular.dev/guide/ssr"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found in the Angular SSR guide or Build with AI pages."
    }
   ],
   "checks": {
    "domain": "angular.dev",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 242,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "x-fh-requested-host, accept-encoding"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 6745,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 200
     }
    },
    "ora": {
     "score": 45,
     "grade": "D",
     "scanned_at": "2026-08-21T19:26:53.547+00:00",
     "via": "GET https://ora.ai/api/score/angular.dev (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T14:02:53.743Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "An Angular app created without --ssr sends a client-rendered shell, so an agent that skips JavaScript sees no page content until @angular/ssr is added.",
    "Angular leaves non-200 codes to the status property in app.routes.server.ts; the angular.dev site itself answered a made-up path with 200 on 2026-11-05.",
    "Prerendered Angular routes turn redirectTo into meta refresh tags, so a crawler reading SSG output gets a 200 page instead of a 301 or 302."
   ],
   "does_not_do_basis": [
    null,
    {
     "fact": 14,
     "keep": "limit"
    },
    {
     "fact": 4,
     "keep": "fact"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/angular/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "tanstack-start",
   "name": "TanStack Start",
   "type": "framework",
   "operator": "TanStack LLC",
   "homepage": "https://tanstack.com/start/latest",
   "one_line": "TanStack Start is a full-stack React and Solid framework built on TanStack Router. Routes render on the server by default, prerendering and a sitemap are opt-in, and a default build answers a markdown-only Accept header with 406.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "TanStack Start 1.0 was declared stable in a TanStack blog post by Tanner Linsley dated Tuesday, October 13, 2026.",
     "source_url": "https://tanstack.com/blog/tanstack-start-1-0",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-13"
    },
    {
     "claim": "The @tanstack/react-start 1.169.4 release, the npm latest on 2026-11-05, was published on GitHub on 22 October 2026 by the TanStack/router release workflow.",
     "source_url": "https://github.com/TanStack/router/releases/tag/%40tanstack%2Freact-start%401.169.4",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-22"
    },
    {
     "claim": "The TanStack Start overview says Start adds full-document SSR, streaming, server functions and client/server builds on top of TanStack Router, with Vite or Rsbuild as the build tool.",
     "source_url": "https://tanstack.com/start/latest/docs/framework/react/overview",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "In TanStack Start, routes that match the initial request render on the server unless a route sets ssr: false or ssr: 'data-only', or the router sets defaultSsr: false.",
     "source_url": "https://tanstack.com/start/latest/docs/framework/react/guide/selective-ssr.md",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "TanStack Start static prerendering is off until prerender.enabled is set in the tanstackStart plugin config; crawlLinks follows links in rendered HTML to find more pages.",
     "source_url": "https://tanstack.com/start/latest/docs/framework/react/guide/static-prerendering.md",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "TanStack Start can write a sitemap at build time when prerendering with crawlLinks is on and the sitemap option has enabled: true and a host URL.",
     "source_url": "https://tanstack.com/start/latest/docs/framework/react/guide/seo.md",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "TanStack Start sets titles, meta tags and JSON-LD through a route's head property; the SEO guide shows a script entry with type application/ld+json built from loader data.",
     "source_url": "https://tanstack.com/start/latest/docs/framework/react/guide/seo.md",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The TanStack Start GEO guide shows llms.txt as a hand-written server route at src/routes/llms[.]txt.ts returning text/plain; the framework has no llms.txt generator.",
     "source_url": "https://tanstack.com/start/latest/docs/framework/react/guide/geo.md",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "TanStack Start SPA mode prerenders a /_shell.html page and sets default rewrites that send every 404 request to that shell.",
     "source_url": "https://tanstack.com/start/latest/docs/framework/react/guide/spa-mode.md",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "TanStack Router, which Start uses for routing, handles unmatched paths with notFoundComponent; the default notFoundMode is fuzzy, so the closest matching route with that component renders.",
     "source_url": "https://tanstack.com/router/latest/docs/guide/not-found-errors.md",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "A default app made on 2026-11-05 with `npx @tanstack/cli@0.72.16 create ts-app --framework React --package-manager npm --yes --no-git --no-intent` (@tanstack/react-start 1.169.4), built with `npm run build` and run with `npx vite preview`, put the H1 \"Start simple, ship quickly.\" in the server HTML and returned 404 for /made-up-path-xyz.",
     "source_url": "https://tanstack.com/start/latest/docs/framework/react/guide/selective-ssr.md",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "The same TanStack Start 1.169.4 preview answered a request for / with Accept: text/markdown with status 406 and the JSON body {\"error\":\"Only HTML requests are supported here\"}; Accept: text/markdown, text/html;q=0.9 got 200 HTML.",
     "source_url": "https://tanstack.com/start/latest/docs/framework/react/guide/seo.md",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "The default TanStack Start starter built on 2026-11-05 had no public folder and served no robots.txt, sitemap.xml or llms.txt (all 404 in vite preview).",
     "source_url": "https://tanstack.com/start/latest/docs/framework/react/guide/seo.md",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "tanstack.com docs pages carry a note that each page is available as plain markdown at the same path with .md, for example /start/latest/docs/framework/react/getting-started.md.",
     "source_url": "https://tanstack.com/start/latest/docs/framework/react/getting-started",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "On 2026-11-05 a tanstack.com docs page requested with Accept: text/markdown returned text/markdown with Vary: Accept, while the tanstack.com home page returned 406 for the same header.",
     "source_url": "https://tanstack.com/start/latest/docs/framework/react/overview",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "tanstack.com/llms.txt routes agents to per-library indexes, and the root llms-full.txt returns the same index on purpose because the full docs corpus is too large.",
     "source_url": "https://tanstack.com/llms.txt",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The TanStack Start llms.txt at /start/latest/llms.txt is an index of per-page markdown docs (for example guide/selective-ssr.md) and tells agents to fetch one linked page at a time.",
     "source_url": "https://tanstack.com/start/latest/llms.txt",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Start overview says tanstack.com is owned by TanStack LLC, a privately held and self-funded company; the TanStack/router repository is MIT licensed.",
     "source_url": "https://tanstack.com/start/latest/docs/framework/react/overview",
     "read_date": "2026-11-05",
     "kind": "primary"
    }
   ],
   "products": [
    {
     "name": "TanStack Start",
     "what": "Open source full-stack framework for React and Solid built on TanStack Router, with SSR, streaming, server functions and optional prerendering.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://github.com/TanStack/router",
      "note": "MIT license (TanStack/router repository)"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "The GEO guide shows how to write /llms.txt yourself as a server route (src/routes/llms[.]txt.ts); nothing is generated by default.",
     "source_url": "https://tanstack.com/start/latest/docs/framework/react/guide/geo.md"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the SEO, GEO or rendering markdown guides; a default 1.169.4 build returned 406 for Accept: text/markdown instead of markdown."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No framework feature found in the guides read; the .md copies on tanstack.com belong to the docs site."
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "The selective SSR guide says routes matching the initial request are rendered on the server by default, and the SEO guide says SSR is enabled by default.",
     "source_url": "https://tanstack.com/start/latest/docs/framework/react/guide/selective-ssr.md"
    },
    {
     "id": "real-404",
     "status": "partial",
     "evidence": "Not-found handling renders notFoundComponent and a default build returned 404, but SPA mode rewrites all 404 requests to /_shell.html.",
     "source_url": "https://tanstack.com/start/latest/docs/framework/react/guide/spa-mode.md"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found in the selective SSR, SPA mode or SEO guides; the default starter preview response carried Vary: Origin."
    }
   ],
   "checks": {
    "domain": "tanstack.com",
    "read_on": "2026-11-05",
    "scope": "Plain-fetch checks ran on https://tanstack.com/start/latest; the Ora and Cloudflare scores cover the whole host tanstack.com.",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 345,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 406,
      "content_type": "application/json",
      "vary": null
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 13973,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 75,
     "grade": "B",
     "scanned_at": "2026-10-24T06:04:45.738+00:00",
     "via": "GET https://ora.ai/api/score/tanstack.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 27,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T14:03:38.913Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "TanStack Start does not turn Accept: text/markdown into markdown; a default 1.169.4 build refuses that header with a 406 JSON error unless HTML is also accepted.",
    "TanStack Start's default starter has no robots.txt, sitemap or llms.txt; each one is either a file you add to public/ or a server route from the SEO and GEO guides.",
    "In SPA mode TanStack Start serves its /_shell.html for every unknown URL through 200 rewrites, so missing pages stop returning 404."
   ],
   "does_not_do_basis": [
    {
     "fact": 11,
     "keep": "fact"
    },
    {
     "fact": 12,
     "keep": "fact"
    },
    {
     "fact": 8,
     "keep": "limit"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/tanstack-start/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "hugo",
   "name": "Hugo",
   "type": "framework",
   "homepage": "https://gohugo.io/",
   "one_line": "Hugo is a static site generator written in Go that renders every page to HTML at build time, writes sitemap.xml by default and ships a built-in markdown output format that sites can switch on per page kind.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Hugo's own introduction describes it as a static site generator written in Go that renders a complete site in seconds.",
     "source_url": "https://gohugo.io/about/introduction/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Hugo v0.169.0 was released on GitHub on 27 October 2026, mainly to ship a build with Go 1.27.3; the same release HTML-escapes menu pre and post values taken from front matter.",
     "source_url": "https://github.com/gohugoio/hugo/releases/tag/v0.169.0",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-10-27"
    },
    {
     "claim": "Hugo renders a custom not-found page from a layouts/404.html template, with per-language variants such as 404.de.html.",
     "source_url": "https://gohugo.io/templates/404/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Hugo's 404 docs hand the status code to the production host and list per-host setup for CloudFront, S3, Apache, NGINX, Netlify and others; on GitHub Pages it is automatic.",
     "source_url": "https://gohugo.io/templates/404/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Hugo writes robots.txt only after enableRobotsTXT is set to true in the project configuration, using an embedded template unless the site overrides it.",
     "source_url": "https://gohugo.io/templates/robots/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Hugo generates sitemap.xml in the root of the public directory by default for a single-language site, using an embedded template that follows sitemap protocol v0.9.",
     "source_url": "https://gohugo.io/templates/sitemap/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Hugo's built-in output formats include markdown with media type text/markdown and base name index, next to html, json, rss, robots and sitemap.",
     "source_url": "https://gohugo.io/configuration/output-formats/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "By default Hugo renders only html for regular pages and html plus rss for the home page, sections, taxonomies and terms; other formats such as markdown or json need an outputs entry and a template.",
     "source_url": "https://gohugo.io/configuration/outputs/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Hugo's embedded Schema partial (schema.html) writes microdata meta elements in the head, filling name, description, datePublished and similar fields from page data.",
     "source_url": "https://gohugo.io/templates/embedded/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Hugo also ships embedded opengraph.html and twitter_cards.html partials that build social metadata from site configuration and front matter.",
     "source_url": "https://gohugo.io/templates/embedded/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The gohugoio/hugo repository is published under the Apache-2.0 license.",
     "source_url": "https://github.com/gohugoio/hugo",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "On 2026-11-05 gohugo.io returned 404 for /llms.txt, /robots.txt and the index.md path of a docs page, served /sitemap.xml as application/xml, and returned a real 404 for a made-up path.",
     "source_url": "https://gohugo.io/templates/404/",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Hugo",
     "what": "Open source static site generator written in Go, with built-in sitemap, robots, RSS, JSON and markdown output formats.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://github.com/gohugoio/hugo",
      "note": "Apache-2.0 license"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No statement found in the Hugo output formats, outputs, embedded templates or v0.169.0 release notes; the gohugo.io docs site itself publishes no llms.txt."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the Hugo output formats or 404 template pages; Hugo writes static files into public/ and leaves serving to the host."
    },
    {
     "id": "markdown-twin",
     "status": "partial",
     "evidence": "A built-in markdown output format (text/markdown, base name index) exists, but default outputs are html and rss only, so it needs an outputs entry and a template.",
     "source_url": "https://gohugo.io/configuration/output-formats/"
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "Hugo is a static site generator that renders each page to HTML at build time.",
     "source_url": "https://gohugo.io/about/introduction/"
    },
    {
     "id": "real-404",
     "status": "partial",
     "evidence": "Hugo renders 404.html from layouts/404.html; the docs say the production host serves it and setup varies by host.",
     "source_url": "https://gohugo.io/templates/404/"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found in the Hugo output formats, outputs or 404 template pages about a Vary header."
    }
   ],
   "checks": {
    "domain": "gohugo.io",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 253,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding"
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 55908,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 34,
     "grade": "D",
     "scanned_at": "2026-09-04T09:15:55.507+00:00",
     "via": "GET https://ora.ai/api/score/gohugo.io (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 7,
     "level": "L0 Not Ready",
     "scanned_at": "2026-11-05T14:03:50.973Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 4624,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 323,
     "js_shell": false,
     "jsonld_types": [],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": false,
     "missing_path_status": 404,
     "llms_txt_valid": false,
     "llms_txt_bytes": 55908,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Hugo writes no index.md next to each page out of the box; its markdown output format stays idle until outputs lists it and a matching template exists.",
    "Hugo's embedded schema.html partial emits microdata meta tags, so JSON-LD needs a partial you write yourself.",
    "Hugo cannot set an HTTP status for missing pages; it builds 404.html and the host (NGINX, S3, Netlify and so on) decides the response."
   ],
   "does_not_do_basis": [
    null,
    {
     "fact": 8,
     "keep": "both"
    },
    {
     "fact": 3,
     "keep": "fact"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/hugo/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "jekyll",
   "name": "Jekyll",
   "type": "framework",
   "homepage": "https://jekyllrb.com/",
   "one_line": "Jekyll is a Ruby static site generator and the engine behind GitHub Pages. It turns Markdown and Liquid templates into plain HTML files; sitemaps and JSON-LD come from the jekyll-sitemap and jekyll-seo-tag plugins.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "The Jekyll docs describe it as a static site generator that turns text in a markup language plus layouts into a static website.",
     "source_url": "https://jekyllrb.com/docs/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Jekyll README says it renders Markdown and Liquid into a complete static site for Apache, Nginx or another server, and that Jekyll is the engine behind GitHub Pages.",
     "source_url": "https://github.com/jekyll/jekyll",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Jekyll's quickstart installs the jekyll and bundler gems, scaffolds a site with `jekyll new myblog` and needs Ruby 2.7.0 or higher.",
     "source_url": "https://jekyllrb.com/docs/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Jekyll 4.4.1, a patch restoring globbed path matching in front matter defaults, was announced on jekyllrb.com on 29 January 2025.",
     "source_url": "https://jekyllrb.com/news/2025/01/29/jekyll-4-4-1-released/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-01-29"
    },
    {
     "claim": "On 2026-11-05 the newest entry in the jekyllrb.com news list was still the Jekyll 4.4.1 release, and the site header showed v4.4.1.",
     "source_url": "https://jekyllrb.com/news/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Jekyll's custom 404 tutorial says a 404.html at the root of _site is served automatically by GitHub Pages and by the local WEBrick server.",
     "source_url": "https://jekyllrb.com/tutorials/custom-404-page/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "For Apache and Nginx hosts, the Jekyll 404 tutorial adds ErrorDocument 404 /404.html to .htaccess or an error_page 404 rule in the nginx server block.",
     "source_url": "https://jekyllrb.com/tutorials/custom-404-page/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Minima is the theme `jekyll new` installs, and its README says it comes with the jekyll-seo-tag plugin preinstalled.",
     "source_url": "https://github.com/jekyll/minima",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The jekyll-seo-tag plugin adds title, description, canonical URL, Open Graph and Twitter tags, plus JSON-LD site and post metadata.",
     "source_url": "https://github.com/jekyll/jekyll-seo-tag",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The jekyll-sitemap plugin writes a sitemaps.org sitemap once it is listed under plugins in _config.yml; the GitHub Pages gem ignores it if it appears only in the Gemfile.",
     "source_url": "https://github.com/jekyll/jekyll-sitemap",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Setting safe: true in a Jekyll _config.yml turns off all plugins, so jekyll-sitemap writes no sitemap.xml in that mode.",
     "source_url": "https://github.com/jekyll/jekyll-sitemap",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "jekyllrb.com says Jekyll is maintained by a core team of volunteers, and the jekyll/jekyll repository is MIT licensed.",
     "source_url": "https://jekyllrb.com/tutorials/custom-404-page/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "On 2026-11-05 jekyllrb.com returned 404 for /llms.txt and for a made-up path, and answered Accept: text/markdown on the home page with text/html.",
     "source_url": "https://jekyllrb.com/",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Jekyll",
     "what": "Open source Ruby static site generator that turns Markdown and Liquid templates into static HTML; it powers GitHub Pages.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://github.com/jekyll/jekyll",
      "note": "MIT license"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No statement found in the Jekyll docs, plugins page, news list or the jekyll-seo-tag and jekyll-sitemap READMEs, and the jekyllrb.com site has no llms.txt of its own."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the Jekyll quickstart or custom 404 tutorial; Jekyll writes static files to _site and the web server decides content types."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No statement found in the Jekyll quickstart or plugin READMEs; Markdown sources are converted to .html files in _site."
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "The Jekyll quickstart calls it a static site generator that uses layouts to create a static website, so pages ship as complete HTML.",
     "source_url": "https://jekyllrb.com/docs/"
    },
    {
     "id": "real-404",
     "status": "partial",
     "evidence": "404.html is served automatically by GitHub Pages and WEBrick; Apache and Nginx need ErrorDocument or error_page rules per the tutorial.",
     "source_url": "https://jekyllrb.com/tutorials/custom-404-page/"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found in the Jekyll quickstart, 404 tutorial or plugin READMEs about Vary or content negotiation."
    }
   ],
   "checks": {
    "domain": "jekyllrb.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 152,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding"
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 5445,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "unavailable": "GET /api/score returned 404 DOMAIN_NOT_SCANNED"
    },
    "cloudflare": {
     "score": 7,
     "level": "L0 Not Ready",
     "scanned_at": "2026-11-05T14:04:14.857Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "Jekyll keeps no markdown copy in _site, since every .md source page is converted to an .html file, so a page's markdown is not reachable at a URL unless you copy it as a static file.",
    "Jekyll core writes no sitemap.xml or JSON-LD; both come from the jekyll-sitemap and jekyll-seo-tag plugins, which stop working under safe: true.",
    "Outside GitHub Pages and WEBrick, a Jekyll 404.html gets a 404 status only after the server is configured with ErrorDocument or error_page."
   ],
   "does_not_do_basis": [
    null,
    {
     "fact": 10,
     "keep": "both"
    },
    {
     "fact": 5,
     "keep": "fact"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/jekyll/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "eleventy",
   "name": "Eleventy (11ty)",
   "type": "framework",
   "operator": "Font Awesome",
   "homepage": "https://www.11ty.dev/",
   "one_line": "Eleventy (11ty), now being renamed Build Awesome, is a JavaScript static site generator that turns Markdown, Nunjucks, Liquid and other templates into plain HTML files, with a 404.html convention and no server runtime.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "The Eleventy getting-started guide describes templates in Markdown, HTML, Liquid, Nunjucks and other formats that Eleventy transforms into pages at build time.",
     "source_url": "https://www.11ty.dev/docs/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Eleventy's quickstart sets a project up by hand with npm init, `npm install @11ty/eleventy` and `npx @11ty/eleventy`, and names v3.1.8 as the newest version.",
     "source_url": "https://www.11ty.dev/docs/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Eleventy v3.1.8 was published on GitHub on 3 November 2026; the patch reverts the Nunjucks dependency to nunjucks@3.2.4 to fix regressions with setLibrary.",
     "source_url": "https://github.com/11ty/buildawesome/releases/tag/v3.1.8",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-03"
    },
    {
     "claim": "On 3 March 2026 the Eleventy blog announced the project is being renamed Build Awesome, with Eleventy v4 to ship as Build Awesome v4 and existing plugins and build commands kept compatible.",
     "source_url": "https://www.11ty.dev/blog/build-awesome/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-03-03"
    },
    {
     "claim": "The Build Awesome post says a paid Build Awesome Pro tier is planned but will not be required to use the open source generator.",
     "source_url": "https://www.11ty.dev/blog/build-awesome/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Eleventy joined Font Awesome, announced on the 11ty blog on 12 September 2024, with the open source project continuing under the same maintainer.",
     "source_url": "https://www.11ty.dev/blog/eleventy-font-awesome/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2024-09-12"
    },
    {
     "claim": "Eleventy's 404 quick tip writes a template with permalink: 404.html, which Eleventy outputs as a static 404.html file.",
     "source_url": "https://www.11ty.dev/docs/quicktips/not-found/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Per the Eleventy 404 tip, GitHub Pages, GitLab Pages, Netlify, Cloudflare Pages and Vercel pick up 404.html with no further setup, while .htaccess hosts need ErrorDocument 404 /404.html.",
     "source_url": "https://www.11ty.dev/docs/quicktips/not-found/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Eleventy Dev Server, added in v2.0.0 and started with --serve, applies the 404.html convention during local development.",
     "source_url": "https://www.11ty.dev/docs/quicktips/not-found/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Eleventy's official plugin list (all under the @11ty npm scope) covers Image, Fetch, RSS, i18n, Navigation, Render and others, with no sitemap or llms.txt plugin listed.",
     "source_url": "https://www.11ty.dev/docs/plugins/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Eleventy's Edge and Serverless plugins, which ran templates in edge or serverless functions for server-side rendering, are listed as retired.",
     "source_url": "https://www.11ty.dev/docs/plugins/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "On 2026-11-05 www.11ty.dev returned 404 for /llms.txt, answered Accept: text/markdown with text/html, and sent a made-up path through a 308 trailing-slash redirect before a 404.",
     "source_url": "https://www.11ty.dev/",
     "read_date": "2026-11-05",
     "kind": "observed",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "The Eleventy source repository now lives at github.com/11ty/buildawesome under the MIT license, described as a simpler site generator that turns a directory of templates into HTML.",
     "source_url": "https://github.com/11ty/buildawesome",
     "read_date": "2026-11-05",
     "kind": "primary"
    }
   ],
   "products": [
    {
     "name": "Eleventy (Build Awesome)",
     "what": "Open source JavaScript static site generator that turns templates in many languages into HTML files.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://github.com/11ty/buildawesome",
      "note": "MIT license; a paid Build Awesome Pro tier is planned and optional"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No statement found in the Eleventy docs, quick tips index or official plugin list; www.11ty.dev and build.awesome.me both returned 404 for /llms.txt."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No statement found in the Eleventy getting-started guide or 404 quick tip; Eleventy writes static files to _site and the host serves them."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No statement found in the docs or official plugin list about writing .md copies of pages."
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "The getting-started guide says Eleventy transforms each template into a page at build time, so output is complete HTML.",
     "source_url": "https://www.11ty.dev/docs/"
    },
    {
     "id": "real-404",
     "status": "partial",
     "evidence": "Eleventy writes 404.html; listed hosts serve it automatically and .htaccess hosts need ErrorDocument, per the 404 quick tip.",
     "source_url": "https://www.11ty.dev/docs/quicktips/not-found/"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "No statement found in the Eleventy getting-started guide, quick tips index or official plugin list about Vary."
    }
   ],
   "checks": {
    "domain": "11ty.dev",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 1440,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": null
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 104973,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 308,
      "location": "/agent-ready-check-2rryfckk/",
      "final_status": 404
     }
    },
    "ora": {
     "score": 38,
     "grade": "D",
     "scanned_at": "2026-08-25T15:20:35.801+00:00",
     "via": "GET https://ora.ai/api/score/11ty.dev (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T14:04:28.050Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "Eleventy has no official sitemap or llms.txt plugin in its @11ty plugin list; either file is a template you write with its own permalink.",
    "Eleventy no longer offers server rendering because its Edge and Serverless plugins are retired, so every page is whatever HTML the build wrote.",
    "The Eleventy 404.html file gets a 404 status from the host, not from Eleventy; on Apache it needs an ErrorDocument line."
   ],
   "does_not_do_basis": [
    {
     "fact": 9,
     "keep": "fact"
    },
    {
     "fact": 10,
     "keep": "fact"
    },
    {
     "fact": 7,
     "keep": "limit"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/eleventy/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "drupal",
   "name": "Drupal",
   "type": "cms",
   "homepage": "https://www.drupal.org/",
   "one_line": "Open-source PHP CMS that renders pages on the server; llms.txt and per-entity markdown come from the contributed LLM Support recipe, and JSON-LD from the Schema.org Metatag module.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Drupal is distributed under the GNU General Public License with no licensing fees.",
     "source_url": "https://www.drupal.org/about",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Drupal releases page lists 11.4.11 and 11.3.20 as patch releases, an 11.5.0-beta1, and a development branch for Drupal 12.0 due in December 2026.",
     "source_url": "https://www.drupal.org/project/drupal/releases",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The contributed LLM Support recipe bundles three modules: /llms.txt for authoring and output of the file, Markdownify for markdown output of each entity, and Token Filter for token support in llms.txt authoring.",
     "source_url": "https://www.drupal.org/project/llm_support",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "LLM Support does not write llms-full.txt; its page says Drupal site content is often too large to serve in one text file.",
     "source_url": "https://www.drupal.org/project/llm_support",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The LLM Support project was created by Pronovix on 5 June 2025, and release 1.0.7 came out on 18 August 2026.",
     "source_url": "https://www.drupal.org/project/llm_support",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-08-18"
    },
    {
     "claim": "llmstxt.org lists Drupal LLM Support as a recipe providing llms.txt support on any Drupal 10.3 or later site.",
     "source_url": "https://llmstxt.org/",
     "read_date": "2026-11-05",
     "kind": "secondary"
    },
    {
     "claim": "The Schema.org Metatag module extends Drupal's Metatag module to output structured data as JSON-LD in the page head.",
     "source_url": "https://www.drupal.org/project/schema_metatag",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Schema.org Metatag covers a subset of Schema.org types by design and lets sites set defaults per content type and override them per node.",
     "source_url": "https://www.drupal.org/project/schema_metatag",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Drupal's about page says its community counts more than 1,000,000 developers, designers, trainers and other contributors.",
     "source_url": "https://www.drupal.org/about",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    }
   ],
   "products": [
    {
     "name": "Drupal core",
     "what": "Server-rendered PHP content management system.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.drupal.org/about",
      "note": "GPL, no licensing fees"
     }
    },
    {
     "name": "LLM Support recipe",
     "what": "Contributed recipe bundling /llms.txt, Markdownify and Token Filter modules.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.drupal.org/project/llm_support",
      "note": "Contributed project on drupal.org"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "The contributed LLM Support recipe authors and serves /llms.txt; core does not.",
     "source_url": "https://www.drupal.org/project/llm_support"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "The recipe page names markdown output per entity; Accept-header negotiation is not mentioned."
    },
    {
     "id": "markdown-twin",
     "status": "partial",
     "evidence": "Markdownify outputs each entity in markdown through the recipe.",
     "source_url": "https://www.drupal.org/project/llm_support"
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "Server rendering is Drupal's architecture; no page read states it in these words."
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "Not covered in the pages read."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Not covered in the pages read."
    }
   ],
   "checks": {
    "domain": "drupal.org",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 588,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Cookie,Accept-Encoding,GeoIP-country,Origin"
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 188,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 302,
      "location": "https://new.drupal.org/agent-ready-check-m3wjyksi",
      "final_status": 404
     }
    },
    "ora": {
     "score": 31,
     "grade": "D",
     "scanned_at": "2026-08-24T07:41:30.093+00:00",
     "via": "GET https://ora.ai/api/score/drupal.org (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 13,
     "level": "L0 Not Ready",
     "scanned_at": "2026-11-05T14:07:38.473Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 2717,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 1214,
     "js_shell": false,
     "jsonld_types": [],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": "Drupal 11 (https://www.drupal.org)",
     "answers_markdown": false,
     "missing_path_status": 404,
     "llms_txt_valid": false,
     "llms_txt_bytes": 188,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Drupal core ships no llms.txt; the file comes from the contributed LLM Support recipe, which also leaves out llms-full.txt on purpose."
   ],
   "does_not_do_basis": [
    {
     "fact": 2,
     "keep": "both"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/drupal/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "ghost",
   "name": "Ghost",
   "type": "cms",
   "homepage": "https://ghost.org/",
   "one_line": "Open-source publishing platform for blogs and newsletters. Since July 2026 Ghost can write /llms.txt and serve a markdown copy of each public post at its URL plus .md, switched on under Settings, Meta data.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Ghost's changelog entry \"Optimize your site for AI search\", dated 2026-07-16, added built-in tools that generate llms.txt and markdown versions of public content.",
     "source_url": "https://ghost.org/changelog/geo/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-07-16"
    },
    {
     "claim": "With the feature on, Ghost writes llms.txt at the domain root and serves a post as markdown when .md is appended to its URL.",
     "source_url": "https://ghost.org/changelog/geo/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Ghost includes only public content: members-only and paid posts appear with their public title and excerpt, and private sites serve neither file.",
     "source_url": "https://ghost.org/changelog/geo/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Ghost turned the llms.txt and markdown feature off by default for existing sites; owners switch it on under Settings, Meta data.",
     "source_url": "https://ghost.org/changelog/geo/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Self-hosted Ghost installs get the llms.txt and markdown feature only after updating to the latest version, while Ghost(Pro) sites have it at once.",
     "source_url": "https://ghost.org/changelog/geo/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Ghost automatically includes structured data in all posts and pages.",
     "source_url": "https://ghost.org/help/seo/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Ghost creates and updates an XML sitemap automatically and adds canonical tags across the site.",
     "source_url": "https://ghost.org/help/seo/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Ghost fills empty post metadata with data from the page content as a fallback.",
     "source_url": "https://ghost.org/help/seo/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Ghost describes itself as open source, independent and funded entirely by its users.",
     "source_url": "https://ghost.org/",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    }
   ],
   "products": [
    {
     "name": "Ghost (self-hosted)",
     "what": "Open-source Node.js publishing platform with themes rendered on the server."
    },
    {
     "name": "Ghost(Pro)",
     "what": "Managed hosting of Ghost by the Ghost Foundation, with Starter, Publisher, Business and Custom plans."
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "supports",
     "evidence": "Ghost writes llms.txt at the root once the GEO setting is on.",
     "source_url": "https://ghost.org/changelog/geo/"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "The changelog describes .md URLs, not Accept-header negotiation."
    },
    {
     "id": "markdown-twin",
     "status": "supports",
     "evidence": "Appending .md to a public post URL returns markdown when the setting is on.",
     "source_url": "https://ghost.org/changelog/geo/"
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "Theme rendering is server-side in Ghost's architecture; no page read states it in these words."
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "Not covered in the pages read."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Not covered in the pages read."
    }
   ],
   "checks": {
    "domain": "ghost.org",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 719,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding"
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 52239,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 70,
     "grade": "B",
     "scanned_at": "2026-11-01T23:13:41.497+00:00",
     "via": "GET https://ora.ai/api/score/ghost.org (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T14:07:51.717Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 4363,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 920,
     "js_shell": false,
     "jsonld_types": [
      "WebSite"
     ],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": "Hugo 0.119.0",
     "answers_markdown": false,
     "missing_path_status": 404,
     "llms_txt_valid": false,
     "llms_txt_bytes": 52239,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Ghost does not expose the body of members-only or paid posts in llms.txt or the .md copies; agents get the public title and excerpt.",
    "Ghost leaves the AI files off for sites that existed before the July 2026 release until an owner turns them on."
   ],
   "does_not_do_basis": [
    {
     "fact": 2,
     "keep": "fact"
    },
    null
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/ghost/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "adobe-brand-visibility",
   "name": "Adobe Brand Visibility (formerly LLM Optimizer)",
   "type": "host-or-cdn",
   "operator": "Adobe",
   "homepage": "https://business.adobe.com/products/brand-visibility.html",
   "one_line": "Adobe product whose Optimize at Edge feature routes AI agent traffic at the CDN to pre-rendered or rewritten HTML, so JavaScript-heavy pages and added summaries reach agents without changes in the CMS.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Adobe describes Optimize at Edge as a capability of Adobe Brand Visibility that serves AI-friendly changes to LLM user agents at the CDN layer, with no authoring changes in the CMS.",
     "source_url": "https://experienceleague.adobe.com/en/docs/brand-visibility/using/resources/optimize-at-edge/overview",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Adobe says Optimize at Edge serves the optimized HTML only to AI agents, with no change for human visitors or search engine bots.",
     "source_url": "https://experienceleague.adobe.com/en/docs/brand-visibility/using/resources/optimize-at-edge/overview",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Adobe lists ChatGPT, Perplexity and Claude as the agents Optimize at Edge delivers to.",
     "source_url": "https://experienceleague.adobe.com/en/docs/brand-visibility/using/resources/optimize-at-edge/overview",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Routing for Optimize at Edge has to sit on the outermost CDN; AEM Cloud Service customers on the Adobe-managed Fastly set it up in the product, and other CDNs need their own routing rules.",
     "source_url": "https://experienceleague.adobe.com/en/docs/brand-visibility/using/resources/optimize-at-edge/overview",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Sites with WAF or bot rules must allowlist the AdobeEdgeOptimize/1.0 user agent, optionally checked with an x-edgeoptimize-fetcher-key header.",
     "source_url": "https://experienceleague.adobe.com/en/docs/brand-visibility/using/resources/optimize-at-edge/overview",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Adobe's Recover Content Visibility opportunity pre-renders pages so agents that do not run JavaScript get the full text, and Adobe argues in its FAQ that this restores parity rather than cloaking.",
     "source_url": "https://experienceleague.adobe.com/en/docs/brand-visibility/using/resources/optimize-at-edge/overview",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Adobe says optimized pages are served from cache with time-to-live settings in minutes, and URLs without a deployed opportunity are proxied unchanged.",
     "source_url": "https://experienceleague.adobe.com/en/docs/brand-visibility/using/resources/optimize-at-edge/overview",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Adobe states that Optimize at Edge works with any front end and is not limited to sites on Adobe's Edge Delivery Services.",
     "source_url": "https://experienceleague.adobe.com/en/docs/brand-visibility/using/resources/optimize-at-edge/overview",
     "read_date": "2026-11-05",
     "kind": "primary"
    }
   ],
   "products": [
    {
     "name": "Adobe Brand Visibility",
     "what": "AI visibility product with opportunity reports and Optimize at Edge deployment to agent traffic."
    },
    {
     "name": "Optimize at Edge",
     "what": "CDN-layer routing of LLM user agents to pre-rendered or rewritten HTML."
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No llms.txt feature on the Optimize at Edge page."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "Optimize at Edge serves HTML chosen by user agent, not markdown by Accept header."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No markdown copies on the page read."
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "Pre-rendered HTML snapshots go to agent traffic at the edge.",
     "source_url": "https://experienceleague.adobe.com/en/docs/brand-visibility/using/resources/optimize-at-edge/overview"
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "Not covered on the page read."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Routing is by user agent; Vary is not covered on the page read."
    }
   ],
   "checks": {
    "domain": "business.adobe.com",
    "read_on": "2026-11-05",
    "scope": "Plain-fetch checks ran on https://business.adobe.com/products/brand-visibility.html; the Ora and Cloudflare scores cover the whole host business.adobe.com.",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "error": "the home page request failed or timed out",
     "home_status": null
    },
    "ora": {
     "unavailable": "GET /api/score returned 404 DOMAIN_NOT_SCANNED"
    },
    "cloudflare": {
     "unavailable": "scanner could not fetch the site: HTTP 520 <none>"
    }
   },
   "does_not_do": [
    "Adobe Brand Visibility does not change the HTML that browsers or search engine crawlers receive; Optimize at Edge targets listed AI user agents only.",
    "Optimize at Edge does not act on pages until an opportunity is deployed for that URL."
   ],
   "does_not_do_basis": [
    {
     "fact": 1,
     "keep": "fact"
    },
    {
     "fact": 6,
     "keep": "limit"
    }
   ],
   "related": [
    "scrunch-agent-pages"
   ],
   "page": "https://agentreadyhtml.com/vendors/adobe-brand-visibility/",
   "homepage_status": {
    "status": 0,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "sanity",
   "name": "Sanity",
   "type": "cms",
   "homepage": "https://www.sanity.io/",
   "one_line": "Headless content platform; the customer's front end renders the HTML. Sanity's own learning site serves markdown on Accept: text/markdown from structured content, and Sanity publishes a field guide on doing the same.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Sanity published \"How to serve content to agents (a field guide)\" on 2026-02-19, covering llms.txt, Cloudflare's edge conversion, markdown routes with content negotiation and APIs or MCP.",
     "source_url": "https://www.sanity.io/blog/how-to-serve-content-to-agents-a-field-guide",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-02-19"
    },
    {
     "claim": "Sanity says Sanity Learn answers Accept: text/markdown on the same URL and that a lesson page drops from 392KB of HTML to 13KB of markdown, a 97 percent reduction.",
     "source_url": "https://www.sanity.io/blog/how-to-serve-content-to-agents-a-field-guide",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "Sanity's guide says the markdown is generated from the structured source rather than converted back from HTML.",
     "source_url": "https://www.sanity.io/blog/how-to-serve-content-to-agents-a-field-guide",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Sanity's guide advises \"Probably don’t do llms.txt\" for corpus dumps and cites Cloudflare's developer docs llms-full.txt at 46.6MB, about 12 million tokens.",
     "source_url": "https://www.sanity.io/blog/how-to-serve-content-to-agents-a-field-guide",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Sanity's guide says Claude Code sends Accept headers that leave out text/html and skips its summarization step when a server answers with Content-Type: text/markdown.",
     "source_url": "https://www.sanity.io/blog/how-to-serve-content-to-agents-a-field-guide",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "Sanity exposes content to agents through GROQ queries, GraphQL and an MCP server, which its guide calls the far end of the spectrum.",
     "source_url": "https://www.sanity.io/blog/how-to-serve-content-to-agents-a-field-guide",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Sanity has published its SEO and AEO guidance as an agent skill for coding agents building on Sanity.",
     "source_url": "https://www.sanity.io/blog/how-to-serve-content-to-agents-a-field-guide",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Sanity's Growth plan is priced at $15 per seat a month, and the Free plan includes up to 20 user seats and two public datasets.",
     "source_url": "https://www.sanity.io/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Sanity Content Lake and Studio",
     "what": "Hosted structured content store with an open-source editing studio, queried by the customer's front end.",
     "pricing": {
      "model": "freemium",
      "from": 15,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.sanity.io/pricing",
      "note": "Growth plan per seat per month; Free plan up to 20 seats"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "Sanity's guide discusses llms.txt but advises against corpus dumps; no generator is described."
    },
    {
     "id": "markdown-negotiation",
     "status": "partial",
     "evidence": "Sanity's guide shows Accept-header routes built on the customer's front end, as Sanity Learn does.",
     "source_url": "https://www.sanity.io/blog/how-to-serve-content-to-agents-a-field-guide"
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No platform-level .md copies in the pages read."
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "Rendering belongs to the customer's front end."
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "Rendering and status codes belong to the customer's front end."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Not stated in the guide text read."
    }
   ],
   "checks": {
    "domain": "sanity.io",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 1298,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "Accept, x-sanity-variant"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/markdown",
      "bytes": 29668,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 72,
     "grade": "B",
     "scanned_at": "2026-11-01T23:11:13.869+00:00",
     "via": "GET https://ora.ai/api/score/sanity.io (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 67,
     "level": "L5 Agent-Native",
     "scanned_at": "2026-11-05T14:50:26.727Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 3733,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 1598,
     "js_shell": false,
     "jsonld_types": [],
     "home_links_llms_txt": true,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": true,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 29642,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Sanity serves no public web pages for a customer site; HTML, markdown routes and 404s come from the front end the customer builds."
   ],
   "does_not_do_basis": [
    null
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/sanity/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "strapi",
   "name": "Strapi",
   "type": "cms",
   "homepage": "https://strapi.io/",
   "one_line": "Open-source headless CMS written in TypeScript on Node.js, self-hosted or on Strapi Cloud; it serves content as an API, so what an agent reads depends on the front end that renders it.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Strapi describes itself as an open-source TypeScript headless CMS and a real Node.js application the customer controls.",
     "source_url": "https://strapi.io/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Strapi is MIT-licensed according to its home page.",
     "source_url": "https://strapi.io/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Strapi runs on the customer's own servers or on Strapi Cloud from the same codebase.",
     "source_url": "https://strapi.io/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Strapi's site banner on 2026-11-05 announced that Strapi MCP is generally available for agents to manage Strapi content.",
     "source_url": "https://strapi.io/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Strapi Cloud pricing offers yearly billing that saves up to 17 percent against monthly billing.",
     "source_url": "https://strapi.io/pricing-cloud",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Strapi Cloud charges $1.50 per extra 25,000 API requests and $30 per extra 100 GB of asset bandwidth beyond plan quotas.",
     "source_url": "https://strapi.io/pricing-cloud",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Strapi offers Strapi Cloud discounts to qualifying open-source and non-profit organizations.",
     "source_url": "https://strapi.io/pricing-cloud",
     "read_date": "2026-11-05",
     "kind": "primary"
    }
   ],
   "products": [
    {
     "name": "Strapi (self-hosted)",
     "what": "MIT-licensed headless CMS that exposes REST and GraphQL APIs.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://strapi.io/",
      "note": "MIT licence"
     }
    },
    {
     "name": "Strapi Cloud",
     "what": "Managed hosting for Strapi projects with API request and bandwidth quotas.",
     "pricing": {
      "model": "subscription",
      "from": null,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://strapi.io/pricing-cloud",
      "note": "Plan prices load per plan; overages 1.50 USD per 25k API requests"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No llms.txt feature on the pages read."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "Strapi serves an API; no Accept-header markdown on the pages read."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No markdown copies on the pages read."
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "Rendering belongs to the customer's front end."
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "Rendering and status codes belong to the customer's front end."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Not covered on the pages read."
    }
   ],
   "checks": {
    "domain": "strapi.io",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 634,
     "jsonld_blocks": 6,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "rsc,next-router-state-tree,next-router-prefetch"
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 14054,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 64,
     "grade": "C",
     "scanned_at": "2026-10-29T15:04:56.643+00:00",
     "via": "GET https://ora.ai/api/score/strapi.io (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T14:50:40.961Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": null,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 837,
     "js_shell": false,
     "jsonld_types": [
      "Organization",
      "WebSite",
      "WebPage",
      "BreadcrumbList"
     ],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": false,
     "missing_path_status": 404,
     "llms_txt_valid": false,
     "llms_txt_bytes": 14052,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Strapi does not render the public pages an agent fetches; a separate front end such as Next.js or Astro turns its API content into HTML."
   ],
   "does_not_do_basis": [
    null
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/strapi/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "duda",
   "name": "Duda",
   "type": "site-builder",
   "homepage": "https://www.duda.co/",
   "one_line": "Website builder sold to agencies and SaaS platforms. Duda writes an llms.txt on every publish, listing live pages, store products and language versions with their meta descriptions, and leaving out drafts and noindex pages.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Duda announced on 2025-06-27 that it was rolling out llms.txt on all published sites.",
     "source_url": "https://www.duda.co/product-updates/duda-is-prepping-your-sites-for-the-future-of-ai-search",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-06-27"
    },
    {
     "claim": "Duda regenerates llms.txt every time a site is published, with no setting to turn on.",
     "source_url": "https://www.duda.co/product-updates/duda-is-prepping-your-sites-for-the-future-of-ai-search",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "A Duda llms.txt lists live URLs including blog posts, native store products and categories, and language versions.",
     "source_url": "https://www.duda.co/product-updates/duda-is-prepping-your-sites-for-the-future-of-ai-search",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Duda uses each page's meta description in llms.txt and falls back to the meta title when no description exists.",
     "source_url": "https://www.duda.co/product-updates/duda-is-prepping-your-sites-for-the-future-of-ai-search",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Duda leaves drafts and noindex pages out of llms.txt.",
     "source_url": "https://www.duda.co/product-updates/duda-is-prepping-your-sites-for-the-future-of-ai-search",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Duda's pricing page offers a 14-day free period with plans from $19 a month and lists Basic, Team, Agency and White Label plans.",
     "source_url": "https://www.duda.co/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Duda says its plans separate access to the platform from individual site subscriptions, aimed at agencies, SaaS companies and professionals building client sites.",
     "source_url": "https://www.duda.co/pricing",
     "read_date": "2026-11-05",
     "kind": "primary"
    }
   ],
   "products": [
    {
     "name": "Duda website builder",
     "what": "Multi-site builder for agencies and SaaS platforms with automatic llms.txt on publish.",
     "pricing": {
      "model": "subscription",
      "from": 19,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.duda.co/pricing",
      "note": "Plans from 19 USD a month after a 14-day free period"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "supports",
     "evidence": "Duda generates llms.txt on every publish.",
     "source_url": "https://www.duda.co/product-updates/duda-is-prepping-your-sites-for-the-future-of-ai-search"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No Accept-header markdown in the pages read."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No .md copies in the pages read."
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "Rendering is not described in the pages read."
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "Not covered in the pages read."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Not covered in the pages read."
    }
   ],
   "checks": {
    "domain": "duda.co",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": false,
     "words_in_initial_html": 2457,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding,User-Agent,Accept-Encoding"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 119245,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 59,
     "grade": "C",
     "scanned_at": "2026-09-04T23:08:06.934+00:00",
     "via": "GET https://ora.ai/api/score/duda.co (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T14:50:53.807Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "Duda's llms.txt is generated, not written by the owner, in the update read; the post describes no way to edit the generated file."
   ],
   "does_not_do_basis": [
    null
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/duda/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "hostinger-website-builder",
   "name": "Hostinger AI Builder",
   "type": "site-builder",
   "operator": "Hostinger",
   "homepage": "https://www.hostinger.com/ai-website-builder",
   "one_line": "Hostinger's AI site builder. Its agentic mode writes /llms.txt on every publish, manual mode writes it once Web2Agent is on, and Web2Agent also exposes a site to AI agents over MCP.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Hostinger AI Builder in agentic mode creates an llms.txt file automatically every time a site is published, with no setup.",
     "source_url": "https://www.hostinger.com/support/how-to-enable-llms-txt-on-your-website/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "In Hostinger AI Builder manual mode, the Enable LLMS.txt toggle is available only when Web2Agent (Beta) is switched on.",
     "source_url": "https://www.hostinger.com/support/how-to-enable-llms-txt-on-your-website/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Hostinger says the manual-mode file is created at domain.tld/llms.txt and may take some time to appear after publishing.",
     "source_url": "https://www.hostinger.com/support/how-to-enable-llms-txt-on-your-website/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Hostinger's WordPress customers get llms.txt from the Create LLMs.txt file toggle in the Hostinger Tools plugin, under LLM Optimization.",
     "source_url": "https://www.hostinger.com/support/how-to-enable-llms-txt-on-your-website/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Hostinger calls Web2Agent an experimental feature that makes a WordPress or AI Builder manual-mode site reachable by AI agents through the Model Context Protocol.",
     "source_url": "https://www.hostinger.com/support/11729400-web-2-agent-in-hostinger/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Turning on Web2Agent starts a crawl of the site that Hostinger says takes 2 to 15 minutes before the site can answer agent requests.",
     "source_url": "https://www.hostinger.com/support/11729400-web-2-agent-in-hostinger/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Hostinger says Web2Agent respects robots.txt and llms.txt and can be turned off without changing the visible site.",
     "source_url": "https://www.hostinger.com/support/11729400-web-2-agent-in-hostinger/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Hostinger applies its GEO settings in agentic mode through the automatically generated llms.txt.",
     "source_url": "https://www.hostinger.com/support/11791154-hostinger-ai-builder-agentic-mode-geo-settings/",
     "read_date": "2026-11-05",
     "kind": "primary"
    }
   ],
   "products": [
    {
     "name": "Hostinger AI Builder",
     "what": "AI website builder with agentic and manual modes and automatic llms.txt in agentic mode."
    },
    {
     "name": "Hostinger Tools plugin for WordPress",
     "what": "Plugin on Hostinger WordPress hosting with LLM Optimization, llms.txt and Web2Agent toggles."
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "supports",
     "evidence": "Agentic mode writes llms.txt on publish; manual mode and WordPress need a toggle.",
     "source_url": "https://www.hostinger.com/support/how-to-enable-llms-txt-on-your-website/"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No Accept-header markdown in the pages read."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No .md copies in the pages read."
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "Rendering is not described in the pages read."
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "Not covered in the pages read."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Not covered in the pages read."
    }
   ],
   "checks": {
    "domain": "hostinger.com",
    "read_on": "2026-11-05",
    "scope": "Plain-fetch checks ran on https://www.hostinger.com/ai-website-builder; the Ora and Cloudflare scores cover the whole host hostinger.com.",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 4294,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "accept-encoding, accept"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 13828,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 96,
     "grade": "A+",
     "scanned_at": "2026-11-05T07:00:48.016+00:00",
     "via": "GET https://ora.ai/api/score/hostinger.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 100,
     "level": "L5 Agent-Native",
     "scanned_at": "2026-11-05T14:51:09.376Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 1845,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 3772,
     "js_shell": false,
     "jsonld_types": [
      "Organization",
      "WebSite",
      "WebPage",
      "Service",
      "Product",
      "AggregateRating",
      "FAQPage",
      "ImageObject"
     ],
     "home_links_llms_txt": false,
     "markdown_alternate_link": true,
     "generator": null,
     "answers_markdown": true,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 13165,
     "llms_full_valid": true,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Hostinger AI Builder manual mode writes no llms.txt until Web2Agent, a beta, is switched on."
   ],
   "does_not_do_basis": [
    {
     "fact": 1,
     "keep": "limit"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/hostinger-website-builder/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "typo3",
   "name": "TYPO3",
   "type": "cms",
   "homepage": "https://typo3.org/",
   "one_line": "Open-source PHP CMS that renders pages on the server, with site-level error handlers per status code; llms.txt and .md copies of pages come from extensions such as the LLMS TXT Generator documented on docs.typo3.org.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "The LLMS TXT Generator extension for TYPO3 produces an llms.txt index of the site and a markdown version of every listed page at its URL plus .md, without navigation, header or footer.",
     "source_url": "https://docs.typo3.org/permalink/web-vision/ai-llms-txt:introduction@main",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The LLMS TXT Generator serves the index at both /llms.txt and /.well-known/llms.txt.",
     "source_url": "https://docs.typo3.org/permalink/web-vision/ai-llms-txt:introduction@main",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The extension builds the markdown pages through TYPO3's regular rendering, so every content element and column position is included.",
     "source_url": "https://docs.typo3.org/permalink/web-vision/ai-llms-txt:introduction@main",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Hidden, access-restricted, hide-in-menu and no-index pages are left out of the TYPO3 extension's llms.txt.",
     "source_url": "https://docs.typo3.org/permalink/web-vision/ai-llms-txt:introduction@main",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The LLMS TXT Generator requires TYPO3 13.4 LTS or 14.3 LTS, PHP 8.2 to 8.5 and the TYPO3 system extension seo.",
     "source_url": "https://docs.typo3.org/permalink/web-vision/ai-llms-txt:introduction@main",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The TYPO3 extension can cache the generated llms.txt and export pages as markdown files from the command line.",
     "source_url": "https://docs.typo3.org/permalink/web-vision/ai-llms-txt:introduction@main",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The extension's documentation states that llms.txt is not an access-control mechanism and points to robots.txt and server configuration for crawl permissions.",
     "source_url": "https://docs.typo3.org/permalink/web-vision/ai-llms-txt:introduction@main",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "TYPO3's ErrorController looks up the error handler a site configures for a status code and falls back to TYPO3's own error page when the site configures none.",
     "source_url": "https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/SiteHandling/ErrorHandling/Index.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "TYPO3 14.2 added a generic error action to the ErrorController for HTTP status codes that the fixed error methods do not cover.",
     "source_url": "https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/SiteHandling/ErrorHandling/Index.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "TYPO3's system extension seo gives editors meta tag fields and renders the meta tags and an XML sitemap in the frontend.",
     "source_url": "https://docs.typo3.org/c/typo3/cms-seo/main/en-us/Introduction/Index.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    }
   ],
   "products": [
    {
     "name": "TYPO3 CMS",
     "what": "Server-rendered PHP CMS with site configuration for error handling and a system extension for SEO."
    },
    {
     "name": "LLMS TXT Generator (web-vision/ai-llms-txt)",
     "what": "Extension that writes llms.txt and serves .md copies of pages."
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "partial",
     "evidence": "An extension writes llms.txt and /.well-known/llms.txt; core does not.",
     "source_url": "https://docs.typo3.org/permalink/web-vision/ai-llms-txt:introduction@main"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "The extension page describes .md URLs, not Accept-header negotiation."
    },
    {
     "id": "markdown-twin",
     "status": "partial",
     "evidence": "With the extension, every listed page has a .md copy.",
     "source_url": "https://docs.typo3.org/permalink/web-vision/ai-llms-txt:introduction@main"
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "Server rendering is TYPO3's architecture; the pages read do not state it in these words."
    },
    {
     "id": "real-404",
     "status": "partial",
     "evidence": "Sites configure an error handler per status code; without one TYPO3 shows its own error page.",
     "source_url": "https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/SiteHandling/ErrorHandling/Index.html"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Not covered in the pages read."
    }
   ],
   "checks": {
    "domain": "typo3.org",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 504,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "Accept"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/markdown",
      "bytes": 2186,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 59,
     "grade": "C",
     "scanned_at": "2026-10-30T06:14:01.588+00:00",
     "via": "GET https://ora.ai/api/score/typo3.org (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T14:51:21.990Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "TYPO3 core ships neither an llms.txt nor markdown copies of pages; an extension supplies both."
   ],
   "does_not_do_basis": [
    {
     "fact": 0,
     "keep": "both"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/typo3/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "netlify",
   "name": "Netlify",
   "type": "host-or-cdn",
   "homepage": "https://www.netlify.com/",
   "hq": "United States",
   "one_line": "Web hosting and edge platform. Netlify answers missing paths with a site 404.html when one exists, offers a Prerender extension that hands JavaScript apps to agents as HTML, and publishes an edge-function template for markdown negotiation.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Netlify says it was founded in 2014 and is a venture-backed software company headquartered in San Francisco.",
     "source_url": "https://www.netlify.com/about/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "A 404.html file in a Netlify deploy is picked up automatically and shown for any path that does not resolve to a static file, with no redirect rule needed.",
     "source_url": "https://docs.netlify.com/manage/routing/redirects/redirect-options/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Netlify redirect rules accept status 404 to show a custom not-found page for a given path while the address bar keeps the requested URL.",
     "source_url": "https://docs.netlify.com/manage/routing/redirects/redirect-options/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Netlify documents a catch-all rewrite to /index.html with status 200 for single-page apps that use history pushState, usually listed as the last rule; with that rule every unknown path answers 200.",
     "source_url": "https://docs.netlify.com/manage/routing/redirects/rewrites-proxies/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Netlify's prerendering docs say prerendering serves pre-rendered HTML to crawlers, agents and preview services while regular visitors keep the JavaScript application.",
     "source_url": "https://docs.netlify.com/build/post-processing/prerendering/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Netlify Prerender extension runs on Netlify Edge Functions and Functions, needs no third-party API key and requires Node.js 20 or later; the Prerender.io extension is the alternative that needs a Prerender.io key.",
     "source_url": "https://docs.netlify.com/build/post-processing/prerendering/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Netlify's Prerender extension replaces a legacy beta prerendering feature that Netlify now marks as deprecated.",
     "source_url": "https://docs.netlify.com/build/post-processing/prerendering/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Netlify's markdown-for-agents prompt template, updated on 2026-03-16, asks a coding agent to add an edge function that checks for Accept: text/markdown, converts the origin HTML with Turndown and returns Content-Type: text/markdown; charset=utf-8.",
     "source_url": "https://docs.netlify.com/prompt-templates/netlify/markdown-for-agents/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-03-16"
    },
    {
     "claim": "The same Netlify template adds an X-Markdown-Tokens header holding an estimated token count computed as string length divided by 4.",
     "source_url": "https://docs.netlify.com/prompt-templates/netlify/markdown-for-agents/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Netlify's documentation pages tell agents that the full docs index is in llms.txt and that appending .md to any docs URL returns a markdown version.",
     "source_url": "https://docs.netlify.com/manage/routing/redirects/redirect-options/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Netlify's Free plan carries a 300-credit monthly limit, and the Pro plan lists $20 a month with Pro tiers from 3,000 to 20,000 credits a month.",
     "source_url": "https://www.netlify.com/pricing/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Netlify hosting and Edge Functions",
     "what": "Git-based deploys of static and server-rendered sites, with redirect rules, custom headers and edge functions that can read the Accept header.",
     "pricing": {
      "model": "freemium",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.netlify.com/pricing/",
      "note": "Free plan with a 300-credit monthly limit; Pro listed at 20 USD a month with 3,000 to 20,000 credits"
     }
    },
    {
     "name": "Netlify Prerender extension",
     "what": "Serves pre-rendered HTML of JavaScript apps to crawlers, agents and link-preview services, built on Netlify Edge Functions."
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "Netlify hosts whatever llms.txt a site deploys; no generator for customer sites is documented in the pages read."
    },
    {
     "id": "markdown-negotiation",
     "status": "partial",
     "evidence": "A Netlify prompt template builds an edge function that answers Accept: text/markdown; nothing is on by default.",
     "source_url": "https://docs.netlify.com/prompt-templates/netlify/markdown-for-agents/"
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "Netlify's own docs offer .md URLs; no .md feature for customer sites was found."
    },
    {
     "id": "initial-html",
     "status": "partial",
     "evidence": "The Prerender extension serves pre-rendered HTML to agents for JavaScript apps once installed.",
     "source_url": "https://docs.netlify.com/build/post-processing/prerendering/"
    },
    {
     "id": "real-404",
     "status": "supports",
     "evidence": "A deployed 404.html is shown automatically for failed paths; a 200 SPA rewrite overrides that when added.",
     "source_url": "https://docs.netlify.com/manage/routing/redirects/redirect-options/"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "The markdown template lists Content-Type and X-Markdown-Tokens headers; Vary is not named in the template text read."
    }
   ],
   "checks": {
    "domain": "netlify.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 1277,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "Accept-Encoding, Accept"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 2973,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 90,
     "grade": "A",
     "scanned_at": "2026-11-04T21:24:22.525+00:00",
     "via": "GET https://ora.ai/api/score/netlify.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 67,
     "level": "L5 Agent-Native",
     "scanned_at": "2026-11-05T14:04:37.112Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 3927,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 1578,
     "js_shell": false,
     "jsonld_types": [
      "Organization",
      "WebSite",
      "WebPage",
      "BreadcrumbList",
      "SoftwareApplication",
      "ItemList"
     ],
     "home_links_llms_txt": false,
     "markdown_alternate_link": true,
     "generator": "Astro v7.3.8",
     "answers_markdown": true,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 2973,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Netlify does not convert HTML to markdown for customer sites unless the site adds an edge function such as the one in its prompt template.",
    "The SPA rewrite to /index.html that Netlify documents makes every unknown path answer 200, so a site using it loses real 404s unless it adds its own rules."
   ],
   "does_not_do_basis": [
    {
     "fact": 7,
     "keep": "both"
    },
    {
     "fact": 3,
     "keep": "fact"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/netlify/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "aws-amplify-hosting",
   "name": "AWS Amplify Hosting",
   "type": "host-or-cdn",
   "operator": "Amazon Web Services",
   "homepage": "https://aws.amazon.com/amplify/hosting/",
   "one_line": "Git-connected hosting on AWS for static sites, single-page apps and server-rendered Next.js apps; its redirect rules decide whether a missing path answers 404 or hands every URL to a client-side router.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Amplify Hosting deploys server-side rendered apps built with Next.js versions up through Next.js 15, including image optimization and middleware.",
     "source_url": "https://docs.aws.amazon.com/amplify/latest/userguide/ssr-amplify-support.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "AWS's Amplify documentation says SSG pages are prerendered at build time and SSR pages at request time, so the HTML content of each page arrives ready in the browser.",
     "source_url": "https://docs.aws.amazon.com/amplify/latest/userguide/ssr-amplify-support.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Amplify's Rewrite (200) rule type serves content from a destination address while the browser keeps the original URL, and AWS lists sending all single-page-app traffic to index.html as a common use.",
     "source_url": "https://docs.aws.amazon.com/amplify/latest/userguide/redirects.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Amplify's Not Found (404) rule type displays a destination page for addresses that do not exist, including pointing nonexistent paths of a web app to index.html for a client-side router.",
     "source_url": "https://docs.aws.amazon.com/amplify/latest/userguide/redirects.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "AWS says an unexpected 302 from an Amplify app usually comes from redirect and custom header changes, and the fix is to re-enable the app's default 404 rewrite rule.",
     "source_url": "https://docs.aws.amazon.com/amplify/latest/userguide/redirects.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Amplify applies redirect rules from the top of the list down, so rule order decides which answer a path gets.",
     "source_url": "https://docs.aws.amazon.com/amplify/latest/userguide/redirects.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Amplify pricing lists the Standard build instance free up to 1,000 build minutes a month and then $0.01 per minute, data transfer out free up to 15 GB a month and then $0.15 per GB served.",
     "source_url": "https://aws.amazon.com/amplify/pricing/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Amplify pricing lists SSR requests free up to 500,000 a month and then $0.30 per million requests.",
     "source_url": "https://aws.amazon.com/amplify/pricing/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "AWS says new customers from 2025-07-15 receive up to $200 in Free Tier credits that apply to Amplify, with a free plan available for 6 months after account creation.",
     "source_url": "https://aws.amazon.com/amplify/pricing/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-07-15"
    }
   ],
   "products": [
    {
     "name": "AWS Amplify Hosting",
     "what": "Hosting with CI/CD from Git for static, single-page and Next.js SSR apps, with redirect and rewrite rules and custom headers.",
     "pricing": {
      "model": "usage-based",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://aws.amazon.com/amplify/pricing/",
      "note": "Free tier allowances, then 0.01 USD per build minute and 0.15 USD per GB served"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No llms.txt feature in the Amplify Hosting pages read."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No Accept-header markdown feature in the Amplify Hosting pages read."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No markdown copy feature in the Amplify Hosting pages read."
    },
    {
     "id": "initial-html",
     "status": "partial",
     "evidence": "SSR and SSG Next.js apps arrive prerendered; plain single-page apps stay client-rendered.",
     "source_url": "https://docs.aws.amazon.com/amplify/latest/userguide/ssr-amplify-support.html"
    },
    {
     "id": "real-404",
     "status": "partial",
     "evidence": "Rule types include Not Found (404); SPA setups rewrite unknown paths to index.html.",
     "source_url": "https://docs.aws.amazon.com/amplify/latest/userguide/redirects.html"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Not covered in the pages read."
    }
   ],
   "checks": {
    "domain": "aws.amazon.com",
    "read_on": "2026-11-05",
    "scope": "Plain-fetch checks ran on https://aws.amazon.com/amplify/hosting/; the Ora and Cloudflare scores cover the whole host aws.amazon.com.",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 326,
     "jsonld_blocks": 2,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "accept-encoding"
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 302356,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 301,
      "location": "/agent-ready-check-17sehjff/",
      "final_status": 404
     }
    },
    "ora": {
     "score": 60,
     "grade": "C",
     "scanned_at": "2026-10-30T14:26:36.852+00:00",
     "via": "GET https://ora.ai/api/score/aws.amazon.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T14:04:46.413Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": null,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 1524,
     "js_shell": false,
     "jsonld_types": [
      "ItemList"
     ],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": false,
     "missing_path_status": 404,
     "llms_txt_valid": false,
     "llms_txt_bytes": 302356,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Amplify Hosting does not prerender a plain React or Vue single-page app for agents; the HTML is whatever the build emits.",
    "The Amplify Next.js support page stops at Next.js 15, so later majors are not listed as supported on that page."
   ],
   "does_not_do_basis": [
    null,
    null
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/aws-amplify-hosting/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "firebase-hosting",
   "name": "Firebase Hosting",
   "type": "host-or-cdn",
   "operator": "Google",
   "homepage": "https://firebase.google.com/products/hosting",
   "one_line": "Google's static and single-page app hosting on a global CDN, with a fixed response order that ends in a custom 404.html, plus Firebase App Hosting for server-rendered Next.js and Angular apps.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Firebase Hosting answers in a fixed priority order: reserved /__/* paths, configured redirects, exact-match static content, configured rewrites, the custom 404 page, then the default 404 page.",
     "source_url": "https://firebase.google.com/docs/hosting/full-config",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "A file named 404.html in the Firebase public directory is shown when a request on the domain triggers a 404 Not Found.",
     "source_url": "https://firebase.google.com/docs/hosting/full-config",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Firebase applies the first matching rule within the redirects and rewrites attributes, and configured redirects take precedence over rewrites.",
     "source_url": "https://firebase.google.com/docs/hosting/full-config",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "With cleanUrls set to true, Firebase Hosting drops the .html extension and answers a request that includes .html with a 301 to the extensionless path.",
     "source_url": "https://firebase.google.com/docs/hosting/full-config",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Firebase points builders of server-rendered Angular or Next.js apps to Firebase App Hosting; the older framework-aware Hosting integration is described as an early preview.",
     "source_url": "https://firebase.google.com/docs/hosting/frameworks/frameworks-overview",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Firebase App Hosting builds apps with Cloud Build, serves them on Cloud Run and caches them in Cloud CDN, with preconfigured support for Next.js and Angular.",
     "source_url": "https://firebase.google.com/docs/app-hosting",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Firebase App Hosting offers agent skills for coding agents such as Claude Code, Codex and Cursor to help set up deployments.",
     "source_url": "https://firebase.google.com/docs/app-hosting",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Firebase pricing lists Hosting storage free up to 10 GB and then $0.026 per GB, and data transfer free up to 360 MB a day and then $0.15 per GB.",
     "source_url": "https://firebase.google.com/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Firebase Hosting",
     "what": "Static and single-page app hosting with redirects, rewrites, headers and a custom 404.html.",
     "pricing": {
      "model": "freemium",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://firebase.google.com/pricing",
      "note": "No-cost up to 10 GB storage and 360 MB a day transfer; then 0.026 USD per GB stored and 0.15 USD per GB transferred"
     }
    },
    {
     "name": "Firebase App Hosting",
     "what": "Server-rendered web app hosting on Cloud Run with Cloud CDN caching, preconfigured for Next.js and Angular; requires a billing account.",
     "pricing": {
      "model": "usage-based",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://firebase.google.com/pricing",
      "note": "Firebase pricing says App Hosting requires a billing account"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No llms.txt feature in the Firebase Hosting pages read."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No Accept-header markdown feature in the Firebase Hosting pages read."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No markdown copy feature in the pages read."
    },
    {
     "id": "initial-html",
     "status": "partial",
     "evidence": "App Hosting serves server-rendered Next.js and Angular; plain Hosting serves whatever static files the build emits.",
     "source_url": "https://firebase.google.com/docs/app-hosting"
    },
    {
     "id": "real-404",
     "status": "supports",
     "evidence": "A custom 404.html is served for 404 Not Found, after redirects, static matches and rewrites.",
     "source_url": "https://firebase.google.com/docs/hosting/full-config"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Not covered in the pages read."
    }
   ],
   "checks": {
    "domain": "firebase.google.com",
    "read_on": "2026-11-05",
    "scope": "Plain-fetch checks ran on https://firebase.google.com/products/hosting; the Ora and Cloudflare scores cover the whole host firebase.google.com.",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 346,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "Accept, Accept-Encoding"
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 98598,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 56,
     "grade": "C",
     "scanned_at": "2026-10-21T12:47:22.147+00:00",
     "via": "GET https://ora.ai/api/score/firebase.google.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 27,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T14:05:01.337Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "Firebase Hosting has no prerendering service of its own for client-rendered apps; a catch-all rewrite to index.html sits above the custom 404 page in its priority order.",
    "Firebase App Hosting cannot run on the no-cost plan alone, since Firebase says it requires a billing account."
   ],
   "does_not_do_basis": [
    {
     "fact": 0,
     "keep": "both"
    },
    null
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/firebase-hosting/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "azure-static-web-apps",
   "name": "Azure Static Web Apps",
   "type": "host-or-cdn",
   "operator": "Microsoft",
   "homepage": "https://azure.microsoft.com/products/app-service/static",
   "one_line": "Microsoft's hosting for static front ends with managed Azure Functions APIs; a navigationFallback setting serves index.html for unmatched paths, and responseOverrides set what a 404 returns.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Microsoft describes Azure Static Web Apps as a service that deploys full stack web apps to Azure from a code repository, rebuilding on every push to a watched GitHub or Azure DevOps branch.",
     "source_url": "https://learn.microsoft.com/en-us/azure/static-web-apps/overview",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Microsoft says static web apps on the service are commonly built with Angular, React, Svelte, Vue or Blazor where server-side rendering is not required.",
     "source_url": "https://learn.microsoft.com/en-us/azure/static-web-apps/overview",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The navigationFallback section in staticwebapp.config.json returns a rewrite target such as /index.html for static file requests that match no deployed file, with an exclude list for paths that should not fall back.",
     "source_url": "https://learn.microsoft.com/en-us/azure/static-web-apps/configuration",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Route rules in Azure Static Web Apps are not applied to requests that trigger navigationFallback.",
     "source_url": "https://learn.microsoft.com/en-us/azure/static-web-apps/configuration",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The responseOverrides section defines a custom response when the server would otherwise return an error code, and Microsoft's examples rewrite 404 to a custom 404.html.",
     "source_url": "https://learn.microsoft.com/en-us/azure/static-web-apps/configuration",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Microsoft's example configuration shows a disabled auth route returning a 404 that then falls back to /index.html with a 200 status code.",
     "source_url": "https://learn.microsoft.com/en-us/azure/static-web-apps/configuration",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "A globalHeaders section in Azure Static Web Apps adds HTTP headers to every response unless a route header rule overrides them.",
     "source_url": "https://learn.microsoft.com/en-us/azure/static-web-apps/configuration",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Azure Static Web Apps comes in Free and Standard plans; the Free plan allows 250 MB per app, 3 staging environments and 2 custom domains, and the Dedicated plan was retired effective 2025-10-31.",
     "source_url": "https://learn.microsoft.com/en-us/azure/static-web-apps/plans",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-10-31"
    }
   ],
   "products": [
    {
     "name": "Azure Static Web Apps",
     "what": "Static hosting with Git-triggered builds, managed Functions APIs, routing rules, fallbacks and response overrides.",
     "pricing": {
      "model": "freemium",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://learn.microsoft.com/en-us/azure/static-web-apps/plans",
      "note": "Free plan for personal projects; Standard plan cost is on the Azure pricing page"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No llms.txt feature in the Static Web Apps pages read."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No Accept-header markdown feature in the pages read."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No markdown copy feature in the pages read."
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "Microsoft frames the service around apps where server-side rendering is not required; HTML is whatever the build emits."
    },
    {
     "id": "real-404",
     "status": "partial",
     "evidence": "Without navigationFallback a missing file can return a 404 overridden by responseOverrides; with the fallback, unmatched paths get index.html.",
     "source_url": "https://learn.microsoft.com/en-us/azure/static-web-apps/configuration"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Not covered in the pages read."
    }
   ],
   "checks": {
    "domain": "azure.microsoft.com",
    "read_on": "2026-11-05",
    "scope": "Plain-fetch checks ran on https://azure.microsoft.com/products/app-service/static; the Ora and Cloudflare scores cover the whole host azure.microsoft.com.",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 1421,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding"
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 94538,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 302,
      "location": "https://azure.microsoft.com/en-us/agent-ready-check-ydxgmirf",
      "final_status": 404
     }
    },
    "ora": {
     "score": 51,
     "grade": "C",
     "scanned_at": "2026-05-11T06:37:06.719+00:00",
     "via": "GET https://ora.ai/api/score/azure.microsoft.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T14:05:23.165Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": null,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 2630,
     "js_shell": false,
     "jsonld_types": [],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": false,
     "missing_path_status": 404,
     "llms_txt_valid": false,
     "llms_txt_bytes": 94502,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Azure Static Web Apps does not prerender client-side apps for crawlers or agents in the pages read; navigationFallback hands every unmatched path to index.html."
   ],
   "does_not_do_basis": [
    null
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/azure-static-web-apps/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "github-pages",
   "name": "GitHub Pages",
   "type": "host-or-cdn",
   "operator": "GitHub",
   "homepage": "https://pages.github.com/",
   "one_line": "Static hosting from a GitHub repository with an optional Jekyll build; a 404.html or 404.md in the repository becomes the custom not-found page, and server headers cannot be set.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "GitHub describes Pages as a static site hosting service that takes HTML, CSS and JavaScript files from a repository, optionally runs a build process and publishes a website.",
     "source_url": "https://docs.github.com/en/pages/getting-started-with-github-pages/what-is-github-pages",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "GitHub Pages is available in public repositories on GitHub Free, and in public and private repositories on GitHub Pro, Team, Enterprise Cloud and Enterprise Server.",
     "source_url": "https://docs.github.com/en/pages/getting-started-with-github-pages/what-is-github-pages",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "A custom not-found page on GitHub Pages is a file named 404.html or 404.md in the publishing source.",
     "source_url": "https://docs.github.com/en/pages/getting-started-with-github-pages/creating-a-custom-404-page-for-your-github-pages-site",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Jekyll is the static site generator with built-in support on GitHub Pages; it builds Markdown and HTML into a site using layouts and Liquid templates.",
     "source_url": "https://docs.github.com/en/pages/setting-up-a-github-pages-site-with-jekyll/about-github-pages-and-jekyll",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "GitHub Pages runs a set of Jekyll plugins that are on by default and cannot be disabled, including jekyll-titles-from-headings, jekyll-relative-links and jekyll-readme-index.",
     "source_url": "https://docs.github.com/en/pages/setting-up-a-github-pages-site-with-jekyll/about-github-pages-and-jekyll",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Published GitHub Pages sites may be no larger than 1 GB, deployments time out after 10 minutes, and sites have a soft bandwidth limit of 100 GB a month.",
     "source_url": "https://docs.github.com/en/pages/getting-started-with-github-pages/github-pages-limits",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "GitHub Pages answers rate-limited requests with HTTP 429 and an informative HTML body.",
     "source_url": "https://docs.github.com/en/pages/getting-started-with-github-pages/github-pages-limits",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "GitHub's terms on the limits page say Pages is not meant to run an online business, an e-commerce site or commercial software as a service.",
     "source_url": "https://docs.github.com/en/pages/getting-started-with-github-pages/github-pages-limits",
     "read_date": "2026-11-05",
     "kind": "primary"
    }
   ],
   "products": [
    {
     "name": "GitHub Pages",
     "what": "Static site hosting from a repository, with a built-in Jekyll build or a custom GitHub Actions workflow.",
     "pricing": {
      "model": "free",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://docs.github.com/en/pages/getting-started-with-github-pages/what-is-github-pages",
      "note": "Included with GitHub Free for public repositories; private repositories need a paid GitHub plan"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "GitHub Pages serves an llms.txt only if the repository contains one; no generator in the pages read."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No Accept-header handling in the pages read; Pages offers no custom response headers."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No markdown copy feature in the pages read."
    },
    {
     "id": "initial-html",
     "status": "partial",
     "evidence": "Pages serves the static files in the repository or the Jekyll build, so content is in the HTML when the source is static.",
     "source_url": "https://docs.github.com/en/pages/getting-started-with-github-pages/what-is-github-pages"
    },
    {
     "id": "real-404",
     "status": "supports",
     "evidence": "A 404.html or 404.md in the source becomes the custom not-found page.",
     "source_url": "https://docs.github.com/en/pages/getting-started-with-github-pages/creating-a-custom-404-page-for-your-github-pages-site"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Not covered in the pages read."
    }
   ],
   "checks": {
    "domain": "pages.github.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 688,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding"
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 9379,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "unavailable": "GET /api/score returned 404 DOMAIN_NOT_SCANNED"
    },
    "cloudflare": {
     "score": 7,
     "level": "L0 Not Ready",
     "scanned_at": "2026-11-05T14:05:40.180Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "GitHub Pages offers no way to set custom response headers or rewrite by Accept header in the pages read, so markdown negotiation needs a CDN in front.",
    "GitHub Pages runs no server code, so a site built as a client-rendered app reaches agents as its empty shell."
   ],
   "does_not_do_basis": [
    null,
    null
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/github-pages/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "fastly",
   "name": "Fastly",
   "type": "host-or-cdn",
   "homepage": "https://www.fastly.com/",
   "one_line": "Edge cloud and CDN with Fastly Compute, a WebAssembly runtime where a small service can answer Accept: text/markdown or known AI crawlers with a cached markdown copy of the origin page.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Fastly published \"Give AI Agents the Markdown They Actually Want\" on 2026-05-28, a walkthrough of a Fastly Compute service that serves agents a markdown version of the same page while normal requests pass to the origin.",
     "source_url": "https://www.fastly.com/blog/give-ai-agents-markdown-they-actually-want",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-05-28"
    },
    {
     "claim": "The Fastly example converts a page to markdown when the user agent matches one of 17 AI crawler patterns or the request sends Accept: text/markdown.",
     "source_url": "https://www.fastly.com/blog/give-ai-agents-markdown-they-actually-want",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Fastly example also answers an explicit /md/<path> prefix with markdown regardless of headers, for debugging and spot checks.",
     "source_url": "https://www.fastly.com/blog/give-ai-agents-markdown-they-actually-want",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Fastly's example uses Defuddle for content extraction and Turndown for markdown, with linkedom providing the DOM inside the Compute JavaScript runtime.",
     "source_url": "https://www.fastly.com/blog/give-ai-agents-markdown-they-actually-want",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Fastly says a markdown conversion takes a few hundred milliseconds on a cold request and uses SimpleCache to cache the result at the edge.",
     "source_url": "https://www.fastly.com/blog/give-ai-agents-markdown-they-actually-want",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Fastly says a typical article in markdown compresses to 20 to 30 percent of its HTML size.",
     "source_url": "https://www.fastly.com/blog/give-ai-agents-markdown-they-actually-want",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "Fastly pricing lists 10 million Compute requests a month free and usage-based tiers beyond that.",
     "source_url": "https://www.fastly.com/pricing",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Fastly's pricing page lists an AI Runtime Control product for routing, governance and observability of AI and agentic traffic at the edge, with 100,000 requests a month free.",
     "source_url": "https://www.fastly.com/pricing",
     "read_date": "2026-11-05",
     "kind": "primary"
    }
   ],
   "products": [
    {
     "name": "Fastly Compute",
     "what": "WebAssembly edge runtime where request handlers can read headers such as Accept and transform origin responses.",
     "pricing": {
      "model": "usage-based",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.fastly.com/pricing",
      "note": "10 million Compute requests a month free"
     }
    },
    {
     "name": "Fastly CDN (Full Site Delivery)",
     "what": "Content delivery with caching and VCL or Compute configuration.",
     "pricing": {
      "model": "usage-based",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://www.fastly.com/pricing",
      "note": "Free tier, Growth usage-based and Enterprise quote"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No llms.txt feature in the pages read."
    },
    {
     "id": "markdown-negotiation",
     "status": "partial",
     "evidence": "A Fastly blog example builds Accept: text/markdown handling on Compute; it is sample code, not a switch.",
     "source_url": "https://www.fastly.com/blog/give-ai-agents-markdown-they-actually-want"
    },
    {
     "id": "markdown-twin",
     "status": "partial",
     "evidence": "The same example serves /md/<path> as markdown.",
     "source_url": "https://www.fastly.com/blog/give-ai-agents-markdown-they-actually-want"
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "Fastly caches and serves the origin HTML; rendering is the origin's job."
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "Status codes pass through from the origin in the pages read."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "The blog excerpt read does not state the Vary header it sends."
    }
   ],
   "checks": {
    "domain": "fastly.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 1294,
     "jsonld_blocks": 2,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 16618,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 70,
     "grade": "B",
     "scanned_at": "2026-10-16T01:37:06.729+00:00",
     "via": "GET https://ora.ai/api/score/fastly.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T14:05:49.661Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 6999,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 1747,
     "js_shell": false,
     "jsonld_types": [
      "Organization",
      "Corporation"
     ],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": false,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 16618,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Fastly has no one-click markdown conversion; the May 2026 blog post is code a customer deploys on Compute.",
    "Fastly does not render client-side JavaScript apps into HTML for agents in the pages read."
   ],
   "does_not_do_basis": [
    null,
    null
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/fastly/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "akamai",
   "name": "Akamai",
   "type": "host-or-cdn",
   "homepage": "https://www.akamai.com/",
   "one_line": "CDN and edge platform. Akamai edge servers do not cache responses that carry a Vary header other than Accept-Encoding, which matters for any site that negotiates markdown, and EdgeWorkers can run JavaScript on requests and responses.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Akamai's Property Manager docs say edge servers do not cache responses that include a Vary header, even when the content is cacheable by definition.",
     "source_url": "https://techdocs.akamai.com/property-mgr/docs/rm-vary-header",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The one exception Akamai documents is Vary: Accept-Encoding with a Content-Encoding of br or gzip, which edge servers cache under the property rules.",
     "source_url": "https://techdocs.akamai.com/property-mgr/docs/rm-vary-header",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Akamai's Remove Vary Header behavior, when set to ON, strips Vary headers other than Vary: Accept-Encoding so responses can be cached; removing the header at the origin is the method Akamai prefers.",
     "source_url": "https://techdocs.akamai.com/property-mgr/docs/rm-vary-header",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Akamai EdgeWorkers deploys JavaScript functions to Akamai edge servers, invoked on specific events in the request and response cycle.",
     "source_url": "https://techdocs.akamai.com/edgeworkers/docs/welcome-to-edgeworkers",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Akamai states an EdgeWorkers cold start time for first execution of less than five milliseconds.",
     "source_url": "https://techdocs.akamai.com/edgeworkers/docs/welcome-to-edgeworkers",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "EdgeWorkers needs an entitlement on the customer's Akamai contract and a supported delivery product as its base layer.",
     "source_url": "https://techdocs.akamai.com/edgeworkers/docs/welcome-to-edgeworkers",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Akamai's techdocs site tells agents that each docs project has an llms.txt index and that appending .md to a documentation URL returns its markdown version.",
     "source_url": "https://techdocs.akamai.com/edgeworkers/docs/welcome-to-edgeworkers",
     "read_date": "2026-11-05",
     "kind": "primary"
    }
   ],
   "products": [
    {
     "name": "Akamai Property Manager delivery",
     "what": "CDN delivery configured through property rules and behaviors, including Remove Vary Header.",
     "pricing": {
      "model": "enterprise quote",
      "from": null,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://techdocs.akamai.com/edgeworkers/docs/welcome-to-edgeworkers",
      "note": "EdgeWorkers needs a contract entitlement; no list price on the pages read"
     }
    },
    {
     "name": "Akamai EdgeWorkers",
     "what": "JavaScript functions run on Akamai edge servers on request and response events, with EdgeKV for data."
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No llms.txt feature for customer sites in the pages read."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No built-in markdown conversion in the pages read; EdgeWorkers code could implement it."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "Akamai's own techdocs offer .md URLs; no customer feature was found."
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "Akamai serves origin HTML; rendering is the origin's job."
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "Status codes come from the origin and property rules."
    },
    {
     "id": "vary-accept",
     "status": "partial",
     "evidence": "Edge servers skip caching for responses with Vary other than Accept-Encoding; Remove Vary Header strips it.",
     "source_url": "https://techdocs.akamai.com/property-mgr/docs/rm-vary-header"
    }
   ],
   "checks": {
    "domain": "akamai.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 403,
     "h1_in_initial_html": true,
     "words_in_initial_html": 31,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 403,
      "content_type": "text/html",
      "vary": null
     },
     "llms_txt": {
      "status": 403,
      "content_type": "text/html",
      "bytes": 380,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 403
     }
    },
    "ora": {
     "score": 27,
     "grade": "F",
     "scanned_at": "2026-10-23T03:53:50.07+00:00",
     "via": "GET https://ora.ai/api/score/akamai.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "unavailable": "scanner could not fetch the site: HTTP 403 Forbidden"
    },
    "crawl_2026_11_04": {
     "tranco_rank": 1859,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 403,
     "h1_in_html": false,
     "words": null,
     "js_shell": false,
     "jsonld_types": [],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": false,
     "missing_path_status": 403,
     "llms_txt_valid": false,
     "llms_txt_bytes": 380,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Akamai does not cache a response that varies on Accept, so a markdown-negotiating origin behind Akamai either loses edge caching or must drop Vary and risk mixed cache entries."
   ],
   "does_not_do_basis": [
    {
     "fact": 0,
     "keep": "both"
    }
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/akamai/",
   "homepage_status": {
    "status": 403,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "prerender-io",
   "name": "Prerender.io",
   "type": "host-or-cdn",
   "homepage": "https://prerender.io/",
   "one_line": "Dynamic rendering service that renders JavaScript pages in a headless browser, caches the HTML and serves it to search crawlers and AI crawlers, with meta tags that set the status code the cached copy returns.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Prerender.io's docs say it serves cached HTML to AI crawlers and search engines, and that accuracy depends on status codes, page readiness signals, cache management and cookie consent handling.",
     "source_url": "https://docs.prerender.io/docs/best-practices-for-crawler-ready-pages",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "By default Prerender.io caches a page and answers with 200 OK; a meta tag named prerender-status-code with the value 404 or 301 in the head overrides the status, and prerender-header can carry a Location for the 301.",
     "source_url": "https://docs.prerender.io/docs/best-practices-for-crawler-ready-pages",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Prerender.io caches exactly the status code the origin returns, so a missing page that the origin answers with 200 is cached and served to every crawler as a 200 soft 404.",
     "source_url": "https://docs.prerender.io/docs/404-page-is-cached-as-200",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Prerender.io guesses when a page is ready by counting in-flight network requests, and a page can set window.prerenderReady to false and then true to control when the snapshot is taken.",
     "source_url": "https://docs.prerender.io/docs/best-practices-for-crawler-ready-pages",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Prerender.io API has a /recache endpoint so a site can refresh a cached page when its content changes instead of waiting for expiry.",
     "source_url": "https://docs.prerender.io/docs/best-practices-for-crawler-ready-pages",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Prerender.io lists Starter at $59 a month for 30,000 renders, Growth at $169 a month for 100,000 renders and Pro at $419 a month for 500,000 renders, with custom Enterprise Plus pricing.",
     "source_url": "https://prerender.io/pricing/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    },
    {
     "claim": "Prerender.io says on its pricing page that it has supported businesses with search visibility since 2014.",
     "source_url": "https://prerender.io/pricing/",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "Prerender.io says 30 percent of bot traffic now comes from AI crawlers and that only 25 percent of AI crawlers can fetch JavaScript without executing it.",
     "source_url": "https://prerender.io/ai-search/",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    }
   ],
   "products": [
    {
     "name": "Prerender.io",
     "what": "Headless-browser rendering and HTML cache served to crawlers through a middleware or CDN integration.",
     "pricing": {
      "model": "subscription",
      "from": 59,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://prerender.io/pricing/",
      "note": "Starter, 30,000 renders a month, 30-day free trial"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "No llms.txt feature in the pages read."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "Prerender.io returns rendered HTML, not markdown, in the pages read."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No markdown output in the pages read."
    },
    {
     "id": "initial-html",
     "status": "supports",
     "evidence": "Crawlers and agents get cached, fully rendered HTML of JavaScript pages.",
     "source_url": "https://docs.prerender.io/docs/best-practices-for-crawler-ready-pages"
    },
    {
     "id": "real-404",
     "status": "partial",
     "evidence": "The cached status is whatever the origin returns, or the value of a prerender-status-code meta tag.",
     "source_url": "https://docs.prerender.io/docs/404-page-is-cached-as-200"
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Not covered in the pages read."
    }
   ],
   "checks": {
    "domain": "prerender.io",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 1394,
     "jsonld_blocks": 3,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding, Accept-Encoding,Cookie"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 7241,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "unavailable": "GET /api/score returned 404 DOMAIN_NOT_SCANNED"
    },
    "cloudflare": {
     "score": 33,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T14:06:18.523Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "Prerender.io does not detect soft 404s on its own terms; a missing page keeps the 200 the origin sent until a prerender-status-code tag says otherwise.",
    "Prerender.io does not change what human visitors receive; only requests routed to it by user agent get the cached HTML."
   ],
   "does_not_do_basis": [
    {
     "fact": 2,
     "keep": "fact"
    },
    null
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/prerender-io/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "jina-reader",
   "name": "Jina AI Reader",
   "type": "markdown-tooling",
   "operator": "Jina AI",
   "homepage": "https://jina.ai/reader/",
   "one_line": "Hosted API that fetches any URL in a browser and returns LLM-ready markdown or JSON when the URL is prefixed with r.jina.ai, plus a search endpoint at s.jina.ai; it shows a site what an agent pipeline extracts from its pages.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Jina AI Reader converts a page to LLM-friendly input when r.jina.ai is prepended to its URL.",
     "source_url": "https://jina.ai/reader/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Jina's s.jina.ai endpoint searches the web and returns the top five results with their URLs and contents as LLM-friendly text.",
     "source_url": "https://jina.ai/reader/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Reader API rate limit table lists r.jina.ai at 20 requests per minute without an API key, 500 with a free or paid key and 5,000 with a premium key, with an average latency of 7.9 seconds.",
     "source_url": "https://jina.ai/reader/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Reader lets the caller choose the browser engine used to fetch a page, override the User-Agent string, set the browser locale and set the window size.",
     "source_url": "https://jina.ai/reader/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Reader's markdown output options for headings, rules, emphasis and links are passed through to the Turndown library.",
     "source_url": "https://jina.ai/reader/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Reader caches fetched URL contents for a period; callers can bypass the cache, accept cached content younger than N seconds, or ask that a request be neither cached nor logged.",
     "source_url": "https://jina.ai/reader/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Jina says Reader reads PDFs natively, and an OCR option using jina-ocr-v1 turns images into markdown at 40 times the token cost.",
     "source_url": "https://jina.ai/reader/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Jina says the Reader service code is on its GitHub organization while the ReaderLM-v2 and jina-vlm models are CC-BY-NC 4.0, and that Elastic has sold the commercial licence as its own SKU since 2026-08-10.",
     "source_url": "https://jina.ai/reader/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-08-10"
    },
    {
     "claim": "Jina's FAQ routes purchase orders, negotiated contracts and procurement for the hosted APIs through Elastic rather than self-serve Stripe billing.",
     "source_url": "https://jina.ai/reader/",
     "read_date": "2026-11-05",
     "kind": "primary"
    }
   ],
   "products": [
    {
     "name": "Reader API (r.jina.ai)",
     "what": "URL to markdown, text, HTML or JSON conversion with browser rendering, caching and PDF support.",
     "pricing": {
      "model": "usage-based",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://jina.ai/reader/",
      "note": "Usable without a key at 20 requests a minute; paid token packs raise limits"
     }
    },
    {
     "name": "Search API (s.jina.ai)",
     "what": "Web search that returns the top five results with their page contents as text."
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "no statement",
     "evidence": "Reader does not generate llms.txt for sites in the page read."
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "Reader converts pages itself rather than negotiating with the origin, in the page read."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "Not a site feature; Reader produces its own markdown copy on request."
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "Reader runs a browser, so it reads JavaScript-rendered content that a plain fetch would miss."
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "Not covered in the page read."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Not covered in the page read."
    }
   ],
   "checks": {
    "domain": "jina.ai",
    "read_on": "2026-11-05",
    "scope": "Plain-fetch checks ran on https://jina.ai/reader/; the Ora and Cloudflare scores cover the whole host jina.ai.",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 5153,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding"
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 29317,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 61,
     "grade": "C",
     "scanned_at": "2026-10-01T19:16:59.135+00:00",
     "via": "GET https://ora.ai/api/score/jina.ai (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T14:06:31.981Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": null,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 1596,
     "js_shell": false,
     "jsonld_types": [],
     "home_links_llms_txt": true,
     "markdown_alternate_link": false,
     "generator": null,
     "answers_markdown": false,
     "missing_path_status": 404,
     "llms_txt_valid": false,
     "llms_txt_bytes": 27047,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Jina AI Reader changes nothing on the site it reads; it is a client-side conversion service, so a site gains no llms.txt or markdown route from it.",
    "Reader's commercial model licence is not included in token purchases, according to Jina's FAQ."
   ],
   "does_not_do_basis": [
    null,
    null
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/jina-reader/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "rank-math",
   "name": "Rank Math SEO",
   "type": "markdown-tooling",
   "homepage": "https://rankmath.com/",
   "one_line": "WordPress SEO plugin with an LLMS Txt module that writes /llms.txt from the post types and taxonomies a site picks, leaves out noindex posts, and caps the list at a configurable number of items.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Rank Math's knowledge base article on llms.txt was published on 2025-07-28 and last modified on 2025-09-23.",
     "source_url": "https://rankmath.com/kb/llms-txt/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2025-07-28"
    },
    {
     "claim": "Rank Math's llms.txt feature is a module named LLMS Txt that is switched on from Rank Math SEO, Dashboard, and configured under General Settings, Edit llms.txt.",
     "source_url": "https://rankmath.com/kb/llms-txt/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Rank Math says the llms.txt file stays empty until the site owner configures it.",
     "source_url": "https://rankmath.com/kb/llms-txt/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "For each selected post type, Rank Math lists every item's title, URL and a short intro-text description, and posts set to noindex are excluded.",
     "source_url": "https://rankmath.com/kb/llms-txt/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Rank Math can also list taxonomy terms such as categories or tags with their URLs.",
     "source_url": "https://rankmath.com/kb/llms-txt/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Rank Math's Posts/Terms Limit defaults to 100 items and an Additional Content field adds hand-written links or text.",
     "source_url": "https://rankmath.com/kb/llms-txt/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Rank Math's own guide calls llms.txt a proposal rather than an official standard and says adoption across platforms is limited.",
     "source_url": "https://rankmath.com/kb/llms-txt/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Rank Math's offer page lists PRO renewing at $8.99 a month billed annually, Business at $27.99 and Agency at $64.99, plus taxes.",
     "source_url": "https://rankmath.com/pricing/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "Rank Math SEO (free)",
     "what": "WordPress SEO plugin with a free version on wordpress.org; the LLMS Txt module is documented in its knowledge base."
    },
    {
     "name": "Rank Math PRO",
     "what": "Paid tiers of the plugin.",
     "pricing": {
      "model": "subscription",
      "from": 8.99,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://rankmath.com/pricing/",
      "note": "PRO renewal per month billed annually, plus taxes; sale prices shown on 2026-11-05 not recorded"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "supports",
     "evidence": "The LLMS Txt module writes /llms.txt from chosen post types and taxonomies.",
     "source_url": "https://rankmath.com/kb/llms-txt/"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No Accept-header handling in the article read."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "No .md copies in the article read."
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "Rendering is WordPress and the theme."
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "Not covered in the article read."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Not covered in the article read."
    }
   ],
   "checks": {
    "domain": "rankmath.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 1119,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding"
     },
     "llms_txt": {
      "status": 404,
      "content_type": "text/html",
      "bytes": 81219,
      "starts_with_h1": false
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 44,
     "grade": "D",
     "scanned_at": "2026-09-16T00:48:48.853+00:00",
     "via": "GET https://ora.ai/api/score/rankmath.com (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 27,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T14:06:45.358Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": null,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 1271,
     "js_shell": false,
     "jsonld_types": [
      "Organization",
      "WebSite",
      "ImageObject",
      "WebPage"
     ],
     "home_links_llms_txt": false,
     "markdown_alternate_link": false,
     "generator": "WP Rocket 3.19.4",
     "answers_markdown": false,
     "missing_path_status": 404,
     "llms_txt_valid": false,
     "llms_txt_bytes": 81219,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "Rank Math does not fill the llms.txt file on activation; nothing is listed until post types or taxonomies are chosen.",
    "Rank Math's module writes an index only; the guide read describes no llms-full.txt and no markdown versions of posts."
   ],
   "does_not_do_basis": [
    {
     "fact": 2,
     "keep": "fact"
    },
    {
     "fact": 1,
     "keep": "both"
    }
   ],
   "related": [
    "wordpress-llmstxt-plugins"
   ],
   "page": "https://agentreadyhtml.com/vendors/rank-math/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "aioseo",
   "name": "All in One SEO (AIOSEO)",
   "type": "markdown-tooling",
   "homepage": "https://aioseo.com/",
   "one_line": "WordPress SEO plugin whose LLMs.txt Generator writes llms.txt for every user and, on Pro plans, llms-full.txt with markdown formatting, from the post types and taxonomies a site selects.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "AIOSEO says its LLMs.txt Generator is available to Lite and Pro users, while llms-full.txt and the markdown settings need a Pro account.",
     "source_url": "https://aioseo.com/features/llms-txt-generator/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "AIOSEO's generator lets a site choose which post types, categories and taxonomies go into the llms.txt and llms-full.txt files.",
     "source_url": "https://aioseo.com/features/llms-txt-generator/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "AIOSEO describes a recent-posts llms.txt and a comprehensive llms-full.txt that can export the whole content library.",
     "source_url": "https://aioseo.com/features/llms-txt-generator/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "AIOSEO offers a markdown formatting option for the generated files.",
     "source_url": "https://aioseo.com/features/llms-txt-generator/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "AIOSEO manages the files from the WordPress dashboard.",
     "source_url": "https://aioseo.com/features/llms-txt-generator/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "AIOSEO calls the feature the \"#1 LLMs.txt Generator for WordPress\" and says 3 million+ professionals use the plugin.",
     "source_url": "https://aioseo.com/features/llms-txt-generator/",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    },
    {
     "claim": "AIOSEO's pricing FAQ says Basic renews at $99 a year against a $49.50 first-year price, and that other plans renew at roughly double their first-year rate.",
     "source_url": "https://aioseo.com/pricing/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-11-05"
    }
   ],
   "products": [
    {
     "name": "AIOSEO Lite",
     "what": "Free WordPress SEO plugin that can generate llms.txt."
    },
    {
     "name": "AIOSEO Pro plans",
     "what": "Paid tiers that add llms-full.txt, markdown settings and other SEO features.",
     "pricing": {
      "model": "subscription",
      "from": 49.5,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://aioseo.com/pricing/",
      "note": "Basic first year; renews at 99 USD a year"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "supports",
     "evidence": "Lite and Pro generate llms.txt; Pro adds llms-full.txt.",
     "source_url": "https://aioseo.com/features/llms-txt-generator/"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No Accept-header handling on the page read."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "The markdown option formats the generated files; no per-post .md URLs on the page read."
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "Rendering is WordPress and the theme."
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "The plugin's 404 features are about broken links, not status codes, on the page read."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Not covered on the page read."
    }
   ],
   "checks": {
    "domain": "aioseo.com",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 3433,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 786666,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "unavailable": "GET /api/score returned 404 DOMAIN_NOT_SCANNED"
    },
    "cloudflare": {
     "score": 20,
     "level": "L1 Basic Web Presence",
     "scanned_at": "2026-11-05T14:06:56.335Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    }
   },
   "does_not_do": [
    "AIOSEO Lite does not produce llms-full.txt; that file and the markdown settings sit behind the Pro plans."
   ],
   "does_not_do_basis": [
    {
     "fact": 0,
     "keep": "limit"
    }
   ],
   "related": [
    "wordpress-llmstxt-plugins"
   ],
   "page": "https://agentreadyhtml.com/vendors/aioseo/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "website-llms-txt",
   "name": "Website LLMs.txt (WordPress plugin)",
   "type": "markdown-tooling",
   "homepage": "https://wordpress.org/plugins/website-llms-txt/",
   "one_line": "Free WordPress plugin that builds and serves /llms.txt from published content on a schedule, reads noindex and nofollow flags from Yoast, Rank Math, SEOPress and AIOSEO, and leaves out content anonymous visitors cannot read.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "Website LLMs.txt lists more than 50,000 active installations on its wordpress.org page.",
     "source_url": "https://wordpress.org/plugins/website-llms-txt/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Website LLMs.txt rebuilds the file immediately, daily or weekly as set in Settings, LLMs.txt, and a Generate Now button rebuilds it on demand.",
     "source_url": "https://wordpress.org/plugins/website-llms-txt/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Website LLMs.txt reads the SEO settings of Yoast SEO, Rank Math, SEOPress and AIOSEO and excludes anything marked noindex or nofollow.",
     "source_url": "https://wordpress.org/plugins/website-llms-txt/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Since version 8.5.4, Website LLMs.txt leaves out anything an anonymous visitor cannot read, so sites with membership or access-control plugins lose those posts from the file by default.",
     "source_url": "https://wordpress.org/plugins/website-llms-txt/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Website LLMs.txt FAQ warns that files generated before 8.5.4 may have listed titles and links of non-public content, and advises replacing any shared copy.",
     "source_url": "https://wordpress.org/plugins/website-llms-txt/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Website LLMs.txt respects WooCommerce product visibility rules and supports multisite networks.",
     "source_url": "https://wordpress.org/plugins/website-llms-txt/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Website LLMs.txt exposes developer filters such as llms_generator_get_post_meta_description for description logic and can attach optional Markdown files.",
     "source_url": "https://wordpress.org/plugins/website-llms-txt/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The Website LLMs.txt FAQ says no AI model is guaranteed to use llms.txt, while naming GPTBot, ClaudeBot and PerplexityBot as crawlers that already fetch such files.",
     "source_url": "https://wordpress.org/plugins/website-llms-txt/",
     "read_date": "2026-11-05",
     "kind": "vendor_claim"
    }
   ],
   "products": [
    {
     "name": "Website LLMs.txt",
     "what": "WordPress plugin that generates, schedules and serves /llms.txt.",
     "pricing": {
      "model": "free",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://wordpress.org/plugins/website-llms-txt/",
      "note": "Free on wordpress.org, open source"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "supports",
     "evidence": "The plugin generates llms.txt and serves it from the site root.",
     "source_url": "https://wordpress.org/plugins/website-llms-txt/"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "No Accept-header handling on the plugin page."
    },
    {
     "id": "markdown-twin",
     "status": "no statement",
     "evidence": "Optional Markdown files can be attached; no per-post .md URLs on the plugin page."
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "Rendering is WordPress and the theme."
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "Not covered on the plugin page."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Not covered on the plugin page."
    }
   ],
   "checks": {
    "domain": "wordpress.org",
    "read_on": "2026-11-05",
    "scope": "Plain-fetch checks ran on https://wordpress.org/plugins/website-llms-txt/; the Ora and Cloudflare scores cover the whole host wordpress.org.",
    "note": "The domain wordpress.org is shared with the wordpress record, so its Ora and Cloudflare scores are on that record.",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 5134,
     "jsonld_blocks": 1,
     "markdown_request": {
      "status": 200,
      "content_type": "text/markdown",
      "vary": "Accept"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 5765,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    }
   },
   "does_not_do": [
    "Website LLMs.txt does not decide which posts are public on membership sites; since 8.5.4 it drops them unless an editor includes each one by hand."
   ],
   "does_not_do_basis": [
    null
   ],
   "related": [
    "wordpress-llmstxt-plugins"
   ],
   "page": "https://agentreadyhtml.com/vendors/website-llms-txt/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  },
  {
   "id": "llms-txt-python",
   "name": "llms-txt (Answer.AI reference tooling)",
   "type": "markdown-tooling",
   "operator": "Answer.AI",
   "homepage": "https://llmstxt.org/",
   "one_line": "The Python module published with the llms.txt proposal: it parses an llms.txt file into sections and expands the linked files into an XML context, alongside the proposal text that defines the file and the .md page copies.",
   "read_date": "2026-11-05",
   "facts": [
    {
     "claim": "The llmstxt.org core module implements parse_llms_file, which pulls the sections of an llms.txt into a simple data structure.",
     "source_url": "https://llmstxt.org/core.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The llms-txt module builds a Project with one Section per H2 part of the file and can skip the section named Optional.",
     "source_url": "https://llmstxt.org/core.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The llms-txt module offers an XML output because, its docs say, some LLMs such as Claude prefer XML.",
     "source_url": "https://llmstxt.org/core.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The v2 changes page says the llms_txt2ctx context-expansion tool is no longer part of the proposal; agents are expected to read llms.txt and follow its links.",
     "source_url": "https://llmstxt.org/changes.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Proposal v2 adds rel=\"alternate\" type=\"text/markdown\" for a page's markdown copy and rel=\"describedby\" for the llms.txt that covers it, as HTML link elements or an HTTP Link header.",
     "source_url": "https://llmstxt.org/changes.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "Proposal v2 accepts both page.html.md and page.md as markdown copy URLs and says the most specific llms.txt in a subpath applies.",
     "source_url": "https://llmstxt.org/changes.html",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The llmstxt.org page lists August 10, 2026 as its modified date.",
     "source_url": "https://llmstxt.org/",
     "read_date": "2026-11-05",
     "kind": "primary",
     "fact_date": "2026-08-10"
    },
    {
     "claim": "llmstxt.org says all nbdev projects now create .md versions of every page by default.",
     "source_url": "https://llmstxt.org/",
     "read_date": "2026-11-05",
     "kind": "primary"
    },
    {
     "claim": "The AnswerDotAI/llms-txt repository on GitHub is published under the Apache-2.0 licence.",
     "source_url": "https://github.com/AnswerDotAI/llms-txt",
     "read_date": "2026-11-05",
     "kind": "primary"
    }
   ],
   "products": [
    {
     "name": "llms-txt Python module",
     "what": "Parser and context builder for llms.txt files, documented on llmstxt.org.",
     "pricing": {
      "model": "open source",
      "from": 0,
      "currency": "USD",
      "as_of": "2026-11-05",
      "source_url": "https://github.com/AnswerDotAI/llms-txt",
      "note": "Apache-2.0"
     }
    }
   ],
   "standards": [
    {
     "id": "llms-txt",
     "status": "supports",
     "evidence": "Reference parser and the proposal text itself.",
     "source_url": "https://llmstxt.org/"
    },
    {
     "id": "markdown-negotiation",
     "status": "no statement",
     "evidence": "The proposal pages read define link relations, not Accept-header negotiation."
    },
    {
     "id": "markdown-twin",
     "status": "supports",
     "evidence": "v2 defines page.html.md and page.md copies.",
     "source_url": "https://llmstxt.org/changes.html"
    },
    {
     "id": "initial-html",
     "status": "no statement",
     "evidence": "Out of scope for the module."
    },
    {
     "id": "real-404",
     "status": "no statement",
     "evidence": "Out of scope for the module."
    },
    {
     "id": "vary-accept",
     "status": "no statement",
     "evidence": "Out of scope for the module."
    }
   ],
   "checks": {
    "domain": "llmstxt.org",
    "read_on": "2026-11-05",
    "plain_fetch": {
     "method": "GET with the crawl user agent; Accept: text/html, then Accept: text/markdown; /llms.txt at the origin; a made-up path without following redirects",
     "home_status": 200,
     "h1_in_initial_html": true,
     "words_in_initial_html": 1801,
     "jsonld_blocks": 0,
     "markdown_request": {
      "status": 200,
      "content_type": "text/html",
      "vary": "Accept-Encoding"
     },
     "llms_txt": {
      "status": 200,
      "content_type": "text/plain",
      "bytes": 637,
      "starts_with_h1": true
     },
     "missing_path": {
      "status": 404
     }
    },
    "ora": {
     "score": 44,
     "grade": "D",
     "scanned_at": "2026-10-11T18:26:39.747+00:00",
     "via": "GET https://ora.ai/api/score/llmstxt.org (cached; no scan was triggered)"
    },
    "cloudflare": {
     "score": 7,
     "level": "L0 Not Ready",
     "scanned_at": "2026-11-05T14:07:19.377Z",
     "via": "POST https://isitagentready.com/api/scan, keyless, default profile; score computed as the page does"
    },
    "crawl_2026_11_04": {
     "tranco_rank": null,
     "reachable": true,
     "skipped_by_robots": false,
     "home_status": 200,
     "h1_in_html": true,
     "words": 1896,
     "js_shell": false,
     "jsonld_types": [],
     "home_links_llms_txt": true,
     "markdown_alternate_link": false,
     "generator": "quarto-1.10.18",
     "answers_markdown": false,
     "missing_path_status": 404,
     "llms_txt_valid": true,
     "llms_txt_bytes": 637,
     "llms_full_valid": false,
     "edition": "shared crawl 2026-11-04, Tranco list 746WX"
    }
   },
   "does_not_do": [
    "The llms-txt module does not generate an llms.txt from a website; it reads and expands a file someone has already written."
   ],
   "does_not_do_basis": [
    null
   ],
   "related": [],
   "page": "https://agentreadyhtml.com/vendors/llms-txt-python/",
   "homepage_status": {
    "status": 200,
    "checked": "2026-11-05"
   }
  }
 ]
}
