Skip to content

Platform Method ​

The Platform method generates feed URLs for known platforms using URL pattern matching. It works without HTTP requests by recognizing URL structures specific to each platform.

How It Works ​

The Platform method uses handlers for each supported platform:

  1. Pattern Matching: Each handler checks if the URL matches its platform (e.g., github.com, youtube.com).
  2. URL Generation: The matching handler generates feed URLs based on the URL structure.
  3. First Match: The first matching handler wins. Subsequent handlers are skipped.

TIP

Even when feeds are discoverable via HTML <link> tags, the Platform method is useful because it generates feed variants the page does not advertise, like a channel's Shorts feed or a repository's releases feed. Handlers that work from the URL alone need no page content, which helps when you use the method directly and only have a URL.

Hints ​

Platform handlers attach a hint to each feed URI they generate. Hints provide a machine-readable key and a human-readable label that describe what type of feed the URI represents (e.g., "All uploads", "Videos", "Shorts"). This is useful when a single URL generates multiple feed variants and you need to let users pick the right one, especially for feeds that don't include a descriptive title.

Hints are propagated to the final DiscoverResult objects returned by discoverFeeds. Results from non-platform methods (HTML, headers, guess) do not include hints.

typescript
type DiscoverUriHint = {
  key: string    // e.g., 'youtube:all', 'youtube:videos'
  label: string  // e.g., 'All uploads', 'Videos'
}

Supported Platforms ​

Apple Podcasts ​

Discovers RSS feeds for Apple Podcasts shows by extracting the feed URL from the page content.

URL PatternFeeds Generated
podcasts.apple.com/{locale}/podcast/{name}/id{id}Podcast feed*

* Requires HTML content to extract feed URL.

YouTube ​

Discovers Atom feeds for channels and playlists. Generates ten feed variants for channels: all uploads, then videos, shorts and live streams, each also as a popular and a members-only feed.

URL PatternFeeds Generated
youtube.com/channel/{id}All channel feed variants
youtube.com/@{handle}All channel feed variants*
youtube.com/user/{name}All channel feed variants*
youtube.com/c/{custom}All channel feed variants*
youtube.com/watch?v={id}All channel feed variants*
youtu.be/{id}All channel feed variants*
youtube.com/shorts/{id}All channel feed variants*
youtube.com/live/{id}All channel feed variants*
youtube.com/playlist?list={id}Playlist feed

* Requires HTML content to extract channel ID.

Reddit ​

Discovers Atom feeds for subreddits, users, multireddits, and domains.

URL PatternFeeds Generated
reddit.comHomepage feed
reddit.com/r/{subreddit}Subreddit posts + comments
reddit.com/r/{subreddit}/{sort}Sorted posts (hot/new/rising/top) + comments
reddit.com/r/{subreddit}/comments/{id}Post comments
reddit.com/u/{username}User activity
reddit.com/user/{username}/m/{multireddit}Multireddit feed
reddit.com/domain/{domain}Domain submissions

Medium ​

Discovers RSS feeds for Medium user profiles, publications, tags, and subdomains.

URL PatternFeeds Generated
medium.com/@{username}User posts feed
medium.com/{publication}Publication feed
medium.com/tag/{tag}Tag feed
medium.com/{publication}/tagged/{tag}Tagged publication feed
*.medium.comSubdomain publication feed
*.medium.com/tagged/{tag}Subdomain tagged feed

Substack ​

Discovers RSS feeds for Substack newsletters.

URL PatternFeeds Generated
*.substack.comNewsletter feed
substack.com/@{user}Newsletter feed

WordPress.com ​

Discovers RSS and Atom feeds for WordPress.com blogs, with category, tag, and author support.

URL PatternFeeds Generated
*.wordpress.comPosts feed (RSS + Atom + RDF) + comments
*.wordpress.com/category/{category}Category feed (+ above)
*.wordpress.com/tag/{tag}Tag feed (+ above)
*.wordpress.com/author/{author}Author feed (+ above)

WP Engine ​

Discovers feeds for WP Engine-hosted WordPress sites. Uses the same feed structure as WordPress.com.

URL PatternFeeds Generated
*.wpenginepowered.comSame as WordPress.com
*.wpengine.comSame as WordPress.com (legacy domain)

Blogspot ​

Discovers RSS and Atom feeds for Blogspot blogs, including label, comments, summary, and per-post comments feeds. Also matches country-coded TLDs (*.blogspot.co.uk, *.blogspot.de, etc.).

