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 URLs directly from the page URL—no HTTP request needed. This makes it faster when you only have a URL and want to avoid fetching the page content first.

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 only", "Shorts only"). 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 only'
}

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 four feed variants for channels: all uploads, videos-only, shorts-only, and live streams-only.

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

* Requires HTML content to extract channel ID.

Reddit

Discovers RSS 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)
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 RSS feeds for Codeberg and Gitea users, repositories, releases, tags, and branch commits.

URL PatternFeeds Generated
codeberg.org/{user}User activity feed
codeberg.org/{user}/{repo}Releases, tags, activity
codeberg.org/{user}/{repo}/src/branch/{branch}Branch commits (+ above)
codeberg.org/{user}/{repo}/src/branch/{branch}/{path}File history (+ above)

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 RSS 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 — no hardcoded instance list.

URL PatternFeeds Generated
{instance}/@{username}User posts feed
{instance}/@{username}/tagged/{tag}User posts tagged feed
{instance}/@{username}/with_repliesUser posts with replies feed
{instance}/@{username}/mediaUser media-only feed
{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 + files + news (RSS + Atom) + discussion

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 RSS 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)

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)
nebula.tv/videosAll videos + All videos (Plus)
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 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)
nebula.tv/videosAll videos + All videos (Plus)
nebula.tv/videos?category={slug}Category + Category (Plus) + above

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 feed (Atom) + comments-only feed (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)

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)

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
*.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 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)

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)

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 { githubHandler, 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,
  letterboxdHandler,
  libsynHandler,
  listedHandler,
  livejournalHandler,
  lobstersHandler,
  mastodonHandler,
  mataroaHandler,
  mediumHandler,
  microblogHandler,
  misskeyHandler,
  myanimelistHandler,
  naverBlogHandler,
  nebulaHandler,
  noteHandler,
  observableHandler,
  odyseeHandler,
  pagecordHandler,
  paragraphHandler,
  pikaHandler,
  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 } from 'feedscout/platform'

const uris = discoverUrisFromPlatform(htmlContent, {
  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 only' },
//   },
//   {
//     uri: 'https://www.youtube.com/feeds/videos.xml?playlist_id=UUSHBJycsmduvYEL83R_U4JriQ',
//     hint: { key: 'youtube:shorts', label: 'Shorts only' },
//   },
//   {
//     uri: 'https://www.youtube.com/feeds/videos.xml?playlist_id=UULVBJycsmduvYEL83R_U4JriQ',
//     hint: { key: 'youtube:live', label: 'Live streams only' },
//   },
// ]

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],
    },
  },
})