Skip to content

Enhance SEO with llms.txt, sitemap updates, and RSS feed support#21

Open
CourtneyFradreck wants to merge 2 commits into
mainfrom
attachcv
Open

Enhance SEO with llms.txt, sitemap updates, and RSS feed support#21
CourtneyFradreck wants to merge 2 commits into
mainfrom
attachcv

Conversation

@CourtneyFradreck
Copy link
Copy Markdown
Owner

@CourtneyFradreck CourtneyFradreck commented Apr 14, 2026

Summary by CodeRabbit

  • New Features

    • Enabled RSS feed for subscribers to receive blog updates
    • Added AI/machine learning discovery protocol
    • Enhanced search engine optimization with improved metadata and structured data
  • Improvements

    • Optimized image loading performance across blog pages
    • Refined sitemap with content priority levels
    • Updated site discoverability directives

@netlify
Copy link
Copy Markdown

netlify Bot commented Apr 14, 2026

Deploy Preview for courtnotes ready!

Name Link
🔨 Latest commit 90b7d4b
🔍 Latest deploy log https://app.netlify.com/projects/courtnotes/deploys/69dea4e18676e500082c73f5
😎 Deploy Preview https://deploy-preview-21--courtnotes.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 14, 2026

📝 Walkthrough

Walkthrough

This pull request extends a static site with RSS feed generation, LLM-accessible content, and enhanced SEO metadata. Changes include new feed templates (feed.xml.njk, llms.txt.njk), comprehensive SEO improvements with structured data in seo.njk, optimized image attributes across templates, and bot discovery directives in robots.txt.njk and sitemap.xml.njk.

Changes

Cohort / File(s) Summary
Feed & Discovery Infrastructure
src/feed.xml.njk, src/individual-blog.njk, src/llms.txt.njk, src/robots.txt.njk
Added RSS feed generation, LLM-accessible content file, RSS link in individual blog template, and Llms-Txt discovery directive in robots.
SEO Enhancements
src/_includes/seo.njk, src/sitemap.xml.njk, src/index.njk
Enhanced with conditional JSON-LD (BlogPosting, WebSite, WebPage types), article-specific meta tags, priority values in sitemap, and homepage description for CourtNotes.
Image Optimization
src/individual-blog.njk, src/blog.njk
Added explicit width/height dimensions (800x450 for individual posts, 400x225 for blog previews) and loading strategies (eager for featured images, lazy for thumbnails).

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • #14: Modifies src/_includes/seo.njk with overlapping SEO meta/JSON-LD enhancements and URL handling patterns
  • #13: Updates src/individual-blog.njk with RSS link and image attribute changes; directly overlaps with this PR's markup modifications
  • #15: Enhances src/sitemap.xml.njk with date formatting and priority logic similar to this PR's sitemap updates

Poem

🐰 Whiskers twitching with delight,
RSS feeds now glowing bright,
LLMs find our llms.txt with glee,
SEO JSON-LD sets our content free!
Images optimized, metadata's tight—
This little rabbit hops toward search light! 🔍

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the main changes: adding llms.txt support, updating sitemaps with priority elements, and implementing RSS feed functionality for SEO enhancement.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch attachcv

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR enhances the site’s SEO/discoverability by adding llms.txt and an RSS feed, improving sitemap metadata, and tightening on-page SEO tags for better indexing and previews.

