
Short answer: A Grav CMS RSS feed comes from the official Feed plugin. Install it with bin/gpm install feed, make sure your blog page defines a content collection, and the feed is available by adding .rss ή .atom to that page’s URL, for example /blog.rss. Set the title, description, limit and length in the plugin configuration or the page header, turn on absolute URLs, and then connect the feed to an auto-poster so every new post is shared on social media automatically.
Grav is a flat-file CMS: pages are Markdown files in folders, with settings in YAML front matter, and there is no database. That makes Grav sites fast and easy to version, and it also makes the feed straightforward once you know where the settings live. This guide explains how the Grav RSS feed works, how to configure it, how to fix links, dates and images, and how to use one feed per topic. Each section ends with what matters when the feed is used for automatic social posting.
Grav core does not generate feeds itself. The feature comes from the Feed plugin maintained by the Grav team, which supports Atom 1.0, RSS and JSON Feed. The plugin is included in the blog skeleton, so if you started from it, your feed may already exist. On other sites, install it with the Grav Package Manager from the root of your installation:
bin/gpm install feedThe plugin is enabled after installation and comes with default values. Nothing else is required to get a first feed, but the defaults are placeholders, such as a generic feed title, so you will want to change them.
The Feed plugin works on pages that list other pages. In Grav terms, that is a page with a content header that defines a collection, typically your blog listing page:
---
title: Blog
content:
items: '@self.children'
order:
by: date
dir: desc
limit: 10
pagination: true
feed:
limit: 20
description: News and articles from Example
---With this header in user/pages/02.blog/blog.md, the listing is at /blog and the feeds are at /blog.rss και /blog.atom. JSON Feed is off by default because the .json extension often conflicts with other plugins; you can enable it in the plugin settings if you need it.
Two things follow from this design. First, the order and filters of the collection apply to the feed, so sort by date in descending order or new posts may not appear first. Second, any page with a collection gets a feed, which is useful for categories and tags, as shown later.
Site-wide defaults go in user/config/plugins/feed.yaml. Copy the file from the plugin folder rather than editing the original, so updates do not overwrite your changes:
enabled: true
limit: 20
title: 'Example Blog'
description: 'News and articles from Example'
length: 500
enable_json_feed: false
show_last_modified: falselimit is the number of items in the feed, and length is how many characters of each item’s content are included. Any of these values can be overridden for one page in its feed header, as in the earlier example. You can also edit the same settings in the Admin plugin under Plugins and Feed, if you prefer a form to YAML.
This is the most important setting for any feed that leaves your site. Feed readers and auto-posters see links and image paths out of context, so a relative path such as /blog/my-post ή /user/pages/02.blog/my-post/cover.jpg is useless to them. Grav can write absolute URLs everywhere:
# user/config/system.yaml
absolute_urls: trueIf your site runs behind a proxy or a CDN, also check that Grav knows the correct scheme and host, so the absolute URLs start with your real https domain rather than an internal address. Then open the feed and confirm every link element. The problem and its symptoms are described in relative URLs in RSS feeds.
The feed uses each page’s date to sort and to fill the publication date. Set it explicitly in the front matter of every post:
---
title: Our autumn product update
date: 13-10-2026 08:15
publish_date: 13-10-2026 08:15
---Watch the date format. Grav parses dates with PHP, and PHP reads dashes as day-month-year but slashes as month-day-year. 01-02-2026 is the 1st of February, while 01/02/2026 is the 2nd of January. A wrong date can push a new post to the bottom of the feed or make an auto-poster ignore it as old. You can set the expected format with the date format options in the system configuration. More on date pitfalls is in RSS date format and RFC 822 errors.
publish_date και unpublish_date control visibility. A post with a future publish date stays out of the collection, and therefore out of the feed, until that time. Pages can also be hidden with published: false. Keep drafts unpublished: anything that appears in the feed may be shared immediately by an auto-poster.
Sometimes a page belongs in the blog listing but not in the feed, such as a pinned welcome post. The plugin supports that directly:
feed:
skip: trueFor the content of each item, the length setting decides how much text is included. For auto-posting, a short, well-written summary at the top of each post is more useful than a long cut-off body, because networks show only the first sentences. If you prefer a dedicated summary, Grav’s summary delimiter (=== on its own line) marks where the summary ends. The trade-offs are explained in full-text vs excerpt RSS feeds.
| Setting | Where | Recommended |
|---|---|---|
| Feed URL | Blog page URL plus .rss | Keep it permanent |
| limit | feed.yaml or page header | 10 to 20 items |
| length | feed.yaml or page header | Enough for a clear summary |
| absolute_urls | system.yaml | true |
| Order | Collection in page header | date, descending |
| skip | Single page header | For pages outside the feed |
Social posts with a good image get much more attention. Auto-posting tools look for an image in the feed item and in the Open Graph tags of the linked page. In Grav, images live next to the page’s Markdown file, so two steps make them work outside your site:
absolute_urls: true.og:image from the page’s media. If your theme does not, add them to the base template with the page’s first image or a header field.Check one post with a social preview tool after setup. If the wrong picture appears, read how to control which image gets auto-posted.
The plugin renders feeds with Twig templates, and you can replace them for a single page:
feed:
template:
rss: my-overrideCreate my-override.rss.twig in your theme’s templates folder. A custom template lets you add an enclosure element for the cover image, a category element for each tag, or a different GUID. If you change the GUID on a live feed, every item looks new to auto-posters and may be shared again, so decide on the format once; see why a feed auto-posts the same article twice.
Because any collection page has a feed, topic feeds are easy. Grav’s taxonomy URLs, such as /blog/tag:news, filter the blog collection, and appending the extension gives a filtered feed in many setups. A more explicit approach is a dedicated page whose collection uses a taxonomy filter:
content:
items:
'@taxonomy.category': tutorials
order:
by: date
dir: descThis page’s feed contains only tutorials. Topic feeds let you send each kind of content to the right audience, for example tutorials to a developer community and company news to LinkedIn. The idea is explained in category filtering for auto-posting.
Grav supports several languages with language-specific Markdown files, such as item.en.md και item.de.md, and language prefixes in URLs. Each language version of the blog listing has its own collection and therefore its own feed, for example /en/blog.rss και /de/blog.rss. Treat them as separate feeds: connect each one to the social accounts that speak that language, and make sure every translated post has its own date and summary. If a post exists in only one language, Grav may fall back to the default language depending on your settings, so check each feed after enabling multilingual support. Distribution across languages is covered in how to automate multi-language content across social media.
Add an autodiscovery link to the head of your base template. The plugin documentation shows links built from base_url, which works when the blog is your home page. If the blog lives at /blog, point to that page explicitly:
<link rel="alternate" type="application/rss+xml"
title="Example Blog" href="{{ base_url_absolute }}/blog.rss" />A visible RSS button in the sidebar or footer helps readers too. Why this matters is covered in Αυτόματη ανίχνευση RSS feed.
Grav caches pages and collections. Normally the cache is refreshed when page files change, but sites deployed by copying files, or behind a CDN, can serve an old feed. Run bin/grav clear-cache after deployments, and keep CDN cache times for the feed short.
content collection, or the Feed plugin is disabled.absolute_urls is off.publish_date, wrong date format, or a stale cache.The plugin’s own documentation is in the Grav Feed plugin repository. After each change, check the result with the W3C Feed Validation Service.
PostRSS has been publishing RSS and Atom feeds to social networks since 2014. Paste the address of your Grav feed, or several topic feeds, connect your accounts and choose the post format. PostRSS checks the feeds as often as every minute and shares each new post, with its image and link, to the networks you choose among 66 supported networks, messengers, team chats and blogs, including Mastodon, Bluesky, LinkedIn, Telegram, Discord and DEV. Keyword filters, UTM parameters, hashtags from categories and posting windows let you tailor each channel. See the PostRSS features page and the plan limits on the pricing page. More developer guides are under the Technical Guide tag.
A Grav CMS RSS feed is the Feed plugin plus a page with a sorted collection. Install the plugin, set a real title and description, turn on absolute URLs, date your posts in an unambiguous format and keep drafts unpublished. Add an autodiscovery link, validate the feed, and every new Grav post can be shared on social media automatically.
Add .rss or .atom to the URL of the page that lists your posts, for example /blog.rss. The Feed plugin must be installed and the page needs a content collection.
Grav writes relative URLs by default. Set absolute_urls to true in the system configuration so links and images work in feed readers and on social networks.
Add a feed header with skip set to true to that page. Unpublished pages and pages with a future publish date are left out automatically.
Yes. Any page with a collection has a feed, so a page that filters by a taxonomy such as a category produces a topic feed you can send to its own social accounts.
Yes, but it is disabled by default because the json extension can conflict with other plugins. Enable it in the plugin configuration if you need it.
What changed in the networks, what broke, and how to fix it before it costs you reach.
Από την Internet Solutions, την ομάδα πίσω από το PostRSS. Κάθε προϊόν σάς εξοικονομεί χρόνο με τον δικό του τρόπο.