URL PatternFeeds Generated
*.blogspot.comPosts feed (Atom + RSS) + summary (Atom + RSS) + comments (Atom + RSS)
*.blogspot.com/search/label/{label}Label feed (Atom + RSS) + above
*.blogspot.com/{year}/{month}/{slug}.htmlPost comments feed (Atom + RSS)* + above

* Requires HTML content to extract the post ID.

DEV.to ​

Discovers RSS feeds for DEV.to user profiles, tags, the global community, and the latest sort.

URL PatternFeeds Generated
dev.toCommunity feed
dev.to/latestLatest sort feed
dev.to/{username}User posts feed
dev.to/t/{tag}Tag posts feed

Lobsters ​

Discovers RSS feeds for Lobsters homepage, users, tags, and domains.

URL PatternFeeds Generated
lobste.rsHomepage feed
lobste.rs/newestNewest posts feed
lobste.rs/topTop stories feed
lobste.rs/top/{period}Top stories by period (1d/3d/1w/1m/1y)
lobste.rs/commentsSite-wide comments feed
lobste.rs/~{username}User stories feed
lobste.rs/t/{tag}Tag feed
lobste.rs/t/{tag1},{tag2}Multi-tag feed
lobste.rs/domains/{domain}Domain feed

Goodreads ​

Discovers RSS feeds for Goodreads user activity and bookshelves.

URL PatternFeeds Generated
goodreads.com/user/show/{id}User updates + reviews
goodreads.com/review/list/{id}Reviews + user updates

GitHub ​

Discovers Atom feeds for users, organizations, and repositories.

URL PatternFeeds Generated
github.com/{user}User activity feed
github.com/{owner}/{repo}Releases, commits, tags
github.com/{owner}/{repo}/wikiWiki changes (+ above)
github.com/{owner}/{repo}/discussionsDiscussions (+ above)
github.com/{owner}/{repo}/tree/{branch}Branch commits (+ above)
github.com/{owner}/{repo}/blob/{branch}/{path}File commits (+ above)
github.com/{owner}/{repo}/commits/{branch}/{path}File commits (+ above)

GitHub Gist ​

Discovers Atom feeds for GitHub Gist users, starred gists, forks, and the discover stream.

URL PatternFeeds Generated
gist.github.com/{username}User gists feed
gist.github.com/{username}/{gist-id}User gists feed
gist.github.com/{username}/starredUser starred gists feed
gist.github.com/{username}/forksUser forks feed
gist.github.com/discoverDiscover gists feed

Codeberg / Gitea ​

Discovers Atom feeds for Codeberg and Gitea users, repositories, releases and tags, with RSS as the fallback.

URL PatternFeeds Generated
codeberg.org/{user}User activity feed
codeberg.org/{user}/{repo}Releases, tags, activity

Also supports gitea.com with the same patterns.

GitLab ​

Discovers Atom feeds for GitLab users and repositories. Self-hosted instances are detected via the og:site_name HTML meta tag or the X-Gitlab-Meta response header.

URL PatternFeeds Generated
gitlab.com/{user}User activity feed
gitlab.com/{user}/{repo}Releases, tags, issues, merge requests, activity
gitlab.com/{user}/{repo}/-/commits/{branch}Branch commits feed (+ above)
gitlab.com/{user}/{repo}/-/tree/{branch}Branch commits feed (+ above)

Product Hunt ​

Discovers Atom feeds for Product Hunt homepage, topics, and categories.

URL PatternFeeds Generated
producthunt.comHomepage feed
producthunt.com/topics/{topic}Topic feed
producthunt.com/categories/{category}Category feed

Pinterest ​

Discovers RSS feeds for Pinterest user profiles.

URL PatternFeeds Generated
pinterest.com/{username}User pins feed

Dailymotion ​

Discovers RSS feeds for Dailymotion users, playlists, channels, and the global trending feed.

URL PatternFeeds Generated
dailymotion.com/{username}User videos feed
dailymotion.com/playlist/{id}Playlist feed
dailymotion.com/channel/{name}Channel feed
dailymotion.com or dailymotion.com/trendingTrending feed

DeviantArt ​

Discovers RSS feeds for DeviantArt user portfolios, gallery folders, favourites, and tags.

URL PatternFeeds Generated
deviantart.com/{username}User deviations feed
deviantart.com/{username}/galleryUser gallery feed
deviantart.com/{username}/gallery/{id}Gallery folder feed
deviantart.com/{username}/favouritesUser favourites feed
deviantart.com/tag/{tag}Tag feed

Mastodon ​

