Tell your Mac what to do with your files — in plain English.
Review exactly what will happen. Undo anything.
Download · Try it in 2 minutes · How it works · How AI is used · Benchmarks · Ideas
Your Mac's storage is a mystery, organizing thousands of files by hand takes an afternoon, and nobody trusts a bot with rm -rf.
Tidy fixes all three. Type what you want. Tidy shows exactly which files and folders it would touch, with sizes. You approve. Everything goes to the Trash with a recorded location, so any change can be undone from inside the app.
|
“Delete the 10 biggest files”, “organize by date”, “remove the instances that aren't the 26.2 version”. No rules to learn. |
Opt-in folders, review-then-approve, no overwrites, no permanent deletes, a durable journal and one-click Put back. |
No account, no cloud, no telemetry. The optional AI model runs on your Mac; your files never leave it. |
More: a tiny always-on-top assistant, light & dark, and everything reachable from the keyboard
The shrink button turns Tidy into a 360×580 assistant pinned to a screen corner (Esc to expand). All screens stay reachable from its icon bar.
Every row above is covered by an automated end-to-end test on a mock folder — see Quality.
flowchart LR
A["💬 You ask"] --> B["🧭 Request engine<br/>(deterministic, optional local AI)"]
B --> C["📋 Reviewable plan<br/>exact files, sizes"]
C -->|you approve| D["🔐 Safety engine<br/>validate · fingerprint · journal"]
D --> E["📦 Execute<br/>no-replace moves · native Trash"]
E --> F["✅ Verify"]
F --> G["🕘 History<br/>Undo · Put back"]
B -. "never touches files" .- X(("AI"))
| Guarantee | How |
|---|---|
| You choose what Tidy can see | Per-folder switches; everything else is invisible to the assistant. |
| Nothing changes without approval | One-use, expiring tokens bound to the exact actions; a folder edited after review refuses to run. |
| No overwrites | RENAME_EXCL no-replace moves; collisions are skipped and reported. |
| No permanent deletion — anywhere in the code | Removal is the native Trash, with its recovery location recorded for Put back. |
| Symlink & race safe | Handle-relative, no-follow traversal; mount boundaries respected; .git internals never opened. |
| Only one crate can mutate files | crates/safety. The UI, the request engine and the AI model can only propose. |
| Offline | The only network use is you pressing Download model (pinned by revision + SHA-256). |
Full threat model: docs/ARCHITECTURE.md.
flowchart TD
Q["Your request"] --> E{"Deterministic engine<br/>understands it?"}
E -->|"yes · ~1–75 ms"| P["Reviewed plan"]
E -->|no| M["Local model (optional)"]
M --> R1["① Restate as a plain command<br/>using your real folder names"] --> E
M --> R2["② Build folders from<br/>grammar-constrained matching rules"] --> P
M --> R3["③ Answer from your index"]
Small models are unreliable planners but good at rewriting and classifying, so Tidy uses AI for that and code for precision. Details, model list and how to add your own: docs/HOW-AI-IS-USED.md.
Download Tidy-<version>-macos-arm64.dmg from Releases, drag Tidy to Applications. Builds are not notarized yet, so on first launch right-click → Open, or:
xattr -dr com.apple.quarantine /Applications/Tidy.appCheck the download: shasum -a 256 -c SHA256SUMS.txt. Requires macOS 11+ (Apple Silicon recommended for local AI; Metal is used automatically).
Build from source
Needs Rust 1.90+, Node 22+, Xcode command-line tools and CMake.
git clone https://github.com/NicolasLasch/Tidy.git && cd Tidy/apps/desktop
npm ci
npm run worker:build # pinned llama.cpp worker (once, ~5 min)
npm run desktop # development app with hot reload
npm run package # release bundle → target/release/bundle/macos/Tidy.appNever point a new tool at your real Documents first. Generate ~1,000 deliberately messy files:
cargo run --example make_mock -p tidy-agent-runtime -- ~/TidyMock --largeOpen Tidy → Storage → Add folder → pick ~/TidyMock/Inbox, then ask:
what's taking the most space?organize this folder by type→ approve →organize by date→ History → Undo alldelete duplicate filesreplace spaces with underscores in file nameschange all .txt files to .md
- 140+ automated tests: safety refusals, indexer, request engine, and end-to-end scenarios that run the real safety engine on real files — including a 1,000-file messy tree (organize by type/date then undo everything, bulk renames, extension changes, de-duplication, 500-action batches, Put back) verified byte-for-byte. CI runs fmt, clippy
-D warnings, the full suite and a secret scan on every push. - Fast: understanding a request takes ~1 ms at 1,000 files and ~30–75 ms at 50,000; a 50,000-file folder moves to the Trash (and back) with one atomic rename.
| 1,000 files | 10,000 files | 50,000 files |
|---|---|---|
| request 1 ms · rescan 45 ms | request 7 ms · rescan 0.46 s | request 31 ms · rescan 3.0 s |
Full tables: docs/BENCHMARKS.md · reproduce with cargo run --release --example benchmark -p tidy-agent-runtime.
Tauri 2 (Rust) + React/TypeScript · SQLite/FTS5 index · llama.cpp worker (Metal/CPU) · Qwen3 models via Hugging Face · no Electron, no Python, no cloud.
crates/platform authorized roots, no-follow handles, protected paths
crates/file-indexer scanner + SQLite index
crates/organization pure planning (categories, dates, matching rules)
crates/storage storage findings
crates/safety the ONLY crate that mutates files (validate → approve → journal → execute → verify → undo)
crates/agent-runtime request engine (intent.rs), model client and catalog
apps/desktop Tauri app: chat · storage explorer · history · models
native/inference small llama.cpp worker
- Chat that plans, reviews and executes · whole-folder Trash · Put back
- Whole-disk explorer with cached sizes · duplicates · bulk renames · extension changes
- Local models with your own Hugging Face GGUFs
- Signed & notarized builds, auto-update (opt-in)
- Text search inside PDFs/Office docs · near-duplicate photos
- Windows & Linux · “recipes” you can share · keyboard-first mode
More in docs/IDEAS.md — many are marked good first issue.
Tidy is built in the open and wants your ideas: new request phrases, file categories, model recipes, translations, design feedback, bug reports. Start with CONTRIBUTING.md, open an Idea issue, or say hi in Discussions. If Tidy saved you an afternoon, a ⭐ helps others find it.
Tauri · llama.cpp · Qwen · Hugging Face · lucide · nlohmann/json
MIT. Bundled llama.cpp and nlohmann/json licenses ship in apps/desktop/src-tauri/resources/inference/.











