{"id":45357619,"url":"https://github.com/rseng/opensource-heartbeat-action","last_synced_at":"2026-02-21T13:14:57.204Z","repository":{"id":38215099,"uuid":"288521699","full_name":"rseng/opensource-heartbeat-action","owner":"rseng","description":"Generate an interface to showcase the open source contributions for your organization or user group (under development)","archived":false,"fork":false,"pushed_at":"2023-05-28T12:20:51.000Z","size":716,"stargazers_count":1,"open_issues_count":2,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-09-17T00:09:12.190Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rseng.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":null,"code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":"vsoch"}},"created_at":"2020-08-18T17:33:57.000Z","updated_at":"2021-12-15T02:52:01.000Z","dependencies_parsed_at":"2023-01-29T20:46:21.987Z","dependency_job_id":null,"html_url":"https://github.com/rseng/opensource-heartbeat-action","commit_stats":{"total_commits":21,"total_committers":2,"mean_commits":10.5,"dds":"0.23809523809523814","last_synced_commit":"7e18d16d16cc197cc5ae5bce9698bf1c29b85604"},"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/rseng/opensource-heartbeat-action","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rseng%2Fopensource-heartbeat-action","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rseng%2Fopensource-heartbeat-action/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rseng%2Fopensource-heartbeat-action/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rseng%2Fopensource-heartbeat-action/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rseng","download_url":"https://codeload.github.com/rseng/opensource-heartbeat-action/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rseng%2Fopensource-heartbeat-action/sbom","scorecard":{"id":787246,"data":{"date":"2025-08-11","repo":{"name":"github.com/rseng/opensource-heartbeat-action","commit":"d77aad70f5a38a3138b88435075bd6be6da5dc1f"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.4,"checks":[{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"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":"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":"Dangerous-Workflow","score":-1,"reason":"no workflows found","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":"Code-Review","score":0,"reason":"Found 0/22 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":"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":"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":"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":"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":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: containerImage not pinned by hash: Dockerfile:1: pin your Docker image by updating ubuntu:18.04 to ubuntu:18.04@sha256:152dc042452c496007f07ca9127571cb9c29697f42acbfad72324b2bb2e43c98","Warn: pipCommand not pinned by hash: Dockerfile:4","Info:   0 out of   1 containerImage dependencies pinned","Info:   0 out of   1 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":"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":"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":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 8 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-23T06:23:58.584Z","repository_id":38215099,"created_at":"2025-08-23T06:23:58.584Z","updated_at":"2025-08-23T06:23:58.584Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29681489,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T12:30:22.644Z","status":"ssl_error","status_checked_at":"2026-02-21T12:29:55.402Z","response_time":107,"last_error":"SSL_read: 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":"2026-02-21T13:14:56.473Z","updated_at":"2026-02-21T13:14:57.198Z","avatar_url":"https://github.com/rseng.png","language":"Python","funding_links":["https://github.com/sponsors/vsoch"],"categories":[],"sub_categories":[],"readme":"# Open Source Heartbeat\n\nA GitHub action to generate a web interface to show GitHub activity for a subset\nof users or organizations.\n\n - the interface is created under docs/\n - events are populated in docs/_events\n - the site is served via Jekyll\n\nThis means that you can use the action in your workflows too,\nand choose how often / when to run it, and how to update your GitHub pages.\nContinue reading to learn more.\n\n## Interface\n\nThe main page shows a sortable view of the top 100 new contributions. You can\nfilter down to a contribution type, or click on browse to see a subset of that type.\n\n![img/open-source-heartbeat.png](img/open-source-heartbeat.png)\n\n\nHere is the browse view.\n\n![img/browse.png](img/browse.png)\n\n\nAnd here is looking at an archive for a contribution type. Archives are linked from\nthe browse page.\n\n![img/archive.png](img/archive.png)\n\nAnd finally, a chart shows a summary of contributions.\n\n![img/chart.png](img/chart.png)\n\n\n## Getting Started\n\nIf you have a custom set of users or organizations, you'll need to first generate a \nusers.txt file (or a differently named file that you'll specify as the `users_file` for your action\nand/or an orgs.txt file (for the `orgs_file` to specify organizations to use).\nAs an alternative, you can have this file generated or updated via the GitHub action first\nby specifying the `query` argument. For help building your query, it's recommended to try\nyour search in the [GitHub Advanced](https://github.com/search/advanced) view. For example,\nto search users for the location being \"Stanford\" I might use the query `location%3AStanford`.\n\nTo summarize, you'll need to:\n\n 1. Add A GitHub workflow for your run, you can see examples in the [examples](examples) folder.\n 2. Run the workflow as you have set up to generate the docs/ folder.\n 3. Update the _config.yml in the docs folder to have the correct baseurl for your site.\n\nOnce the docs folder is added to your repository via a pull request, it won't be generated\nagain, so you are free to customize it as you like.\n\n## Inputs\n\n### `users_file`\n\n**Optional** The path to the users.txt (or otherwise named) file that has\na single GitHub username per line. These are the users that will have their\nevents parsed to show on the website.\n\n```\nusername1\nusername2\n...\nusernameN\n```\n\nIf you define the `query` variable this file will be updated, or created first\nif it doesn't exist.\n\n### `orgs_file`\n\n**Optional** If you want to add contributions based on organizations, you can\ndefine an `orgs_file` which defaults to orgs.txt. The format is the same as \nthe `users_file`. If you don't define this variable, parsing organization\nevents will be skipped.\n\n### `users_from_orgs_file`\n\nIf you want to use an organization to look up public members, set this varaible.\nIt will default to `user-orgs.txt` and be used if it's found.\n\n### `query`\n\n**Optional** If defined, we will use [update-users.py](scripts/update-users.py)\nto first update the users.txt based on your query. For example,\nto search users for the location being \"Stanford\" I might use the query `location%3AStanford`.\nFor help building your query, it's recommended to try your search in the \n[GitHub Advanced](https://github.com/search/advanced) view. If this variable\nis not defined, the update will be skipped, and you will be required to already\nhave a users.txt file.\n\n### `cleanup`\n\nIf defined as anything, clean up the previous collection folder before generating\nnew events. If not defined, skip cleanup entirely (old events will be preserved).\n\n### `exclude_users_file`\n\n**Optional** The path to the exclude-users.txt (or otherwise named) file that has\na single GitHub username per line for users to not include. For example, if we discover\na username via a query but then don't want to add it (e.g., the user has requested\nnot being added) it will not be included. This file has the same format\nas the users.txt file - one username per line.\n\n```\nusername1\nusername2\n...\nusernameN\n```\n\n### `events`\n\nA comma separated list of allowed events. By default, we use \"all\" to allow all events.\nEvents include:\n\n- PushEvent\n- IssueCommentEvent\n- PullRequestEvent\n- CreateEvent\n- IssueCommentEvent\n- ReleaseEvent\n- IssuesEvent\n- PublicEvent\n- PullRequestReviewCommentEvent\n- PullRequestReviewEvent\n\nFor example, maybe you are just interested in questions being asked by members of your\norgs (or repos they need help or contribution to) - you would select the IssuesEvent.\nOr if you want to see contribution, you might choose the PullRequestEvent. It's up to you!\n\n### `token`\n\nYour GitHub token is required to define in the environment to increase query\nlimits for the GitHub API.\n\n\n## Supporting Scripts\n\nIf you want to update the users.txt file manually (and via the same method\ndone for the action) you can do that via:\n\n```\n$ python scripts/update-users.py --help\nPresent working directory is /home/vanessa/Desktop/Code/rseng/stanford-issues/scripts\nusage: update-users.py [-h] [--version] [--users-file USERS_FILE] [--exclude-users-file EXCLUDE_USERS_FILE]\n                       [--user-query USER_QUERY]\n\nOpen Source Heartbeat\n\noptional arguments:\n  -h, --help            show this help message and exit\n  --version             suppress additional output.\n  --users-file USERS_FILE\n                        The users.txt file with GitHub usernames on lines.\n  --exclude-users-file EXCLUDE_USERS_FILE\n                        A list of users to never add (that might still be discovered).\n  --user-query USER_QUERY\n                        The string portion of a user query, generate with\n                        https://github.com/search/advanced.\n```\n\nFor example:\n\n```bash\n$ python scripts/update-users.py --users-file users.txt --user-query \"location%3AStanford\"\n...\nusers file: users.txt\nusers file: exclude-users.txt\nFound 24 new users!\n```\n\n\n## Example usage\n\nIn the example usage below, you should update the `master` branch to a versioned\nrelease.\n\n```yaml\n    steps:\n    - name: Checkout Code\n      uses: actions/checkout@v2\n    - name: Generate OpenSource Heartbeat Interface\n      uses: rseng/opensource-heartbeat-action@master\n      with:\n        users_file: 'users.txt'\n        collection: 'docs/_events'\n        query: 'location%3AStanford'\n        token: ${{ secrets.GITHUB_TOKEN }}\n```\n\nIf you want to just include a subset of organizations (and not parse individual\nusers) then you can leave out the query, and don't define the users file.\n\n```yaml\n    steps:\n    - name: Checkout Code\n      uses: actions/checkout@v2\n    - name: Generate OpenSource Heartbeat Interface\n      uses: rseng/opensource-heartbeat-action@master\n      with:\n        orgs_file: 'orgs.txt'\n        collection: 'docs/_events'\n        token: ${{ secrets.GITHUB_TOKEN }}\n```\n\n## Questions\n\n## Why do I only see 1 push event for my repository?\n\nFor push and comment events, it might be the case that a user comments or pushes\nmultiple times on a single repository. To be concise, we only add the first\nevent of this type seen, per user and per repository. This means that the\nevents that are generated are generally an underestimate of actual activity.\n\n## How do I customize the interface?\n\nThe interface will always be generated in the docs subfolder, so\nif you haven't created it there yet, the action will generate\nit the first time around. It's up to you to add all or a subset of\nfiles in docs/* or docs/_events after the content is generated.\nFor example, you could add both docs and _issues\nin a next step that will commit to an existing or new branch:\n\n```\ngit add docs/*\ngit add docs/_issues/*\n```\n\nThis means that after the original docs is added and merged,\nyou should be able to customize or otherwise update the template\nto your liking. The folder won't be edited if it already exists\nbeyond the _events folder.\n\n## Showcase\n\nIf you use the action and want to share, please open a pull request to add your repository here!\n\n - [vsoch Opensource Heartbeat](https://vsoch.github.io/opensource-heartbeat/)\n - [rse-ops Opensource Heartbeat](https://rse-ops.github.io/opensource-heartbeat/)\n - [Stanford Opensource Heartbeat](https://stanford-rc.github.io/opensource-stanford/) (removed/404 when @vsoch left Stanford)\n - **Coming soon** LLNL RADIUSS\n\n## Future Wants\n\nIt would be nice to have the ability to see charts by year (e.g., to determine\ncontribution changes over the years).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frseng%2Fopensource-heartbeat-action","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frseng%2Fopensource-heartbeat-action","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frseng%2Fopensource-heartbeat-action/lists"}