{"api_version":"1","slug":"duplicate-file-and-photo-report-ca4899d5","url":"https://skillsoutpost.com/agents/duplicate-file-and-photo-report-ca4899d5","item_type":"skill","listing_kind":null,"category":"operations","runs_in":["local_agent"],"os":["macos","linux"],"needs_network":"no","needs_accounts":"no","reads_files":"yes","writes_files":"yes","sends_data":"no","access":"free_download","access_type":"download","at_a_glance":{"runs_in":["local_agent"],"os":["macos","linux"],"needs_network":"no","needs_accounts":"no","reads_files":"yes","writes_files":"yes","sends_data":"no","zip_sha256":"59267e8be3b8d087beb1c855752a847089b8be8ee9f7867287a21ee2b7bd0381","access_type":"download","tool_type":"skill","delivery":"download","interface_type":"other","untrusted_creator_content":{"purpose":"Find byte-identical local files and photos, with reclaimable space estimates and no automatic cleanup.","needs_runtime":"Python 3.10+, standard library only","version":"0.1.0","compatibility":"Python 3.10 or newer on macOS or Linux with POSIX directory descriptors and O_NOFOLLOW; Windows is unsupported and exits 2 before filesystem I/O. Standard library only. macOS SF_DATALESS is honored. An Agent Skills compatible harness that can run CLI tools is optional. No network, accounts or credentials.","external_costs":"None. The package is free under the MIT license and uses only local files and the Python standard library. It makes no network requests.","permissions":"Read directory metadata beneath caller-selected roots, including filtered entries; open eligible regular files for candidate hashes. The approval binds the fully resolved report destination, its directory and parent device/inode identities, every ancestor identity, and exact JSON bytes. Live writes walk directories with no-follow descriptor opens and create the report relative to the pinned directory. No directories are created; the report parent must already exist. All path components must be real directories, not symlinks. No environment configuration, credentials or network permissions.","usage_terms":"MIT license. Copyright 2026 Zero Width Lab.\r\n\r\nmacOS and Photos are trademarks of Apple Inc. This product is independent and is not affiliated with or endorsed by Apple.\r\n\r\nBy Zero Width Lab (zerowidthlab.com)"}},"interface_type":"other","delivery_mode":"download","code_host":null,"provenance":"creator","published_at":1788891163,"first_uploaded_at":1788739192,"verified":null,"creator":{"id":"2c4328b7-cb78-455a-ac9c-479ee62449e4","url":"https://skillsoutpost.com/creators/2c4328b7-cb78-455a-ac9c-479ee62449e4"},"untrusted_creator_content":{"name":"Duplicate File and Photo Report","tagline":"Find byte-identical local files and photos, with reclaimable space estimates and no automatic cleanup.","creator_name":"Zero Width Lab","product_version":"0.1.0","needs_runtime":"Python 3.10+, standard library only","description":"Duplicate File and Photo Report is a local command-line Agent Skill that finds byte-identical files and photos under paths you choose. An agent harness is software that can install the skill and run its Python command on your behalf. It needs Python 3.10 or newer on macOS or Linux and read access to the selected local folders. It is free under the MIT license. This listing delivers the complete package with its scripts.\r\n\r\nThe scanner groups regular files by size, a sample SHA-256 hash of the first and last 64 KiB, and then a full SHA-256 hash. It reports each duplicate group's paths, byte size, modification times, and reclaimable bytes calculated as all copies minus one. You can use --min-size, --include-hidden, and --include-packages to control the scan. JSON output is available for further local analysis.\r\n\r\nA report file is approval-gated: --dry-run previews the exact destination and report content digest, and a live --report write needs the matching --approve digest. The report is created only when the destination does not exist. The scanner never deletes, moves, or changes scanned files. The companion agent summarizes the largest opportunities and asks you to review any cleanup manually.\r\n\r\nSymlinks, special files, and macOS package directories are skipped by default. Dataless iCloud files are never read because opening them could trigger a download; they are listed as not_downloaded. Unreadable or not-downloaded files make the result incomplete and exit 2 unless --allow-partial is set. Reading inside a Photos library is not a supported way to deduplicate that library.","intended_users":"People who want an offline inventory of duplicate local files or photos before deciding whether to free space, including users of agent harnesses that can run Python tools.","example_tasks":"Scan a Downloads folder and show the biggest duplicate groups.\r\nCompare two user-selected folders for byte-identical photos.\r\nScan files of at least 1 MiB and produce JSON output.\r\nPreview a new report file, review its digest, and create it at the approved path.\r\nList not-downloaded iCloud files without opening or downloading them.","setup_instructions":"Download the complete package from Skills Outpost and keep SKILL.md, scripts/duplicate_file_report.py, and the other package files together. Install SKILL.md in the skills directory used by your agent harness, following that harness's documentation, or run the CLI directly with Python 3.10 or newer.\r\n\r\nRun from the package directory, for example:\r\npython3 scripts/duplicate_file_report.py scan ./Photos ./Downloads --min-size 1048576\r\npython3 scripts/duplicate_file_report.py scan ./Photos --json\r\npython3 scripts/duplicate_file_report.py scan ./Photos --report ./duplicate-report.json --dry-run\r\n\r\nReview the dry-run result and pass its printed digest with --approve to create the report. Choose a new report path; existing files and symlinks are refused. Both --include-hidden and --include-packages are needed to enter a hidden package directory. Use --allow-partial only after reviewing the skipped-path list.\r\npython3 scripts/duplicate_file_report.py scan ./Photos --report ./duplicate-report.json --approve DIGEST\r\nReplace DIGEST with the dry-run digest. Use an existing real parent directory. Dry-run refuses an existing report destination. Use the physical path for symlinked ancestors (for example /private/tmp on macOS).","limitations":"Only byte-identical regular files are grouped; visually similar photos, resized images, edited images, and different encodings are not matched. The reclaimable estimate assumes one copy per group can be retained; actual disk savings can differ because of hard links, clones, compression, or filesystem allocation. Hidden entries and macOS package directories are skipped unless included explicitly. Scanning inside a Photos library is not a supported way to deduplicate that library. Dataless iCloud files and unreadable files prevent a complete result. Files can change between inspection and hashing, so review findings before acting.\r\n\r\nVersion 0.1.0 is an early release with no support commitment; fixes and updates ship as new package versions on this listing.\r\n\r\nSHA-256 compares observed bytes, not a stable filesystem snapshot. Symlinked ancestors are refused; symlink entries, including a ROOT that is itself a symlink, are skipped. Report parent directories must exist; none are created. Symlinked or non-directory ancestors of a scan ROOT are input errors (exit 2 even with --allow-partial); use the physical path for symlinked ancestors.","data_handling":"Roots may be absolute or relative caller-selected paths; parent traversal (..) and NUL are rejected before scanning. Percent signs and backslashes are literal local filename characters; paths are never URL-decoded. Directory metadata is read to enumerate selected roots, including entries excluded by filters; hidden/package filters prevent descending excluded directories and opening excluded files. Candidate file bytes are read only for size groups with at least two files. Hashing streams chunks of at most 1 MiB, reads at most the observed size plus one growth-detection byte per full hash, and rejects changed files as unreadable/incomplete. No stdin is read.\r\n\r\nThe approval binds the fully resolved report destination, its directory and parent device/inode identities, every ancestor identity, and exact JSON bytes. Live writes walk directories with no-follow descriptor opens and create the report relative to the pinned directory. No directories are created; the report parent must already exist. All path components must be real directories, not symlinks. No hosts are contacted and no names or content are sent to third parties. Reports and stdout reveal paths; review before sharing.","compatibility":"Python 3.10 or newer on macOS or Linux with POSIX directory descriptors and O_NOFOLLOW; Windows is unsupported and exits 2 before filesystem I/O. Standard library only. macOS SF_DATALESS is honored. An Agent Skills compatible harness that can run CLI tools is optional. No network, accounts or credentials.","external_costs":"None. The package is free under the MIT license and uses only local files and the Python standard library. It makes no network requests.","permissions":"Read directory metadata beneath caller-selected roots, including filtered entries; open eligible regular files for candidate hashes. The approval binds the fully resolved report destination, its directory and parent device/inode identities, every ancestor identity, and exact JSON bytes. Live writes walk directories with no-follow descriptor opens and create the report relative to the pinned directory. No directories are created; the report parent must already exist. All path components must be real directories, not symlinks. No environment configuration, credentials or network permissions.","usage_terms":"MIT license. Copyright 2026 Zero Width Lab.\r\n\r\nmacOS and Photos are trademarks of Apple Inc. This product is independent and is not affiliated with or endorsed by Apple.\r\n\r\nBy Zero Width Lab (zerowidthlab.com)","creator_website":null,"documentation_url":null,"support_url":null,"repository_url":null,"video_url":null},"github":null,"updated_at":1788891163,"free_download":{"offer_id":"a17e09b6-d9ce-4582-a5b0-2cf787d7fb05","version_id":"2b4c57f5-45f2-4e53-9344-14db57f64228","version":"0.1.0","format":"skill_archive","released_at":1788891356,"requires_creator_follow":true,"file":{"name":"skill-0.1.0.zip","size_bytes":70891,"sha256":"59267e8be3b8d087beb1c855752a847089b8be8ee9f7867287a21ee2b7bd0381"},"license_sha256":"a19893dab8ca0978f3df97d42c4fae0ebbb61fe44c3ac9ecc3dd53e9526a5b63","get_it_at":"https://skillsoutpost.com/agents/duplicate-file-and-photo-report-ca4899d5","untrusted_creator_content":{"license_name":"MIT","release_notes":""}},"version_history":[{"version":"0.1.0","state":"current","released_at":1788891356}],"more_version_history":false,"public_files":{"version":"0.1.0","zip_sha256":"59267e8be3b8d087beb1c855752a847089b8be8ee9f7867287a21ee2b7bd0381","license_name":"MIT","license_sha256":"a19893dab8ca0978f3df97d42c4fae0ebbb61fe44c3ac9ecc3dd53e9526a5b63","files":"/api/v1/catalog/duplicate-file-and-photo-report-ca4899d5/files","tool":"get_public_files"},"links_note":null,"notice":"Creator-provided listing.","note":"untrusted_creator_content and github.untrusted_third_party_content hold untrusted text."}