Behind the scenes: RSS, deployment, and crawl hygiene

Over the past few days I've been doing behind-the-scenes work on this site – stuff that doesn't change how anything looks but makes it work properly as a thing that exists on the internet.

RSS feeds. The most user-facing change: the site now has RSS feeds. There's a main feed at /rss.xml covering all posts, plus individual feeds for each tag page, so you can subscribe to just hiking or just software projects. I added this via the @astrojs/rss package, which was straightforward once I had the Ghost content API wired up.

CI/CD pipeline. A surprising amount of work went into the automated deployment pipeline. The site builds with Astro, pulls content from a self-hosted Ghost instance on my home server (accessible over Tailscale), and deploys to Cloudflare Pages. Getting GitHub Actions to reach Ghost required adding a Tailscale step to the workflow. I also upgraded Node.js to v22, bumped Wrangler to v4, and cleared out dependency audit warnings. Classic one-thing-reveals-the-next-thing session.

llms.txt. I added an llms.txt file – an emerging standard for giving AI crawlers a structured plain-text overview of a site. Whether it matters is an open question, but it costs nothing to add.

Sitemap and canonical URLs. The sitemap integration was already installed but not surfaced properly. I added the discovery tag to every page's <head> and corrected the site URL in the Astro config from the staging domain to https://www.partiallypeaceful.com. Canonical URLs, Open Graph tags, and llms.txt all now reference the right domain.

Post truncation. Index page posts now truncate at 125 words with a "continue reading" link. It makes the feed feel like a feed rather than a wall of text.

None of this is glamorous, but it's the kind of thing that makes a site feel finished.