Live Collections

Your site's content — blog posts, authors, categories, tags, and changelog entries — is live data. Instead of copying a list of recent posts into a page and watching it go stale, you reference the collection by name and it is fetched fresh every time the page renders. The same collections are available in every page and every component, so you can show real data anywhere on your site.

What's available everywhere

These collections are ready to use in any page template or component, with no setup:

  • posts — your published blog posts (slug, title, excerpt, cover image, published date, author, tags, reading time, view count, featured flag).

  • authors — your active authors (slug, full name, avatar, bio, role).

  • categories — your post categories, including hierarchy (slug, name, description, parent, children).

  • tags — your post tags (slug, name, post count).

  • changelog — your published changelog entries (version, title, body, published date).

On a dynamic landing page (under /lp/) there is also a lead record — the business the page was personalised for. See Dynamic Landing Pages.

Using a collection

Reference a collection by name and loop over it. For example, a "recent posts" strip on your homepage:

{% for post in posts %}
  <a href="/blog/{{ post.slug }}">{{ post.title }}</a>
{% endfor %}

Each collection is always a safe list — if you have no posts yet, the loop simply renders nothing. A collection is only fetched when a page or component actually mentions it, so referencing one you don't use costs nothing.

Filtering and sorting in the template

You can shape a collection inline with Liquid filters:

{% assign featured = posts | where: 'is_featured', true | limit: 3 %}
{% for post in featured %}
  <h3>{{ post.title }}</h3>
{% endfor %}

You can chain filters too — for example, the names of every editor:

{{ authors | where: 'role', 'editor' | map: 'full_name' | join: ', ' }}

This kind of filtering happens on the rows already on the page. When you want the server to do the filtering and paging for you — and to reuse that across pages — build a dynamic component (next section).

Reusable, server-filtered widgets

A component can declare which collection it reads and how to filter it. The server fetches and filters the rows before rendering, and your component receives them as items. This is ideal for things like "latest 3 posts in a category" that you drop onto several pages.

You build these in Design → Components by setting the component's kind to Dynamic and configuring its Data Binding — pick a source (e.g. posts), and optionally a filter, sort, and limit. Your agent can do the same in one step — see Dynamic Components.

Ideas

  • Show your newest posts on the homepage, and the rest on the blog index.

  • Put your team on a contact or about page straight from authors — no second list to maintain.

  • Add a changelog feed to a footer or a "what's new" panel.

  • Build a category landing page that lists only the posts in that category.

Because it's all live, every one of these stays current the moment you publish new content.

Next steps