User-agent: *
Allow: /
# No bot-specific rules below: GPTBot, ChatGPT-User, OAI-SearchBot, PerplexityBot,
# ClaudeBot, anthropic-ai, Google-Extended, Bingbot, and CCBot all inherit this same
# permissive rule intentionally, to maximize AI-answer-engine citation of
# public marketing pages. Do not add a narrower block for these unless there
# is a specific reason to opt a given crawler out.
Disallow: /admin/
Disallow: /kai/
# /portal is deliberately NOT disallowed (2026-08-17). `Disallow: /portal` is a
# PREFIX match, so it also covered the legacy /portal/about.html,
# /portal/pricing.html, /portal/terms.html and /portal/Demo/?v= URLs that
# existed before the 2026-07-31 static-path rename (when static/ was mounted at
# /portal instead of root). Those paths now correctly 404 — but a blocked URL
# cannot be crawled, so Google could never SEE the 404 and could never drop the
# stale entries: Search Console reported them as "Indexed, though blocked by
# robots.txt" and the removal validation failed on 8/11/26 for exactly this
# reason. Same trap already documented below for terms.html/privacy.html.
# The SPA itself (/portal and /portal/, the only two real routes — every other
# /portal/* path 404s) is kept out of the index by
# in static/portal-app.html,
# which Google can only act on if it is allowed to fetch the page.
# Do NOT re-add a Disallow here unless these URLs are first confirmed dropped
# from the index in Search Console.
# static/Demo/ contains exactly one file (index.html), and both /Demo/ and
# /Demo/index.html serve it (StaticFiles html=True). A Disallow here protected
# nothing and risked a bare-URL listing for /Demo/ — blocked URLs can still be
# indexed from inbound links, and a blocked crawl can never read the canonical.
# Both URLs stay crawlable; the page carries to keep it out of the search index (same reasoning
# as terms.html/privacy.html below — a Disallow would block the crawl and
# Google would never read the noindex, leaving it eligible for a bare-URL
# listing from inbound links). It is also no longer listed in sitemap.xml.
# The self-referential canonical (-> /Demo/index.html) still consolidates the
# /Demo/, /Demo/index.html and /Demo/?v= cache-buster variants.
# Do NOT add a Disallow here unless the page is first confirmed dropped from
# the index in Search Console.
Allow: /Demo/
Disallow: /checkout.html
Disallow: /custom-checkout.html
Disallow: /billing.html
Disallow: /dashboard.html
Disallow: /launcher.html
Disallow: /portal-app.html
Disallow: /success.html
Disallow: /unsubscribed.html
Disallow: /unsubscribe.html
Disallow: /api/
# terms.html/privacy.html/aup.html/dpa.html are kept OUT of the search index,
# but deliberately still crawlable. They carry instead of a Disallow here, because a Disallow
# would block the crawl and Google would therefore never read the noindex —
# leaving them eligible to appear as bare-URL listings via the footer links on
# every page. "follow" keeps footer link equity flowing through them.
# Do NOT add Disallow lines for these unless the pages have first been
# confirmed dropped from the index in Search Console.
Sitemap: https://anweshna.com/sitemap.xml