{"id":34038830,"url":"https://github.com/bitrate16/cashcat","last_synced_at":"2026-03-11T04:32:18.547Z","repository":{"id":306712609,"uuid":"981785401","full_name":"bitrate16/cashcat","owner":"bitrate16","description":"Easy tool for verifying file integrity","archived":false,"fork":false,"pushed_at":"2025-05-11T21:50:05.000Z","size":15,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-04T15:27:19.065Z","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":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bitrate16.png","metadata":{"files":{"readme":"README.md","changelog":null,"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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-05-11T21:48:31.000Z","updated_at":"2025-05-11T21:50:09.000Z","dependencies_parsed_at":null,"dependency_job_id":"6037ecdd-3519-4e0e-b71c-10e650ced86d","html_url":"https://github.com/bitrate16/cashcat","commit_stats":null,"previous_names":["bitrate16/cashcat"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bitrate16/cashcat","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitrate16%2Fcashcat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitrate16%2Fcashcat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitrate16%2Fcashcat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitrate16%2Fcashcat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bitrate16","download_url":"https://codeload.github.com/bitrate16/cashcat/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitrate16%2Fcashcat/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30370798,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T21:41:54.280Z","status":"online","status_checked_at":"2026-03-11T02:00:07.027Z","response_time":84,"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":[],"created_at":"2025-12-13T21:07:36.612Z","updated_at":"2026-03-11T04:32:18.532Z","avatar_url":"https://github.com/bitrate16.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# cashcat\n\nCompare directories recursively using ~~cash~~ hashes\n\nSimple tool for verifying file integrity\n\n# Install\n\n```bash\npip install cashcat\n```\n\n# Example\n\nCheck hashes for files:\n```bash\npython -m cashcat check --root ./path-a ./path-b --hashfile ./cashcat.json\n```\n\nGenerate hashes for files:\n```bash\npython -m cashcat generate --root ./path-a ./path-b --hashfile ./cashcat.json\n```\n\nUpdate hashes for files:\n```bash\npython -m cashcat update --root ./path-a ./path-b --hashfile ./cashcat.json\n```\n\n# Why?\n\nIf you ever wanted to store multiple copies of many files and need to ensure that each medium didn't get corrupted or actually corrupted with data loss - this tool may help.\n\nIt simply checks for each file that present in each root recursively by mathing the hash value with hash from storage. You can store hashfile in every place (even on your drives, since it's just a json file) and use it for verification.\n\nThis tool works as following:\n- First, it collects all file paths recursivery for each specified root\n- Second, it does set intersection to determine which files exist in each root\n- For every non-in-intersection path it produces a warning\n- For every file in intersection it does hash computation and varifiction agains the varue from storage\n  - Every mismatch is reported\n  - Every file missing from storage is reported\n\n# How to use\n\nThis tool has multiple modes of operation described below.\n\n```\n$ python -m cashcat check --help\nusage: cashcat [-h] -r ROOT [ROOT ...] [-s HASHFILE] [-v] {check,generate,update}\n\npositional arguments:\n  {check,generate,update}\n                        action mode: check - checks files agains the hash store; generate - force regenerate all hashes; update - generate hashes only for new files\n\noptions:\n  -h, --help            show this help message and exit\n  -r, --root ROOT [ROOT ...]\n                        paths to tree roots, at least 2 roots to compare\n  -s, --hashfile HASHFILE\n                        path to hash file store\n  -v, --verbose         verbose logging\n```\n\n## check\n\nCheck the integrity using the existing storage file. Does not change anything.\n\n## generate\n\nFull overwrite of storage file. Generate hash for every file from set intersection. Does not generate hashes for files that exist only in single root (in case of 2+ roots).\n\n## update\n\nUpdate storage file. Generate hash for every file from set intersection that **not exists** in storage yet. Does not generate hashes for files that exist only in single root (in case of 2+ roots).\n\nUpdate of files that has content changed not supported yet.\n\n# LICENSE\n\n```\ncashcat - simple file integrity verification tool\nCopyright (C) 2025  bitrate16\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU Affero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public License\nalong with this program.  If not, see \u003chttps://www.gnu.org/licenses/\u003e.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbitrate16%2Fcashcat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbitrate16%2Fcashcat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbitrate16%2Fcashcat/lists"}