npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

feedsmith

v3.0.1

Published

Fast, all‑in‑one feed parser and generator for RSS, Atom, RDF, and JSON Feed, with support for Podcast, iTunes, Dublin Core, and OPML files.

Readme

Feedsmith

codecov npm version license

Fast, all‑in‑one JavaScript feed parser and generator for RSS, Atom, RDF, and JSON Feed, with support for popular namespaces and OPML files.

Feedsmith's universal and format-specific parsers turn each feed into an object that mirrors its original structure and maps legacy elements to their modern equivalents, so you read an old feed the same way as a new one.

[!IMPORTANT] Feedsmith 3.0 is out! 🎉 It comes with a range of improvements and some breaking changes. Check out the migration guide to see what's new and how to upgrade from 2.x.

Read full docs ↗   ·   Quick Start   ·   Why Feedsmith?   ·   Benchmarks →


Features

Core

  • Comprehensive support: Supports all major feed formats and namespaces.
  • Preserves structure: Parsed feed object maintains the original feed structure making it easy to access the data.
  • Smart namespace handling: Normalizes custom namespace prefixes to standard ones (e.g., <custom:creator> becomes dc.creator).
  • Parsing & generating: Use one package for both parsing and generating feeds.

Leniency

  • Normalizes legacy elements: Upgrades feed elements to their modern equivalents so that you never need to worry about reading feeds in older formats.
  • CaSe INSENsiTive: Handles fields and attributes in any case (lowercase, uppercase, mixed).
  • Namespace URI tolerance: Accepts non-official namespace URIs (HTTPS variants, case variations, trailing slashes, whitespace).
  • Forgiving: Gracefully handles malformed or incomplete feeds and extracts valid data. This makes it suitable for use with real-world feeds that may not strictly follow specifications.

Performance

  • Ultrafast parsing: One of the fastest JavaScript feed parsers (see benchmarks).
  • Type-safe API: Built with TypeScript from the ground up, it provides complete type definitions for every feed format and namespace.
  • Tree-shakable: Only include the parts of the library you need, reducing bundle size.
  • Well-tested: Comprehensive test suite with over 4000 tests and 99% code coverage.

Compatibility

  • Works in Node.js and modern browsers.
  • Supports both CommonJS and ES modules.
  • Works with plain JavaScript, so you don't need TypeScript.

Supported Formats

Feedsmith aims to fully support all major feed formats and namespaces in complete alignment with their specs.

✅ Available   ·   ⌛️ Work in progress   ·   📋 Planned

Feeds

| Format | Versions | Parse | Generate | |--------|----------|-------|----------| | RSS | 0.9x, 2.0 | ✅ | ✅ | | Atom | 0.3, 1.0 | ✅ | ✅ | | RDF | 0.9, 1.0 | ✅ | 📋 | | JSON Feed | 1.0, 1.1 | ✅ | ✅ |

Other

| Format | Versions | Parse | Generate | |--------|----------|-------|----------| | OPML | 1.0, 2.0 | ✅ | ✅ |

Feed Namespaces

| Name | Prefix | Supported in | Parse | Generate | |------|---------|--------------|-------|----------| | Atom | <atom:*> | RSS, RDF | ✅ | ✅ | | Dublin Core | <dc:*> | RSS, Atom, RDF | ✅ | ✅ | | Dublin Core Terms | <dcterms:*> | RSS, Atom, RDF | ✅ | ✅ | | Syndication | <sy:*> | RSS, Atom, RDF | ✅ | ✅ | | Content | <content:*> | RSS, RDF | ✅ | ✅ | | Slash | <slash:*> | RSS, Atom, RDF | ✅ | ✅ | | iTunes | <itunes:*> | RSS, Atom | ✅ | ✅ | | Podcast Index | <podcast:*> | RSS | ✅ | ✅ | | Podlove Simple Chapters | <psc:*> | RSS, Atom | ✅ | ✅ | | Media RSS | <media:*> | RSS, Atom, RDF | ✅ | ✅ | | Google Play Podcast | <googleplay:*> | RSS, Atom | ✅ | ✅ | | Spotify | <spotify:*> | RSS | ✅ | ✅ | | Acast | <acast:*> | RSS | ✅ | ✅ | | RawVoice | <rawvoice:*> | RSS | ✅ | ✅ | | FeedPress | <feedpress:*> | RSS | ✅ | ✅ | | arXiv | <arxiv:*> | Atom | ✅ | ✅ | | OpenSearch | <opensearch:*> | RSS, Atom | ✅ | ✅ | | PRISM | <prism:*> | RSS | ✅ | ✅ | | ccREL | <cc:*> | RSS, Atom, RDF | ✅ | ✅ | | Creative Commons | <creativeCommons:*> | RSS, Atom | ✅ | ✅ | | Atom Threading | <thr:*> | RSS, Atom | ✅ | ✅ | | Atom Publishing Protocol | <app:*> | Atom | ✅ | ✅ | | Comment API | <wfw:*> | RSS, Atom, RDF | ✅ | ✅ | | Administrative | <admin:*> | RSS, Atom, RDF | ✅ | ✅ | | Pingback | <pingback:*> | RSS, Atom | ✅ | ✅ | | Trackback | <trackback:*> | RSS, Atom | ✅ | ✅ | | Source | <source:*> | RSS | ✅ | ✅ | | blogChannel | <blogChannel:*> | RSS | ✅ | ✅ | | YouTube | <yt:*> | Atom | ✅ | ✅ | | W3C Basic Geo | <geo:*> | RSS, Atom | ✅ | ✅ | | GeoRSS Simple | <georss:*> | RSS, Atom, RDF | ✅ | ✅ | | RDF | <rdf:*> | RDF | ✅ | ✅ | | XML | <xml:*> | RSS, Atom, RDF | ✅ | ✅ |

