{"adoption": {"forks": 112, "observed_at": "2026-08-28T04:05:18.283268+00:00", "stars": 1659}, "canonical_url": "https://ross.abutalabs.com/products/antidupl", "card": {"archived": false, "artifact_type": "application", "description": "A program to search similar and defect pictures on the disk", "domain": ["image-processing", "photography", "files", "desktop-applications"], "enriched": true, "function": ["image-processing", "gui", "developer-tools"], "health_score": 84, "homepage": "https://ermig1979.github.io/AntiDupl", "language": "C#", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["ermig1979/AntiDupl"], "name": "ermig1979/AntiDupl", "platform": ["windows", "cross-platform"], "pushed_at": "2026-04-11T12:57:54+00:00", "repo": "ermig1979/AntiDupl", "stars": 1659, "tags": ["duplicate-image-detection", "similar-image-search", "image-defect-detection", "photo-management", "csharp", "dotnet", "desktop"], "topics": [], "urls": [], "use_cases": ["find duplicate photos in a large image collection", "detect similar images that are not byte-identical", "find corrupted or defective image files", "clean up disk space wasted by duplicate pictures", "compare images across jpeg png gif tiff webp heif formats", "automate deduplication of a photo library instead of manual review"], "what_it_is": "AntiDupl.NET is a free open-source Windows desktop application that finds duplicate and similar images on disk by comparing file contents, supporting many formats including JPEG, PNG, GIF, TIFF, WEBP, HEIF, and AVIF. It can also detect images with certain defects, automating cleanup of large image collections.", "when_to_avoid": ["you need a cross-platform GUI - the GUI targets Windows (the separate AntiDuplX CLI covers Linux)", "you need automated/server-side deduplication in a pipeline - use the AntiDuplX command-line tool instead", "you need video or audio deduplication", "you need exact-hash deduplication at massive scale in a data center"], "when_to_choose": ["you need a GUI tool on Windows to deduplicate image collections", "you want content-based similarity matching, not just hash-identical files", "you also want to detect defective/damaged images", "you need support for many formats including HEIC, AVIF, JXL, PSD"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/antidupl", "repo": "ermig1979/AntiDupl", "role": "main", "score": 70}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:05:18.283268+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T03:44:41.978092+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a780196bb3417c06db6c784cb392d85c4b9c9053b63890c1af1ff4f19e1d7f8a", "fetched_at": "2026-08-28T04:05:18.283268+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ermig1979/AntiDupl"}, {"content_hash": "ad4b222ae2b116e310cdf6bdfaa9ed120afdec0a6e8fbb90a8416d1197c39db2", "fetched_at": "2026-08-29T11:17:07.638195+00:00", "kind": "homepage", "missing": false, "url": "https://ermig1979.github.io/AntiDupl"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:05:18.283268+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T03:44:41.978092+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a780196bb3417c06db6c784cb392d85c4b9c9053b63890c1af1ff4f19e1d7f8a", "fetched_at": "2026-08-28T04:05:18.283268+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ermig1979/AntiDupl"}, {"content_hash": "ad4b222ae2b116e310cdf6bdfaa9ed120afdec0a6e8fbb90a8416d1197c39db2", "fetched_at": "2026-08-29T11:17:07.638195+00:00", "kind": "homepage", "missing": false, "url": "https://ermig1979.github.io/AntiDupl"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T03:44:41.978092+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a780196bb3417c06db6c784cb392d85c4b9c9053b63890c1af1ff4f19e1d7f8a", "fetched_at": "2026-08-28T04:05:18.283268+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ermig1979/AntiDupl"}, {"content_hash": "ad4b222ae2b116e310cdf6bdfaa9ed120afdec0a6e8fbb90a8416d1197c39db2", "fetched_at": "2026-08-29T11:17:07.638195+00:00", "kind": "homepage", "missing": false, "url": "https://ermig1979.github.io/AntiDupl"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:05:18.283268+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:05:18.283268+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:05:18.283268+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T03:44:41.978092+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a780196bb3417c06db6c784cb392d85c4b9c9053b63890c1af1ff4f19e1d7f8a", "fetched_at": "2026-08-28T04:05:18.283268+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ermig1979/AntiDupl"}, {"content_hash": "ad4b222ae2b116e310cdf6bdfaa9ed120afdec0a6e8fbb90a8416d1197c39db2", "fetched_at": "2026-08-29T11:17:07.638195+00:00", "kind": "homepage", "missing": false, "url": "https://ermig1979.github.io/AntiDupl"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:05:18.283268+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:05:18.283268+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T03:44:41.978092+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a780196bb3417c06db6c784cb392d85c4b9c9053b63890c1af1ff4f19e1d7f8a", "fetched_at": "2026-08-28T04:05:18.283268+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ermig1979/AntiDupl"}, {"content_hash": "ad4b222ae2b116e310cdf6bdfaa9ed120afdec0a6e8fbb90a8416d1197c39db2", "fetched_at": "2026-08-29T11:17:07.638195+00:00", "kind": "homepage", "missing": false, "url": "https://ermig1979.github.io/AntiDupl"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:05:18.283268+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:05:18.283268+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:05:18.283268+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T03:44:41.978092+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a780196bb3417c06db6c784cb392d85c4b9c9053b63890c1af1ff4f19e1d7f8a", "fetched_at": "2026-08-28T04:05:18.283268+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ermig1979/AntiDupl"}, {"content_hash": "ad4b222ae2b116e310cdf6bdfaa9ed120afdec0a6e8fbb90a8416d1197c39db2", "fetched_at": "2026-08-29T11:17:07.638195+00:00", "kind": "homepage", "missing": false, "url": "https://ermig1979.github.io/AntiDupl"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:05:18.283268+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:05:18.283268+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T03:44:41.978092+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a780196bb3417c06db6c784cb392d85c4b9c9053b63890c1af1ff4f19e1d7f8a", "fetched_at": "2026-08-28T04:05:18.283268+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ermig1979/AntiDupl"}, {"content_hash": "ad4b222ae2b116e310cdf6bdfaa9ed120afdec0a6e8fbb90a8416d1197c39db2", "fetched_at": "2026-08-29T11:17:07.638195+00:00", "kind": "homepage", "missing": false, "url": "https://ermig1979.github.io/AntiDupl"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T03:44:41.978092+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a780196bb3417c06db6c784cb392d85c4b9c9053b63890c1af1ff4f19e1d7f8a", "fetched_at": "2026-08-28T04:05:18.283268+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ermig1979/AntiDupl"}, {"content_hash": "ad4b222ae2b116e310cdf6bdfaa9ed120afdec0a6e8fbb90a8416d1197c39db2", "fetched_at": "2026-08-29T11:17:07.638195+00:00", "kind": "homepage", "missing": false, "url": "https://ermig1979.github.io/AntiDupl"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T03:44:41.978092+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a780196bb3417c06db6c784cb392d85c4b9c9053b63890c1af1ff4f19e1d7f8a", "fetched_at": "2026-08-28T04:05:18.283268+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ermig1979/AntiDupl"}, {"content_hash": "ad4b222ae2b116e310cdf6bdfaa9ed120afdec0a6e8fbb90a8416d1197c39db2", "fetched_at": "2026-08-29T11:17:07.638195+00:00", "kind": "homepage", "missing": false, "url": "https://ermig1979.github.io/AntiDupl"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T03:44:41.978092+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a780196bb3417c06db6c784cb392d85c4b9c9053b63890c1af1ff4f19e1d7f8a", "fetched_at": "2026-08-28T04:05:18.283268+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ermig1979/AntiDupl"}, {"content_hash": "ad4b222ae2b116e310cdf6bdfaa9ed120afdec0a6e8fbb90a8416d1197c39db2", "fetched_at": "2026-08-29T11:17:07.638195+00:00", "kind": "homepage", "missing": false, "url": "https://ermig1979.github.io/AntiDupl"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 76, "longevity": 100, "rhythm": 46}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 3169, "days_push": 144, "days_rel": 144, "gap_med": null, "n_releases_24m": 1}, "score": 70, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}