RSS į 66 socialinius tinklus: Facebook, Instagram, X, LinkedIn, Telegram ir kitus Blogas Partnerių programa Kontaktai
Prisijungti Pradėti nemokamai
Updated: 2026-10-13
Grav CMS RSS Feed: Configure the Feed Plugin and Auto-Post

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 arba .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.

Does Grav have an RSS feed by default?

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 feed

The 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.

How Grav decides which pages are in the feed

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 ir /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.

Configure the Feed plugin

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: false

limit 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.

Make links absolute

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 arba /user/pages/02.blog/my-post/cover.jpg is useless to them. Grav can write absolute URLs everywhere:

# user/config/system.yaml
absolute_urls: true

If 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.

Dates and publishing control

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 ir 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.

Skip pages and control content

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: true

For 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.

SettingWhereRecommended
Feed URLBlog page URL plus .rssKeep it permanent
limitfeed.yaml or page header10 to 20 items
lengthfeed.yaml or page headerEnough for a clear summary
absolute_urlssystem.yamltrue
OrderCollection in page headerdate, descending
skipSingle page headerFor pages outside the feed

Images in Grav feeds

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 for images in content, covered by absolute_urls: true.
  • Open Graph tags on post pages. Many themes output them, and plugins such as SEO-focused metadata plugins can add 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.

Customise the feed template

The plugin renders feeds with Twig templates, and you can replace them for a single page:

feed:
    template:
        rss: my-override

Create 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.

Category and tag feeds

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: desc

This 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.

Multilingual Grav sites

Grav supports several languages with language-specific Markdown files, such as item.en.md ir 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 ir /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.

Advertise the feed

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 kanalo automatinis aptikimas.

Caching and common problems

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.

  • Feed returns the HTML page. The page has no content collection, or the Feed plugin is disabled.
  • 404 on blog.rss. The extension is not allowed in the page types of the system configuration, or the URL points to a post rather than the listing.
  • Relative links. absolute_urls is off.
  • New posts missing. Future publish_date, wrong date format, or a stale cache.
  • Feed title says My Feed Title. The default configuration was never changed.

The plugin’s own documentation is in the Grav Feed plugin repository. After each change, check the result with the W3C Feed Validation Service.

How PostRSS works with a Grav site

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.

Related reading

The bottom line

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.

FAQ

Where is the RSS feed of a Grav site?

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.

Why does my Grav feed contain relative links?

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.

How do I keep a page out of the Grav feed?

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.

Can Grav publish a feed per category or tag?

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.

Does the Grav Feed plugin support JSON Feed?

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.

New guides, once a month

What changed in the networks, what broke, and how to fix it before it costs you reach.

We send a confirmation e-mail first. Unsubscribe any time.

Daugiau mūsų komandos įrankių

Sukūrė Internet Solutions – PostRSS komanda. Kiekvienas produktas sutaupo laiko savaip.