Quick Start

This guide will get you up and running with Feedsmith in just a few minutes.

For a full overview of all the features, visit the documentation website.

Installation

npm install feedsmith

Migrating from v2.x? Check out the migration guide.

Parse Any Feed

The simplest way to parse any feed is to use the universal parseFeed function:

import { parseFeed } from 'feedsmith'

// Works with RSS, Atom, RDF, and JSON Feed
const { format, feed } = parseFeed(feedContent)

console.log('Feed format:', format) // rss, atom, json, rdf
console.log('Feed title:', feed.title)

if (format === 'rss') {
  console.log('RSS feed link:', feed.link)
}

Parse Specific Feed Formats

If you know the format in advance, you can use the format-specific parsers:

import {
  parseAtomFeed,
  parseJsonFeed,
  parseRssFeed,
  parseRdfFeed
} from 'feedsmith'

// Parse specific formats
const rssFeed = parseRssFeed('rss content')
const atomFeed = parseAtomFeed('atom content')
const rdfFeed = parseRdfFeed('rdf content')
const jsonFeed = parseJsonFeed('json content')

// Access typed data
rssFeed.title
rssFeed.dc?.creator
rssFeed.items?.[0]?.title

Parse OPML Files

import { parseOpml } from 'feedsmith'

const opml = parseOpml('opml content')

opml.head?.title
opml.body?.outlines?.[0].text
opml.body?.outlines?.[1].xmlUrl

Generate a Feed

import { generateRssFeed } from 'feedsmith'

const rss = generateRssFeed({
  title: 'My Blog',
  link: 'https://example.com',
  description: 'A simple blog',
  items: [{
    title: 'Hello World',
    link: 'https://example.com/hello',
    description: 'My first post',
    pubDate: new Date()
  }]
})

console.log(rss) // Complete RSS XML

// You can also generate other formats:
// - generateAtomFeed() for Atom feeds
// - generateJsonFeed() for JSON feeds
// - generateOpml() for OPML files

Error Handling

If the feed is unrecognized or invalid, an Error will be thrown with a descriptive message.

import { parseFeed, parseJsonFeed } from 'feedsmith'

try {
  const universalFeed = parseFeed('<not-a-feed></not-a-feed>')
} catch (error) {
  // Error: Unrecognized feed format
}

try {
  const jsonFeed = parseJsonFeed('{}')
} catch (error) {
  // Error: Invalid feed format
}

TypeScript Types

Feedsmith provides comprehensive TypeScript types for all feed formats:

import type { AnyFeed, AtomFeed, JsonFeed, Opml, RssFeed } from 'feedsmith'

// Access all types for a format
type Feed = RssFeed.Feed<string>
type Item = RssFeed.Item<string>
type Category = RssFeed.Category
type Enclosure = RssFeed.Enclosure

// Return type of parseFeed
type Result = AnyFeed

Why Feedsmith?

Why should you use this library over the alternatives?

The key advantage of Feedsmith is that it preserves the original feed structure exactly as defined in each specific feed format.

Many alternative packages attempt to normalize data by:

  • Merging distinct fields like author, dc:creator, and creator into a single property.
  • Combining date fields such as dc:date and pubDate without preserving their sources.
  • Handling multiple <atom:link> elements inconsistently, sometimes keeping only the first or last one or ignoring different rel attributes.
  • Some libraries try to combine different feed formats into one universal structure.

While this approach can be useful for quick reading of feed data, it often results in a loss of information that may be crucial for certain applications, such as reading data from specific namespaces.

Acknowledgements