{"id":15696724,"url":"https://github.com/cicirello/count-action-users","last_synced_at":"2025-10-17T18:39:42.375Z","repository":{"id":38079520,"uuid":"392055530","full_name":"cicirello/count-action-users","owner":"cicirello","description":"Generates Shields endpoint with number of users of a GitHub Action","archived":false,"fork":false,"pushed_at":"2025-08-12T13:25:28.000Z","size":335,"stargazers_count":9,"open_issues_count":1,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-13T05:58:07.509Z","etag":null,"topics":["actions","badge","counter","endpoint","github","github-actions","json","json-endpoint","shields-endpoint"],"latest_commit_sha":null,"homepage":"https://actions.cicirello.org/count-action-users/","language":"Python","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/cicirello.png","metadata":{"funding":{"github":"cicirello","patreon":null,"open_collective":null,"ko_fi":"cicirello","tidelift":null,"community_bridge":null,"liberapay":"cicirello","issuehunt":null,"otechie":null,"custom":null},"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}},"created_at":"2021-08-02T18:32:59.000Z","updated_at":"2025-08-12T13:16:06.000Z","dependencies_parsed_at":"2023-12-15T01:23:49.030Z","dependency_job_id":"dcdb8a86-b8f9-42a6-8515-deec8ba4783f","html_url":"https://github.com/cicirello/count-action-users","commit_stats":{"total_commits":177,"total_committers":2,"mean_commits":88.5,"dds":"0.15254237288135597","last_synced_commit":"cf393b8b52088aceb94f534a4891b52a8190e715"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/cicirello/count-action-users","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cicirello%2Fcount-action-users","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cicirello%2Fcount-action-users/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cicirello%2Fcount-action-users/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cicirello%2Fcount-action-users/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cicirello","download_url":"https://codeload.github.com/cicirello/count-action-users/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cicirello%2Fcount-action-users/sbom","scorecard":{"id":282530,"data":{"date":"2025-08-11","repo":{"name":"github.com/cicirello/count-action-users","commit":"61868374f97f521f23eb2589577903595cbd2970"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.4,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/10 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":"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":"Maintained","score":4,"reason":"4 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 4","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql-analysis.yml:28","Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql-analysis.yml:29","Warn: no topLevel permission defined: .github/workflows/build.yml:1","Warn: no topLevel permission defined: .github/workflows/codeql-analysis.yml:1","Warn: no topLevel permission defined: .github/workflows/generate-samples.yml:1","Warn: no topLevel permission defined: .github/workflows/major-release-num.yml:1","Info: no jobLevel write permissions found"],"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":"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":"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: MIT License: 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":"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":"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/build.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/cicirello/count-action-users/build.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/cicirello/count-action-users/build.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/cicirello/count-action-users/build.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/cicirello/count-action-users/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/cicirello/count-action-users/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:57: update your workflow using https://app.stepsecurity.io/secureworkflow/cicirello/count-action-users/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:71: update your workflow using https://app.stepsecurity.io/secureworkflow/cicirello/count-action-users/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/generate-samples.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/cicirello/count-action-users/generate-samples.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/generate-samples.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/cicirello/count-action-users/generate-samples.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/major-release-num.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/cicirello/count-action-users/major-release-num.yml/main?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:5: pin your Docker image by updating ghcr.io/cicirello/pyaction:3.13.5-gh-2.75.1 to ghcr.io/cicirello/pyaction:3.13.5-gh-2.75.1@sha256:f7a134206e5edf6d1dfa3eba0d9768a77f1521ec4f2647a16ac7ae62b3f29789","Info:   0 out of   9 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   1 containerImage 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":"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":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: github.com/cicirello/.github/SECURITY.md:1","Info: Found linked content: github.com/cicirello/.github/SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: github.com/cicirello/.github/SECURITY.md:1","Info: Found text in security policy: github.com/cicirello/.github/SECURITY.md:1"],"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":"SAST","score":7,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 0 commits out of 23 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-17T16:16:59.851Z","repository_id":38079520,"created_at":"2025-08-17T16:16:59.852Z","updated_at":"2025-08-17T16:16:59.852Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272355763,"owners_count":24920173,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-27T02:00:09.397Z","response_time":76,"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":["actions","badge","counter","endpoint","github","github-actions","json","json-endpoint","shields-endpoint"],"created_at":"2024-10-03T19:09:47.537Z","updated_at":"2025-10-17T18:39:42.283Z","avatar_url":"https://github.com/cicirello.png","language":"Python","funding_links":["https://github.com/sponsors/cicirello","https://ko-fi.com/cicirello","https://liberapay.com/cicirello"],"categories":[],"sub_categories":[],"readme":"# count-action-users\n\n[![count-action-users](https://actions.cicirello.org/images/count-action-users640.png)](#count-action-users)\n\nCheck out all of our GitHub Actions: https://actions.cicirello.org/\n\n## About\n\n| __GitHub Actions__ | [![GitHub release (latest by date)](https://img.shields.io/github/v/release/cicirello/count-action-users?label=Marketplace\u0026logo=GitHub)](https://github.com/marketplace/actions/count-action-users) |\n| :--- | :--- |\n| __Build Status__ | [![build](https://github.com/cicirello/count-action-users/actions/workflows/build.yml/badge.svg)](https://github.com/cicirello/count-action-users/actions/workflows/build.yml) [![samples](https://github.com/cicirello/count-action-users/actions/workflows/generate-samples.yml/badge.svg)](https://github.com/cicirello/count-action-users/actions/workflows/generate-samples.yml) [![CodeQL](https://github.com/cicirello/count-action-users/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/cicirello/count-action-users/actions/workflows/codeql-analysis.yml) |\n| __Source Info__ | [![License](https://img.shields.io/github/license/cicirello/count-action-users)](https://github.com/cicirello/count-action-users/blob/main/LICENSE) [![GitHub top language](https://img.shields.io/github/languages/top/cicirello/count-action-users)](https://github.com/cicirello/count-action-users) |\n| __Support__ | [![GitHub Sponsors](https://img.shields.io/badge/sponsor-30363D?logo=GitHub-Sponsors\u0026logoColor=#EA4AAA)](https://github.com/sponsors/cicirello) [![Liberapay](https://img.shields.io/badge/Liberapay-F6C915?logo=liberapay\u0026logoColor=black)](https://liberapay.com/cicirello) [![Ko-Fi](https://img.shields.io/badge/Ko--fi-F16061?logo=ko-fi\u0026logoColor=white)](https://ko-fi.com/cicirello) |\n\nThe [cicirello/count-action-users](https://github.com/cicirello/count-action-users) GitHub Action \ngenerates a [Shields endpoint](https://shields.io/endpoint) with the count of the number of \nworkflows that use a GitHub Action. It is thus a tool for\nmaintainers of GitHub Actions, and it can be used to insert a badge with a users count into the\nREADME for a GitHub Action. The key features include:\n* __Designed to Run on a Schedule__: The intended usage is to run the action on a \n  schedule (e.g., nightly) to update the endpoint. \n* __Customizable__: It is configurable in a number of ways (e.g., badge color, logo, style)\n  using action inputs, but you can also override these things when you embed the badge using \n  Shield's URL parameters.\n* __Multiple Action Support__: For those who maintain multiple GitHub Actions, the `count-action-users`\n  action accepts a list of GitHub Actions as an input, generating endpoints for all actions \n  in the list. In this way, a single run of the action in a single workflow in a single repository\n  is sufficient to regularly monitor the number of users of all of the actions that you maintain.\n  Or, if you prefer, you can run the action separately within the repositories of each action.\n\n_The developers of the `count-action-users` GitHub Action are not affiliated \nwith the developers of Shields, although like most of GitHub we use their badges\nin most of our repositories._\n\n__Here are a Few Example Badges__\n* Example with moderate number of users: \n  ![Count of Action Users](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fcicirello%2Fcount-action-users%2Fsamples%2Fendpoints%2Fjacoco-badge-generator.json)\n* Example with very large number of users `actions/setup-python`: \n  ![Count of Action Users](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fcicirello%2Fcount-action-users%2Fsamples%2Fendpoints%2Fsetup-python.json)\n* Example with huge number of users `actions/checkout`: \n  ![Count of Action Users](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fcicirello%2Fcount-action-users%2Fsamples%2Fendpoints%2Fcheckout.json)\n\n## Table of Contents\n\nThe remainder of the documentation is organized as follows:\n* [Example Workflows](#example-workflows): Several example workflows illustrating \n  usage of the action.\n* [FAQ](#faq): List of questions we anticipate you may have, or which have been asked.\n* [Inputs](#inputs): Documentation of the action's inputs.\n* [Outputs](#outputs): Documentation of the action's outputs.\n* [All Possible Action Inputs](#all-possible-action-inputs): A workflow showing all\n  of the action's inputs with their default values.\n* [Built With](#built-with): A list of the tools, etc used to develop this action.\n* [Support the Project](#support-the-project): The various ways that you can support\n  the project.\n* [License](#license): License information (MIT License).\n\n## Example Workflows\n\n### Example 1: Storing endpoint at root of repository\n\nThis first workflow runs on a schedule (daily at 4am), and it can also\nbe run manually if need be (via the `workflow_dispatch` event). It uses all\nof the default action inputs. The default location for the generated endpoint\nis the root of the repository. In this example, there is a single action that\nwe are monitoring: `owner/action-name`. The action names the endpoint file using\nthe name of the action, so in this case, the name of the file it creates is:\n`action-name.json`. Please note that the `GITHUB_TOKEN` must be passed as an\nenvironment variable, as shown in the workflow, to authenticate to the GitHub API.\n\n```yml\nname: count-action-users\n\non:\n  schedule:\n    - cron: '0 4 * * *'\n  workflow_dispatch:\n\njobs:\n  count:\n    runs-on: ubuntu-latest\n      \n    steps:\n    - uses: actions/checkout@v2\n\n    - name: Generate user count JSON endpoint\n      uses: cicirello/count-action-users@v1\n      with:\n        action-list: owner/action-name \n      env:\n        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}\n```\n\nYou can then pass the URL of the endpoint to Shields to generate and\ninsert a badge into your README with the following Markdown. Just be sure to\nreplace `OWNERUSERID`, `REPOSITORY`, and `BRANCH` as appropriate.\n\n```markdown\n![Count of Action Users](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/OWNERUSERID/REPOSITORY/BRANCH/action-name.json)\n```\n\nNote that in the above, you are relying on GitHub's `raw.githubusercontent.com`\nserver for serving the endpoint to Shields. We do not actually recommend doing this\nas that server isn't really intended for that purpose, and may create a delay\nthat will trickle down to Shields serving the badge. However, you might initially\nset it up this way to try out the action. \nSee [Example 2](#example-2-serving-via-github-pages-from-the-docs-directory) \nand [Example 3](#example-3-serving-via-github-pages-from-the-gh-pages-branch) \nfor examples of our recommended approach, serving via GitHub Pages.\n\nSee [later in this document](#how-to-link-the-badge-to-search-results) for an \nexample of the markdown needed to link the badge to a GitHub search results page\nwith the workflows represented by the user count. \n\nIf you maintain more than one GitHub Action and want to generate\nuser count endpoints for all of them with a single application\nof this action, then you can pass a list of your GitHub actions\nas follows:\n\n```yml\nname: count-action-users\n\non:\n  schedule:\n    - cron: '0 4 * * *'\n  workflow_dispatch:\n\njobs:\n  count:\n    runs-on: ubuntu-latest\n      \n    steps:\n    - uses: actions/checkout@v2\n\n    - name: Generate user count JSON endpoint\n      uses: cicirello/count-action-users@v1\n      with:\n        action-list: \u003e\n          owner/action-one\n          owner/action-two\n          owner/action-three  \n      env:\n        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}\n```\n\nThe above example will generate the following JSON files:\n`action-one.json`, `action-two.json`, and `action-three.json`.\nNote that the `\u003e` is one of the ways to specify a multiline string\nin YAML.\n\n### Example 2: Serving via GitHub Pages from the docs directory\n\nThe previous example relies on GitHub's `raw.githubusercontent.com`\nserver for serving the endpoint to Shields. This is less than ideal\nas that server is intended for those browsing GitHub to see the\nraw version of files, and isn't really intended for general serving\nof files.\n\n__GitHub Pages (our recommended approach)__: We instead recommend utilizing\nGitHub Pages. The benefit of this is that you will gain the advantage of the \nCDN that backs GitHub Pages, thus significantly \nenhancing the speed of serving the endpoint to Shields. \nFirst note that you do not necessarily need to setup a full\nwebsite for this purpose. You can literally use it to serve nothing but\nyour user count JSON endpoint, if you don't want to otherwise set up a full project\npage. Follow GitHub's directions for enabling [GitHub Pages](https://pages.github.com/)\non the repository in which you want to use the `count-action-users` action.\n\nTo do this, go to the settings tab of that repository, and then select \"Pages\" in the\nleft. In this example, we are assuming serving from the \"docs\" directory of your\ndefault branch, so make those selections as you enable \"Pages\" for your repository.\nOnce you do, anything you store in the \"docs\" directory will be served\nfrom the URL: `https://YOURUSERID.github.io/REPOSITORY/`.\n\nSo, now run the action using this workflow:\n\n```yml\nname: count-action-users\n\non:\n  schedule:\n    - cron: '0 4 * * *'\n  workflow_dispatch:\n\njobs:\n  count:\n    runs-on: ubuntu-latest\n      \n    steps:\n    - uses: actions/checkout@v2\n\n    - name: Generate user count JSON endpoint\n      uses: cicirello/count-action-users@v1\n      with:\n        target-directory: docs\n        action-list: owner/action-name \n      env:\n        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}\n```\n\nNote that the above workflow uses the \n`target-directory` input to store the endpoint in the docs directory,\nwhich will be created by the action if it doesn't already exist.\nAssuming that you have configured GitHub Pages to serve from \"docs\",\nthen your endpoint will be accessible from \n`https://YOURUSERID.github.io/REPOSITORY/action-name.json`.\n\nYou can then use the following Markdown to insert the badge in your README.\nJust be sure to replace `YOURUSERID` and `REPOSITORY` as appropriate.\n\n```markdown\n![Count of Action Users](https://img.shields.io/endpoint?url=https://YOURUSERID.github.io/REPOSITORY/action-name.json)\n```\n\nIf you are also utilizing GitHub Pages for a project site, then you might want\nto store the endpoint in a subdirectory of \"docs\" to keep your site's files organized.\nFor example, perhaps you want to store it in a directory \"endpoints\", then you can\naccomplish that with the following action input: `target-directory: docs/endpoints`.\nThis would change the necessary Markdown for inserting the badge to:\n\n```markdown\n![Count of Action Users](https://img.shields.io/endpoint?url=https://YOURUSERID.github.io/REPOSITORY/endpoints/action-name.json)\n```\n\nSee [later in this document](#how-to-link-the-badge-to-search-results) for an \nexample of the markdown needed to link the badge to a GitHub search results page\nwith the workflows represented by the user count.\n\n### Example 3: Serving via GitHub Pages from the gh-pages branch\n\nGitHub Pages allows you to serve your site from either the \"docs\" directory\n(as in the above example), or from the root of any branch. Assuming you are\nsetting this up in the repository of the action that you maintain, then the\ndefault branch is not a good choice for your project site. Instead, create \na `gh-pages` branch in your repository (you can then delete everything in the\n`gh-pages` branch, as it only needs to contain the source of your project site).\nJust like Example 2 above, you don't really need to have a project site, as your\nsite can literally be just the endpoint you want to pass to Shields.\n\nNow, setup the following workflow in the default branch (e.g., \"main\") \nof your repository. Note that even though this workflow will be pushing to the `gh-pages` branch,\nthe workflow itself must be in the default branch, or else the schedule will not run.\n\n```yml\nname: count-action-users\n\non:\n  schedule:\n    - cron: '0 4 * * *'\n  workflow_dispatch:\n\njobs:\n  count:\n    runs-on: ubuntu-latest\n      \n    steps:\n    - uses: actions/checkout@v2\n      with:\n        ref: gh-pages\n\n    - name: Generate user count JSON endpoint\n      uses: cicirello/count-action-users@v1\n      with:\n        action-list: owner/action-name \n      env:\n        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}\n```\n\nYou'll notice above that the `count-action-users` step\ndid not change. Instead, the `checkout` step changed to\ncheckout the `gh-pages` branch of the repository. The\n`count-action-users` action commits and pushes to the\nchecked out branch.\n\nAs in the previous example, the JSON endpoint will be at \nthe root of the project site \n(`https://YOURUSERID.github.io/REPOSITORY/action-name.json`). Thus, you can then use the \nfollowing Markdown to insert the badge in your README.\nJust be sure to replace `YOURUSERID` and `REPOSITORY` as appropriate.\n\n```markdown\n![Count of Action Users](https://img.shields.io/endpoint?url=https://YOURUSERID.github.io/REPOSITORY/action-name.json)\n```\n\nIf you'd rather have it in a subdirectory, you can set the appropriate action input,\nsuch as with: `target-directory: endpoints`. Doing so would then require\nthe following Markdown for inserting the badge into the README:  \n\n```markdown\n![Count of Action Users](https://img.shields.io/endpoint?url=https://YOURUSERID.github.io/REPOSITORY/endpoints/action-name.json)\n```\n\nSee [later in this document](#how-to-link-the-badge-to-search-results) for an \nexample of the markdown needed to link the badge to a GitHub search results page\nwith the workflows represented by the user count.\n\n### Protected branches with required checks\n\nThe default permissions of the `GITHUB_TOKEN` are sufficient for pushing \nto a protected branch, provided that the branch protection hasn't been \nconfigured with required reviews nor with required checks. If the repository where\nyou are running the `count-action-users` action does have a branch protection \nrule with required reviews or required checks, there are a couple solutions.\n\n__Not Recommended__: First, you could create a personal access token (PAT) \nwith necessary permissions, save it as a repository secret, and use the PAT \nwith during the actions/checkout step \n(see [actions/checkout](https://github.com/actions/checkout)'s documentation). \nHowever, we do not recommend doing so. If anyone else has write access to the \nrepository, then they can potentially create additional workflows using that PAT\nto bypass the required checks and/or reviews; and you obviously had a reason for\nputting those requirements in place.\n\n__Recommended__: Although your default branch likely has branch protection rules\nthat include required checks and/or reviews, you do not need to store your\nuser count endpoint in the default branch.\nSee [Example 3](#example-3-serving-via-github-pages-from-the-gh-pages-branch)\nearlier, which uses the `gh-pages` branch along with GitHub Pages to serve the\nendpoint to Shields. You can configure branch protection on the `gh-pages`\nbranch, and as long as you don't add any required checks or reviews for that\nspecific branch, the action will be able to push to it without the need for a PAT.\n\n### Specific version vs major release\n\nAll of the above examples used the major release tag\nfor the `count-action-users` step \n(i.e., `uses: cicirello/count-action-users@v1`):\n\n```yml\n    - name: Generate user count JSON endpoint\n      uses: cicirello/count-action-users@v1\n      with:\n        action-list: owner/action-name \n      env:\n        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}\n```\n\nThe advantage to this is that you will automatically\nget all non-breaking changes and bug fixes without the\nneed to alter your workflow. If you prefer to \nuse a specific release, just use the SemVer of the\nrelease that you wish to use, such as with the following:\n\n```yml\n    - name: Generate user count JSON endpoint\n      uses: cicirello/count-action-users@v1.0.2\n      with:\n        action-list: owner/action-name \n      env:\n        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}\n```\n\nIf you do use a specific release, then we recommend\nconfiguring [GitHub's Dependabot](https://github.blog/2020-06-01-keep-all-your-packages-up-to-date-with-dependabot/)\nin your repository.  Dependabot can be used to monitor dependencies,\nincluding GitHub Actions, and generates automated pull requests to update\nversions. The PRs it generates includes the text of release notes and ChangeLogs\ngiving you the opportunity to decide whether to upgrade the version.\n\n### How to Link the Badge to Search Results\n\nIt is common practice to link status badges to something relevant\n(e.g., a build status badge to workflow runs). For a users count badge,\nyou might consider linking it to a GitHub search results page. You can do that\nwith the following Markdown. Replace \"YOURUSERID\" with the user id of the owner\nof the action, and replace \"ACTIONNAME\" with the name of the action. Also replace\n\"RELEVANT_SHIELDS_URL\" with the link that generates the badge from the endpoint\n(see the examples in the workflow examples above).\n\n```markdown\n[![Count of Action Users](RELEVANT_SHIELDS_URL)](https://github.com/search?q=YOURUSERID+ACTIONNAME+path:.github/workflows+language:YAML\u0026type=Code)\n```\n\n## FAQ\n\n__Why not instead submit a pull request to Shields to add direct support to their \nawesome project for an actions users count badge?__ The GitHub Code Search API, which \nwe utilize for this action, has a rate limit of 30 queries per minute for an \nauthenticated user; and can also potentially interact with other secondary rate limits,\nincluding some secondary limits that are not published. \nBy running this as an action, the necessary queries benefit \nfrom the GITHUB_TOKEN of the user of this action, and in theory we can more easily\nstay within the rate limits. I imagine the rate\nlimit would be significantly more challenging for a solution directly integrated with \nShields. We additionally have a built-in time delay in between queries for those using\nthe action to monitor multiple GitHub actions.\n\n__How does `count-action-users` work?__ The `count-action-users` action queries GitHub's\nCode Search API. The search is restricted to the contents of files in the `.github/workflows`\ndirectory (since active workflows must be in that directory to run) and restricted to \nthe YAML language (the language for workflows). The search terms then include\nthe owner of the action and the name of the action. It is possible that some false positives\nmay be included in the count. For example, although GitHub requires actions in the marketplace to\nhave unique names, if an action has a simple enough name, that name may be found within that\nof another action with a longer name. Including the owner name in the search should\nminimize false positives. See the documentation of \nGitHub's [code search](https://docs.github.com/en/github/searching-for-information-on-github/searching-on-github/searching-code)\nfor details of what code is (and is not) indexed by GitHub.\n\n__Can't we further minimize false positives with \"owner/action-name\" as a single search \nterm?__ Unfortunately, GitHub's code search drops various special characters that are often\nused as wildcards from searches, including `/`, replacing them with \nspaces. Due to this, combining owner and the \naction's name into a single search \nterm in this way is equivalent to the search we are currently doing.\n\n## Inputs\n\nMost of the inputs have default values that should be sufficient in most\ncases. Only the `action-list` input is required.\n\n### `action-list` (REQUIRED)\n\nThis input is required. All other inputs are optional.\nThis input is a comma or space separated list of the GitHub Actions for\nwhich you want user count endpoints generated. We recommend that you \ninclude both owner name and action name, rather than just the action name,\nto improve accuracy of results. For example, if I was running this\nfor this very action, I would set this input as follows: \n\n```yml\n    - name: Generate user count JSON endpoint\n      uses: cicirello/count-action-users@v1\n      with:\n        action-list: cicirello/count-action-users\n      env:\n        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}\n```\n\nThe action will also work if you only use the action name (e.g., `action-list: count-action-users`), \nbut the results may be less accurate. Although GitHub requires each action to have a \nunique name, if the name of your action is relatively simple, then there may be other\naction names that include your action's name within. By including the owner name\nof the action in the search, you can minimize some false positives in the results.\n\nIf you maintain several GitHub Actions, then we recommend that you utilize\na YAML multiline string when specifying this input to make your workflow \neasy to read. For example:\n\n```yml\n    - name: Generate user count JSON endpoint\n      uses: cicirello/count-action-users@v1\n      with:\n        action-list: \u003e\n          owner/action-one\n          owner/action-two\n          owner/action-three\n          owner/action-four\n      env:\n        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}\n```\n\nThe `\u003e` in the above is one of YAML's ways of specifying a multiline string.\nThe action also doesn't care who the owners of the actions are, and will work if\ndifferent actions have different owners, such as with the following:\n\n```yml\n    - name: Generate user count JSON endpoint\n      uses: cicirello/count-action-users@v1\n      with:\n        action-list: \u003e\n          owner/action-one\n          anotherOwner/action-two\n          somebodyElse/action-three\n      env:\n        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}\n```\n\nThe filename of each endpoint is of the form: `action-name.json`.\n\n### `target-directory`\n\nThis is the directory, relative to the root of the repository in which\nthe action is run, where the JSON endpoints will be stored. It defaults to\nthe root of the repository. If the target directory doesn't exist, then the\naction will create it.\n\n### `color`\n\nThis is the color for the right side of the badge (the side with the count\nof action users). The default is the shade of blue that is currently\nused by Shields to designate that the badge is \"informational\". You can pass 3-digit hex\n(e.g., `color: '#333'`), 6-digit hex (e.g., `color: '#343434'`), or named\ncolors (e.g., `blue`). Anything that is valid in CSS, SVG, etc is valid\nfor this input. However, the action does not do any validation of the color that \nyou pass. Note that the quotes are required if you use hex because the `#` is \na special character to YAML.\n\n### `include-logo`\n\nThis input controls whether or not a logo is inserted in the badge. The default is\n`true`.\n\n### `named-logo`\n\nThis controls which logo is inserted if a logo is included in the badge. The default is\n`githubactions`, which is the GitHub Actions logo. Another to consider \nis `github`, which is the GitHub logo. You can pass the name of any logo supported\nby [Shields](https://github.com/badges/shields), which also includes \n[simple-icons](https://github.com/simple-icons/simple-icons). \n\n### `style`\n\nThis controls the style of the badge, and can be any style that is supported by \n[Shields](https://github.com/badges/shields). The default is `flat`, which happens to\nalso be the Shields default.\n\n### `fail-on-error`\n\nThis input enables you to control what happens if the\naction fails for some reason (e.g., error communicating\nwith the GitHub's Code Search API, etc). \n\nThe default is `fail-on-error: true`, which means that if\nan error occurs it will cause the workflow to fail. The rationale\nfor this default is that the failed workflow will lead to a\nGitHub notification so that you know something went wrong.\nIf you'd rather just let it quietly fail, to most likely correct\nitself during the next run, then pass `fail-on-error: false`\n(actually anything other than `true` will be treated as `false`).\n\n### `commit-and-push`\n\nThe `commit-and-push` input controls whether the action commits\nand pushes the generated JSON endpoints upon creation. It defaults to\n`commit-and-push: true`. If the user count changed since\nlast commit, then as long as you are not running this in a detached\nhead state (such as on a pull request event), the action will commit\nand push the new endpoint. If you are in a detached head\nstate, such as if you were to run this during a pull request \n(not sure why you would), then the action will simply and quietly\nskip the commit/push without issuing an error. \n\nIf your branch is protected with either required reviews or required\nchecks, then the push will fail with an error. Whether this also\nfails your workflow depends on how you have set \nthe `fail-on-error` input. See the earlier discussion for what you \ncan do if you wish to use the action in a repository \nthat has required reviews or required checks:\n[Protected branches with required checks](#protected-branches-with-required-checks).\n\nThe author of the commit is set to the github-actions bot.\n\n### `query-delay`\n\nThis input specifies a delay, in seconds, in between queries for \ncases where multiple actions are being monitored. The purpose of this\ndelay is to decrease chance of hitting API rate limits. The default is\n65 seconds, which ensures that no more than one code search query is\nexecuted per minute. This input doesn't accept values less than 33. For example,\nif you attempt to pass 0 (or anything else less than 33), the minimum of\n33 will be used instead. That minimum ensures that at most two code search queries\nwill be executed per minute.\n\nWhy is the default, and minimum, query delays so high? Although the rate limit\nis 30 code search queries per minute, there are other unpublished secondary rate \nlimits. During our initial testing, we occasionally ran into such secondary limits\nwhen using a lower query delay that allowed for four queries in a \nminute, specifically on the fourth query. It is unclear what other activity \nwas interacting to hit those secondary rate limits. The default, and minimum,\nquery delays are designed to help you avoid rate limit effects.\n\nAdditionally, there is no reason for the action to collect usage statistics\nof the actions that you maintain more than once per day, so the length of the delay \nbetween queries shouldn't really matter much to you. The one case where it might is\nif you have reason to run this in a private repository, and thus the delay time\nwill count against your actions minutes. In that case you can simply setup one workflow\nper action that you maintain (thus no delay will be inserted), and make sure\nyou schedule them so that they are far enough apart in time.\n\n## Outputs\n\nThe action has only the following action output variable.\n\n### `exit-code`\n\nIf the input `fail-on-error` is set to `false`, then in addition to\nquietly failing (i.e., not failing the workflow run), the output `exit-code`\nwill be set to a non-zero exit code that may be useful in debugging the\nissue. If the input `fail-on-error` is set to `true` (the default), your\nworkflow run won't have the opportunity to check the `exit-code` output.\nHowever, the `exit-code` and a descriptive error message will still be\nlogged in the workflow output. In either case, if you believe that the\nfailure is a bug, please include this in any bug reports.\n\n## All Possible Action Inputs\n\nThe workflow here shows all possible inputs, with their default\nvalues, and also shows how to access the action's `exit-code`\noutput if desired.\n\n```yml\nname: count-action-users\n\non:\n  schedule:\n    - cron: '0 4 * * *'\n  workflow_dispatch:\n\njobs:\n  count:\n    runs-on: ubuntu-latest\n      \n    steps:\n    - uses: actions/checkout@v2\n\n    - name: Generate user count JSON endpoint\n      id: endpointStep # Only needed if you want to check the exit-code\n      uses: cicirello/count-action-users@v1\n      with:\n        action-list: owner/action # This input is REQUIRED.\n        target-directory: '' # Default is root of repository.\n        color: '#007ec6' # The shade of blue used by Shields for informational badges\n        include-logo: true\n        named-logo: githubactions # Defaults to the GitHub Actions logo\n        style: flat # Which is Shields's default as well\n        fail-on-error: true\n        commit-and-push: true\n        query-delay: 65\n      env:\n        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}\n\n    - name: Check exit code if desired\n      run: |\n        # Note that if you set fail-on-error to true, you'll\n        # never actually get here if an error occurs. But if you\n        # set fail-on-error to false, then instead of failing the\n        # workflow, the action will output the exit code that would\n        # have failed the workflow and you can check it here.\n        echo \"exitCode = ${{ steps.endpointStep.outputs.exit-code }}\"\n```\n\n## Built With\n\nThe `count-action-users` action uses the following:\n* Python (implemented almost entirely in Python);\n* The [cicirello/pyaction](https://actions.cicirello.org/pyaction/) Docker container, which \n  is designed to support GitHub Actions development in the Python language (see\n  [pyaction's GitHub repository](https://github.com/cicirello/pyaction)); \n* [The GitHub CLI](https://cli.github.com/); and\n* We started with our template repository for GitHub Actions implemented in \n  Python: [cicirello/python-github-action-template](https://github.com/cicirello/python-github-action-template).\n  \n## Support the Project\n\nYou can support the project in a number of ways:\n* __Starring__: If you find the `count-action-users` action useful, consider starring the\n  repository.\n* __Sharing with Others__: Consider sharing it with others who you feel might find it useful.\n* __Reporting Issues__: If you find a bug or have a suggestion for a new feature, please \n  report it via the [Issue tracker](https://github.com/cicirello/count-action-users/issues).\n* __Contributing Code__: If there is an open issue that you think you can help with, submit a pull request.\n* __Sponsoring__: You can also consider [becoming a sponsor](https://github.com/sponsors/cicirello).\n\n## License\n\nThis GitHub Action is licensed under the [MIT License](https://github.com/cicirello/count-action-users/blob/main/LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcicirello%2Fcount-action-users","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcicirello%2Fcount-action-users","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcicirello%2Fcount-action-users/lists"}