Discovers RSS feeds for Mastodon user profiles and hashtag pages. Detects Mastodon instances via the <meta name="generator"> HTML tag or the Server response header, with no hardcoded instance list.

URL PatternFeeds Generated
{instance}/@{username}User posts feed
{instance}/@{username}/tagged/{tag}User posts tagged feed + posts
{instance}/@{username}/with_repliesUser posts with replies feed + posts
{instance}/@{username}/mediaUser media-only feed + posts
{instance}/tags/{tag}Hashtag feed

NOTE

Requires page content or response headers to detect Mastodon instances. Works with any Mastodon-compatible server, not just well-known instances.

Bluesky ​

Discovers RSS feeds for Bluesky profiles.

URL PatternFeeds Generated
bsky.app/profile/{handle}Profile posts feed

Tumblr ​

Discovers RSS feeds for Tumblr blogs and tagged posts.

URL PatternFeeds Generated
*.tumblr.comBlog posts feed
*.tumblr.com/tagged/{tag}Tagged posts feed

Behance ​

Discovers RSS feeds for Behance user portfolios and appreciated works, plus the homepage Featured-projects and Featured-by-Adobe gallery feeds.

URL PatternFeeds Generated
behance.net or behance.net/galleriesFeatured projects + Featured by Adobe
behance.net/{username}User portfolio feed
behance.net/{username}/appreciatedUser appreciated feed

SoundCloud ​

Discovers RSS feeds for SoundCloud user profiles.

URL PatternFeeds Generated
soundcloud.com/{user}User sounds feed*

* Requires HTML content to extract user ID.

Vimeo ​

Discovers RSS feeds for Vimeo user profiles, channels, groups, and albums (showcases).

URL PatternFeeds Generated
vimeo.com/{user}User videos feed
vimeo.com/{user}/likesUser likes feed (+ videos)
vimeo.com/channels/{channel}Channel feed
vimeo.com/groups/{group}Group feed
vimeo.com/album/{id}Album/showcase feed

SourceForge ​

Discovers RSS feeds for SourceForge project activity, file releases, news, and discussion.

URL PatternFeeds Generated
sourceforge.net/projects/{project} or sourceforge.net/p/{project}Activity + project + files + news (RSS + Atom) + discussion (RSS + Atom) + bugs

Kickstarter ​

Discovers Atom feeds for Kickstarter projects and global new projects.

URL PatternFeeds Generated
kickstarter.comGlobal new projects feed
kickstarter.com/discoverGlobal new projects feed
kickstarter.com/projects/{creator}/{project}Project updates feed

Letterboxd ​

Discovers RSS feeds for Letterboxd user profiles.

URL PatternFeeds Generated
letterboxd.com/{username}User diary feed

Steam ​

Discovers RSS feeds for Steam game news and community groups.

URL PatternFeeds Generated
store.steampowered.com/app/{id}Game news feed
store.steampowered.com/news/app/{id}Game news feed
steamcommunity.com/app/{id}Game news feed
steamcommunity.com/groups/{name}Group RSS feed

Stack Exchange ​

Discovers Atom feeds for Stack Overflow, Server Fault, Super User, Ask Ubuntu, MathOverflow, Stack Apps, and all *.stackexchange.com sites.

URL PatternFeeds Generated
{site}Site-wide newest questions feed
{site}/questions/tagged/{tag}Tag feed
{site}/questions/{id}Question feed
{site}/users/{id}User feed
{site}/collectives/{name}Collective feed

NOTE

Tag feeds accept ?sort={newest|active|votes|creation|hot|week|month} (also ?tab=…). The value is passed through to the generated feed URL when it matches one of the allowed sorts. Unknown values are silently dropped.

Hashnode ​

Discovers RSS feeds for Hashnode blogs on *.hashnode.dev.

URL PatternFeeds Generated
*.hashnode.devBlog feed

Paragraph ​

Discovers RSS feeds for Paragraph blogs (successor to Mirror.xyz).

URL PatternFeeds Generated
paragraph.com/@{username}Blog feed

Hatena Blog ​

Discovers RSS and Atom feeds for Hatena Blog on *.hatenablog.com, *.hatenablog.jp, and *.hateblo.jp.

URL PatternFeeds Generated
*.hatenablog.comPosts feed (RSS + Atom)
*.hatenablog.jpPosts feed (RSS + Atom)
*.hateblo.jpPosts feed (RSS + Atom)
*/archive/category/{category}Category feed (RSS + Atom) + posts
*/archive/author/{author}Author feed (RSS + Atom) + posts