Changes:

  • Add llms.txt and expose it via robots.txt.
  • Introduce an RSS feed (feed.xml) and add RSS autodiscovery in SEO markup.
  • Improve sitemap entries (priorities) and add image dimension/loading hints across key templates.

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
src/sitemap.xml.njk Adds per-URL <priority> values to sitemap entries.
src/robots.txt.njk Adds a pointer to llms.txt alongside the sitemap reference.
src/llms.txt.njk Adds an llms.txt endpoint with site summary and post links.
src/index.njk Adds homepage description and image performance attributes.
src/feed.xml.njk Adds an RSS 2.0 feed rendering posts.
src/blog.njk Adds image dimension/loading attributes to blog snippets.
src/_includes/seo.njk Adds RSS autodiscovery, robots meta, conditional OG/schema output.
src/_includes/individual-blog.njk Removes duplicate <title> and tweaks post hero image attributes (but adds a duplicate RSS link).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/feed.xml.njk
Comment on lines +8 to +20
<title>{{ metadata.title }}</title>
<link>{{ metadata.siteUrl }}</link>
<description>Personal blog by {{ metadata.author }} — covering software engineering, startup building, and learning in public.</description>
<language>en</language>
<atom:link href="{{ metadata.siteUrl }}/feed.xml" rel="self" type="application/rss+xml"/>
{%- for post in collections.post | reverse %}
<item>
<title>{{ post.data.title }}</title>
<link>{{ metadata.siteUrl }}{{ post.url }}</link>
<guid isPermaLink="true">{{ metadata.siteUrl }}{{ post.url }}</guid>
<description>{{ post.data.description }}</description>
<pubDate>{{ post.date.toUTCString() }}</pubDate>
<author>{{ metadata.author }}</author>
Copy link

Copilot AI Apr 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RSS XML output needs escaping: at least one post title contains an ampersand (e.g., “AgriLease & Nexpay”), and unescaped & (or <, >, etc.) will produce invalid XML in <title>/<description>. Please XML-escape these fields (or wrap in CDATA) when rendering the feed items.

Suggested change
<title>{{ metadata.title }}</title>
<link>{{ metadata.siteUrl }}</link>
<description>Personal blog by {{ metadata.author }} — covering software engineering, startup building, and learning in public.</description>
<language>en</language>
<atom:link href="{{ metadata.siteUrl }}/feed.xml" rel="self" type="application/rss+xml"/>
{%- for post in collections.post | reverse %}
<item>
<title>{{ post.data.title }}</title>
<link>{{ metadata.siteUrl }}{{ post.url }}</link>
<guid isPermaLink="true">{{ metadata.siteUrl }}{{ post.url }}</guid>
<description>{{ post.data.description }}</description>
<pubDate>{{ post.date.toUTCString() }}</pubDate>
<author>{{ metadata.author }}</author>
<title>{{ metadata.title | escape }}</title>
<link>{{ metadata.siteUrl | escape }}</link>
<description>Personal blog by {{ metadata.author | escape }} — covering software engineering, startup building, and learning in public.</description>
<language>en</language>
<atom:link href="{{ (metadata.siteUrl ~ '/feed.xml') | escape }}" rel="self" type="application/rss+xml"/>
{%- for post in collections.post | reverse %}
<item>
<title>{{ post.data.title | escape }}</title>
<link>{{ (metadata.siteUrl ~ post.url) | escape }}</link>
<guid isPermaLink="true">{{ (metadata.siteUrl ~ post.url) | escape }}</guid>
<description>{{ post.data.description | escape }}</description>
<pubDate>{{ post.date.toUTCString() }}</pubDate>
<author>{{ metadata.author | escape }}</author>

Copilot uses AI. Check for mistakes.
Comment thread src/feed.xml.njk
<guid isPermaLink="true">{{ metadata.siteUrl }}{{ post.url }}</guid>
<description>{{ post.data.description }}</description>
<pubDate>{{ post.date.toUTCString() }}</pubDate>
<author>{{ metadata.author }}</author>
Copy link

Copilot AI Apr 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

<author> in RSS 2.0 items is intended to be an email address (often in the form email (name)); a plain display name may fail validation in stricter feed readers. Consider removing <author>, adding a real email, or switching to dc:creator (with the proper namespace) for a name-only author field.

Copilot uses AI. Check for mistakes.
<link rel="shortcut icon" href="../assets/logo.svg" type="image/x-icon">
<title>{{ title }}</title>
<link rel="stylesheet" href="/individual.css">
<link rel="alternate" type="application/rss+xml" title="{{ metadata.title }} RSS Feed" href="{{ '/feed.xml' | absoluteUrl(metadata.siteUrl) }}">
Copy link

