{"id":13696119,"url":"https://github.com/pelican-plugins/webring","last_synced_at":"2026-03-06T20:03:46.316Z","repository":{"id":36449961,"uuid":"222986195","full_name":"pelican-plugins/webring","owner":"pelican-plugins","description":"Display latest posts from a list of feeds on your site","archived":false,"fork":false,"pushed_at":"2024-07-07T14:47:11.000Z","size":196,"stargazers_count":9,"open_issues_count":1,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-09-25T12:39:29.528Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pelican-plugins.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","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},"funding":{"github":"justinmayer","custom":"https://donate.getpelican.com","liberapay":"pelican"}},"created_at":"2019-11-20T16:58:09.000Z","updated_at":"2025-02-19T04:12:07.000Z","dependencies_parsed_at":"2025-04-10T18:43:17.900Z","dependency_job_id":"5df1b6b3-c411-4416-8dd9-e7b6e4489951","html_url":"https://github.com/pelican-plugins/webring","commit_stats":{"total_commits":67,"total_committers":7,"mean_commits":9.571428571428571,"dds":0.4477611940298507,"last_synced_commit":"0576cebcc158a2bf73cea69ed36a195b3b56ed87"},"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/pelican-plugins/webring","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pelican-plugins%2Fwebring","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pelican-plugins%2Fwebring/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pelican-plugins%2Fwebring/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pelican-plugins%2Fwebring/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pelican-plugins","download_url":"https://codeload.github.com/pelican-plugins/webring/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pelican-plugins%2Fwebring/sbom","scorecard":{"id":726840,"data":{"date":"2025-08-11","repo":{"name":"github.com/pelican-plugins/webring","commit":"9ac85daa931aab7c63ed8dc2b2f9ced9f1827659"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.7,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 1/20 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":10,"reason":"GitHub workflow tokens follow principle of least privilege","details":["Warn: jobLevel 'contents' permission set to 'write': .github/workflows/main.yml:66","Info: topLevel 'contents' permission set to 'read': .github/workflows/main.yml:9"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/pelican-plugins/webring/main.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/pelican-plugins/webring/main.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/pelican-plugins/webring/main.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:43: update your workflow using https://app.stepsecurity.io/secureworkflow/pelican-plugins/webring/main.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/pelican-plugins/webring/main.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:70: update your workflow using https://app.stepsecurity.io/secureworkflow/pelican-plugins/webring/main.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:73: update your workflow using https://app.stepsecurity.io/secureworkflow/pelican-plugins/webring/main.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:96: update your workflow using https://app.stepsecurity.io/secureworkflow/pelican-plugins/webring/main.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:80","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:81","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   4 third-party GitHubAction dependencies pinned","Info:   0 out of   2 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: GNU Affero General Public License v3.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/main.yml:58"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact 1.4.0 not signed: https://api.github.com/repos/pelican-plugins/webring/releases/90446296","Warn: release artifact 1.3.0 not signed: https://api.github.com/repos/pelican-plugins/webring/releases/40903213","Warn: release artifact 1.2.0 not signed: https://api.github.com/repos/pelican-plugins/webring/releases/30115566","Warn: release artifact 1.0.0 not signed: https://api.github.com/repos/pelican-plugins/webring/releases/21826914","Warn: release artifact 1.4.0 does not have provenance: https://api.github.com/repos/pelican-plugins/webring/releases/90446296","Warn: release artifact 1.3.0 does not have provenance: https://api.github.com/repos/pelican-plugins/webring/releases/40903213","Warn: release artifact 1.2.0 does not have provenance: https://api.github.com/repos/pelican-plugins/webring/releases/30115566","Warn: release artifact 1.0.0 does not have provenance: https://api.github.com/repos/pelican-plugins/webring/releases/21826914"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 14 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-22T13:04:21.780Z","repository_id":36449961,"created_at":"2025-08-22T13:04:21.780Z","updated_at":"2025-08-22T13:04:21.780Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30195571,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-06T19:07:06.838Z","status":"ssl_error","status_checked_at":"2026-03-06T18:57:34.882Z","response_time":250,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6: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":[],"created_at":"2024-08-02T18:00:36.433Z","updated_at":"2026-03-06T20:03:46.291Z","avatar_url":"https://github.com/pelican-plugins.png","language":"Python","funding_links":["https://github.com/sponsors/justinmayer","https://donate.getpelican.com","https://liberapay.com/pelican"],"categories":["Plugins"],"sub_categories":["Migrated to new architecture"],"readme":"# Webring\n\n[![Build Status](https://img.shields.io/github/actions/workflow/status/pelican-plugins/webring/main.yml?branch=main)](https://github.com/pelican-plugins/webring/actions)\n[![PyPI Version](https://img.shields.io/pypi/v/pelican-webring)](https://pypi.org/project/pelican-webring/)\n[![Downloads](https://img.shields.io/pypi/dm/pelican-webring)](https://pypi.org/project/pelican-webring/)\n![License](https://img.shields.io/pypi/l/pelican-webring?color=blue)\n\nThis Pelican plugin adds a webring or feed aggregation to your site from a list\nof web feeds.\n\nIt retrieves the latest posts from a list of web feeds and makes them available\nin templates, effectively creating a [partial webring][1] or feed aggregation.\nPosts are sorted from newer to older.\n\nIt is inspired by [openring](https://git.sr.ht/~sircmpwn/openring), a tool for\ngenerating an HTML file to include in your [SSG][2] from a template and a list\nof web feeds, and\n[pelican-planet](https://framagit.org/bochecha/pelican-planet), a Pelican\nplugin for creating feed aggregations.\n\nInstallation\n------------\n\nThis plugin can be installed via:\n\n    python -m pip install pelican-webring\n\nAs long as you have not explicitly added a `PLUGINS` setting to your Pelican settings file, then the newly-installed plugin should be automatically detected and enabled. Otherwise, you must add `webring` to your existing `PLUGINS` list. For more information, please see the [How to Use Plugins](https://docs.getpelican.com/en/latest/plugins.html#how-to-use-plugins) documentation.\n\nSettings\n--------\n\n```\nWEBRING_FEED_URLS = []\n```\nA list of web feeds in the form of a URL or local file.\n\n```\nWEBRING_MAX_ARTICLES = 3\n```\nThe maximum number of articles.\n\n```\nWEBRING_ARTICLES_PER_FEED = 1\n```\nThe maximum number of articles per feed.\n\n```\nWEBRING_SUMMARY_WORDS = 20\n```\nThe maximum number of words of post summaries. If set to 0, truncation is\ndisabled.\n\n```\nWEBRING_CLEAN_SUMMARY_HTML = True\n```\nWhether to clean html tags from post summaries or not.\n\n**Example**\n\nLet's suppose we have two blogs in our webring and want to show two articles\nper blog. We would also like to show a quite short summary.\n\n```\nWEBRING_FEED_URLS = [\n    'https://justinmayer.com/feeds/all.atom.xml',\n    'https://danluu.com/atom.xml'\n]\nWEBRING_ARTICLES_PER_FEED = 2\nWEBRING_MAX_ARTICLES = 4\nWEBRING_SUMMARY_LENGTH = 25\n```\n\nTemplates\n---------\n\nThe plugin makes available the resulting web feed articles in the variable\n`webring_articles`.\n\nAll existing _date_ attributes are Pelican `utils.SafeDatetime` objects, which\ncan be used with [Pelican's Jinja filter\n`strftime`](https://docs.getpelican.com/en/stable/themes.html#date-formatting).\n\nEach article contains all available properties in the original feed entry, for\nexample:\n\n- `article.title`: The article title.\n- `article.link`: The article URL.\n- `article.date`: The article date as a Pelican `utils.SafeDatetime` object.\n- `article.summary`: The article summary, as provided in the web feed and modified\naccording to this plugin's settings.\n- `article.description`: The original article summary, without cleaning or\n  truncation.\n\nArticles also contain information about the _source feed_, which can be\naccessed through `source_` prefixed attributes:\n\n- `source_title`: The title of the web feed.\n- `source_link`: A link to the web feed.\n- `source_id`: An identification field provided in some web feeds.\n\nIf you access an attribute that is not present in the entry or source feed, an\nempty string will be returned, except for _dates_ (`published`, `updated`,\n`created` and `expired`) that `None` is returned.\n\nFor a list of available entry and source feed attributes, [read the feedparser\nreference document](https://pythonhosted.org/feedparser/reference.html).\n\nYou can use `webring_articles` in any kind of content type, including _pages_\nand _articles_. Read the following sections for examples on how to use this\nvariable in your templates.\n\n### Adding a Webring section in the bottom of articles\n\nImagine we'd like to put our webring in the bottom of articles, using the\ndefault Pelican template (ie. notmyidea). To simplify, we'll use the existing\nCSS classes.\n\nEdit the `notmyidea/templates/base.html` file and make it look like this:\n\n```\n        ...\n        \u003csection id=\"extras\" class=\"body\"\u003e\n        {% if WEBRING_FEED_URLS %}\n            \u003cdiv class=\"webring\"\u003e\n                \u003ch2\u003eWebring\u003c/h2\u003e\n                {% for article in webring_articles %}\n                \u003cp\u003e\u003ca href=\"{{ article.link }}\"\u003e{{ article.title }}\u003c/a\u003e\u003c/p\u003e\n                \u003cp\u003e{{ article.date|strftime('%d %B %Y') }} - {{ article.summary}}\u003c/p\u003e\n                {% endfor %}\n            \u003c/div\u003e\n        {% endif %}\n        {% if LINKS %}\n        ...\n```\n\nIf there were no links or social widgets, the result would be like in the\nimage below:\n\n![Footer Webring](https://github.com/pelican-plugins/webring/raw/main/webring-footer.jpg)\n\n### Adding a feed aggregation page\n\nIn this case, we'd like to generate a new page with all feed contents processed\nby this plugin. For example, imagine we'd like to access that page as:\n`https://my-domain.com/feed-aggregation`.\n\nThis objective can be accomplished in several ways in Pelican. We're showing\nhere one that only requires a new HTML template.\n\nThe following is an example template file named `feed-aggregation.html` based on\n`page.html` that should reside in your theme template directory:\n\n```\n{% extends \"base.html\" %}\n{% block title %}Feed aggregation{% endblock %}\n\n{% block content %}\n\u003csection id=\"content\" class=\"body\"\u003e\n    \u003ch1 class=\"entry-title\"\u003eFeed aggregation\u003c/h1\u003e\n\n    {% if WEBRING_FEED_URLS %}\n        {% for article in webring_articles %}\n            \u003carticle class=\"hentry\"\u003e\n                \u003cheader\u003e\n                    \u003ch2\u003e\u003ca href=\"{{ article.link }}\"\u003e{{ article.title }}\u003c/a\u003e\u003c/h2\u003e\n                \u003c/header\u003e\n                \u003cp\u003e{{ article.date|strftime('%d %B %Y') }}\u003c/p\u003e\n                \u003cdiv class=\"entry-content\"\u003e\n                {{ article.summary}}\n                \u003c/div\u003e\n            \u003c/article\u003e\n        {% endfor %}\n    {% endif %}\n\n\u003c/section\u003e\n{% endblock %}\n```\n\nFinally, in order for our template to be rendered in the wanted location, we add the following **template page** to our `pelicanconf.py`. Note that `feed-aggregation.html` is relative to your theme's template directory.\n\n```\nTEMPLATE_PAGES = { 'feed-aggregation.html': 'feed-aggregation/index.html' }\n```\n\nThe final result would be as in the image below:\n\n![Page Webring](https://github.com/pelican-plugins/webring/raw/main/webring-page.jpg)\n\nContributing\n------------\n\nContributions are welcome and much appreciated. Every little bit helps. You can contribute by improving the documentation, adding missing features, and fixing bugs. You can also help out by reviewing and commenting on [existing issues][].\n\nTo start contributing to this plugin, review the [Contributing to Pelican][] documentation, beginning with the **Contributing Code** section.\n\nLicense\n-------\n\nThis project is licensed under the AGPL 3.0 license.\n\n[existing issues]: https://github.com/pelican-plugins/webring/issues\n[Contributing to Pelican]: https://docs.getpelican.com/en/latest/contribute.html\n[1]: https://en.wikipedia.org/wiki/Webring \"In a proper webring, websites would be linked in a circular structure.\"\n[2]: https://en.wikipedia.org/wiki/Category:Static_website_generators \"Static Site Generator\"\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpelican-plugins%2Fwebring","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpelican-plugins%2Fwebring","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpelican-plugins%2Fwebring/lists"}