Reference → Feeds — Reference

Feeds — Reference

The Feeds surface is the platform's content-syndication plane. It owns the configuration and rendering of RSS, Atom, and JSON Feed outputs that downstream readers, aggregators, and integrations consume. The surface covers per-content-type feeds (blog posts, product updates, changelog entries), custom feed builders (filtered by category / tag / author / date window), and the ping aggregator that notifies subscribed services when new content publishes.

This page is a reference for platform engineers and integrators who need to understand the surface before extending it, scripting against it, or wiring a downstream reader. Customer-facing how-tos live in the customer docs set; this page describes the shape of the surface, not the steps to drive it.


Overview

Feeds live under the Content → Feeds view in SG-Admin, paired with the Sitemap settings under the same Content sub-tree. The view renders three primary panels — the default-feeds list (one entry per content type), the custom-feeds list (operator-defined filtered feeds), and the per-feed detail / edit form — and exposes write operations for enabling, configuring, and previewing feeds.

The platform ships default feeds for each content type that supports syndication: blog posts, product records, changelog entries. Each default feed is enabled by default and serves at a conventional URL (/feed/, /feed/products/, /feed/changelog/). The defaults can be disabled, retitled, or rescoped — they cannot be deleted (a disabled default feed returns a 404 at its URL but remains in the configuration).

Custom feeds are operator-defined and live alongside the defaults. A custom feed names a content type, applies one or more filters (category, tag, author, date window), picks a format (RSS 2.0, Atom 1.0, or JSON Feed 1.1), and serves at an operator-chosen slug. This is the surface that lets a site publish, for example, a category-specific feed for a podcast or a tag-filtered feed for an investor-relations stream.

Where it lives in SG-Admin:

  • Sidebar: SG-Admin → Content → Feeds
  • URL prefix: /sg-admin/content/feeds
  • View templates: application/views/Admin/Content/feeds-*.php
Sitemap configuration, redirect rules, and SEO defaults live on adjacent Content / SEO views — see Related references at the bottom of this page.
┌──────────────────────────────────────────────────────────────────────┐│ SG-Admin → Content → Feeds [+ New custom] │├──────────────────────────────────────────────────────────────────────┤│ Default feeds ││ Title Content type Format URL Active││ ───────────────────── ───────────── ───────── ─────────── ──── ││ Blog Posts RSS 2.0 /feed/ on ││ Products Products RSS 2.0 /feed/products on ││ Changelog Changelog Atom 1.0 /feed/changelog on ││ ││ Custom feeds ││ Title Filters Format Active ││ ───────────────────── ───────────────────────── ────────── ──────││ Podcast — All Eps cat=podcast RSS 2.0 on ││ Investor Updates cat=investor, last 90d JSON 1.1 on ││ Q&A blog tag=qa Atom 1.0 off ││ ││ [⋯ Edit] [⋯ Preview] [⋯ Disable] [⋯ Ping list] │└──────────────────────────────────────────────────────────────────────┘

Actions

The Feeds surface exposes the following operations. Each is described by what it does to the served feed, not by its internal method name.

List and search

Returns the configured feeds — defaults and customs in two panels. Each entry shows title, content type, format, URL, active state, and item count. Supports filtering by active / disabled and by format.

Configure default feed

Loads the default-feed configuration for a content type into the form. Editable fields: title, description, image, item count per feed, format, and active state. The URL is not editable on a default feed — it is determined by the content type slug.

Create custom feed

Opens an empty form. Required fields: title, content type, format, slug. Optional fields: description, image, item-count override, filter list (category / tag / author / date window). The slug must be unique site-wide and must not collide with a reserved path. On submit, the surface validates the filter expression and creates the feed record.

Edit custom feed

Loads an existing custom feed into the form. Submit replaces the stored configuration with the posted values. Changing the slug emits a redirect record under Redirects so existing subscribers do not break — a behavior the operator can opt out of with a checkbox.

Disable

Marks a feed inactive. The URL responds with a 404 while the configuration is preserved. Used when a feed is temporarily suspended without losing the operator's intent.

Delete (custom feeds only)

Permanent removal. Default feeds cannot be deleted — only disabled. Deleting a custom feed also removes the slug claim, freeing it for re-use.

Preview

Returns the rendered feed as it would appear at the public URL, including the latest items. Used as a sanity check before save and as an integration aid for downstream readers that need to inspect the feed shape.

Ping list

Manages the list of aggregator endpoints the platform notifies when a feed updates. The default list ships with the standard public ping endpoints; operators can add or remove entries. A ping is fired automatically whenever a record covered by the feed publishes; manual re-ping is also exposed for troubleshooting.

Item-level overrides

For per-record cases — a single blog post that should be excluded from the public feed, or a product that should appear in a non-default custom feed — the content record exposes a feeds: field that points into this surface. The Feeds surface honors those overrides at render time without needing a separate edit here.

SAME ITEM SET · THREE FORMATSRSS 2.0 Atom 1.0 JSON Feed 1.1┌──────────────────────────┐ ┌──────────────────────────┐ ┌──────────────────────────┐│ <rss version="2.0"> │ │ <feed │ │ { ││ <channel> │ │ xmlns="…/Atom"> │ │ "version": ││ <title>…</title> │ │ <title>…</title> │ │ "…/jsonfeed/v1.1", ││ <link>…</link> │ │ <link rel="self".../> │ │ "title": "…", ││ <item> │ │ <updated>…</updated> │ │ "items": [ ││ <title>…</title> │ │ <entry> │ │ { ││ <link>…</link> │ │ <title>…</title> │ │ "title": "…", ││ <pubDate>…</pubDate> │ │ <updated>…</updated> │ │ "date_published": ││ <description>…</…> │ │ <summary>…</summary> │ │ "…", ││ </item> │ │ </entry> │ │ "content_html": … ││ </channel> │ │ </feed> │ │ } ││ </rss> │ │ │ │ ] │└──────────────────────────┘ └──────────────────────────┘ │ } │└──────────────────────────┘

Data model

A feed record carries the following fields. Field names below are the conceptual shape — the on-disk column names match closely but are not contractually stable across releases.

FieldTypeNotes
idintegerPrimary key.
kindenumdefault or custom. Defaults are seeded; customs are operator-created.
titlestringFeed channel title. Surfaced in reader UIs.
descriptiontextFeed channel description.
image_urlstringFeed channel image.
content_typestringSlug pointing at a content type — posts, products, changelog, etc.
formatenumrss-2.0, atom-1.0, json-feed-1.1.
slugstringURL path component. Unique site-wide for customs. Determined by content type for defaults.
item_countintegerItems returned per render. Default 20. Capped at 100.
filtersobjectFor customs only. Filter expression (categories, tags, authors, date window).
activebooleanWhen false, the URL returns 404.
ping_endpointslistAggregator endpoints to notify on update.
created_attimestampFirst save.
updated_attimestampTouched on edit.
Render-time composition: the served feed is computed at request time from the configuration plus a filtered query against the content type. The order is fixed: filter expression → date sort (newest first) → item-count cap → format-specific serializer. The serializer renders RSS, Atom, or JSON Feed based on the format field; the same item set produces a different document shape per format.

Format coverage: RSS 2.0 is the default for blog and product feeds because the broadest set of readers parses it. Atom 1.0 is the default for changelog feeds because of its first-class semantics, which downstream changelog aggregators rely on. JSON Feed 1.1 is offered as an option for integrations that prefer JSON.

RENDER REQUEST /feed/products/│▼┌──────────────────────────────────────┐│ 1. Resolve feed record │ by slug match│ content_type=products │└─────────────────┬────────────────────┘▼┌──────────────────────────────────────┐│ 2. Apply filter expression │ category / tag / author /│ (custom feeds only — defaults │ date-window predicates│ pass through) │└─────────────────┬────────────────────┘▼┌──────────────────────────────────────┐│ 3. Sort by published_at DESC ││ 4. Cap at item_count │└─────────────────┬────────────────────┘▼┌──────────────────────────────────────┐│ 5. Serialize per format │ rss-2.0 / atom-1.0 /│ │ json-feed-1.1└──────────────────────────────────────┘▼served as application/xmlor application/feed+json

Permissions

Access to the Feeds surface is gated at two layers.

Layer 1 — admin gate. Every action under SG-Admin passes through the platform's standard admin access check at request entry. An unauthenticated request never reaches the Feeds surface.

Layer 2 — per-action capability. Within SG-Admin, each Feeds action checks a capability associated with the calling operator's role. The default role configuration ships with three roles — Administrator, Editor, Viewer — and the capability map is:

CapabilityAdministratorEditorViewer
List feedsyesyesyes
Configure default feedyesyesno
Create custom feedyesyesno
Edit custom feedyesyesno
Disableyesyesno
Delete customyesnono
Previewyesyesyes
Edit ping listyesnono
Manual re-pingyesyesno
Custom roles defined under Settings → Roles override the default map. The capability slugs are stable; the role slugs are configurable.

Public-feed access (separate from the admin gates above). Feeds serve publicly at their URL by default — that is the point of syndication. The active flag governs whether the URL responds; there is no per-reader gate on a feed itself.

Audit. Every write — create, edit, disable, delete, ping-list change — emits an Activity Log entry. Manual re-pings are also logged. Activity Log retention is governed by the site's general settings.


Related references

  • Posts — Reference. Provides the default content type for the /feed/ blog feed.
  • Products — Reference. Provides the default content type for the /feed/products/ feed.
  • Changelog — Reference. Provides the default content type for the /feed/changelog/ feed and is the typical Atom 1.0 consumer.
  • Sitemap — Reference. Adjacent surface. Sitemap controls which records are advertised for crawl; Feeds controls which records are advertised for subscription. Both live under Content.
  • Redirects — Reference. Slug changes on custom feeds emit redirect records by default.
  • Settings — Reference. Owns the role definitions, the default ping endpoints, and Activity Log retention.
For the corresponding customer-facing walkthrough — turning on a category feed, switching a feed to JSON, adding an aggregator to the ping list — see the Content section of the customer docs at /docs/content/feeds.
On this page