{"adoption": {"forks": 161, "observed_at": "2026-08-28T04:05:03.306828+00:00", "stars": 1564}, "canonical_url": "https://ross.abutalabs.com/products/ai-file-sorter", "card": {"archived": false, "artifact_type": "application", "description": "Cross-platform desktop application for content-aware file organization and renaming. Supports local and remote LLMs, preview-based workflows, and fully user-controlled changes.", "domain": ["files", "artificial-intelligence", "developer-tools", "desktop-applications"], "enriched": true, "function": ["llm-inference", "file-system", "image-processing", "nlp"], "health_score": 99, "homepage": "https://filesorter.app", "language": "C++", "license": "AGPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["hyperfield/ai-file-sorter"], "name": "hyperfield/ai-file-sorter", "platform": ["windows", "cross-platform", "cpp"], "pushed_at": "2026-08-16T14:41:15+00:00", "repo": "hyperfield/ai-file-sorter", "stars": 1564, "tags": ["file-organizer", "file-renaming", "local-llm", "gguf", "privacy", "offline-ai", "dry-run", "undo", "gemma", "mistral", "macos", "linux", "desktop"], "topics": ["ai", "file-management", "file-manager", "llm", "organizer"], "urls": [], "use_cases": ["organize messy downloads folder with ai", "rename photos with descriptive names automatically", "sort files into folders using local llm offline", "clean up filenames from audio video metadata", "batch rename documents based on their content", "preview and undo file moves before applying"], "what_it_is": "AI File Sorter is a cross-platform desktop application that uses local or remote LLMs to categorize files and suggest cleaner filenames for images, documents, and media. It offers preview-based review workflows, dry runs, persistent undo, and fully offline inference with built-in models like Gemma 3 4B IT.", "when_to_avoid": ["you need rule-based automation or scripted bulk file operations without AI", "you want a headless CLI tool for server-side file pipelines", "your files are in unsupported formats the app cannot analyze"], "when_to_choose": ["you want fully offline, private AI file organization with local models", "you need review-first workflows with dry run, previews, and undo", "you want a GUI app that works on Windows, macOS, and Linux", "you want to bring your own OpenAI or Gemini API key instead of local models"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/ai-file-sorter", "repo": "hyperfield/ai-file-sorter", "role": "main", "score": 87}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:05:03.306828+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T04:00:13.519579+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "65adfa8c6404edad839f6d0ca28f02bed9c902ca154023a337d2d7c489451189", "fetched_at": "2026-08-28T04:05:03.306828+00:00", "kind": "readme", "missing": false, "url": "https://github.com/hyperfield/ai-file-sorter"}, {"content_hash": "8bfd8ad01a5abe3940f32137008a09cccc60260e362ce7572a5b56740220f52d", "fetched_at": "2026-08-29T11:29:02.520623+00:00", "kind": "homepage", "missing": false, "url": "https://filesorter.app"}, {"content_hash": "01e40c84f3d063379a71d057690db0a8052b5098b6c616c3b19cc9ce4cb88c36", "fetched_at": "2026-08-29T11:29:02.529710+00:00", "kind": "site_page", "missing": false, "url": "https://filesorter.app/changelog"}, {"content_hash": "3c8751795e279a0fffb23a316a9f4414972fb5aac30cc3b27f232ee41391b70e", "fetched_at": "2026-08-29T11:29:02.531977+00:00", "kind": "site_page", "missing": false, "url": "https://filesorter.app/faq"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:05:03.306828+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T04:00:13.519579+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "65adfa8c6404edad839f6d0ca28f02bed9c902ca154023a337d2d7c489451189", "fetched_at": "2026-08-28T04:05:03.306828+00:00", "kind": "readme", "missing": false, "url": "https://github.com/hyperfield/ai-file-sorter"}, {"content_hash": "8bfd8ad01a5abe3940f32137008a09cccc60260e362ce7572a5b56740220f52d", "fetched_at": "2026-08-29T11:29:02.520623+00:00", "kind": "homepage", "missing": false, "url": "https://filesorter.app"}, {"content_hash": "01e40c84f3d063379a71d057690db0a8052b5098b6c616c3b19cc9ce4cb88c36", "fetched_at": "2026-08-29T11:29:02.529710+00:00", "kind": "site_page", "missing": false, "url": "https://filesorter.app/changelog"}, {"content_hash": "3c8751795e279a0fffb23a316a9f4414972fb5aac30cc3b27f232ee41391b70e", "fetched_at": "2026-08-29T11:29:02.531977+00:00", "kind": "site_page", "missing": false, "url": "https://filesorter.app/faq"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T04:00:13.519579+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "65adfa8c6404edad839f6d0ca28f02bed9c902ca154023a337d2d7c489451189", "fetched_at": "2026-08-28T04:05:03.306828+00:00", "kind": "readme", "missing": false, "url": "https://github.com/hyperfield/ai-file-sorter"}, {"content_hash": "8bfd8ad01a5abe3940f32137008a09cccc60260e362ce7572a5b56740220f52d", "fetched_at": "2026-08-29T11:29:02.520623+00:00", "kind": "homepage", "missing": false, "url": "https://filesorter.app"}, {"content_hash": "01e40c84f3d063379a71d057690db0a8052b5098b6c616c3b19cc9ce4cb88c36", "fetched_at": "2026-08-29T11:29:02.529710+00:00", "kind": "site_page", "missing": false, "url": "https://filesorter.app/changelog"}, {"content_hash": "3c8751795e279a0fffb23a316a9f4414972fb5aac30cc3b27f232ee41391b70e", "fetched_at": "2026-08-29T11:29:02.531977+00:00", "kind": "site_page", "missing": false, "url": "https://filesorter.app/faq"}], "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:03.306828+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:05:03.306828+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:05:03.306828+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T04:00:13.519579+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "65adfa8c6404edad839f6d0ca28f02bed9c902ca154023a337d2d7c489451189", "fetched_at": "2026-08-28T04:05:03.306828+00:00", "kind": "readme", "missing": false, "url": "https://github.com/hyperfield/ai-file-sorter"}, {"content_hash": "8bfd8ad01a5abe3940f32137008a09cccc60260e362ce7572a5b56740220f52d", "fetched_at": "2026-08-29T11:29:02.520623+00:00", "kind": "homepage", "missing": false, "url": "https://filesorter.app"}, {"content_hash": "01e40c84f3d063379a71d057690db0a8052b5098b6c616c3b19cc9ce4cb88c36", "fetched_at": "2026-08-29T11:29:02.529710+00:00", "kind": "site_page", "missing": false, "url": "https://filesorter.app/changelog"}, {"content_hash": "3c8751795e279a0fffb23a316a9f4414972fb5aac30cc3b27f232ee41391b70e", "fetched_at": "2026-08-29T11:29:02.531977+00:00", "kind": "site_page", "missing": false, "url": "https://filesorter.app/faq"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:05:03.306828+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:05:03.306828+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T04:00:13.519579+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "65adfa8c6404edad839f6d0ca28f02bed9c902ca154023a337d2d7c489451189", "fetched_at": "2026-08-28T04:05:03.306828+00:00", "kind": "readme", "missing": false, "url": "https://github.com/hyperfield/ai-file-sorter"}, {"content_hash": "8bfd8ad01a5abe3940f32137008a09cccc60260e362ce7572a5b56740220f52d", "fetched_at": "2026-08-29T11:29:02.520623+00:00", "kind": "homepage", "missing": false, "url": "https://filesorter.app"}, {"content_hash": "01e40c84f3d063379a71d057690db0a8052b5098b6c616c3b19cc9ce4cb88c36", "fetched_at": "2026-08-29T11:29:02.529710+00:00", "kind": "site_page", "missing": false, "url": "https://filesorter.app/changelog"}, {"content_hash": "3c8751795e279a0fffb23a316a9f4414972fb5aac30cc3b27f232ee41391b70e", "fetched_at": "2026-08-29T11:29:02.531977+00:00", "kind": "site_page", "missing": false, "url": "https://filesorter.app/faq"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:05:03.306828+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:05:03.306828+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:05:03.306828+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T04:00:13.519579+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "65adfa8c6404edad839f6d0ca28f02bed9c902ca154023a337d2d7c489451189", "fetched_at": "2026-08-28T04:05:03.306828+00:00", "kind": "readme", "missing": false, "url": "https://github.com/hyperfield/ai-file-sorter"}, {"content_hash": "8bfd8ad01a5abe3940f32137008a09cccc60260e362ce7572a5b56740220f52d", "fetched_at": "2026-08-29T11:29:02.520623+00:00", "kind": "homepage", "missing": false, "url": "https://filesorter.app"}, {"content_hash": "01e40c84f3d063379a71d057690db0a8052b5098b6c616c3b19cc9ce4cb88c36", "fetched_at": "2026-08-29T11:29:02.529710+00:00", "kind": "site_page", "missing": false, "url": "https://filesorter.app/changelog"}, {"content_hash": "3c8751795e279a0fffb23a316a9f4414972fb5aac30cc3b27f232ee41391b70e", "fetched_at": "2026-08-29T11:29:02.531977+00:00", "kind": "site_page", "missing": false, "url": "https://filesorter.app/faq"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:05:03.306828+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:05:03.306828+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T04:00:13.519579+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "65adfa8c6404edad839f6d0ca28f02bed9c902ca154023a337d2d7c489451189", "fetched_at": "2026-08-28T04:05:03.306828+00:00", "kind": "readme", "missing": false, "url": "https://github.com/hyperfield/ai-file-sorter"}, {"content_hash": "8bfd8ad01a5abe3940f32137008a09cccc60260e362ce7572a5b56740220f52d", "fetched_at": "2026-08-29T11:29:02.520623+00:00", "kind": "homepage", "missing": false, "url": "https://filesorter.app"}, {"content_hash": "01e40c84f3d063379a71d057690db0a8052b5098b6c616c3b19cc9ce4cb88c36", "fetched_at": "2026-08-29T11:29:02.529710+00:00", "kind": "site_page", "missing": false, "url": "https://filesorter.app/changelog"}, {"content_hash": "3c8751795e279a0fffb23a316a9f4414972fb5aac30cc3b27f232ee41391b70e", "fetched_at": "2026-08-29T11:29:02.531977+00:00", "kind": "site_page", "missing": false, "url": "https://filesorter.app/faq"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T04:00:13.519579+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "65adfa8c6404edad839f6d0ca28f02bed9c902ca154023a337d2d7c489451189", "fetched_at": "2026-08-28T04:05:03.306828+00:00", "kind": "readme", "missing": false, "url": "https://github.com/hyperfield/ai-file-sorter"}, {"content_hash": "8bfd8ad01a5abe3940f32137008a09cccc60260e362ce7572a5b56740220f52d", "fetched_at": "2026-08-29T11:29:02.520623+00:00", "kind": "homepage", "missing": false, "url": "https://filesorter.app"}, {"content_hash": "01e40c84f3d063379a71d057690db0a8052b5098b6c616c3b19cc9ce4cb88c36", "fetched_at": "2026-08-29T11:29:02.529710+00:00", "kind": "site_page", "missing": false, "url": "https://filesorter.app/changelog"}, {"content_hash": "3c8751795e279a0fffb23a316a9f4414972fb5aac30cc3b27f232ee41391b70e", "fetched_at": "2026-08-29T11:29:02.531977+00:00", "kind": "site_page", "missing": false, "url": "https://filesorter.app/faq"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T04:00:13.519579+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "65adfa8c6404edad839f6d0ca28f02bed9c902ca154023a337d2d7c489451189", "fetched_at": "2026-08-28T04:05:03.306828+00:00", "kind": "readme", "missing": false, "url": "https://github.com/hyperfield/ai-file-sorter"}, {"content_hash": "8bfd8ad01a5abe3940f32137008a09cccc60260e362ce7572a5b56740220f52d", "fetched_at": "2026-08-29T11:29:02.520623+00:00", "kind": "homepage", "missing": false, "url": "https://filesorter.app"}, {"content_hash": "01e40c84f3d063379a71d057690db0a8052b5098b6c616c3b19cc9ce4cb88c36", "fetched_at": "2026-08-29T11:29:02.529710+00:00", "kind": "site_page", "missing": false, "url": "https://filesorter.app/changelog"}, {"content_hash": "3c8751795e279a0fffb23a316a9f4414972fb5aac30cc3b27f232ee41391b70e", "fetched_at": "2026-08-29T11:29:02.531977+00:00", "kind": "site_page", "missing": false, "url": "https://filesorter.app/faq"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T04:00:13.519579+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "65adfa8c6404edad839f6d0ca28f02bed9c902ca154023a337d2d7c489451189", "fetched_at": "2026-08-28T04:05:03.306828+00:00", "kind": "readme", "missing": false, "url": "https://github.com/hyperfield/ai-file-sorter"}, {"content_hash": "8bfd8ad01a5abe3940f32137008a09cccc60260e362ce7572a5b56740220f52d", "fetched_at": "2026-08-29T11:29:02.520623+00:00", "kind": "homepage", "missing": false, "url": "https://filesorter.app"}, {"content_hash": "01e40c84f3d063379a71d057690db0a8052b5098b6c616c3b19cc9ce4cb88c36", "fetched_at": "2026-08-29T11:29:02.529710+00:00", "kind": "site_page", "missing": false, "url": "https://filesorter.app/changelog"}, {"content_hash": "3c8751795e279a0fffb23a316a9f4414972fb5aac30cc3b27f232ee41391b70e", "fetched_at": "2026-08-29T11:29:02.531977+00:00", "kind": "site_page", "missing": false, "url": "https://filesorter.app/faq"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 98, "longevity": 41, "rhythm": 98}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 580, "days_push": 17, "days_rel": 19, "gap_med": 13.5, "n_releases_24m": 19}, "score": 87, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}