guide · computers

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.

July 14, 2026 · By Alastair Fraser

A retro robot at a newsstand with three racks labeled RSS.XML, READER-FRIENDLY HTML, and AUTODISCOVERY LINK.

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:

  1. RSS feed/rss.xml. Newest first. Sourced from getCollection('posts', ({ data }) => !data.draft), so every non-draft item appears once.
  2. 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.
  3. 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:

  1. 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.
  2. 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.
  3. 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.

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 title attribute is the canonical feed name, “Agentic Bot Sitter” — not the page title. The reader aggregates across pages.
  • The href is 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 type is application/rss+xml, not text/xml. Some readers won’t accept text/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 by curl https://agenticbotsitter.com/rss.xml | grep -c '<content:encoded' → 0.
  • Full-text target (the original plan in this guide): add content: p.body to each item so feed readers render the post inline. Two-line diff in src/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.xml aren’t split; the single /rss.xml carries all. Useful at ~500 items per feed, but at today’s scale (~245 items) one feed keeps the reader’s experience uniform.
  • JSON Feed (/feed.json). On the roadmap if a consumer asks. Not blocking — confirmed 404 on 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-form IIFE in src/scripts/app.js for subscription; not RSS.

How a reader subscribes

Three ways:

  1. Paste agenticbotsitter.com/rss.xml into the feed reader. The reader picks up the autodiscovery link from there.
  2. Click the autodiscovery link in <head>. Most feed reader browser extensions trigger off this.
  3. 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 ~20 items. The live feed has ~245 items; 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

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.

Sources

#rss#autodiscovery#reader-friendly#full-text#no-js

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.

Your email address will not be published. Required fields are marked.