-
Notifications
You must be signed in to change notification settings - Fork 1
feat(seo): serve prerendered pages to AI crawlers, state the crawler policy in robots.txt #9898
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
62af6bf
feat(seo): serve prerendered pages to AI crawlers, state the policy i…
MarkusNeusinger 83d15fb
docs: reference the PR in the changelog entry
MarkusNeusinger 206fd20
fix(seo): repeat the content signals in the AI user-agent group
MarkusNeusinger 410e123
fix(seo): put the named robots.txt groups before the wildcard group
MarkusNeusinger c34c44f
fix(seo): put Disallow before the broad Allow in every robots.txt group
MarkusNeusinger 6556e3b
fix(seo): declare the content signals in every robots.txt group
MarkusNeusinger 17de3f7
Merge branch 'main' into feat/ai-crawler-policy
MarkusNeusinger File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,16 +1,75 @@ | ||
| # Intended crawler policy: AI crawlers are WELCOME (see /llms.txt and the MCP | ||
| # server — anyplot's strategy is to be maximally consumable by AI agents). | ||
| # Crawler policy — AI crawlers that RETRIEVE and CITE are welcome: anyplot is | ||
| # built to be consumable by AI agents (see /llms.txt and the MCP server at | ||
| # https://api.anyplot.ai/mcp/). Training-only scrapers are declined below. | ||
| # | ||
| # NOTE: Cloudflare's "block AI bots" zone setting currently PREPENDS a managed | ||
| # block (Disallow: / for ClaudeBot, GPTBot, CCBot, Google-Extended, ...) to the | ||
| # live https://anyplot.ai/robots.txt, contradicting this file and llms.txt. | ||
| # Fix lives in the Cloudflare dashboard (zone setting), not in this repo: | ||
| # disable the managed AI-bot block (or switch it to Content-Signal-only) so | ||
| # the live file matches this one. | ||
| # Cloudflare's AI Crawl Control can PREPEND its own managed block to the live | ||
| # file and additionally answer the blocked user agents with HTTP 403 at the | ||
| # edge, so https://anyplot.ai/robots.txt may be longer and stricter than this | ||
| # file. The policy is therefore spelled out here in full — including the | ||
| # content signals Cloudflare would otherwise supply — so it survives with the | ||
| # managed block turned off. Rationale, dashboard steps and how to verify: | ||
| # docs/reference/seo.md ("AI crawler policy"). | ||
| # | ||
| # Two ordering rules in here are load-bearing, both for the same reason — | ||
| # a compliant crawler resolves by specificity, simpler parsers by first match: | ||
| # 1. Named groups come FIRST, `User-agent: *` last. With the wildcard on top, | ||
| # a first-match parser would read `Allow: /` and never reach the declining | ||
| # groups below. | ||
| # 2. Inside a group, `Disallow:` lines come BEFORE `Allow: /` — otherwise a | ||
| # first-match parser lets /debug and /interactive through (verified with | ||
| # Python's urllib.robotparser, which is exactly such a parser). | ||
|
|
||
| User-agent: * | ||
| # Content signals per contentsignals.org. ANY RESTRICTION EXPRESSED HERE IS AN | ||
| # EXPRESS RESERVATION OF RIGHTS UNDER ARTICLE 4 OF EU DIRECTIVE 2019/790. | ||
| # search: indexing and returning links/excerpts — yes | ||
| # ai-input: retrieval for AI answers, grounding, citation — yes | ||
| # ai-train: training or fine-tuning models — no | ||
| # | ||
| # The signal is repeated in EVERY group below, because a crawler reads only the | ||
| # group that matches it: a reservation declared once under `User-agent: *` would | ||
| # never reach a named agent — least of all the training collectors it is aimed | ||
| # at. | ||
| # | ||
| # AI assistants, AI search and citation crawlers. These send readers back and | ||
| # are the reason /llms.txt exists; the *-User agents fetch only because a human | ||
| # asked their assistant to open the page. | ||
| User-agent: ClaudeBot | ||
| User-agent: Claude-User | ||
| User-agent: Claude-SearchBot | ||
| User-agent: OAI-SearchBot | ||
| User-agent: ChatGPT-User | ||
| User-agent: PerplexityBot | ||
| User-agent: Perplexity-User | ||
| Content-Signal: search=yes,ai-input=yes,ai-train=no,use=reference | ||
| Disallow: /debug | ||
| Disallow: /interactive | ||
| Allow: / | ||
|
|
||
| # Training-only collectors: they take the catalogue without ever returning a | ||
| # reader, which is what ai-train=no says in prose. GPTBot sits here because it | ||
| # is OpenAI's TRAINING crawler — ChatGPT's retrieval path is | ||
| # OAI-SearchBot/ChatGPT-User above and stays open. Flip this one group if the | ||
| # training stance ever changes. | ||
| User-agent: GPTBot | ||
| User-agent: CCBot | ||
| User-agent: Bytespider | ||
| User-agent: Amazonbot | ||
| User-agent: meta-externalagent | ||
| Content-Signal: search=yes,ai-input=yes,ai-train=no,use=reference | ||
| Disallow: / | ||
|
|
||
| # Opt-out tokens for vendors that crawl under a different user agent | ||
| # (Googlebot / Applebot fetch for search and stay allowed). | ||
| User-agent: Google-Extended | ||
| User-agent: Applebot-Extended | ||
| Content-Signal: search=yes,ai-input=yes,ai-train=no,use=reference | ||
| Disallow: / | ||
|
|
||
| # Everyone else: search engines, social/link previews, feed readers. | ||
| User-agent: * | ||
| Content-Signal: search=yes,ai-input=yes,ai-train=no,use=reference | ||
| Disallow: /debug | ||
| Disallow: /interactive | ||
| Allow: / | ||
|
|
||
| Sitemap: https://anyplot.ai/sitemap.xml | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.