{"id":18274580,"url":"https://github.com/shepherdjerred/webring","last_synced_at":"2026-02-15T22:01:24.753Z","repository":{"id":242006857,"uuid":"808395908","full_name":"shepherdjerred/webring","owner":"shepherdjerred","description":"Collect the latest RSS items from your favorite feeds","archived":false,"fork":false,"pushed_at":"2026-02-08T08:41:45.000Z","size":17620,"stargazers_count":5,"open_issues_count":5,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-08T15:28:19.842Z","etag":null,"topics":["astro","rss","typescript","webring"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/webring","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/shepherdjerred.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"2024-05-31T01:43:49.000Z","updated_at":"2026-02-08T08:40:27.000Z","dependencies_parsed_at":"2026-01-19T02:05:54.442Z","dependency_job_id":null,"html_url":"https://github.com/shepherdjerred/webring","commit_stats":null,"previous_names":["shepherdjerred/webring"],"tags_count":31,"template":false,"template_full_name":null,"purl":"pkg:github/shepherdjerred/webring","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shepherdjerred%2Fwebring","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shepherdjerred%2Fwebring/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shepherdjerred%2Fwebring/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shepherdjerred%2Fwebring/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shepherdjerred","download_url":"https://codeload.github.com/shepherdjerred/webring/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shepherdjerred%2Fwebring/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29490360,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-15T19:29:10.908Z","status":"ssl_error","status_checked_at":"2026-02-15T19:29:10.419Z","response_time":118,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":["astro","rss","typescript","webring"],"created_at":"2024-11-05T12:10:01.355Z","updated_at":"2026-02-15T22:01:24.735Z","avatar_url":"https://github.com/shepherdjerred.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://cdn.rawgit.com/shepherdjerred/webring/main/assets/logo-dark.png\"\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://cdn.rawgit.com/shepherdjerred/webring/main/assets/logo-light.png\"\u003e\n    \u003cimg alt=\"webring logo\" src=\"https://cdn.rawgit.com/shepherdjerred/webring/main/assets/logo-light.png\" height=150\u003e\n  \u003c/picture\u003e\n\n[![webring](https://img.shields.io/npm/v/webring.svg)](https://www.npmjs.com/package/webring)\n\n`webring` fetches the latest updates from your favorite RSS feeds.\n\nThis project is actively maintained. If you have a feature request or need help, please [create an issue](https://github.com/shepherdjerred/webring/issues/new).\n\n\u003c/div\u003e\n\n## Installation\n\n```bash\nnpm i webring\n```\n\n## Features\n\n- Written in TypeScript\n- Caching\n- HTML sanitization and truncation\n\n## Quick Start\n\nThis library is intended to be used with a static site generator. I use this with [Astro](https://astro.build/) on my [personal website](https://github.com/shepherdjerred/sjer.red/blob/1220ebef2e43956ba385402ed8529870e9084de8/src/components/BlogWebring.astro#L17-L22).\n\n```typescript\nimport { run } from \"webring\";\n\nconst result = await run({\n  sources: [\n    {\n      url: \"https://drewdevault.com/blog/index.xml\",\n      title: \"Drew DeVault\",\n    },\n    {\n      url: \"https://danluu.com/atom.xml\",\n      title: \"Dan Luu\",\n    },\n    {\n      url: \"https://jakelazaroff.com/rss.xml\",\n      title: \"Jake Lazaroff\",\n    },\n  ],\n});\n\nconsole.log(result);\n// [\n//   {\n//     title: 'A discussion of discussions on AI bias',\n//     url: 'https://danluu.com/ai-bias/',\n//     date: 2024-06-16T00:00:00.000Z,\n//     source: { url: 'https://danluu.com/atom.xml', title: 'Dan Luu' },\n//     preview: `There've been regular viral stories about ML/AI bias with LLMs and generative AI for the past couple years. One thing I find interesting about discussions of bias is how different the reaction is in the LLM and generative AI case when compared to \"classical\" bugs in cases where there's a clear bug. ...`\n//   },\n//   {\n//     title: 'Writing a Unix clone in about a month',\n//     url: 'https://drewdevault.com/2024/05/24/2024-05-24-Bunnix.html',\n//     date: 2024-05-24T00:00:00.000Z,\n//     source: {\n//       url: 'https://drewdevault.com/blog/index.xml',\n//       title: 'Drew DeVault'\n//     },\n//     preview: 'I needed a bit of a break from “real work” recently, so I started a new programming project that was low-stakes and purely recreational. On April 21st, I set out to see how much of a Unix-like operating system for x86_64 targets that I could put together in about a month. The result is Bunnix. Not i...'\n//   },\n//   {\n//     title: 'The Web Component Success Story',\n//     url: 'https://jakelazaroff.com/words/the-web-component-success-story/',\n//     date: 2024-01-29T00:00:00.000Z,\n//     source: { url: 'https://jakelazaroff.com/rss.xml', title: 'Jake Lazaroff' },\n//     preview: \"Web components won't take web development by storm, or show us the One True Way to build websites. What they will do is let us collectively build a rich ecosystem of dynamic components that work with any web stack.\"\n//   }\n// ]\n```\n\n## Configuration\n\n`webring` is configured by passing in a `Configuration` object into the `run` method.\n\nAll possible configuration values can be seen by looking at the [`typedoc` site](https://shepherdjerred.github.io/webring/types/Configuration.html).\n\n## Example\n\nAn example of using this project with Astro is located in `example`. The relevant file is [`src/pages/blog/[...slug].astro`](https://github.com/shepherdjerred/webring/blob/971a77ecd0c612850faeb9d16f7775d3e7ca7253/example/src/pages/blog/%5B...slug%5D.astro#L18).\n\n```typescript\n---\nimport { type CollectionEntry, getCollection } from \"astro:content\";\nimport BlogPost from \"../../layouts/BlogPost.astro\";\nimport { type Configuration, type Result, run } from \"webring\";\n\nexport async function getStaticPaths() {\n  const posts = await getCollection(\"blog\");\n  return posts.map((post) =\u003e ({\n    params: { slug: post.slug },\n    props: post,\n  }));\n}\ntype Props = CollectionEntry\u003c\"blog\"\u003e;\n\nconst post = Astro.props;\nconst { Content } = await post.render();\n\nexport const config: Configuration = {\n  sources: [\n    {\n      url: \"https://drewdevault.com/blog/index.xml\",\n      title: \"Drew DeVault\",\n    },\n    {\n      url: \"https://danluu.com/atom.xml\",\n      title: \"Dan Luu\",\n    },\n    {\n      url: \"https://jakelazaroff.com/rss.xml\",\n      title: \"Jake Lazaroff\",\n    },\n  ],\n  number: 3,\n  truncate: 300,\n  cache: {\n    cache_file: \"webring.json\",\n    cache_duration_minutes: 60,\n  },\n};\n\nexport const result: Result = await run(config);\n---\n\n\u003cBlogPost {...post.data}\u003e\n  \u003cContent /\u003e\n  \u003ch2\u003ePosts from blogs I read\u003c/h2\u003e\n  \u003cul\u003e\n    {\n      result.map((post) =\u003e (\n        \u003cli\u003e\n          \u003ca href={post.url}\u003e{post.title}\u003c/a\u003e\n        \u003c/li\u003e\n      ))\n    }\n  \u003c/ul\u003e\n\u003c/BlogPost\u003e\n```\n\n## Inspiration\n\n- https://github.com/lukehsiao/openring-rs\n- https://git.sr.ht/~sircmpwn/openring\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshepherdjerred%2Fwebring","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshepherdjerred%2Fwebring","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshepherdjerred%2Fwebring/lists"}