{"id":18927436,"url":"https://github.com/pygame/stuntcat","last_synced_at":"2026-03-09T11:05:22.252Z","repository":{"id":45121491,"uuid":"159383958","full_name":"pygame/stuntcat","owner":"pygame","description":"🐱‍🏍 The first pygame 2 community game. Native Windows, Linux, Mac, ...","archived":false,"fork":false,"pushed_at":"2023-12-03T22:38:55.000Z","size":10081,"stargazers_count":82,"open_issues_count":1,"forks_count":28,"subscribers_count":10,"default_branch":"main","last_synced_at":"2025-09-29T18:22:45.389Z","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":"lgpl-2.1","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pygame.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","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}},"created_at":"2018-11-27T18:53:40.000Z","updated_at":"2025-03-19T03:45:18.000Z","dependencies_parsed_at":"2024-12-18T05:17:14.628Z","dependency_job_id":null,"html_url":"https://github.com/pygame/stuntcat","commit_stats":{"total_commits":183,"total_committers":10,"mean_commits":18.3,"dds":0.2295081967213115,"last_synced_commit":"8691da190c6142fa56408298bc675b8ef55125cc"},"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/pygame/stuntcat","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pygame%2Fstuntcat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pygame%2Fstuntcat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pygame%2Fstuntcat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pygame%2Fstuntcat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pygame","download_url":"https://codeload.github.com/pygame/stuntcat/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pygame%2Fstuntcat/sbom","scorecard":{"id":751417,"data":{"date":"2025-08-11","repo":{"name":"github.com/pygame/stuntcat","commit":"2f1b7dd4fb8c63e7e0c54b57a00b310fb848b682"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/python-package.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/python-publish.yml:16","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":"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":"Code-Review","score":0,"reason":"Found 1/11 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":"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":"Pinned-Dependencies","score":1,"reason":"dependency not pinned by hash detected -- score normalized to 1","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-package.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/pygame/stuntcat/python-package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-package.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/pygame/stuntcat/python-package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-publish.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/pygame/stuntcat/python-publish.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-publish.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/pygame/stuntcat/python-publish.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/python-package.yml:29","Warn: pipCommand not pinned by hash: .github/workflows/python-package.yml:30","Warn: pipCommand not pinned by hash: .github/workflows/python-package.yml:31","Warn: pipCommand not pinned by hash: .github/workflows/python-publish.yml:31","Warn: pipCommand not pinned by hash: .github/workflows/python-publish.yml:32","Warn: pipCommand not pinned by hash: .github/workflows/python-publish.yml:33","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   1 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   6 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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: GNU Lesser General Public License v2.1: LICENSE.txt: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":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact 0.2.0 not signed: https://api.github.com/repos/pygame/stuntcat/releases/35808657","Warn: release artifact 0.2.0 does not have provenance: https://api.github.com/repos/pygame/stuntcat/releases/35808657"],"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":-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":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2022-43017 / GHSA-qwmp-2cf2-g9g6"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 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-22T20:29:46.799Z","repository_id":45121491,"created_at":"2025-08-22T20:29:46.802Z","updated_at":"2025-08-22T20:29:46.802Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30291856,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-09T02:57:19.223Z","status":"ssl_error","status_checked_at":"2026-03-09T02:56:26.373Z","response_time":61,"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":"2024-11-08T11:19:10.559Z","updated_at":"2026-03-09T11:05:22.233Z","avatar_url":"https://github.com/pygame.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\n# 🐱‍🏍 — the first pygame 2 community game. Starting now! Are you in?\n\n\u003cimg src=\"docs/stuntcat.svg\" style=\"zoom:200%;\" /\u003e\n\n\n![Alt text](docs/gameplay.gif?raw=true \"Stuntcat\")\n\n\"My first cat was named Speedy. Because when he went into one of those crazy dashes across the house, he'd run all along the backrest of the couch, like one of those motorcycle stuntperson.\nOn a near-vertical surface.\"\n\n* github repo: [https://github.com/pygame/stuntcat](https://github.com/pygame/stuntcat)\n\nThis was originally an experiment in having the whole pygame community being invited to take part. In making this one game. In 4 days. [More info here](https://renesd.blogspot.com/2018/11/first-pygame-2-community-game-starting.html) It was meant to help drive pygame 2 development, making a game with pygame 2. Since then a few people have improved things. It's still meant to be used to develop pygame features and be an example game.\n\nSee the [stuntcat release notes](https://github.com/pygame/stuntcat/releases) for details on what has changed.\n\n\n## Get started\n\nFor development you can start like this:\n\n```\npython3 -m venv venv\n. ./venv/bin/activate\npip install -r requirements.dev.txt\npython run_game.py\n```\n\nFor playing you could install it with `python3 -m pip install stuntcat`, or download an executable from the [stuntcat releases](https://github.com/pygame/stuntcat/releases) page.\n\n\n\n## The team:\n\n* @illume - \"fixes to pygame 2, any general thing that needs doing.\"\"\n\n* TJWhale - \"Hey, I'm interested in helping with this community game if I can :) I've got some experience with pygame, I actually lanched a game on steam with it\"\n\n* @nachomonkey - \"This update focuses primarily on fixing bugs and adding sounds.\"\n\n* @MyreMylar - \"Investigating this issue here, I thought I'd start by clearing the pylint output of as much as I could.\"\n\n* bitcraft - \"I hope I can contribute, but my work schedule is awful\". pyscroll, pytmx libraries.\n\n* Bottersnake - snäke library. \"In fact, I have a a load of frees today so I'll probably whip up all the boilerplate needed to make everything else quicker to write.\"\n\n* @dirk0 - \"Unfortunately I am terribly busy right now, but I could contribute music and Mac OSX compilation/testing, if needed.\"\n\n* M - \"¡Gatito!\" music, sound effects, game design, and graphics.\n\n* @xeno - \"I tried drawing a cat, it looks weird.\"\n\n* @kleinesfilmroellchen\n\n\n\n\n## Awesome libraries\n\nApart from pygame 2 we are going to try using some awesome libraries.\n\n* [pyscroll](https://github.com/bitcraft/pyscroll) - scrolling map\n* [pytmx](https://github.com/bitcraft/pytmx) - tilemap\n* [thorpy](http://www.thorpy.org/) - gui\n* [pymunk](http://www.pymunk.org/en/latest/) - physics\n* [snäke](https://pypi.org/project/pygame.snake/) - cleaner api\n* [pyinstaller](https://www.pyinstaller.org/)\n* [pytest](https://docs.pytest.org/en/latest/) - our game will have some tests.\n* ... other?\n\n### pygame compatibility\n\nThis game works with pygame 1.9.4+ and pygame 2\n\n\n### Running tests\n\nTests can be found in the tests/ folder.\n\nType `pytest`.\nOr run `python -m tox`\n\nTests are run on Mac, Linux, Windows when there is a pull request made.\n\n### Releasing\n\nReleasing is tested with python3.7 (not python2 or any other version).\n\nTo the python package index (PyPI).\n```\nrm -rf dist/*\npython setup.py sdist bdist_wheel\ntwine upload dist/*\n```\n\nOn Windows:\n```\npython setup.py bdist_msi\ndir build/*.msi\n```\n\nOn Mac:\n```\npython setup.py bdist_dmg\nls build/*.dmg\n```\n\n### Recording gif animations\n\nRun the game with the argument `-g`:\n\n```bash\npython run_game.py -g\n```\n\nPress G to start recording two seconds of footage.\n\nRequires imagemagick. Tested on OSX and Linux.\n\n\n## Licenses\n\n#### Code license\n\nLicense for code will be the same as the pygame license (LGPL, but you can keep your parts of course!)\n\n\n#### Art assets\n\nhttps://creativecommons.org/licenses/by-sa/4.0/legalcode\nhttps://creativecommons.org/2015/10/08/cc-by-sa-4-0-now-one-way-compatible-with-gplv3/\n\n- @AokiAhishatsu stuntcat/data/images/\n- M. other stuntcat/data/sounds/\n\n#### Other assets\n\n- stuntcat/data/sound/boo.ogg: [Crowd booing sound](https://freesound.org/people/tim.kahn/sounds/336997/), licensed under [CC BY 3.0](https://creativecommons.org/licenses/by/3.0/legalcode)\n\nSo technically anyone should be able to distribute the game following those licenses (and even sell it).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpygame%2Fstuntcat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpygame%2Fstuntcat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpygame%2Fstuntcat/lists"}