🇬🇧 English · 🇧🇷 Português
Organize messy folders with a local AI — catalog, rename and tidy your files 100% offline.
Point files-organizer at a folder full of loose files. It reads each one, extracts metadata, and uses
a small local LLM (Qwen2.5, via llama.cpp) to infer a clean, human-readable title, tags and file
name. It generates thumbnails, builds a searchable SQLite catalog, and can either move & rename
everything into tidy category folders — fully reversible — or just analyze in place without touching a
single file.
No cloud. No API keys. No telemetry. Your files never leave your machine.
Example —
IMG_2024_final (2).pdf→Nota Fiscal 004512 - Padaria Aurora.pdf(category:documentos)
flowchart TD
IN["📁 Folder (inbox)"] --> SC["Scan<br/>sha256 + file type"]
SC --> EX["Extract<br/>text · EXIF · metadata"]
EX --> LLM["🧠 Local LLM (Qwen2.5)<br/>title · summary · tags · name"]
LLM --> TH["🖼️ Thumbnail"]
LLM --> MODE{"Mode"}
MODE -->|"Organize"| ORG["Move + rename<br/>Category/Readable name"]
MODE -->|"Analyze"| ANA["Catalog only<br/>nothing is moved"]
ORG --> DB[("SQLite<br/>catalog + FTS5")]
ANA --> DB
TH --> DB
ORG --> UND["_DEPARA.csv + Undo"]
ANA --> REP["_ANALISE.csv"]
DB --> EXP["🔎 Explorer<br/>search · grid · move/rename"]
- Scan — walks the folder, computes a
sha256(dedup) and detects the real type by magic bytes. - Extract — pulls text from PDF/DOCX/TXT/MD, EXIF/size from images, and generic filesystem metadata.
- Enrich (LLM) — the local model returns strict JSON:
title,summary,category,tags,suggested_name. Falls back to a heuristic when no model is present. - Organize or Analyze — either move+rename into
Category/folders, or just catalog in place. - Catalog — everything lands in a WAL-mode SQLite database with full-text search (FTS5) and thumbnails.
| 🗂️ Two modes | Organize (move + rename, reversible) or Analyze only (catalog in place, nothing moved). |
| 🧠 Local LLM | Qwen2.5-0.5B via llama-cpp-python, auto-detected in models/. Heuristic fallback with no model. |
| ✍️ Readable names | Real names with spaces & accents, e.g. 2026-07-25 Contrato de Prestação de Serviços.pdf. |
| 🔁 Reversible | Every move is logged; one-click Undo + a human-readable _DEPARA.csv (old ↔ new path + sha256). |
| 🖼️ Thumbnails | Real previews for images (and PDFs with PyMuPDF); everything else gets a category icon. |
| 🔎 Explorer | Browse by category, full-text search (FTS5), grid/list views, and move/rename items (updates the DB). |
| 🛡️ Safe archives | For zip/tar, inspects the contents without extracting — flags path traversal, symlinks and zip-bombs. |
| 🧹 Extension filter | Include-list ("only these") or exclude-list ("everything but these"). |
| 💻 Cross-platform | Windows & Linux, self-contained, fully offline. |
- Organize — moves each file to
Organized/<Category>/<readable name>.<ext>. The destination is cleaned into a timestamped_backup_…/first (never deleted), and every action is reversible. - Analyze only — reads and catalogs a folder in place (metadata, LLM title/tags, thumbnails,
SQLite) and writes an
_ANALISE.csvwith suggestions. Nothing is moved or renamed. You can later open that folder in the Explorer and move/rename items one by one if you want.
Grab a build from Releases:
files-organizer-<version>.zip— portable bundle (most reliable). See INSTALL.md..exe(Windows) ·.AppImage/.deb(Linux) — native installers, built by CI when available.
Then download the model once (auto-detected in models/):
bash models/download-model.sh # Linux/macOS
powershell -ExecutionPolicy Bypass -File models\download-model.ps1 # WindowsRequirements: Python 3.10+ and Node.js 18+.
# Linux/macOS
bash scripts/setup.sh # venv + deps + renderer build
bash scripts/install-linux.sh # desktop shortcut (optional)
./run-app.sh# Windows (PowerShell)
powershell -ExecutionPolicy Bypass -File scripts\setup.ps1
powershell -ExecutionPolicy Bypass -File scripts\install-windows.ps1
.\run-app.batThe UI is Electron; the heavy lifting is a persistent Python worker they talk to over stdio. The SQLite catalog is the shared state — Python writes it, the renderer reads it directly for a snappy UI.
flowchart LR
subgraph UI["Electron · UI"]
REN["Renderer (React)"]
PRE["preload"]
MN["main"]
REN <--> PRE <--> MN
end
subgraph PY["Python · worker"]
WK["worker (stdio)"]
PIP["pipeline"]
WK --> PIP
end
MN <-->|"newline-delimited JSON (stdio)"| WK
PIP --> LC["llama.cpp<br/>Qwen2.5-0.5B"]
PIP -->|"writes"| DB[("SQLite<br/>WAL · FTS5 · thumbs")]
REN -.->|"reads (better-sqlite3)"| DB
backend/organizer/ # Python worker
scan.py # walk + sha256 + type detection
extract/ # pdf, docx, txt, images (EXIF)
llm.py # llama.cpp wrapper + heuristic fallback
organize.py # move / rename / undo
security.py # safe archive inspection (no extraction)
pipeline.py # scan → extract → LLM → organize/analyze
worker.py # stdio JSON-RPC entrypoint
frontend/ # Electron + React + TypeScript
electron/ # main · preload · worker bridge · sqlite reader
src/ # React UI (Organize / Explorer tabs)
scripts/ # setup, shortcut installers, icon/bg, release
models/ # GGUF model (downloaded, not committed)
cd backend && python3 -m venv .venv && . .venv/bin/activate && pip install -e ".[dev]"
pytest # 26 backend tests (no model required)
cd ../frontend && npm install && npm run devPolyForm Noncommercial License 1.0.0 — free to download, use, study, modify and redistribute for non-commercial purposes. Commercial use is not permitted. See LICENSE.