Itch.io ​

Discovers RSS feeds for Itch.io games, creators, devlogs, and browse pages.

URL PatternFeeds Generated
{creator}.itch.io/{game}Game devlog feed
{creator}.itch.ioCreator's games feed
itch.io/gamesGames feed
itch.io/games/by-{username}Creator's games feed
itch.io/games/tag-{tag}Tag feed
itch.io/games/{sort}Sorted games feed (newest/top-rated/top-sellers/on-sale)
itch.io/{section}Section feed (tools/game-assets/soundtracks/physical-games/books/comics/misc)
itch.io/devlogsAll devlogs feed
itch.ioFeatured + new + sales feeds + itch.io blog

CSDN ​

Discovers RSS feeds for CSDN user blogs.

URL PatternFeeds Generated
blog.csdn.net/{username}Blog feed

Douban ​

Discovers RSS feeds for Douban user interests, reviews, notes, and subject reviews.

URL PatternFeeds Generated
www.douban.com/people/{user}Interests + reviews + notes
{subdomain}.douban.com/subject/{id}Subject reviews
www.douban.comBook + movie + music + drama reviews

V2EX ​

Discovers Atom feeds for V2EX index, nodes, members, and tabs.

URL PatternFeeds Generated
v2ex.comIndex feed
v2ex.com/go/{node}Node feed
v2ex.com/member/{username}Member feed
v2ex.com/?tab={tab}Tab feed

Ximalaya ​

Discovers RSS feeds for Ximalaya podcast albums.

URL PatternFeeds Generated
www.ximalaya.com/album/{id}Album feed

Write.as ​

Discovers RSS feeds for Write.as blogs, including tag feeds.

URL PatternFeeds Generated
write.as/{user}Blog feed
write.as/{user}/tag:{tag}Tag feed + blog

Prose.sh ​

Discovers Atom feeds for Prose.sh blogs.

URL PatternFeeds Generated
*.prose.shBlog feed

Pagecord ​

Discovers RSS feeds for Pagecord blogs.

URL PatternFeeds Generated
*.pagecord.comBlog feed

ArtStation ​

Discovers RSS feeds for ArtStation portfolios and the global artwork feed.

URL PatternFeeds Generated
artstation.com/{user}Portfolio feed
{user}.artstation.comPortfolio feed
artstation.com/artworkArtwork + Artwork (Trending)

Bear Blog ​

Discovers Atom and RSS feeds for Bear Blog, including tag-filtered feeds.

URL PatternFeeds Generated
*.bearblog.devPosts feed (Atom + RSS)
*.bearblog.dev/?q={tag}Tag feed (Atom + RSS) + posts

Buttondown ​

Discovers RSS feeds for Buttondown newsletters.

URL PatternFeeds Generated
buttondown.com/{user}Newsletter feed

Dreamwidth ​

Discovers RSS and Atom feeds for Dreamwidth blogs.

URL PatternFeeds Generated
*.dreamwidth.orgPosts feed (RSS + Atom) + userpics (Atom)

Excite Blog ​

Discovers RSS and Atom feeds for Excite Blog, including category feeds.

URL PatternFeeds Generated
*.exblog.jpPosts feed (RSS + Atom)
*.exblog.jp/i{N}Category feed (RSS + Atom) + posts

Fireside.fm ​

Discovers RSS and JSON feeds for Fireside.fm-hosted podcasts.

URL PatternFeeds Generated
*.fireside.fmPodcast feed (RSS + JSON)

Hacker News ​

Discovers RSS feeds for Hacker News.

URL PatternFeeds Generated
news.ycombinator.comFront page feed (RSS)
news.ycombinator.com/showShow HN feed (RSS)

Listed ​

Discovers RSS feeds for Listed (Standard Notes) blogs.

URL PatternFeeds Generated
listed.to/@{user}Blog feed

MyAnimeList ​

Discovers RSS feeds for MyAnimeList user lists and site-wide news.

URL PatternFeeds Generated
myanimelist.net/profile/{user}Anime list, Manga list, Recently watched, Recently read (RSS)
myanimelist.net/animelist/{user}(same as above)
myanimelist.net/mangalist/{user}(same as above)
myanimelist.net/history/{user}(same as above)
myanimelist.net/newsSite-wide news feed

Nebula ​

Discovers RSS feeds for Nebula channels, the global video feed, and category feeds, each with a Plus-only variant.

