tidydisk: consolidate and organize a hoard of scattered files
Pull years of scattered files (old drives, phone backups, NAS dumps, recovery-tool output) into one organized, deduplicated library. Media lands in a Jellyfin/Plex-ready layout; an agent layer sorts whatever your rules can't, using a local model so filenames never leave your machine.
tidydisk fingerprints everything you point it at, drops exact duplicates and junk, and
files what's left where it belongs. It moves and stages files, never deletes them.
Status: v0.1.0 (on PyPI:
pip install tidydisk). The engine, the agent layer, content-derived organization, in-place library repair, the guided 2-pass web UI, opt-in enrichment connectors, and undo/dispose/doctor are all in. See docs/roadmap.md for what's deferred.
Quickstart
The 2-pass cleanup (the front door): Pass 1 analyzes everything read-only into one sealed proposal; Pass 2 is a single review-and-execute in a localhost web UI.
flowchart LR
A[tidydisk pilot] -->|analyzes, read-only| B[sealed proposal.json]
B --> C[tidydisk serve]
C -->|review clusters, approve/reject| D{Execute}
D -->|typed confirmation| E[library on disk]
$ tidydisk pilot # Pass 1: analyze everything -> proposal.json
$ tidydisk serve # Pass 2: review clusters -> approve -> Execute
Headless Pass 2: tidydisk pilot --execute --proposal <proposal.json> --approve-all.
Install from PyPI (zero runtime deps: stdlib only):
$ pip install tidydisk
Or the granular CLI:
$ tidydisk init # writes an annotated tidydisk.toml
$ tidydisk check # validates config + root reachability
$ tidydisk scan library # fingerprint your library into the index
$ tidydisk scan old-drive # fingerprint a source
$ tidydisk verdicts old-drive # ORGANIZED / JUNK / UNIQUE / REVIEW
$ tidydisk plan organize old-drive # uniques -> library
$ tidydisk apply ".tidydisk/plans/plan-organize-old-drive-ab12cd34.jsonl" --execute
$ tidydisk plan dedup old-drive # duplicates + junk -> staging (same-drive, reversible)
$ tidydisk apply ".tidydisk/plans/plan-dedup-old-drive-9f00aa11.jsonl" --execute
$ tidydisk verify library
$ tidydisk plan reorganize --under Video/old-drive --exif # repair flat dumps in place
Agent layer (local model via Ollama, or any OpenAI-compatible endpoint):
$ tidydisk agent triage old-drive # LLM recommends dispositions for the REVIEW pile
$ tidydisk agent classify old-drive # labels the tail your rules didn't cover
$ tidydisk agent eval # measures the configured chain on the golden sets
A fully-annotated example config is browsable at examples/tidydisk.toml.
One small kernel owns every filesystem mutation and there is no delete API anywhere in
the codebase (AST-enforced in CI): staging is reversible, and disposal only ever
happens through tidydisk dispose, gated behind a typed confirmation.
See docs/formats.md for the plan/summary JSON schemas and exit codes.
License
AGPL-3.0-or-later. See LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tidydisk-0.1.0.tar.gz.
File metadata
- Download URL: tidydisk-0.1.0.tar.gz
- Upload date:
- Size: 442.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
285eb1282dd7a33305ffaea752e3f5a29aa35bfbca1232b4032218d5184075ee
|
|
| MD5 |
57da71f3d8ecd0563390dcefb44d042e
|
|
| BLAKE2b-256 |
00765c6c99a1ca6d2a0757dab79f4f1b744778cbf6f20bac1c8e04244e651aff
|
Provenance
The following attestation bundles were made for tidydisk-0.1.0.tar.gz:
Publisher:
release.yml on msampath/tidydisk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tidydisk-0.1.0.tar.gz -
Subject digest:
285eb1282dd7a33305ffaea752e3f5a29aa35bfbca1232b4032218d5184075ee - Sigstore transparency entry: 2295396400
- Sigstore integration time:
-
Permalink:
msampath/tidydisk@7b8ea2dbbcb0f8ed170ce6cac6198591124bf057 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/msampath
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@7b8ea2dbbcb0f8ed170ce6cac6198591124bf057 -
Trigger Event:
push
-
Statement type:
File details
Details for the file tidydisk-0.1.0-py3-none-any.whl.
File metadata
- Download URL: tidydisk-0.1.0-py3-none-any.whl
- Upload date:
- Size: 309.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
64891e961b9aa7ea3416bfd106661717c53b4068fe8435462cd7ba930b7878b7
|
|
| MD5 |
a961dd71d0e429917cbc4afcbaa643c5
|
|
| BLAKE2b-256 |
6fee8acef4fa16bf67f8726848cf12b4174780651c13033e924389babd30175f
|
Provenance
The following attestation bundles were made for tidydisk-0.1.0-py3-none-any.whl:
Publisher:
release.yml on msampath/tidydisk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tidydisk-0.1.0-py3-none-any.whl -
Subject digest:
64891e961b9aa7ea3416bfd106661717c53b4068fe8435462cd7ba930b7878b7 - Sigstore transparency entry: 2295396474
- Sigstore integration time:
-
Permalink:
msampath/tidydisk@7b8ea2dbbcb0f8ed170ce6cac6198591124bf057 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/msampath
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@7b8ea2dbbcb0f8ed170ce6cac6198591124bf057 -
Trigger Event:
push
-
Statement type: