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
┌──────────────────────────────────────────────────────────────────────┐│ 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.
| Field | Type | Notes |
|---|---|---|
id | integer | Primary key. |
kind | enum | default or custom. Defaults are seeded; customs are operator-created. |
title | string | Feed channel title. Surfaced in reader UIs. |
description | text | Feed channel description. |
image_url | string | Feed channel image. |
content_type | string | Slug pointing at a content type — posts, products, changelog, etc. |
format | enum | rss-2.0, atom-1.0, json-feed-1.1. |
slug | string | URL path component. Unique site-wide for customs. Determined by content type for defaults. |
item_count | integer | Items returned per render. Default 20. Capped at 100. |
filters | object | For customs only. Filter expression (categories, tags, authors, date window). |
active | boolean | When false, the URL returns 404. |
ping_endpoints | list | Aggregator endpoints to notify on update. |
created_at | timestamp | First save. |
updated_at | timestamp | Touched on edit. |
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+jsonPermissions
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:
| Capability | Administrator | Editor | Viewer |
|---|---|---|---|
| List feeds | yes | yes | yes |
| Configure default feed | yes | yes | no |
| Create custom feed | yes | yes | no |
| Edit custom feed | yes | yes | no |
| Disable | yes | yes | no |
| Delete custom | yes | no | no |
| Preview | yes | yes | yes |
| Edit ping list | yes | no | no |
| Manual re-ping | yes | yes | no |
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.
/docs/content/feeds.