{"id":5452847,"url":"https://github.com/mborsetti/webchanges","last_synced_at":"2026-04-27T07:01:52.742Z","repository":{"id":37953787,"uuid":"294355344","full_name":"mborsetti/webchanges","owner":"mborsetti","description":"webchanges anonymously checks web content (including images) and commands for changes, delivering instant notifications and AI-powered summaries to your favorite platform.","archived":false,"fork":false,"pushed_at":"2026-04-25T03:58:05.000Z","size":2936,"stargazers_count":47,"open_issues_count":15,"forks_count":8,"subscribers_count":5,"default_branch":"main","last_synced_at":"2026-04-25T05:22:00.804Z","etag":null,"topics":["ai","change-detection","monitoring-tool","notification","web"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/webchanges/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mborsetti.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGELOG.rst","contributing":"CONTRIBUTING.rst","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","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":"2020-09-10T08:51:28.000Z","updated_at":"2026-04-25T03:55:49.000Z","dependencies_parsed_at":"2023-10-04T10:40:10.906Z","dependency_job_id":"abd9572a-89e1-4128-b0da-f294767030be","html_url":"https://github.com/mborsetti/webchanges","commit_stats":{"total_commits":561,"total_committers":4,"mean_commits":140.25,"dds":0.005347593582887722,"last_synced_commit":"bdccb676a1b6e0425aea55b25c5e5407f02292dd"},"previous_names":[],"tags_count":76,"template":false,"template_full_name":null,"purl":"pkg:github/mborsetti/webchanges","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mborsetti%2Fwebchanges","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mborsetti%2Fwebchanges/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mborsetti%2Fwebchanges/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mborsetti%2Fwebchanges/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mborsetti","download_url":"https://codeload.github.com/mborsetti/webchanges/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mborsetti%2Fwebchanges/sbom","scorecard":{"id":631166,"data":{"date":"2025-08-11","repo":{"name":"github.com/mborsetti/webchanges","commit":"3c42a4af2d523e7f7061730f313b227d3a633ef7"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.8,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/30 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":"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":"Maintained","score":10,"reason":"9 commit(s) and 9 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: jobLevel 'contents' permission set to 'write': .github/workflows/ci-cd.yaml:357","Warn: no topLevel permission defined: .github/workflows/ci-cd.yaml:1"],"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/ci-cd.yaml:102: update your workflow using https://app.stepsecurity.io/secureworkflow/mborsetti/webchanges/ci-cd.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci-cd.yaml:106: update your workflow using https://app.stepsecurity.io/secureworkflow/mborsetti/webchanges/ci-cd.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci-cd.yaml:117: update your workflow using https://app.stepsecurity.io/secureworkflow/mborsetti/webchanges/ci-cd.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci-cd.yaml:200: update your workflow using https://app.stepsecurity.io/secureworkflow/mborsetti/webchanges/ci-cd.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci-cd.yaml:204: update your workflow using https://app.stepsecurity.io/secureworkflow/mborsetti/webchanges/ci-cd.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci-cd.yaml:349: update your workflow using https://app.stepsecurity.io/secureworkflow/mborsetti/webchanges/ci-cd.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci-cd.yaml:366: update your workflow using https://app.stepsecurity.io/secureworkflow/mborsetti/webchanges/ci-cd.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci-cd.yaml:369: update your workflow using https://app.stepsecurity.io/secureworkflow/mborsetti/webchanges/ci-cd.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci-cd.yaml:386: update your workflow using https://app.stepsecurity.io/secureworkflow/mborsetti/webchanges/ci-cd.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci-cd.yaml:392: update your workflow using https://app.stepsecurity.io/secureworkflow/mborsetti/webchanges/ci-cd.yaml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/ci-cd.yaml:214","Warn: pipCommand not pinned by hash: .github/workflows/ci-cd.yaml:227","Warn: pipCommand not pinned by hash: .github/workflows/ci-cd.yaml:232","Warn: pipCommand not pinned by hash: .github/workflows/ci-cd.yaml:377","Warn: pipCommand not pinned by hash: .github/workflows/ci-cd.yaml:129","Warn: pipCommand not pinned by hash: .github/workflows/ci-cd.yaml:146","Warn: pipCommand not pinned by hash: .github/workflows/ci-cd.yaml:151","Warn: pipCommand not pinned by hash: .github/workflows/ci-cd.yaml:156","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   4 third-party GitHubAction dependencies pinned","Info:   0 out of   8 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":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"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":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/ci-cd.yaml:354"],"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":"Vulnerabilities","score":0,"reason":"35 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2022-183 / GHSA-h8pj-cxx2-jfg2","Warn: Project is vulnerable to: PYSEC-2020-235 / GHSA-72cx-5ff9-4hhc","Warn: Project is vulnerable to: PYSEC-2020-65 / GHSA-fv3h-8x5j-pvgq","Warn: Project is vulnerable to: PYSEC-2018-13 / GHSA-p6h9-gw49-rqm4","Warn: Project is vulnerable to: PYSEC-2021-142 / GHSA-8q59-q68h-6hv4","Warn: Project is vulnerable to: PYSEC-2018-49 / GHSA-rprw-h62v-c2w7","Warn: Project is vulnerable to: GHSA-55x5-fj6c-h6m8","Warn: Project is vulnerable to: PYSEC-2014-9 / GHSA-57qw-cc2g-pv5p","Warn: Project is vulnerable to: PYSEC-2021-19 / GHSA-jq4v-f5q6-mjqq","Warn: Project is vulnerable to: GHSA-pgww-xf46-h92r","Warn: Project is vulnerable to: PYSEC-2022-230 / GHSA-wrxv-2j5q-m38w","Warn: Project is vulnerable to: PYSEC-2018-12 / GHSA-xp26-p53h-6h2p","Warn: Project is vulnerable to: PYSEC-2024-48 / GHSA-fj7x-q9j7-g6q6","Warn: Project is vulnerable to: PYSEC-2017-15 / GHSA-8f6m-gfq9-g33v","Warn: Project is vulnerable to: PYSEC-2017-14 / GHSA-v9v9-xffq-rwr4","Warn: Project is vulnerable to: PYSEC-2019-182 / GHSA-8867-vpm3-g98g","Warn: Project is vulnerable to: PYSEC-2012-8 / GHSA-p3h7-3c45-qj4v","Warn: Project is vulnerable to: PYSEC-2019-181 / GHSA-p86x-652p-6385","Warn: Project is vulnerable to: PYSEC-2019-41 / GHSA-qfc5-mcwq-26q8","Warn: Project is vulnerable to: PYSEC-2023-117 / GHSA-mrwq-x4v8-fh7p","Warn: Project is vulnerable to: PYSEC-2014-14 / GHSA-652x-xj99-gmcc","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2014-13 / GHSA-cfj3-7x9c-4p3h","Warn: Project is vulnerable to: PYSEC-2018-28 / GHSA-x84v-xcm2-53pg","Warn: Project is vulnerable to: GHSA-34jh-p97f-mpxf","Warn: Project is vulnerable to: PYSEC-2023-212 / GHSA-g4mx-q9vg-27p4","Warn: Project is vulnerable to: PYSEC-2023-207 / GHSA-gwvm-45gx-3cf8","Warn: Project is vulnerable to: PYSEC-2019-133 / GHSA-mh33-7rrq-662w","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v","Warn: Project is vulnerable to: PYSEC-2019-132 / GHSA-r64q-w8jr-g9qp","Warn: Project is vulnerable to: PYSEC-2023-192 / GHSA-v845-jxx5-vc9f","Warn: Project is vulnerable to: PYSEC-2020-148 / GHSA-wqvq-5m8c-6g24","Warn: Project is vulnerable to: PYSEC-2018-32 / GHSA-www2-v7xj-xrc6","Warn: Project is vulnerable to: PYSEC-2021-108"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-21T07:56:27.026Z","repository_id":37953787,"created_at":"2025-08-21T07:56:27.026Z","updated_at":"2025-08-21T07:56:27.026Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32326122,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T23:26:28.701Z","status":"online","status_checked_at":"2026-04-27T02:00:06.769Z","response_time":128,"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":["ai","change-detection","monitoring-tool","notification","web"],"created_at":"2024-03-01T16:03:10.941Z","updated_at":"2026-04-27T07:01:47.715Z","avatar_url":"https://github.com/mborsetti.png","language":"Python","readme":".. role:: underline\n    :class: underline\n.. role:: additions\n    :class: additions\n.. role:: deletions\n    :class: deletions\n\n======================\nwebchanges |downloads|\n======================\n\n**webchanges** *anonymously* checks web content (including images) and commands for changes, delivering instant\nnotifications and AI-powered summaries to your favorite `platform\n\u003chttps://webchanges.readthedocs.io/en/stable/introduction.html#reporters\u003e`__.\n\n\nRequirements\n============\n**webchanges** requires |support|.\n\nFor the best experience, use the current version of `Python \u003chttps://www.python.org/downloads/\u003e`__. We also support\nolder Python versions for 3 years after they're replaced by a newer one; we just ask that you use the most up-to-date\nbug and security fix release from that older version.\n\nWhile **webchanges** supports free-threated Python, certain optional dependencies may not.\n\nFor Generative AI summaries (BETA), you need a free `API Key from Google Cloud AI Studio\n\u003chttps://aistudio.google.com/app/apikey\u003e`__ (see `here\n\u003chttps://webchanges.readthedocs.io/en/stable/differs.html#ai-google\u003e`__).\n\n\nInstallation\n============\n|pypi_version| |format| |status|\n\nInstall **webchanges**  with ``uv`` (recommended):\n\n.. code-block:: bash\n\n   uv pip install webchanges\n\nor with ``pip``:\n\n.. code-block:: bash\n\n   pip install webchanges\n\nRunning in Docker\n-----------------\n**webchanges** can easily run in a `Docker \u003chttps://www.docker.com/\u003e`__ container! You will find a minimal\nimplementation (no browser) `here \u003chttps://github.com/yubiuser/webchanges-docker\u003e`__, and one with a browser\n`here \u003chttps://github.com/jhedlund/webchanges-docker\u003e`__.\n\nAs a GitHub Action\n------------------\n**webchanges** can easily run as a `GitHub Action \u003chttps://www.docker.com/\u003e`__! You will find an implementation\n`here \u003chttps://github.com/swimmwatch/webchanges-action\u003e`__.\n\n\nDocumentation |readthedocs|\n===========================\nThe documentation is hosted on `Read the Docs \u003chttps://webchanges.readthedocs.io/\u003e`__.  A (very good) AI-generated\nhigh-level architectural overview is available on `DeepWiki \u003chttps://deepwiki.com/mborsetti/webchanges\u003e`__.\n\n\nQuick Start\n============\nInitialize\n----------\n\n#. Run the following command to create the default ``config.yaml`` (configuration) and ``jobs.yaml`` (jobs) files and\n   open an editor to add your `jobs \u003chttps://webchanges.readthedocs.io/en/stable/jobs.html\u003e`__:\n\n   .. code-block:: bash\n\n      webchanges --edit\n\n#. Run the following command to change the default `configuration\n   \u003chttps://webchanges.readthedocs.io/en/stable/configuration.html\u003e`__, e.g. to receive change notifications\n   (\"`reports \u003chttps://webchanges.readthedocs.io/en/stable/reporters.html\u003e`__\")\n   by `email \u003chttps://webchanges.readthedocs.io/en/stable/reporters.html#smtp\u003e`__ and/or one of many other methods:\n\n   .. code-block:: bash\n\n      webchanges --edit-config\n\nRun\n---\nTo check the sources in your jobs and report on (e.g. display or via email) any changes found from the last time the\nprogram ran, just run:\n\n.. code-block:: bash\n\n   webchanges\n\n\nSchedule\n--------\n**webchanges** leverages the power of a system scheduler:\n\n- On Linux you can use cron, with the help of a tool like `crontab.guru \u003chttps://crontab.guru\u003e`__ (help `here\n  \u003chttps://www.computerhope.com/unix/ucrontab.htm\u003e`__);\n- On Windows you can use `Windows Task Scheduler \u003chttps://en.wikipedia.org/wiki/Windows_Task_Scheduler\u003e`__;\n- On macOS you can use `launchd \u003chttps://developer.apple\n  .com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/ScheduledJobs.html\u003e`__ (help `here\n  \u003chttps://launchd.info/\u003e`__).\n\n\nCode\n====\n|coveralls| |issues| |code_style| |OpenSSF_Scorecard|\n\nThe code, issues tracker, and discussions are hosted on `GitHub \u003chttps://github.com/mborsetti/webchanges\u003e`__.\n\n\nContributing\n============\nWe welcome any contribution no matter how small, both as pull requests or `issue reports\n\u003chttps://github.com/mborsetti/webchanges/issues\u003e`__.\n\nMore information for code and documentation contributors is `here\n\u003chttps://webchanges.readthedocs.io/en/stable/contributing.html\u003e`__, and our wishlist is `here\n\u003chttps://github.com/mborsetti/webchanges/blob/main/WISHLIST.md\u003e`__.\n\n\nLicense\n=======\n|license|\n\nSee the `complete licenses \u003chttps://raw.githubusercontent.com/mborsetti/webchanges/refs/heads/main/LICENSE.md\u003e`__ (released\nunder the `MIT License \u003chttps://opensource.org/licenses/MIT\u003e`__ but redistributing modified source code, dated 30\nJuly 2020, from `urlwatch 2.21 \u003chttps://github.com/thp/urlwatch/tree/346b25914b0418342ffe2fb0529bed702fddc01f\u003e`__\nlicensed under a `BSD 3-Clause License\n\u003chttps://raw.githubusercontent.com/thp/urlwatch/346b25914b0418342ffe2fb0529bed702fddc01f/COPYING\u003e`__).\n\n\nCompatibility with **urlwatch**\n===============================\n\nThis project is based on code from `urlwatch 2.21\n\u003chttps://github.com/thp/urlwatch/tree/346b25914b0418342ffe2fb0529bed702fddc01f\u003e`__ dated 30 July 2020.\nFor upgrading from **urlwatch** to **webchanges** (using the same job and\nconfiguration files), see `here \u003chttps://webchanges.readthedocs.io/en/stable/upgrading.html\u003e`__.\n\n\n.. |support| image:: https://img.shields.io/pypi/pyversions/webchanges.svg\n    :target: https://www.python.org/downloads/\n    :alt: Supported Python versions\n.. |pypi_version| image:: https://img.shields.io/pypi/v/webchanges.svg?label=\n    :target: https://pypi.org/project/webchanges/\n    :alt: PyPI version\n.. |format| image:: https://img.shields.io/pypi/format/webchanges.svg\n    :target: https://pypi.org/project/webchanges/\n    :alt: Kit format\n.. |downloads| image:: https://img.shields.io/pypi/dm/webchanges.svg\n    :target: https://www.pepy.tech/project/webchanges\n    :alt: PyPI downloads\n.. |license| image:: https://img.shields.io/pypi/l/webchanges.svg\n    :target: https://pypi.org/project/webchanges/\n    :alt: License at https://pypi.org/project/webchanges/\n.. |issues| image:: https://img.shields.io/github/issues-raw/mborsetti/webchanges\n    :target: https://github.com/mborsetti/webchanges/issues\n    :alt: Issues at https://github.com/mborsetti/webchanges/issues\n.. |readthedocs| image:: https://img.shields.io/readthedocs/webchanges/stable.svg?label=\n    :target: https://webchanges.readthedocs.io/\n    :alt: Documentation status\n.. |old_CI| image:: https://github.com/mborsetti/webchanges/actions/workflows/ci-cd.yaml/badge.svg?event=push\n    :target: https://github.com/mborsetti/webchanges/actions\n    :alt: CI testing status\n.. |CI| image:: https://img.shields.io/github/check-runs/mborsetti/webchanges/main\n    :target: https://github.com/mborsetti/webchanges/actions\n    :alt: CI testing status\n.. |old_coveralls| image:: https://coveralls.io/repos/github/mborsetti/webchanges/badge.svg?branch=main\n    :target: https://coveralls.io/github/mborsetti/webchanges?branch=main\n    :alt: Code coverage by Coveralls\n.. |coveralls| image:: https://img.shields.io/coverallsCoverage/github/mborsetti/webchanges.svg\n    :target: https://coveralls.io/github/mborsetti/webchanges?branch=main\n    :alt: Code coverage by Coveralls\n.. |code_style| image:: https://img.shields.io/badge/code%20style-ruff-000000.svg\n    :target: https://github.com/astral-sh/ruff\n    :alt: Code style ruff\n.. |status| image:: https://img.shields.io/pypi/status/webchanges.svg\n    :target: https://pypi.org/project/webchanges/\n    :alt: Package stability\n.. .. |security| image:: https://img.shields.io/badge/security-bandit-green.svg\n..     :target: https://github.com/PyCQA/bandit\n..     :alt: Security Status\n.. .. |snyk| image:: https://snyk.io/advisor/python/webchanges/badge.svg\n..     :target: https://security.snyk.io/package/pip/webchanges\n..     :alt: Snyk Package Health Score\n.. |OpenSSF_Scorecard| image:: https://api.scorecard.dev/projects/github.com/mborsetti/webchanges/badge\n    :target: https://scorecard.dev/viewer/?uri=github.com/mborsetti/webchanges\n    :alt: OpenSSF Scoreard","funding_links":[],"categories":["Python"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmborsetti%2Fwebchanges","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmborsetti%2Fwebchanges","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmborsetti%2Fwebchanges/lists"}