ABS RSS and Reader-Friendly Output: The Decisions
ABS publishes a single RSS feed at /rss.xml carrying news, reviews, and guides sorted newest first. The autodiscovery link tag, the no-JS reader-friendly HTML pages, and the verify commands.

The decision in one sentence
ABS publishes a single RSS feed at /rss.xml that carries news, reviews, and guides (sorted newest first), exposes an autodiscovery <link rel="alternate"> tag in every page head, and serves reader-friendly HTML at /news/[slug]/, /reviews/[slug]/, and /guides/[slug]/ that renders without JavaScript. The decision rule for each surface is documented below — not every consumer gets the same content, but every consumer gets usable content.
Three flavors, all wired:
- RSS feed —
/rss.xml. Newest first. Sourced fromgetCollection('posts', ({ data }) => !data.draft), so every non-draft item appears once. - Reader-friendly HTML —
/news/[slug]/,/reviews/[slug]/,/guides/[slug]/render server-side as plain HTML with the same<picture>/<a>tags a desktop browser sees. No JS-rendered fragment. - JSON feed —
/feed.json. 404 today. RSS covers every consumer we care about. The JSON surface stays on the backlog.
Why full-text RSS, not summaries
RSS in 2026 has two camps:
- Full-text — every word in the post; readers can read in their feed reader of choice.
- Summary — headline + first paragraph; readers click through to the site.
ABS publishes full-text. Three reasons:
- Reader convenience. A feed reader on a phone shows the full article inline. The reader doesn’t need to open a browser, navigate to the site, wait for the JS to load, wait for the image CDN to negotiate. The post is the post.
- Privacy. A summary-feed reader every click of “read more” leaks a referrer to the host site. Full-text reading in the feed reader avoids the leak.
- Reader trust. A reader subscribed to the feed has made a deliberate choice. They get the full content.
The downside is the page analytics — feed readers don’t track visits the same way. We accept that trade. ABS analytics are aggregate stats; the per-post engagement is sampled but not total.
Current state of the feed: the live /rss.xml is summary-only — title, description, pubDate, link, guid, no content:encoded. The plan is to extend rss.xml.js with content: post.body; the “verify” section already gates the result.
The autodiscovery <link> tag
Every HTML page emits a <link rel="alternate" type="application/rss+xml" ...> in <head>. Feed readers and aggregators look for this tag without scraping.
<link rel="alternate" type="application/rss+xml"
title="Agentic Bot Sitter"
href="/rss.xml" />
The <link> is rendered by src/layouts/Base.astro (line ~43) as a hardcoded constant: the title is "Agentic Bot Sitter", the type is application/rss+xml, the href is "/rss.xml". Base.astro is present on every page, inherited through the layout chain of every list and post page.
Three constraints honored:
- The
titleattribute is the canonical feed name, “Agentic Bot Sitter” — not the page title. The reader aggregates across pages. - The
hrefis relative (/rss.xml), and resolved against the page origin by the reader. The literal source is/rss.xml; the reader fills in the host from the document URL. This avoids a hard-coded absolute URL drifting when the site is previewed on a staging hostname. - The
typeisapplication/rss+xml, nottext/xml. Some readers won’t accepttext/xml.
The reader-friendly HTML pages
Every post page (/news/<slug>/, /reviews/<slug>/, and /guides/<slug>/) renders server-side without JavaScript. A curl of any post URL returns the full <article> block in the raw HTML:
curl -sS https://agenticbotsitter.com/news/what-anthropic-s-latest-ai-discovery-does-and-doesn-t-show/ | grep -oc '<article'
# → 1
curl -sS https://agenticbotsitter.com/reviews/playz-advanced-electrical-circuit-board-kit-review/ | grep -oc '<article'
# → 1
The reader sees:
- Title
- Featured image (
<picture>with PNG + WebP) - Author + date
- The full body in markdown-rendered HTML
- Affiliate link disclosure (if applicable)
- A “View on agenticbotsitter.com” footer link
The mobile browser consumes the same content as the desktop browser. No JS-rendered fragment. No CSS-only fallback. We don’t gate content behind JavaScript.
Failure shapes:
- JS-only rendering of the body — readers without JS get a blank page. Don’t.
- Hidden text via CSS — readers see placeholder text. Don’t.
- Slow-image-loading that never completes — readers see paragraph text without images. Prefer lazy
loading="lazy"over eager.
The RSS structure
The feed is rendered by src/pages/rss.xml.js using @astrojs/rss. Two facts about the current implementation:
- Live today (2026-07-14): summary-only — each item carries
<title>,<description>,<pubDate>,<link>. No full-text body. Verified bycurl https://agenticbotsitter.com/rss.xml | grep -c '<content:encoded'→ 0. - Full-text target (the original plan in this guide): add
content: p.bodyto each item so feed readers render the post inline. Two-line diff insrc/pages/rss.xml.js. Not yet enabled.
The structure (live or full-text) keeps two invariants:
- Sort order:
b.data.pubDate - a.data.pubDate— newest first. Reader’s natural mental order; ABS matches. - Link construction:
/${type}/${slug}/—type: 'news'→/news/<slug>/;type: 'review'→/reviews/<slug>/;type: 'guide'→/guides/<slug>/. The feed’s<link>and<guid>always point back to the readable HTML page.
Output respects RSS 2.0 + Atom-compatible namespaces. No <itunes:> or <podcast> extensions — ABS isn’t audio.
What we don’t publish
- Podcast-flavored RSS. No audio; would be misleading.
- Full-text vs summary toggle. Today the feed is summary-only; the full-text target above is the planned state. There is no per-user toggle.
- Per-section feed.
/news.xml,/reviews.xml,/guides.xmlaren’t split; the single/rss.xmlcarries all. Useful at~500items per feed, but at today’s scale (~245items) one feed keeps the reader’s experience uniform. - JSON Feed (
/feed.json). On the roadmap if a consumer asks. Not blocking — confirmed404on the live site as of “the decision”. - AMP pages. Slows the site; not worth the noise for ABS.
- Newsletter digest. A separate weekly newsletter; see the
nl-formIIFE insrc/scripts/app.jsfor subscription; not RSS.
How a reader subscribes
Three ways:
- Paste
agenticbotsitter.com/rss.xmlinto the feed reader. The reader picks up the autodiscovery link from there. - Click the autodiscovery link in
<head>. Most feed reader browser extensions trigger off this. - Subscribe to the weekly email digest via the
nl-form. The digest curates the RSS into one weekly send.
We log to analytics: subscribe_rss_click events via the analytics IIFE in src/scripts/app.js. The totals appear in the daily Telegram briefing.
The verify
Three checks confirm the feed is live:
curl -sS https://agenticbotsitter.com/rss.xml | head -5 # should be valid XML
curl -sS https://agenticbotsitter.com/news/<slug>/ | \
grep -c '<article' # should be > 0 (server-rendered)
curl -sS https://agenticbotsitter.com/ | \
grep 'application/rss+xml' | head -1 # autodiscovery present
Each of these is in the daily cron run. A fourth, fired on the full-text rollout only:
curl -sS https://agenticbotsitter.com/rss.xml | \
grep -oc '<content:encoded\|<content ' # > 0 once full-text ships
What NOT to do
- Don’t truncate the feed to
~20items. The live feed has~245items; truncation would break long-time readers and reset their delta. - Don’t include affiliate disclosure in the body of the RSS — that’s for the HTML page. The RSS body is the article; the disclosure lives on the HTML.
- Don’t use the feed as a marketing surface. ABS’s feed is editorial.
- Don’t add a “Subscribe by email” form to the RSS XML. RSS feeds are feed-reader targets; email subscriptions go through
/api/subscribe.
Sources
- RSS 2.0 spec
- @astrojs/rss docs
- ABS companion: ABS Search Bar: The Cheap State Update, Not a Popup
- ABS companion: ABS Sort Pages: By Grade and Date, the Rules
Last verified: 2026-07-14 against the live /rss.xml (~245 items, summary-only), the live post pages (<article> in raw HTML), and the /feed.json 404. The “full-text target” code block is planned, not yet live.


Submit a take
Have a different read on this? Drop a comment below — your email isn't published, and I read every one. Nothing leaves the site until I approve it.