URL PatternFeeds Generated
nebula.tv/{channel}Videos + Videos (Plus)
nebula.tvAll videos + All videos (Plus) + recently added channels
nebula.tv/videosAll videos + All videos (Plus) + recently added channels
nebula.tv/videos?category={slug}Category + Category (Plus) + above

note.com ​

Discovers RSS feeds for note.com, including hashtag and magazine feeds.

URL PatternFeeds Generated
note.com/{user}Blog feed
note.com/hashtag/{tag}Hashtag feed
note.com/{user}/m/{magazineId}Magazine feed

Odysee ​

Discovers RSS feeds for Odysee channels.

URL PatternFeeds Generated
odysee.com/@{channel}:{id}Videos feed

Tistory ​

Discovers RSS feeds for Tistory blogs.

URL PatternFeeds Generated
*.tistory.comBlog feed

Transistor ​

Discovers RSS feeds for Transistor-hosted podcasts.

URL PatternFeeds Generated
*.transistor.fmPodcast feed

Velog ​

Discovers RSS feeds for Velog users and the platform-wide trending feed.

URL PatternFeeds Generated
velog.io/@{user}Posts feed
velog.ioTrending posts feed

Acast ​

Discovers RSS feeds for Acast-hosted podcasts.

URL PatternFeeds Generated
shows.acast.com/{slug}Podcast feed (RSS)

Ameba Blog ​

Discovers RSS, Atom, and RDF feeds for Ameba Blog.

URL PatternFeeds Generated
ameblo.jp/{user}Posts feed (RSS + Atom + RDF)

Are.na ​

Discovers RSS feeds for Are.na user profiles and channels.

URL PatternFeeds Generated
are.na/{user}User profile feed
are.na/{user}/{channel}Channel feed

Audioboom ​

Discovers RSS feeds for Audioboom channels.

URL PatternFeeds Generated
audioboom.com/channels/{id}Podcast feed (RSS)

BookWyrm ​

Discovers RSS feeds for BookWyrm user activity, reviews, quotes, comments, and per-shelf feeds. Detected by the BookWyrm generator meta tag.

URL PatternFeeds Generated
{instance}/user/{user}Activity + reviews + quotes + comments (RSS)
{instance}/user/{user}/(shelf|books)/{shelf-id}Shelf feed (RSS) + activity/reviews/quotes/comments

Buzzsprout ​

Discovers RSS feeds for Buzzsprout-hosted podcasts.

URL PatternFeeds Generated
buzzsprout.com/{id}Podcast feed

Discourse ​

Discovers RSS feeds for Discourse forums. Detected by the Discourse generator meta tag.

URL PatternFeeds Generated
{instance}/u/{user}User activity feed (RSS)
{instance}/c/{slug}Category feed (RSS)
{instance}/t/{slug}/{id}Topic feed (RSS)
{instance}/top or /top/{period}Top topics feed (RSS)
{instance}/ (or any other path)Latest topics feed + latest posts feed (RSS)

NOTE

The top topics feed accepts {daily|weekly|monthly|quarterly|yearly|all} via either the /top/{period} path or ?period={period} query param. Unknown values are silently dropped.

Friendica ​

Discovers Atom feeds for Friendica user profiles. Detected by the Friendica generator meta tag.

URL PatternFeeds Generated
{instance}/profile/{user}Posts + comments + replies + activity feeds (Atom)

Ghost ​

Discovers RSS feeds for Ghost-hosted blogs, including tag and author feeds.

URL PatternFeeds Generated
*.ghost.ioBlog feed
*.ghost.io/tag/{slug}Tag feed + blog
*.ghost.io/author/{slug}Author feed + blog

Hearthis.at ​

Discovers RSS feeds for Hearthis.at user profiles.

URL PatternFeeds Generated
hearthis.at/{user}Tracks feed

HEY World ​

Discovers Atom feeds for HEY World blogs.

URL PatternFeeds Generated
world.hey.com/{user}Blog feed

InsaneJournal ​

Discovers RSS and Atom feeds for InsaneJournal journals.

URL PatternFeeds Generated
*.insanejournal.comPosts feed (RSS + Atom) + userpics (Atom)

Lemmy ​

Discovers RSS feeds for Lemmy instances, communities and users. Detected by the Lemmy generator meta tag or the X-Powered-By response header. There is no hardcoded instance list.

URL PatternFeeds Generated
{instance}/ or /homeAll posts feed + local posts feed
{instance}/c/{community}Community feed
{instance}/u/{user}User feed

NOTE

Requires page content or response headers to detect Lemmy instances. The ?sort= and ?limit= query params are passed through to the generated feed URL. Unknown sort values are silently dropped.

