Chronoblog (Gatsby) theme with RSS feed
Chronoblog is one of the Gatsby blogging themes. RSS feed can be used to get the latest posts for Github actions, dev.to
, etc. The following steps can easily add it. Use a similar approach for other Gatsby themes.
Initial setup
Run the following commands to clone the repository and install the required packages.
npx gatsby new chronoblog-site https://github.com/Chronoblog/gatsby-starter-chronoblogcd chronoblog-sitenpm i gatsby-plugin-feed@2 gatsby-transformer-remark@3 gatsby-source-filesystem
GraphQL setup
Populate GraphQL fields to avoid null errors. Add canonical_url: http://example.com
to content → links → frontmatter-placeholder → index.md file.
Gatsby config
Add plugin configurations in gatsby-config.js
. Draft content, links, and placeholder post are skipped.
module.exports = {// ...plugins: [// ...{resolve: `gatsby-plugin-feed`,options: {query: `{site {siteMetadata {titledescriptionsiteUrlsite_url: siteUrl}}}`,feeds: [{serialize: ({ query: { site, allMarkdownRemark } }) => {return allMarkdownRemark.edges.map(edge => {return Object.assign({}, edge.node.frontmatter, {description: edge.node.excerpt,date: edge.node.frontmatter.date,url: edge.node.frontmatter.canonical_url || edge.node.frontmatter.url,guid: edge.node.frontmatter.canonical_url || edge.node.frontmatter.url,custom_elements: [{ "content:encoded": edge.node.html }],})})},query: `{allMarkdownRemark(filter: {frontmatter: {draft: { ne: true },link: { eq: null },title: { ne: "Ghost Post" }},},sort: { order: DESC, fields: [frontmatter___date] },) {edges {node {excerpthtmlfields { slug }frontmatter {titlecanonical_urldate}}}}}`,output: "/rss.xml",title: "RSS Feed",},],},},{resolve: `gatsby-transformer-remark`},],// ...};
Gatsby node setup
Implement onCreateNode
function in gatsby-node.js
file
const { createFilePath } = require(`gatsby-source-filesystem`);exports.onCreateNode = ({ node, actions, getNode }) => {const { createNodeField } = actionsif (node.internal.type === `MarkdownRemark`) {const value = createFilePath({ node, getNode })createNodeField({name: `slug`,node,value,})}}
Npm scripts setup
Add serve
script in package.json
{// ..."scripts": {// ..."serve": "gatsby serve"}}
Demo
Run npm run build && npm run serve
. RSS feed should be populated on http://localhost:9000/rss.xml page.