Copilot AI Apr 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This duplicates the RSS autodiscovery link already emitted by seo.njk (included on line 6). Keeping both results in two identical <link rel="alternate" ...> tags in the page head; remove one (prefer keeping it centralized in seo.njk).

Suggested change
<link rel="alternate" type="application/rss+xml" title="{{ metadata.title }} RSS Feed" href="{{ '/feed.xml' | absoluteUrl(metadata.siteUrl) }}">

Copilot uses AI. Check for mistakes.
Comment thread src/robots.txt.njk
Allow: /

Sitemap: {{ metadata.siteUrl }}/sitemap.xml
Llms-Txt: {{ metadata.siteUrl }}/llms.txt
Copy link

Copilot AI Apr 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Llms-Txt: is not a standard robots.txt directive, so most crawlers will ignore it (and some validators may flag it). If the goal is discoverability, consider relying on the well-known /llms.txt path (and/or linking it from HTML) rather than adding a non-standard robots.txt field.

Suggested change
Llms-Txt: {{ metadata.siteUrl }}/llms.txt

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (1)
src/_includes/individual-blog.njk (1)

9-9: Drop the duplicate RSS discovery tag.

seo.njk is already included on Line 6, and it now emits the same RSS <link rel="alternate"> in src/_includes/seo.njk Line 26. Keeping both means each post page advertises the same feed twice.

✂️ Suggested cleanup
-    <link rel="alternate" type="application/rss+xml" title="{{ metadata.title }} RSS Feed" href="{{ '/feed.xml' | absoluteUrl(metadata.siteUrl) }}">
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/_includes/individual-blog.njk` at line 9, Remove the duplicate RSS
discovery tag from the individual blog template: delete the explicit <link
rel="alternate" type="application/rss+xml" ...> line in
src/_includes/individual-blog.njk (the one that builds "{{ '/feed.xml' |
absoluteUrl(metadata.siteUrl) }}") because seo.njk already emits the same tag;
keep the seo.njk emission (src/_includes/seo.njk Line 26) and ensure only that
single RSS <link rel="alternate"> remains on post pages.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/_includes/seo.njk`:
- Around line 54-111: The JSON-LD blocks (BlogPosting, WebSite, WebPage) inject
unescaped template variables (e.g., title, description, author, metadata.title,
metadata.author, seoTitle, fullImage, absolutePageUrl, date) directly into JSON;
create/register a Nunjucks filter (e.g., toJSON) that returns
JSON.stringify(value) and then update every dynamic insertion inside the three
conditional scripts (the isPost BlogPosting block, the Home WebSite block, and
the default WebPage block) to pipe the variables through that filter (e.g., use
title | toJSON, description | toJSON, author | toJSON, metadata.title | toJSON,
etc.), and ensure date values are converted/escaped similarly
(date.toISOString() | toJSON or pre-format before filtering) so all injected
values are valid, escaped JSON strings.