Libsyn ​

Discovers RSS feeds for Libsyn-hosted podcasts.

URL PatternFeeds Generated
{slug}.libsyn.comPodcast feed
feeds.libsyn.com/{showId}Podcast feed

LiveJournal ​

Discovers RSS and Atom feeds for LiveJournal blogs.

URL PatternFeeds Generated
*.livejournal.comPosts feed (RSS + Atom) + userpics (Atom)

Mataroa ​

Discovers RSS feeds for Mataroa blogs.

URL PatternFeeds Generated
*.mataroa.blogBlog feed

Micro.blog ​

Discovers RSS, JSON, and podcast feeds for Micro.blog-hosted blogs, including category, archive, photos, and replies feeds.

URL PatternFeeds Generated
*.micro.blogPosts (RSS + JSON) + podcast (RSS + JSON)
*.micro.blog/categories/{slug}Category (RSS + JSON) + above
*.micro.blog/archiveArchive feed + above
*.micro.blog/photosPhotos feed + above
*.micro.blog/repliesReplies feed + above

Misskey ​

Discovers Atom, RSS, and JSON feeds for Misskey user profiles. Detected by the Misskey application-name meta tag.

URL PatternFeeds Generated
{instance}/@{user}Posts feed (Atom + RSS + JSON)

Discovers RSS feeds for Naver Blog.

URL PatternFeeds Generated
blog.naver.com/{id}Blog feed
m.blog.naver.com/{id}Blog feed

Observable ​

Discovers RSS feeds for Observable user notebooks and collections.

URL PatternFeeds Generated
observablehq.com/@{user}Notebooks feed
observablehq.com/@{user}/collection/{slug}Collection feed

Pika ​

Discovers Atom and RSS feeds for Pika blogs, including tag feeds.

URL PatternFeeds Generated
*.pika.pagePosts feed (Atom + RSS)
*.pika.page/tag/{tag}Tag feed (Atom + RSS) + posts

Pixelfed ​

Discovers Atom feeds for Pixelfed user profiles. Detected by the pixelfed generator meta tag.

URL PatternFeeds Generated
{instance}/{user} or {instance}/users/{user}Posts feed (Atom)

Pleroma ​

Discovers Atom and RSS feeds for Pleroma (and Akkoma) user profiles. Detected by Pleroma-specific API endpoint references in HTML.

URL PatternFeeds Generated
{instance}/users/{user}Posts feed (Atom + RSS)

Podbean ​

Discovers RSS feeds for Podbean-hosted podcasts.

URL PatternFeeds Generated
*.podbean.comPodcast feed

Podigee ​

Discovers RSS feeds for Podigee-hosted podcasts.

URL PatternFeeds Generated
*.podigee.ioPodcast feed (RSS)

Posthaven ​

Discovers Atom feeds for Posthaven blogs.

URL PatternFeeds Generated
*.posthaven.comPosts feed (Atom)

Qiita ​

Discovers Atom feeds for Qiita users, tags, organizations, and popular items.

URL PatternFeeds Generated
qiita.com/{user}User posts feed
qiita.com/tags/{tag}Tag feed
qiita.com/organizations/{org}Organization feed
qiita.com/popular-itemsPopular items feed

RSS.com ​

Discovers RSS feeds for RSS.com-hosted podcasts.

URL PatternFeeds Generated
rss.com/podcasts/{slug}Podcast feed

Seesaa Blog ​

Discovers RSS 2.0 and RDF feeds for Seesaa Blog.

URL PatternFeeds Generated
*.seesaa.netPosts feed (RSS 2.0 + RDF)

Spreaker ​

Discovers RSS feeds for Spreaker-hosted podcasts.

URL PatternFeeds Generated
spreaker.com/podcast/{slug}--{id}Podcast feed

Tildes ​

Discovers RSS and Atom feeds for Tildes homepage and groups.

URL PatternFeeds Generated
tildes.netTopics feed (RSS + Atom)
tildes.net/~{group}Group feed (RSS + Atom)

weblog.lol ​

Discovers RSS, Atom, and JSON feeds for weblog.lol blogs.

URL PatternFeeds Generated
*.weblog.lolPosts feed (RSS + Atom + JSON)

Weebly ​

Discovers RSS feeds for Weebly-hosted blogs.

URL PatternFeeds Generated
*.weebly.comBlog feed
*.weebly.com/{slug}Blog feed (custom page slug) + default blog feed

Zenn ​

