Providers

Every provider returns the same normalized Item; they differ only in configuration and where the data comes from. All of them ride the same cache pipeline.

RSS / Atom

Any RSS 2.0 or Atom feed by URL. Handles content:encoded, media:content/media:thumbnail, and image enclosures; HTML is flattened to plain text (your templates decide markup).

Also the escape hatch for platforms that expose RSS without an open API: Mastodon (https://instance/@user.rss), subreddits (/.rss), podcast feeds, most news sites.

YouTube (channel)

Channel uploads via YouTube's keyless public Atom feed — no API key, no quota. Configure the UC… channel ID (from youtube.com/channel/UC… — not the @handle), or a PL… playlist ID. Returns the ~15 latest videos with titles, descriptions, and thumbnails. Ships with a video-shaped default template (item-youtube.php): thumbnail + play overlay linking to YouTube — no iframe, no third-party requests until the visitor clicks.

Bluesky (profile)

Profile posts via Bluesky's public AppView API — no authentication at all. Configure the handle (name.bsky.social or a custom-domain handle). Reposts, replies, and pins are filtered out; embedded images (with alt text) and link-card thumbnails are mapped.

Mock

Fixture data shaped like a typical social-post API response, run through the same normalizer as the live providers. Zero credentials — build and style templates before any API access exists. Visible when WP_ENVIRONMENT_TYPE is not production; mock feeds don't count toward the free-tier limit outside production.

What about X / Instagram / Facebook?

X has had no free read API since 2023 and no RSS — the only "free" routes are scraping mirrors, which we won't build on. If you accept the trade-offs, point the RSS provider at a bridge you host yourself. Instagram/Facebook (Meta Graph API, app review required) are on the roadmap.

Custom providers

Third-party providers plug into the same registry:

add_action( 'freshet_feeds_register_providers', function ( $registry ) {
    $registry->register( new My_Custom_Provider() );
} );

Implement FreshetFeeds\Provider\ProviderInterfaceid(), label(), fetch( Feed $feed ): ItemCollection, and settingsFields() for the admin form. Return normalized Item objects and you inherit caching, image localization, templates, and the block for free.