{"id":28602504,"url":"https://github.com/macieklamberski/feedsmith","last_synced_at":"2026-04-22T10:02:46.001Z","repository":{"id":284443490,"uuid":"949049409","full_name":"macieklamberski/feedsmith","owner":"macieklamberski","description":"Fast, all‑in‑one JavaScript feed parser and generator for RSS, Atom, RDF, and JSON Feed, with support for popular namespaces and OPML.","archived":false,"fork":false,"pushed_at":"2026-04-10T14:35:39.000Z","size":4116,"stargazers_count":588,"open_issues_count":10,"forks_count":20,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-10T15:26:31.201Z","etag":null,"topics":["atom","feed-generator","feed-parser","jsonfeed","rdf","rss","rss-feed","rss-generator","rss-parser"],"latest_commit_sha":null,"homepage":"https://feedsmith.dev","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/macieklamberski.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-03-15T15:03:03.000Z","updated_at":"2026-04-10T14:34:04.000Z","dependencies_parsed_at":"2025-03-25T23:29:56.829Z","dependency_job_id":"ea11c579-518d-4ec9-8717-ab77273b5543","html_url":"https://github.com/macieklamberski/feedsmith","commit_stats":null,"previous_names":["macieklamberski/feedsmith"],"tags_count":42,"template":false,"template_full_name":null,"purl":"pkg:github/macieklamberski/feedsmith","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/macieklamberski%2Ffeedsmith","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/macieklamberski%2Ffeedsmith/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/macieklamberski%2Ffeedsmith/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/macieklamberski%2Ffeedsmith/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/macieklamberski","download_url":"https://codeload.github.com/macieklamberski/feedsmith/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/macieklamberski%2Ffeedsmith/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32130776,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-22T08:34:57.708Z","status":"ssl_error","status_checked_at":"2026-04-22T08:34:55.583Z","response_time":58,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["atom","feed-generator","feed-parser","jsonfeed","rdf","rss","rss-feed","rss-generator","rss-parser"],"created_at":"2025-06-11T16:01:41.137Z","updated_at":"2026-04-22T10:02:45.993Z","avatar_url":"https://github.com/macieklamberski.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"# Feedsmith\n\n[![codecov](https://codecov.io/gh/macieklamberski/feedsmith/branch/main/graph/badge.svg)](https://codecov.io/gh/macieklamberski/feedsmith)\n[![npm version](https://img.shields.io/npm/v/feedsmith.svg)](https://www.npmjs.com/package/feedsmith)\n[![license](https://img.shields.io/npm/l/feedsmith.svg)](https://github.com/macieklamberski/feedsmith/blob/main/LICENSE)\n\nFast, all‑in‑one JavaScript feed parser and generator for RSS, Atom, RDF, and JSON Feed, with support for popular namespaces and OPML files.\n\nFeedsmith offers universal and format‑specific parsers that maintain the original feed structure in a clean, object-oriented format while intelligently normalizing legacy elements. Access all feed data without compromising simplicity.\n\n**[Read full docs ↗](https://feedsmith.dev)**\n\u0026nbsp;\u0026nbsp;·\u0026nbsp;\u0026nbsp;\n[Quick Start](#quick-start)\n\u0026nbsp;\u0026nbsp;·\u0026nbsp;\u0026nbsp;\n[Why Feedsmith?](#why-feedsmith)\n\u0026nbsp;\u0026nbsp;·\u0026nbsp;\u0026nbsp;\n[Benchmarks →](benchmarks/README.md)\n\n---\n\n\u003e [!IMPORTANT]\n\u003e **Feedsmith 3.x is in final stages of development.** Check out the [v3.x guide](https://v3.feedsmith.dev/migration/v2-to-v3) to explore new features and learn how to upgrade. Install it with:\n\u003e\n\u003e `npm install feedsmith@next`\n\n---\n\n## Features\n\n### Core\n\n* **Comprehensive support** — Supports all major feed formats and namespaces.\n* **Preserves structure** — Parsed feed object maintains the original feed structure making it easy to access the data.\n* **Smart namespace handling** — Normalizes custom namespace prefixes to standard ones (e.g., `\u003ccustom:creator\u003e` becomes `dc.creator`).\n* **Parsing \u0026 generating** — Use one package for both parsing and generating feeds.\n\n### Leniency\n* **Normalizes legacy elements** — Upgrades feed elements to their modern equivalents so that you never need to worry about reading feeds in older formats.\n* **CaSe INSENsiTive** — Handles fields and attributes in any case (lowercase, uppercase, mixed).\n* **Namespace URI tolerance** — Accepts non-official namespace URIs (HTTPS variants, case variations, trailing slashes, whitespace).\n* **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.\n\n### Performance\n* **Ultrafast parsing** — One of the fastest JavaScript feed parsers ([see benchmarks](/benchmarks)).\n* **Type-safe API** — Built with TypeScript from the ground up, it provides complete type definitions for every feed format and namespace.\n* **Tree-shakable** — Only include the parts of the library you need, reducing bundle size.\n* **Well-tested** — Comprehensive test suite with over 2000 tests and 99% code coverage.\n\n### Compatibility\n* Works in Node.js 14.0.0+ and modern browsers.\n* Supports both CommonJS and ES modules.\n* Works with plain JavaScript, you don't need to use TypeScript.\n\n## Supported Formats\n\nFeedsmith aims to fully support all major feed formats and namespaces in complete alignment with their specifications.\n\n✅ Available\n\u0026nbsp;\u0026nbsp;·\u0026nbsp;\u0026nbsp;\n⌛️ Work in progress\n\u0026nbsp;\u0026nbsp;·\u0026nbsp;\u0026nbsp;\n📋 Planned\n\n### Feeds\n\n| Format | Versions | Parse | Generate |\n|--------|----------|-------|----------|\n| [RSS](https://feedsmith.dev/reference/feeds/rss) | 0.9x, 2.0 | ✅ | ✅ |\n| [Atom](https://feedsmith.dev/reference/feeds/atom) | 0.3, 1.0 | ✅ | ✅ |\n| [RDF](https://feedsmith.dev/reference/feeds/rdf) | 0.9, 1.0 | ✅ | 📋 |\n| [JSON Feed](https://feedsmith.dev/reference/feeds/json) | 1.0, 1.1 | ✅ | ✅ |\n\n### Other\n\n| Format | Versions | Parse | Generate |\n|--------|----------|-------|----------|\n| [OPML](https://feedsmith.dev/reference/other/opml) | 1.0, 2.0 | ✅ | ✅ |\n\n### Feed Namespaces\n\n| Name | Prefix | Supported in | Parse | Generate |\n|------|---------|--------------|-------|----------|\n| [Atom](https://feedsmith.dev/reference/namespaces/atom) | `\u003catom:*\u003e` | RSS, RDF | ✅ | ✅ |\n| [Dublin Core](https://feedsmith.dev/reference/namespaces/dc) | `\u003cdc:*\u003e` | RSS, Atom, RDF | ✅ | ✅ |\n| [Dublin Core Terms](https://feedsmith.dev/reference/namespaces/dcterms) | `\u003cdcterms:*\u003e` | RSS, Atom, RDF | ✅ | ✅ |\n| [Syndication](https://feedsmith.dev/reference/namespaces/sy) | `\u003csy:*\u003e` | RSS, Atom, RDF | ✅ | ✅ |\n| [Content](https://feedsmith.dev/reference/namespaces/content) | `\u003ccontent:*\u003e` | RSS, RDF | ✅ | ✅ |\n| [Slash](https://feedsmith.dev/reference/namespaces/slash) | `\u003cslash:*\u003e` | RSS, Atom, RDF | ✅ | ✅ |\n| [iTunes](https://feedsmith.dev/reference/namespaces/itunes) | `\u003citunes:*\u003e` | RSS, Atom | ✅ | ✅ |\n| [Podcast Index](https://feedsmith.dev/reference/namespaces/podcast) | `\u003cpodcast:*\u003e` | RSS | ✅ | ✅ |\n| [Podlove Simple Chapters](https://feedsmith.dev/reference/namespaces/psc) | `\u003cpsc:*\u003e` | RSS, Atom | ✅ | ✅ |\n| [Media RSS](https://feedsmith.dev/reference/namespaces/media) | `\u003cmedia:*\u003e` | RSS, Atom, RDF | ✅ | ✅ |\n| [Google Play Podcast](https://feedsmith.dev/reference/namespaces/googleplay) | `\u003cgoogleplay:*\u003e` | RSS, Atom | ✅ | ✅ |\n| [Spotify](https://feedsmith.dev/reference/namespaces/spotify) | `\u003cspotify:*\u003e` | RSS | ✅ | ✅ |\n| [Acast](https://feedsmith.dev/reference/namespaces/acast) | `\u003cacast:*\u003e` | RSS | ✅ | ✅ |\n| [RawVoice](https://feedsmith.dev/reference/namespaces/rawvoice) | `\u003crawvoice:*\u003e` | RSS | ✅ | ✅ |\n| [FeedPress](https://feedsmith.dev/reference/namespaces/feedpress) | `\u003cfeedpress:*\u003e` | RSS | ✅ | ✅ |\n| [arXiv](https://feedsmith.dev/reference/namespaces/arxiv) | `\u003carxiv:*\u003e` | Atom | ✅ | ✅ |\n| [OpenSearch](https://feedsmith.dev/reference/namespaces/opensearch) | `\u003copensearch:*\u003e` | RSS, Atom | ✅ | ✅ |\n| [PRISM](https://feedsmith.dev/reference/namespaces/prism) | `\u003cprism:*\u003e` | RSS | ✅ | ✅ |\n| [ccREL](https://feedsmith.dev/reference/namespaces/cc) | `\u003ccc:*\u003e` | RSS, Atom | ✅ | ✅ |\n| [Creative Commons](https://feedsmith.dev/reference/namespaces/creativecommons) | `\u003ccreativeCommons:*\u003e` | RSS, Atom | ✅ | ✅ |\n| [Atom Threading](https://feedsmith.dev/reference/namespaces/thr) | `\u003cthr:*\u003e` | RSS, Atom | ✅ | ✅ |\n| [Atom Publishing Protocol](https://feedsmith.dev/reference/namespaces/app) | `\u003capp:*\u003e` | Atom | ✅ | ✅ |\n| [Comment API](https://feedsmith.dev/reference/namespaces/wfw) | `\u003cwfw:*\u003e` | RSS, Atom, RDF | ✅ | ✅ |\n| [Administrative](https://feedsmith.dev/reference/namespaces/admin) | `\u003cadmin:*\u003e` | RSS, Atom, RDF | ✅ | ✅ |\n| [Pingback](https://feedsmith.dev/reference/namespaces/pingback) | `\u003cpingback:*\u003e` | RSS, Atom | ✅ | ✅ |\n| [Trackback](https://feedsmith.dev/reference/namespaces/trackback) | `\u003ctrackback:*\u003e` | RSS, Atom | ✅ | ✅ |\n| [Source](https://feedsmith.dev/reference/namespaces/source) | `\u003csource:*\u003e` | RSS | ✅ | ✅ |\n| [blogChannel](https://feedsmith.dev/reference/namespaces/blogchannel) | `\u003cblogChannel:*\u003e` | RSS | ✅ | ✅ |\n| [YouTube](https://feedsmith.dev/reference/namespaces/yt) | `\u003cyt:*\u003e` | Atom | ✅ | ✅ |\n| [W3C Basic Geo](https://feedsmith.dev/reference/namespaces/geo) | `\u003cgeo:*\u003e` | RSS, Atom | ✅ | ✅ |\n| [GeoRSS Simple](https://feedsmith.dev/reference/namespaces/georss) | `\u003cgeorss:*\u003e` | RSS, Atom, RDF | ✅ | ✅ |\n| [RDF](https://feedsmith.dev/reference/namespaces/rdf) | `\u003crdf:*\u003e` | RDF | ✅ | ✅ |\n\n## Quick Start\n\nThis guide will get you up and running with Feedsmith in just a few minutes.\n\nFor a full overview of all the features, visit the [documentation website](https://feedsmith.dev).\n\n### Installation\n\n```bash\nnpm install feedsmith\n```\n\n\u003e **Migrating from v1.x?** Check out the [migration guide](https://feedsmith.dev/migration-to-2.x).\n\n### Parse Any Feed\n\nThe simplest way to parse any feed is to use the universal `parseFeed` function:\n\n```typescript\nimport { parseFeed } from 'feedsmith'\n\n// Works with RSS, Atom, RDF, and JSON Feed\nconst { format, feed } = parseFeed(feedContent)\n\nconsole.log('Feed format:', format) // rss, atom, json, rdf\nconsole.log('Feed title:', feed.title)\n\nif (format === 'rss') {\n  console.log('RSS feed link:', feed.link)\n}\n```\n\n### Parse Specific Feed Formats\n\nIf you know the format in advance, you can use the format-specific parsers:\n\n```typescript\nimport {\n  parseAtomFeed,\n  parseJsonFeed,\n  parseRssFeed,\n  parseRdfFeed\n} from 'feedsmith'\n\n// Parse specific formats\nconst rssFeed = parseRssFeed('rss content')\nconst atomFeed = parseAtomFeed('atom content')\nconst rdfFeed = parseRdfFeed('rdf content')\nconst jsonFeed = parseJsonFeed('json content')\n\n// Access typed data\nrssFeed.title\nrssFeed.dc?.creator\nrssFeed.items?.[0]?.title\n```\n\n### Parse OPML Files\n\n```typescript\nimport { parseOpml } from 'feedsmith'\n\nconst opml = parseOpml('opml content')\n\nopml.head?.title\nopml.body?.outlines?.[0].text\nopml.body?.outlines?.[1].xmlUrl\n```\n\n### Generate a Feed\n\n```typescript\nimport { generateRssFeed } from 'feedsmith'\n\nconst rss = generateRssFeed({\n  title: 'My Blog',\n  link: 'https://example.com',\n  description: 'A simple blog',\n  items: [{\n    title: 'Hello World',\n    link: 'https://example.com/hello',\n    description: 'My first post',\n    pubDate: new Date()\n  }]\n})\n\nconsole.log(rss) // Complete RSS XML\n\n// You can also generate other formats:\n// - generateAtomFeed() for Atom feeds\n// - generateJsonFeed() for JSON feeds\n// - generateOpml() for OPML files\n```\n\n### Error Handling\n\nIf the feed is unrecognized or invalid, an `Error` will be thrown with a descriptive message.\n\n```typescript\nimport { parseFeed, parseJsonFeed } from 'feedsmith'\n\ntry {\n  const universalFeed = parseFeed('\u003cnot-a-feed\u003e\u003c/not-a-feed\u003e')\n} catch (error) {\n  // Error: Unrecognized feed format\n}\n\ntry {\n  const jsonFeed = parseJsonFeed('{}')\n} catch (error) {\n  // Error: Invalid feed format\n}\n```\n\n### TypeScript Types\n\nFeedsmith provides comprehensive TypeScript types for all feed formats:\n\n```typescript\nimport type { Rss, Atom, Json, Opml } from 'feedsmith/types'\n\n// Access all types for a format\ntype Feed = Rss.Feed\ntype Item = Rss.Item\ntype Category = Rss.Category\ntype Enclosure = Rss.Enclosure\n```\n\n## Why Feedsmith?\n\nWhy should you use this library over the alternatives?\n\nThe key advantage of Feedsmith is that it preserves the original feed structure exactly as defined in each specific feed format.\n\nMany alternative packages attempt to normalize data by:\n\n* Merging distinct fields like `author`, `dc:creator`, and `creator` into a single property.\n* Combining date fields such as `dc:date` and `pubDate` without preserving their sources.\n* Handling multiple `\u003catom:link\u003e` elements inconsistently, sometimes keeping only the first or last one or ignoring different `rel` attributes.\n* Some libraries try to combine different feed formats into one universal structure.\n\nWhile 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.\n\n## Acknowledgements\n\n* The library API is inspired by the [FeedKit library for Swift](https://github.com/nmdias/FeedKit).\n* XML parsing is provided by [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser).\n* HTML entity decoding is handled by [entities](https://github.com/fb55/entities).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmacieklamberski%2Ffeedsmith","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmacieklamberski%2Ffeedsmith","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmacieklamberski%2Ffeedsmith/lists"}