Discovers RSS feeds for Zenn users, topics, publications, and the platform-wide trending feed.

URL PatternFeeds Generated
zenn.dev/{user}User posts feed
zenn.dev/topics/{topic}Topic feed
zenn.dev/p/{pub}Publication feed
zenn.dev/publications/{pub}Publication feed
zenn.devTrending posts feed

Basic Usage ​

typescript
import { discoverFeeds } from 'feedscout'

const feeds = await discoverFeeds('https://github.com/feedstand/feedstand', {
  methods: ['platform'],
})

// [
//   { url: 'https://github.com/feedstand/feedstand/releases.atom', ... },
//   { url: 'https://github.com/feedstand/feedstand/commits.atom', ... },
//   { url: 'https://github.com/feedstand/feedstand/tags.atom', ... },
// ]

Configuration ​

Handler Order ​

Handlers are checked in order. The first matching handler generates the feeds:

typescript
import { discoverFeeds } from 'feedscout'
import { githubHandler, redditHandler, youtubeHandler } from 'feedscout/platform'

const feeds = await discoverFeeds(url, {
  methods: {
    platform: {
      handlers: [youtubeHandler, githubHandler, redditHandler],
    },
  },
})

Default Values ​

Import the default Platform options:

typescript
import { defaultPlatformOptions } from 'feedscout/platform'

Or import individual handlers:

typescript
import {
  acastHandler,
  amebloHandler,
  applePodcastsHandler,
  arenaHandler,
  artstationHandler,
  audioboomHandler,
  bearblogHandler,
  behanceHandler,
  blogspotHandler,
  blueskyHandler,
  bookwyrmHandler,
  buttondownHandler,
  buzzsproutHandler,
  codebergHandler,
  csdnHandler,
  dailymotionHandler,
  deviantartHandler,
  devtoHandler,
  discourseHandler,
  doubanHandler,
  dreamwidthHandler,
  exblogHandler,
  firesideHandler,
  friendicaHandler,
  ghostHandler,
  githubHandler,
  githubGistHandler,
  gitlabHandler,
  goodreadsHandler,
  hackernewsHandler,
  hashnodeHandler,
  hatenablogHandler,
  hearthisHandler,
  heyWorldHandler,
  insanejournalHandler,
  itchioHandler,
  kickstarterHandler,
  lemmyHandler,
  letterboxdHandler,
  libsynHandler,
  listedHandler,
  livejournalHandler,
  lobstersHandler,
  mastodonHandler,
  mataroaHandler,
  mediumHandler,
  microblogHandler,
  misskeyHandler,
  myanimelistHandler,
  naverBlogHandler,
  nebulaHandler,
  noteHandler,
  observableHandler,
  odyseeHandler,
  pagecordHandler,
  paragraphHandler,
  pikaHandler,
  pinterestHandler,
  pixelfedHandler,
  pleromaHandler,
  podbeanHandler,
  podigeeHandler,
  posthavenHandler,
  producthuntHandler,
  proseHandler,
  qiitaHandler,
  redditHandler,
  rssComHandler,
  seesaaHandler,
  soundcloudHandler,
  sourceforgeHandler,
  spreakerHandler,
  stackExchangeHandler,
  steamHandler,
  substackHandler,
  tildesHandler,
  tistoryHandler,
  transistorHandler,
  tumblrHandler,
  v2exHandler,
  velogHandler,
  vimeoHandler,
  weblogLolHandler,
  weeblyHandler,
  wordpressHandler,
  wpengineHandler,
  writeasHandler,
  ximalayaHandler,
  youtubeHandler,
  zennHandler,
} from 'feedscout/platform'

Using Directly ​

Use the Platform discovery function directly to get URIs without validation:

typescript
import { discoverUrisFromPlatform, youtubeHandler } from 'feedscout/platform'

const uris = await discoverUrisFromPlatform(htmlContent, undefined, {
  baseUrl: 'https://www.youtube.com/@mkbhd',
  handlers: [youtubeHandler],
})