In `@src/feed.xml.njk`:
- Around line 15-19: Escape XML-sensitive characters when rendering RSS item
fields in src/feed.xml.njk: replace raw uses of post.data.title and
post.data.description with XML-escaped equivalents (e.g., helper/filters that
escape &, <, >, " and '), or wrap description in a CDATA block before emitting;
ensure link/guid composed from metadata.siteUrl and post.url remain unchanged
but escaped if they can contain special characters, and leave pubDate as
post.date.toUTCString(). Update the template to call the escape helper (or use
CDATA for description) wherever post.data.title or post.data.description are
rendered.

In `@src/llms.txt.njk`:
- Around line 5-7: Templates are using two different data sources (site.* in
src/llms.txt.njk vs metadata.* in sitemap.xml.njk and robots.txt.njk); pick one
and make all templates consistent—I suggest standardizing on metadata.*: change
src/llms.txt.njk to use metadata.title and metadata.description instead of
site.title/site.description, and update metadata.js to export description (or
sync .eleventy.js siteMetadata.description into metadata.js) so metadata
contains title, author, siteUrl, and description; ensure any code referencing
siteMetadata is updated to reference metadata where applicable.

In `@src/robots.txt.njk`:
- Line 9: Remove the non-standard "Llms-Txt: {{ metadata.siteUrl }}/llms.txt"
directive from src/robots.txt.njk; either delete that line or replace it with a
standard directive such as "Sitemap: {{ metadata.siteUrl }}/llms.txt" so
crawlers can discover the llms.txt via the recognized Sitemap directive, and
ensure the llms.txt file is served at the standard path (/llms.txt).

---

Nitpick comments:
In `@src/_includes/individual-blog.njk`:
- Line 9: Remove the duplicate RSS discovery tag from the individual blog
template: delete the explicit <link rel="alternate" type="application/rss+xml"
...> line in src/_includes/individual-blog.njk (the one that builds "{{
'/feed.xml' | absoluteUrl(metadata.siteUrl) }}") because seo.njk already emits
the same tag; keep the seo.njk emission (src/_includes/seo.njk Line 26) and
ensure only that single RSS <link rel="alternate"> remains on post pages.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 75de40cd-217d-40be-b2cb-f3d2757fb47f

📥 Commits

Reviewing files that changed from the base of the PR and between dee9a68 and 90b7d4b.

📒 Files selected for processing (8)
  • src/_includes/individual-blog.njk
  • src/_includes/seo.njk
  • src/blog.njk
  • src/feed.xml.njk
  • src/index.njk
  • src/llms.txt.njk
  • src/robots.txt.njk
  • src/sitemap.xml.njk

Comment thread src/_includes/seo.njk
Comment on lines +54 to +111
{# Schema.org JSON-LD — conditional by page type #}
{% if isPost %}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Blog",
"name": "{{ seoTitle }}",
"url": "{{ absolutePageUrl }}",
"@type": "BlogPosting",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "{{ absolutePageUrl }}"
},
"headline": "{{ title }}",
"description": "{{ description }}",
"image": ["{{ fullImage }}"],
"author": {
"@type": "Person",
"name": "{{ author }}"
},
"publisher": {
"@type": "Organization",
"name": "{{ metadata.title }}",
"logo": {
"@type": "ImageObject",
"url": "{{ '/assets/logo.svg' | absoluteUrl(metadata.siteUrl) }}"
}
},
"datePublished": "{{ date.toISOString() if date else '2024-01-01' }}",
"dateModified": "{{ date.toISOString() if date else '2024-01-01' }}"
}
</script>
{% elif title == "Home" %}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "{{ metadata.title }}",
"url": "{{ metadata.siteUrl }}",
"description": "{{ description }}",
"author": {
"@type": "Person",
"name": "{{ metadata.author }}"
}
}
</script>
{% else %}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "{{ absolutePageUrl }}"
},
"headline": "{{ seoTitle | safe }}",
"description": "{{ description | safe }}",
"image": ["{{ fullImage }}"],
"author": {
"@type": "Person",
"name": "{{ author or metadata.author }}"
},
"publisher": {
"@type": "Organization",
"name": "{{ seoTitle }}",
"logo": {
"@type": "ImageObject",
"url": "{{ '/assets/logo.svg' | absoluteUrl(metadata.siteUrl) }}"
}
},
"datePublished": "{{ date or '2024-01-01' }}",
"dateModified": "{{ date or '2024-01-01' }}"
}
</script>

No newline at end of file
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "{{ seoTitle }}",
"url": "{{ absolutePageUrl }}",
"description": "{{ description }}",
"author": {
"@type": "Person",
"name": "{{ metadata.author }}"
}
}
</script>
{% endif %}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

find . -name "seo.njk" -type f

Repository: CourtneyFradreck/CourtNotes

Length of output: 94


🏁 Script executed:

cat -n ./src/_includes/seo.njk | head -120

Repository: CourtneyFradreck/CourtNotes

Length of output: 4898


🏁 Script executed:

find . -name ".eleventy.js" -o -name "eleventy.config.js" -o -name "*.config.js" | head -5

