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\ProviderInterface — id(), 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.