// [
//   {
//     uri: [
//       'https://www.youtube.com/feeds/videos.xml?channel_id=UCBJycsmduvYEL83R_U4JriQ',
//       'https://www.youtube.com/feeds/videos.xml?playlist_id=UUBJycsmduvYEL83R_U4JriQ',
//     ],
//     hint: { key: 'youtube:all', label: 'All uploads' },
//   },
//   {
//     uri: 'https://www.youtube.com/feeds/videos.xml?playlist_id=UULFBJycsmduvYEL83R_U4JriQ',
//     hint: { key: 'youtube:videos', label: 'Videos' },
//   },
//   {
//     uri: 'https://www.youtube.com/feeds/videos.xml?playlist_id=UUSHBJycsmduvYEL83R_U4JriQ',
//     hint: { key: 'youtube:shorts', label: 'Shorts' },
//   },
//   {
//     uri: 'https://www.youtube.com/feeds/videos.xml?playlist_id=UULVBJycsmduvYEL83R_U4JriQ',
//     hint: { key: 'youtube:live', label: 'Live streams' },
//   },
//   {
//     uri: 'https://www.youtube.com/feeds/videos.xml?playlist_id=UULPBJycsmduvYEL83R_U4JriQ',
//     hint: { key: 'youtube:popular-videos', label: 'Popular videos' },
//   },
//   {
//     uri: 'https://www.youtube.com/feeds/videos.xml?playlist_id=UUPSBJycsmduvYEL83R_U4JriQ',
//     hint: { key: 'youtube:popular-shorts', label: 'Popular shorts' },
//   },
//   {
//     uri: 'https://www.youtube.com/feeds/videos.xml?playlist_id=UUPVBJycsmduvYEL83R_U4JriQ',
//     hint: { key: 'youtube:popular-live', label: 'Popular live streams' },
//   },
//   {
//     uri: 'https://www.youtube.com/feeds/videos.xml?playlist_id=UUMOBJycsmduvYEL83R_U4JriQ',
//     hint: { key: 'youtube:member-videos', label: 'Member videos' },
//   },
//   {
//     uri: 'https://www.youtube.com/feeds/videos.xml?playlist_id=UUMSBJycsmduvYEL83R_U4JriQ',
//     hint: { key: 'youtube:member-shorts', label: 'Member shorts' },
//   },
//   {
//     uri: 'https://www.youtube.com/feeds/videos.xml?playlist_id=UUMVBJycsmduvYEL83R_U4JriQ',
//     hint: { key: 'youtube:member-live', label: 'Member live streams' },
//   },
// ]

NOTE

The YouTube handler requires HTML content for @handle, /user/, and /c/ URLs to extract the channel ID. For /channel/UC... URLs, no content is needed.

Creating Custom Handlers ​

You can create handlers for platforms not included by default.

Handler Interface ​

A PlatformHandler has two methods:

typescript
type PlatformHandler = {
  match: (url: string, content?: string, headers?: Headers) => boolean
  resolve: (
    url: string,
    content?: string,
    headers?: Headers,
    fetchFn?: DiscoverFetchFn,
  ) => Array<DiscoverUriEntry> | Promise<Array<DiscoverUriEntry>>
}
MethodDescription
match(url, content?, headers?)Returns true if this handler should process the URL
resolve(url, content?, headers?, fetchFn?)Returns an array of DiscoverUriEntry objects for the given page URL

Basic Example ​

A handler that appends /feed.xml to any URL on a specific domain:

typescript
import type { PlatformHandler } from 'feedscout/platform'

const myHandler: PlatformHandler = {
  match: (url) => {
    return new URL(url).hostname === 'example.com'
  },

  resolve: (url) => {
    const { origin } = new URL(url)

    return [{ uri: `${origin}/feed.xml` }]
  },
}

Using URL Patterns ​

A handler that extracts a username from the URL path:

typescript
const profileHandler: PlatformHandler = {
  match: (url) => {
    const { hostname, pathname } = new URL(url)

    return hostname === 'example.com' && pathname.startsWith('/users/')
  },

  resolve: (url) => {
    const { origin, pathname } = new URL(url)
    const match = pathname.match(/^\/users\/([^/]+)/)

    if (match?.[1]) {
      return [{ uri: `${origin}/users/${match[1]}/feed.rss` }]
    }

    return []
  },
}

Using Page Content ​

When feed URLs can only be found in the HTML, use the content parameter:

typescript
const contentHandler: PlatformHandler = {
  match: (url) => new URL(url).hostname === 'example.com',

  resolve: (url, content) => {
    if (!content) {
      return []
    }

    const match = content.match(/data-feed-url="([^"]+)"/)

    return match?.[1] ? [{ uri: match[1] }] : []
  },
}

Combining with Defaults ​

Add custom handlers alongside the built-in ones:

typescript
import { defaultPlatformOptions } from 'feedscout/platform'

const feeds = await discoverFeeds(url, {
  methods: {
    platform: {
      handlers: [myHandler, ...defaultPlatformOptions.handlers],
    },
  },
})