This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady
What I Built
Sloth Tidier is a local agent that cleans up your Downloads folder while you nap.
My Downloads folder is a landfill of Scan_0042.pdf, Screenshot 2026-09-14 at 3.12.07 PM.png, and final_FINAL_v3.docx. Sorting it is the chore I put off forever. Sloth Tidier reads each file (text, PDFs, DOCX, screenshots, photos), asks an open-weight model running on my own machine where it belongs and what to call it, and moves it:
-
Scan_0042.pdf→Taxes/2026/2026-03 Property Tax Bill.pdf - A screenshot of a receipt →
Receipts/ - An installer →
Installers/
It's built to be lazy at every step. It shows a plan first and moves nothing until I press y. Every batch can be reverted with one undo command. Or I can run it in watch mode and never think about it again.
It's for anyone with a messy folder who doesn't want to hand their tax forms, medical letters, and bank statements to a cloud API just to get them sorted.
Code
https://github.com/Aishwaryajadhav11/sloth-tidier
It's a single Python file with no required dependencies beyond the standard library (pypdf is optional, for PDF text), plus a README.
ollama pull qwen2.5:3b && ollama pull qwen2.5vl:3b
pip install pypdf
python sloth_tidier.py plan
| Command | What it does |
|---|---|
plan |
Shows what it would move, asks y/N, then applies |
run |
Plans and applies with no questions |
watch |
Rescans every 5 minutes and tidies in the background |
undo |
Puts the last batch back where it was |
How I Built It
-
Open-weight models, served locally by Ollama.
qwen2.5:3bhandles text, PDFs, and DOCX.qwen2.5vl:3bhandles screenshots and photos. Both are small models meant for local use. -
Structured output. Ollama's JSON mode makes the model return
{folder, filename, year, reason}for each file. The prompt asks for a date in the filename only when one clearly appears in the content, and never an invented one. -
Guardrails around the model. The model can only choose from a category list I define, and anything unexpected falls into
Misc. Filenames are sanitized, existing files are never overwritten (collisions get(2)), and nothing is ever deleted. Files modified in the last 60 seconds, or ending in.crdownloador.part, are skipped so it doesn't grab half-finished downloads. -
Plan, apply, undo. The default flow shows the plan and asks before moving. Each move is logged to
~/.sloth_tidier/log.jsonl, andundoreverses the last batch. - Graceful fallback. If Ollama isn't running, it sorts by file extension instead of failing.
The whole thing is one file, so changing the categories, the filename style, or the prompt means editing plain text.
Why Does Open Innovation Matter?
Privacy is the whole point. The files that pile up in Downloads are tax forms, medical letters, bank statements, and receipts. Uploading those to a hosted API just to rename them is a bad trade for a low-stakes chore. The only network call Sloth Tidier makes is to Ollama on localhost, so file contents never leave the machine, and it needs no internet connection once the models are downloaded.
It costs nothing to run, so it can run constantly. A tidier that wakes up every few minutes would be a metered bill with a closed API. Locally, the cost is electricity.
I can change how it behaves. My categories, filename conventions, and prompt are all plain text. If a model picks bad filenames, I edit the prompt. If I want better judgment, I swap the model with one flag (--model) instead of waiting on a vendor or absorbing a pricing change.
Where a closed model would likely win. A large hosted model is probably better at ambiguous files than a 3B model. I designed around that instead of pretending otherwise: the plan-first flow and one-command undo make a wrong guess cheap, which I think is a fair price for keeping my documents private.
Prize Categories
Open to any partner categories this fits.
Top comments (0)