Repository: CourtneyFradreck/CourtNotes

Length of output: 85


🏁 Script executed:

cat -n ./.eleventy.js

Repository: CourtneyFradreck/CourtNotes

Length of output: 2143


🏁 Script executed:

rg -i "filter|tojson|jsonencode|jsonescape" --type=js . | head -20

Repository: CourtneyFradreck/CourtNotes

Length of output: 415


🏁 Script executed:

cat -n package.json

Repository: CourtneyFradreck/CourtNotes

Length of output: 493


🏁 Script executed:

find src -name "*.md" -type f | head -3 | xargs head -30

Repository: CourtneyFradreck/CourtNotes

Length of output: 5280


🏁 Script executed:

rg -i "nunjucks|njk" package.json

Repository: CourtneyFradreck/CourtNotes

Length of output: 53


🏁 Script executed:

rg "tojson|toJSON" src/ --type=njk

Repository: CourtneyFradreck/CourtNotes

Length of output: 98


🏁 Script executed:

rg "tojson|toJSON" src/

Repository: CourtneyFradreck/CourtNotes

Length of output: 53


Apply JSON escaping to all dynamic values in JSON-LD blocks.

These template variables (title, description, author, metadata.title, metadata.author, seoTitle) are interpolated directly into JSON without encoding. Any double quotes, backslashes, or newlines in these values will produce invalid JSON. Register a Nunjucks filter (e.g., toJSON or escape) that applies JSON.stringify() to these values, or wrap them explicitly with proper JSON encoding.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/_includes/seo.njk` around lines 54 - 111, The JSON-LD blocks
(BlogPosting, WebSite, WebPage) inject unescaped template variables (e.g.,
title, description, author, metadata.title, metadata.author, seoTitle,
fullImage, absolutePageUrl, date) directly into JSON; create/register a Nunjucks
filter (e.g., toJSON) that returns JSON.stringify(value) and then update every
dynamic insertion inside the three conditional scripts (the isPost BlogPosting
block, the Home WebSite block, and the default WebPage block) to pipe the
variables through that filter (e.g., use title | toJSON, description | toJSON,
author | toJSON, metadata.title | toJSON, etc.), and ensure date values are
converted/escaped similarly (date.toISOString() | toJSON or pre-format before
filtering) so all injected values are valid, escaped JSON strings.

Comment thread src/feed.xml.njk
Comment on lines +15 to +19
<title>{{ post.data.title }}</title>
<link>{{ metadata.siteUrl }}{{ post.url }}</link>
<guid isPermaLink="true">{{ metadata.siteUrl }}{{ post.url }}</guid>
<description>{{ post.data.description }}</description>
<pubDate>{{ post.date.toUTCString() }}</pubDate>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Escape RSS item fields before writing XML.

post.data.title and post.data.description are emitted raw here. A post containing &, <, or > will produce malformed feed.xml, and some readers will reject the feed entirely. Please XML-escape these values, or wrap the description safely in CDATA before rendering.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/feed.xml.njk` around lines 15 - 19, Escape XML-sensitive characters when
rendering RSS item fields in src/feed.xml.njk: replace raw uses of
post.data.title and post.data.description with XML-escaped equivalents (e.g.,
helper/filters that escape &, <, >, " and '), or wrap description in a CDATA
block before emitting; ensure link/guid composed from metadata.siteUrl and
post.url remain unchanged but escaped if they can contain special characters,
and leave pubDate as post.date.toUTCString(). Update the template to call the
escape helper (or use CDATA for description) wherever post.data.title or
post.data.description are rendered.

Comment thread src/llms.txt.njk
Comment on lines +5 to +7
# {{ site.title }}

> {{ site.description }}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Compare site metadata sources to detect inconsistencies

echo "=== Checking .eleventy.js siteMetadata ==="
rg -A 5 'const siteMetadata = \{' .eleventy.js

echo -e "\n=== Checking src/_data/metadata.js ==="
cat src/_data/metadata.js

echo -e "\n=== Checking other templates' data source usage ==="
rg -n 'metadata\.(siteUrl|title|author)' --type=njk src/
rg -n 'site\.(siteUrl|title|author|description)' --type=njk src/

Repository: CourtneyFradreck/CourtNotes

Length of output: 578


🏁 Script executed:

#!/bin/bash
# Find all .njk template files mentioned in the review
echo "=== Locating .njk template files ==="
fd -e njk src/

echo -e "\n=== Content of llms.txt.njk ==="
cat src/llms.txt.njk

echo -e "\n=== Content of sitemap.xml.njk ==="
cat src/sitemap.xml.njk

echo -e "\n=== Content of robots.txt.njk ==="
cat src/robots.txt.njk

Repository: CourtneyFradreck/CourtNotes

Length of output: 2510


🏁 Script executed:

#!/bin/bash
# Check how siteMetadata is exported/registered in .eleventy.js
echo "=== Checking .eleventy.js for how siteMetadata is made available ==="
cat .eleventy.js

Repository: CourtneyFradreck/CourtNotes

Length of output: 1855


Standardize template data source usage.

This template uses site.* variables, but sitemap.xml.njk and robots.txt.njk use metadata.* instead. The sources diverge—metadata.js exports only title, author, and siteUrl, while .eleventy.js defines siteMetadata with an additional description field. This inconsistency creates maintenance risk and potential for bugs if the values diverge further.

Standardize on a single data source across all templates.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/llms.txt.njk` around lines 5 - 7, Templates are using two different data
sources (site.* in src/llms.txt.njk vs metadata.* in sitemap.xml.njk and
robots.txt.njk); pick one and make all templates consistent—I suggest
standardizing on metadata.*: change src/llms.txt.njk to use metadata.title and
metadata.description instead of site.title/site.description, and update
metadata.js to export description (or sync .eleventy.js siteMetadata.description
into metadata.js) so metadata contains title, author, siteUrl, and description;
ensure any code referencing siteMetadata is updated to reference metadata where
applicable.

Comment thread src/robots.txt.njk
Allow: /

Sitemap: {{ metadata.siteUrl }}/sitemap.xml
Llms-Txt: {{ metadata.siteUrl }}/llms.txt
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🌐 Web query:

Is "Llms-Txt" a recognized directive in robots.txt for advertising llms.txt files?

💡 Result:

No, "Llms-Txt" is not a recognized directive in robots.txt for advertising llms.txt files. The robots.txt standard, as defined by robotstxt.org, the original 1994 specification, RFC 9309, and Google's implementation, only recognizes specific directives: User-agent, Disallow, Allow, and Sitemap. No source mentions "Llms-Txt" as a valid directive. llms.txt is a separate proposed standard (from llmstxt.org, 2024) for AI guidance, distinct from robots.txt. Some non-standard practices suggest adding Allow: /llms.txt or informal lines like "LLMS: https://example.com/llms.txt" in robots.txt to hint at the file, but these are not part of the official specification and crawlers are not required to recognize or act on them.

Citations:


Remove the non-standard "Llms-Txt" directive from robots.txt.

"Llms-Txt" is not a recognized directive in the robots.txt specification (RFC 9309). Standard robots.txt parsers only recognize User-agent, Disallow, Allow, and Sitemap. This directive will be ignored by all standard crawlers.

The llms.txt standard is a separate specification (from llmstxt.org, 2024) distinct from robots.txt. To advertise an llms.txt file, use the official Sitemap directive instead, or ensure the file is accessible at the standard path (/llms.txt) where AI crawlers can discover it.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/robots.txt.njk` at line 9, Remove the non-standard "Llms-Txt: {{
metadata.siteUrl }}/llms.txt" directive from src/robots.txt.njk; either delete
that line or replace it with a standard directive such as "Sitemap: {{
metadata.siteUrl }}/llms.txt" so crawlers can discover the llms.txt via the
recognized Sitemap directive, and ensure the llms.txt file is served at the
standard path (/llms.txt).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants