Add CMS content to bridgetownrb

It took me a while to figure out where to place the code that loads data from an external CMS and makes it available in bridgetownrb.

The idea is to place a builder in the builders folder. This builder is called each time the site is... built.


This file should contain a class with a build method. Bridgetown exposes a get method that allows you to fetch any data without having to worry about using a specific HTTP client. It also parses the JSON for you, if present.

In my case I'm getting data from a pocketbase instance and for each item, I'm adding a resource to bridgetown.

class Builders::PostsBuilder < SiteBuilder
  def build
    get('https://pocketbase/api/collections/blog_posts/records?sort=-date&perPage=1000&expand=files&filter=(public=true)') do |data|
      data[:items].each do |post|
        add_resource :posts, "#{post[:slug]}" do
          ___ post
          layout :post
          permalink '/blog/:slug.html'

The first argument is the collection (in this case posts), and the second argument the "id" of the resource. You can alter the layout and permalink by using the DSL.

You can now call this resource anywhere in your bridgetown code: