mitydigital/feedamic
Feedamic is a Statamic addon that generates RSS and Atom feeds from your collections and entries. Define feeds with simple templates, control included content, and serve valid feeds for readers and aggregators.
Feedamic is a thin addon: it wires a route to an Antlers-rendered XML template, and you control almost everything through a published config file and overridable views. Expect to spend your first hour in config and templates, not in PHP.
Install and publish
composer require mitydigital/statamic-feedamic
php artisan vendor:publish --tag=feedamic-config
php artisan vendor:publish --tag=feedamic-views # only when you need to customise XML
Check the README for the exact publish tags — the addon exposes a config tag and (usually) a views tag, and publishing views is the intended extension point rather than editing anything in vendor/.
Where to look first
config/feedamic.php — the collection(s) to include, limits, caching, and any per-feed definitions. This is the source of truth; read it top to bottom before writing any template.routes/web.php — you register the feed route yourself. The documented pattern is a single route entry pointing at the addon's Atom/RSS view. Confirm the exact class/tag from the README rather than guessing.title, url, date, content, author, etc.) the addon exposes per entry.First use case: a posts collection feed at /feed so readers and feed readers can subscribe. Add the collection to the config, register the route, hit /feed in the browser, then paste the URL into the W3C Feed Validation Service. If it validates, you're done — that's the whole happy path.
Also add discovery to your layout so browsers and readers find it:
<link rel="alternate" type="application/atom+xml" title="Feed" href="{{ route:feed }}">
One feed per collection or taxonomy term. The common real-world shape is several feeds: a global /feed, plus /blog/feed and /news/feed, or per-term feeds like /topics/laravel/feed. Rather than duplicating config, define the feed in the route and pass parameters through, or keep separate config entries per feed. Term-scoped feeds are where the addon earns its keep — a reader subscribing to one category is a real audience.
Config-driven, template-shaped. The mental model is: config selects which entries, the Antlers view decides what the XML looks like. So when a stakeholder asks for "include the featured image" or "use the meta description as the summary", that's a view edit, not a PHP change:
<entry>
<title>{{ title | entities }}</title>
<link href="{{ absolute_url }}" />
<updated>{{ date | format('Y-m-d\TH:i:sP') }}</updated>
<summary>{{ meta_description ?? excerpt }}</summary>
<content type="html"><![CDATA[{{ content }}]]></content>
</entry>
Content for feeds is not content for the web. Relative URLs, lazy-loaded images, and shortcodes all break in a reader. Normalise in the template: absolute URLs, inline styles stripped, and either full content or a deliberate summary — never a teaser that ends mid-sentence.
Caching. Feed generation walks entries and renders Antlers, which is not free. Enable the addon's cache in config for production, and lean on Statamic's static caching / response caching for the feed route too. But pair it with a clear invalidation story: a feed that lags behind publishes is the number one complaint you'll get.
Wire it into your publish workflow. The most effective pattern is to treat the feed as an output of your content model: entries must always have a date field, an author, and a summary field, enforced at the blueprint level. That way the feed template has no fallback logic and no empty tags.
Multi-site. If you run Statamic multisite, scope feeds per site and decide deliberately whether a feed is per-locale (/en/feed, /fr/feed) — readers usually want one language.
Test it in CI-ish fashion. A cheap regression test: curl -s https://your-site.test/feed | xmllint --noout - plus asserting a known title appears. Add it to your smoke checks so an Antlers typo doesn't silently ship an invalid feed.
& in a title or a missing <updated> kills the whole document. Run the W3C validator after every template change, not just at launch. Antlers' entities/sanitize filters or CDATA wrapping are your friends — but don't double-escape by CDATA-wrapping content that already contains entities.pubDate makes readers re-order or skip entries.{{ if date }}./feed page or another addon (Sitemap, SEO Pro) touching feed-ish routes, php artisan route:list | grep -i feed first. Duplicate route names break route:feed in your layout.url. Statamic's url is relative; in XML you need absolute_url (or url | absolute). This silently produces technically-valid-but-useless feeds.Route::statamic() route with your own template is an afternoon's work if the addon ever stalls.<link rel="self"> pointing at the feed's own canonical URL, a stable <id> per entry (permalink, not the numeric ID, if permalinks are stable), and a sensible limit so the first request doesn't render 5,000 entries.How can I help you explore Laravel packages today?