{"id":16146555,"url":"https://github.com/voxpelli/webring-opml","last_synced_at":"2026-02-28T04:02:10.483Z","repository":{"id":178157645,"uuid":"657762186","full_name":"voxpelli/webring-opml","owner":"voxpelli","description":"Generates and publishes OPML feeds for webrings on webri.ng","archived":false,"fork":false,"pushed_at":"2026-02-15T04:26:19.000Z","size":309,"stargazers_count":7,"open_issues_count":10,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-15T11:44:09.507Z","etag":null,"topics":["opml","webring"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/voxpelli.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},"funding":{"github":["voxpelli"]}},"created_at":"2023-06-23T19:44:12.000Z","updated_at":"2025-04-28T12:50:43.000Z","dependencies_parsed_at":null,"dependency_job_id":"fc293a01-29f3-4a23-a221-a21f49c0d468","html_url":"https://github.com/voxpelli/webring-opml","commit_stats":null,"previous_names":["voxpelli/webring-opml"],"tags_count":0,"template":false,"template_full_name":"voxpelli/node-module-template","purl":"pkg:github/voxpelli/webring-opml","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voxpelli%2Fwebring-opml","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voxpelli%2Fwebring-opml/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voxpelli%2Fwebring-opml/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voxpelli%2Fwebring-opml/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/voxpelli","download_url":"https://codeload.github.com/voxpelli/webring-opml/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voxpelli%2Fwebring-opml/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29924719,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-27T19:37:42.220Z","status":"online","status_checked_at":"2026-02-28T02:00:07.010Z","response_time":90,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["opml","webring"],"created_at":"2024-10-10T00:20:31.258Z","updated_at":"2026-02-28T04:02:10.446Z","avatar_url":"https://github.com/voxpelli.png","language":"JavaScript","funding_links":["https://github.com/sponsors/voxpelli"],"categories":[],"sub_categories":[],"readme":"# Webri.ng OPML generator\n\n[![Module type: ESM](https://img.shields.io/badge/module%20type-esm-brightgreen)](https://github.com/voxpelli/badges-cjs-esm)\n[![Types in JS](https://img.shields.io/badge/types_in_js-yes-brightgreen)](https://github.com/voxpelli/types-in-js)\n[![neostandard javascript style](https://img.shields.io/badge/code_style-neostandard-7fffff?style=flat\u0026labelColor=ff80ff)](https://github.com/neostandard/neostandard)\n[![Follow @voxpelli@mastodon.social](https://img.shields.io/mastodon/follow/109247025527949675?domain=https%3A%2F%2Fmastodon.social\u0026style=social)](https://mastodon.social/@voxpelli)\n\nGenerates and publishes OPML feeds for webrings on [webri.ng](https://github.com/webri-ng/webri.ng)\n\n## Current webrings\n\n- [CSS JOY Webring](https://cs.sjoy.lol/): https://webring-opml.voxpelli.com/cssjoy.opml\n- ...yours? Open an issue / PR!\n\n## How to use an OPML file\n\n### Manually import it into your feed reader\n\nThis is supported by pretty much every feed reader out there. You typically download the OPML file to your computer and then uploads it to the feed reader. See eg. [Feedbin's documentation](https://feedbin.com/help/how-to-subscribe/).\n\nThis means that its a one time import and you have to yourself download a new OPML file and import it if you want to get access to any new feeds that has been added.\n\n### Subscribe to it in your feed reader\n\nSupported by very few feed readers, but at least supported by one: [Inoreader](https://www.inoreader.com/) ([see announcement post](http://blog.inoreader.com/2014/05/opml-subscriptions.html))\n\nInoreader supports two modes:\n\n* Subscribe only mode\n* Full syncronisation mode (that unsubscribes from feeds that are no longer part of the OPML file)\n\nYou give it a specific folder in your Inoreader and it will target that one with the OPML and add or sync feeds it finds in the OPML file to that one.\n\n![Skärmavbild 2023-06-24 kl  15 44 03](https://github.com/voxpelli/webring-opml/assets/34457/5b72e8d1-98dd-4f43-9701-44e5c9d9a343)\n\n## Technical details\n\n### Generation\n\nThe script pulls the webri.ng:s JSON list of sites for the specific webring: https://webri.ng/webring/cssjoy/sites\n\nIt then loops through them all, fetched their respective URL:s and looks for a `\u003clink rel=\"alternate\" href=\"...\" /\u003e` within the returned HTML (as specified in eg. [RSS Autodiscovery](https://www.rssboard.org/rss-autodiscovery) and documented in [posts across the web](https://blog.jim-nielsen.com/2021/automatically-discoverable-rss-feeds/)).\n\nIf any such links are found, the first one is deemed to represent the page and included in the OPML file. If no such link is found, the site will be excluded from the OPML.\n\n### GitHub Actions workflow\n\nUses [a GitHub Actions workflow](.github/workflows/gh-pages.yml) that's runs daily (+ whenever I push to `main` or trigger it manually).\n\nThat workflow does two things:\n\n* It calls [`cli.js`](cli.js) with the output folder and desired OPML files to build (eg. `node cli.js opmls cssjoy`)\n* It has [a GitHub Pages setup](https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site#publishing-with-a-custom-github-actions-workflow) that publishes the generated OPML files to GitHub pages\n\nThings that it doesn't do but technically could do:\n\n* Be published as a CLI tool on npm\n* Be published as a reusable library on npm\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvoxpelli%2Fwebring-opml","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvoxpelli%2Fwebring-opml","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvoxpelli%2Fwebring-opml/lists"}