site: feeds everywhere + programmatic surface

Feeds: JSON Feed 1.1 at /feed.json, per-category and per-tag RSS at
/categories/<name>/rss.xml and /tags/<name>/rss.xml alongside the main
/rss.xml — all from a shared src/lib/feed.ts item source. Category/tag
pages advertise their scoped feed via autodiscovery; new /feeds/
directory page (footer-linked) lists every feed with counts; RSS feeds
gain an atom:link self reference and a feed.xsl stylesheet so they
render readably in browsers.

Programmatic readers: build-generated /llms.txt (site map with every
review/bundle/post), SearchAction on the WebSite JSON-LD wired to
/search/?q=, and a "For robots" section on /feeds/ documenting
search.json, llms.txt, the sitemap, and JSON-LD coverage.

Claude-Session: https://claude.ai/code/session_01WZaczDJjL3xZ3u5spsN5AL
This commit is contained in:
2026-07-12 17:56:55 -04:00
parent d91ebacf85
commit 86ea4c8873
15 changed files with 536 additions and 39 deletions
+5
View File
@@ -20,6 +20,8 @@ interface Props {
modifiedTime?: Date;
articleTags?: string[];
jsonLd?: Record<string, unknown> | Record<string, unknown>[];
/** Page-scoped feeds (category/tag) advertised alongside the site-wide ones. */
feeds?: Array<{ title: string; href: string }>;
/** Opt into the wider content tier on roomy viewports (grid/listing pages). */
wide?: boolean;
}
@@ -40,6 +42,7 @@ const {
modifiedTime,
articleTags,
jsonLd,
feeds,
wide,
} = Astro.props;
const siteName = 'Unique';
@@ -77,6 +80,7 @@ const year = new Date().getFullYear();
modifiedTime={modifiedTime}
articleTags={articleTags}
jsonLd={jsonLd}
feeds={feeds}
/>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js" data-cf-beacon='{"token": "fc978456945c49ae90a0b7e0b891ffd2"}'></script>
</head>
@@ -123,6 +127,7 @@ const year = new Date().getFullYear();
<li><a href="/">Home</a></li>
<li><a href="/grid/">Grid</a></li>
<li><a href="/sources/">Sources</a></li>
<li><a href="/feeds/">Feeds</a></li>
</ul>
</section>
<section>