Metadata-Version: 2.4
Name: local-file-organizer
Version: 2.0.0a3
Summary: AI-powered local file management with state-of-the-art models
Author-email: Local File Organizer Team <noreply@example.com>
License: MIT OR Apache-2.0
Project-URL: Homepage, https://github.com/curdriceaurora/Local-File-Organizer
Project-URL: Documentation, https://github.com/curdriceaurora/Local-File-Organizer#readme
Project-URL: Repository, https://github.com/curdriceaurora/Local-File-Organizer
Project-URL: Issues, https://github.com/curdriceaurora/Local-File-Organizer/issues
Project-URL: Changelog, https://github.com/curdriceaurora/Local-File-Organizer/releases
Keywords: file-management,ai,organization,local-llm,privacy
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: End Users/Desktop
Classifier: License :: OSI Approved :: MIT License
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Desktop Environment :: File Managers
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Requires-Python: >=3.11
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: ollama>=0.1.0
Requires-Dist: Pillow>=10.0.0
Requires-Dist: nltk>=3.8.0
Requires-Dist: numpy>=1.24.0
Requires-Dist: tqdm>=4.66.0
Requires-Dist: typer[all]>=0.12.0
Requires-Dist: rich>=13.0.0
Requires-Dist: textual>=0.50.0
Requires-Dist: fastapi>=0.109.0
Requires-Dist: starlette>=0.35.0
Requires-Dist: aiofiles>=23.0.0
Requires-Dist: jinja2>=3.1.0
Requires-Dist: uvicorn[standard]>=0.27.0
Requires-Dist: websockets>=12.0
Requires-Dist: httpx>=0.26.0
Requires-Dist: python-multipart>=0.0.9
Requires-Dist: python-jose>=3.3.0
Requires-Dist: bcrypt<6.0.0,>=4.0.0
Requires-Dist: sqlalchemy>=2.0.0
Requires-Dist: alembic>=1.13.0
Requires-Dist: redis>=5.0.0
Requires-Dist: pyyaml>=6.0.0
Requires-Dist: platformdirs>=3.0.0
Requires-Dist: pydantic>=2.5.0
Requires-Dist: pydantic-settings>=2.1.0
Requires-Dist: email-validator>=2.1.0
Requires-Dist: python-dotenv>=1.0.0
Requires-Dist: click>=8.1.0
Requires-Dist: aiofiles>=23.0.0
Requires-Dist: watchdog>=3.0.0
Requires-Dist: psutil>=5.9.0
Requires-Dist: loguru>=0.7.0
Provides-Extra: parsers
Requires-Dist: PyMuPDF>=1.23.0; extra == "parsers"
Requires-Dist: python-docx>=1.0.0; extra == "parsers"
Requires-Dist: openpyxl>=3.1.0; extra == "parsers"
Requires-Dist: python-pptx>=0.6.0; extra == "parsers"
Requires-Dist: ebooklib>=0.18; extra == "parsers"
Requires-Dist: beautifulsoup4>=4.12.0; extra == "parsers"
Requires-Dist: lxml>=4.9.0; extra == "parsers"
Provides-Extra: web
Requires-Dist: fastapi>=0.109.0; extra == "web"
Requires-Dist: jinja2>=3.1.0; extra == "web"
Requires-Dist: uvicorn[standard]>=0.27.0; extra == "web"
Requires-Dist: websockets>=12.0; extra == "web"
Requires-Dist: httpx>=0.26.0; extra == "web"
Requires-Dist: python-multipart>=0.0.9; extra == "web"
Requires-Dist: python-jose>=3.3.0; extra == "web"
Requires-Dist: bcrypt<6.0.0,>=4.0.0; extra == "web"
Requires-Dist: redis>=5.0.0; extra == "web"
Provides-Extra: dev
Requires-Dist: pytest>=7.4.0; extra == "dev"
Requires-Dist: pytest-asyncio>=0.23.0; extra == "dev"
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
Requires-Dist: pytest-mock>=3.12.0; extra == "dev"
Requires-Dist: pytest-timeout<2.5.0,>=2.2.0; extra == "dev"
Requires-Dist: pytest-xdist>=3.5.0; extra == "dev"
Requires-Dist: pytest-randomly>=3.15.0; extra == "dev"
Requires-Dist: mypy>=1.8.0; extra == "dev"
Requires-Dist: types-PyYAML>=6.0.0; extra == "dev"
Requires-Dist: ruff>=0.1.0; extra == "dev"
Requires-Dist: black>=23.12.0; extra == "dev"
Requires-Dist: isort>=5.13.0; extra == "dev"
Requires-Dist: pre-commit>=3.6.0; extra == "dev"
Requires-Dist: codespell>=2.2.0; extra == "dev"
Requires-Dist: faker>=26.0; extra == "dev"
Requires-Dist: pytest-benchmark>=4.0; extra == "dev"
Requires-Dist: interrogate>=1.5.0; extra == "dev"
Requires-Dist: pymarkdownlnt>=0.9.25; extra == "dev"
Requires-Dist: deptry>=0.16.0; extra == "dev"
Requires-Dist: diff-cover>=7.0.0; extra == "dev"
Requires-Dist: asgi-lifespan>=2.1.0; extra == "dev"
Provides-Extra: cloud
Requires-Dist: openai>=1.0.0; extra == "cloud"
Provides-Extra: llama
Requires-Dist: llama-cpp-python>=0.2.0; extra == "llama"
Provides-Extra: mlx
Requires-Dist: mlx-lm>=0.0.19; platform_system == "Darwin" and extra == "mlx"
Provides-Extra: claude
Requires-Dist: anthropic>=0.20.0; extra == "claude"
Provides-Extra: gui
Requires-Dist: PyQt6>=6.6.0; extra == "gui"
Provides-Extra: audio
Requires-Dist: faster-whisper>=1.0.0; extra == "audio"
Requires-Dist: torch>=2.1.0; extra == "audio"
Requires-Dist: mutagen>=1.47.0; extra == "audio"
Requires-Dist: tinytag>=1.10.0; extra == "audio"
Requires-Dist: pydub>=0.25.0; extra == "audio"
Provides-Extra: video
Requires-Dist: opencv-python>=4.8.0; extra == "video"
Requires-Dist: scenedetect[opencv]>=0.6.0; extra == "video"
Provides-Extra: dedup
Requires-Dist: imagededup>=0.3.0; extra == "dedup"
Requires-Dist: scikit-learn>=1.4.0; extra == "dedup"
Requires-Dist: pypdf>=4.0.0; extra == "dedup"
Requires-Dist: striprtf>=0.0.26; extra == "dedup"
Provides-Extra: archive
Requires-Dist: py7zr>=0.20.0; extra == "archive"
Requires-Dist: rarfile>=4.1; extra == "archive"
Provides-Extra: scientific
Requires-Dist: h5py>=3.10.0; extra == "scientific"
Requires-Dist: netCDF4>=1.6.5; extra == "scientific"
Requires-Dist: scipy>=1.11.0; extra == "scientific"
Provides-Extra: cad
Requires-Dist: ezdxf>=1.1.0; extra == "cad"
Provides-Extra: build
Requires-Dist: pyinstaller>=6.0.0; extra == "build"
Provides-Extra: docs
Requires-Dist: mkdocs>=1.5.0; extra == "docs"
Requires-Dist: mkdocs-material>=9.5.0; extra == "docs"
Requires-Dist: pymdown-extensions>=10.7.0; extra == "docs"
Requires-Dist: mkdocs-minify-plugin>=0.8.0; extra == "docs"
Requires-Dist: mkdocstrings[python]>=0.24.0; extra == "docs"
Provides-Extra: search
Requires-Dist: rank-bm25>=0.2.0; extra == "search"
Requires-Dist: scikit-learn>=1.4.0; extra == "search"
Provides-Extra: all
Requires-Dist: local-file-organizer[archive,audio,build,cad,claude,cloud,dedup,dev,gui,llama,mlx,parsers,scientific,search,video,web]; extra == "all"
Dynamic: license-file

# File Organizer v2.0

[![CI](https://github.com/curdriceaurora/Local-File-Organizer/actions/workflows/ci.yml/badge.svg)](https://github.com/curdriceaurora/Local-File-Organizer/actions/workflows/ci.yml)
[![Docs](https://img.shields.io/badge/docs-user%20guide-blue)](docs/USER_GUIDE.md)

> AI-powered local file management. Local-first by default (Ollama, no cloud required) --
> or connect any OpenAI-compatible endpoint or Anthropic Claude when you need it.

**307 tests** | **334 modules** | **48+ file types** | Python 3.11+

## Features

- **AI-Powered Organization**: Qwen 2.5 3B (text) + Qwen 2.5-VL 7B (vision) via Ollama — or any OpenAI-compatible endpoint (OpenAI, LM Studio, vLLM) — or Anthropic Claude
- **Audio Transcription**: Local speech-to-text with faster-whisper (GPU-accelerated)
- **Video Analysis**: Scene detection and keyframe extraction
- **Copilot Chat**: Natural-language assistant -- "organize ./Downloads", "find report.pdf", "undo"
- **Organization Rules**: Automated sorting with conditions, preview, and YAML persistence
- **Terminal UI**: 8-view Textual TUI (Files, Analytics, Audio, History, Copilot, and more)
- **Web UI**: Browser-based interface via FastAPI and HTMX
- **Full CLI**: Organize, rules, suggest, dedupe, daemon, analytics, update, profiles
- **Auto-Update**: GitHub Releases checks with verified downloads and rollback
- **Intelligence**: Pattern learning, preference tracking, smart suggestions, auto-tagging
- **Deduplication**: Hash and semantic duplicate detection
- **Undo/Redo**: Full operation history
- **PARA + Johnny Decimal**: Built-in organizational methodologies
- **Cross-Platform**: macOS (DMG), Windows (installer), Linux (AppImage) executables

## Screenshots

![TUI overview](docs/assets/tui-overview.svg)

![TUI demo](docs/assets/tui-demo.gif)

## Quick Start

```bash
pip install -e .

# Pull models
ollama pull qwen2.5:3b-instruct-q4_K_M
ollama pull qwen2.5vl:7b-q4_K_M

# Organize files (dry run first)
file-organizer organize ./Downloads ./Organized --dry-run

# Launch the TUI
file-organizer tui
```

## Web UI (Preview)

Start the FastAPI server and open the UI:

```bash
uvicorn file_organizer.api.main:app --reload
```

Then visit `http://localhost:8000/ui/` for the HTMX interface.

## Documentation

- [User Guide](docs/USER_GUIDE.md)
- [CLI Reference](docs/cli-reference.md)
- [Configuration Guide](docs/CONFIGURATION.md)
- [Troubleshooting](docs/troubleshooting.md)
- [Getting Started](docs/getting-started.md)

## Optional Feature Packs

| Pack | Install Command | Features |
|------|----------------|----------|
| Cloud | `pip install -e ".[cloud]"` | OpenAI-compatible API provider (OpenAI, LM Studio, vLLM) |
| Claude | `pip install -e ".[claude]"` | Anthropic Claude API provider (text + vision) |
| LLaMA | `pip install -e ".[llama]"` | Local llama.cpp inference (GGUF models, no Ollama needed) |
| Audio | `pip install -e ".[audio]"` | Speech-to-text (faster-whisper, torch) |
| Video | `pip install -e ".[video]"` | Scene detection (OpenCV, scenedetect) |
| Dedup | `pip install -e ".[dedup]"` | Image deduplication (perceptual hashing) |
| Archive | `pip install -e ".[archive]"` | 7z and RAR archive support |
| Scientific | `pip install -e ".[scientific]"` | HDF5, NetCDF, MATLAB formats |
| CAD | `pip install -e ".[cad]"` | DXF and CAD format support |
| Build | `pip install -e ".[build]"` | Executable packaging (PyInstaller) |
| All | `pip install -e ".[all]"` | Everything above |

### Audio system dependencies

For full audio format support, the `[audio]` pack uses **FFmpeg** (all platforms) and optionally **CUDA + cuDNN** (NVIDIA GPU users).

**FFmpeg** — required for non-`.wav` formats (MP3, M4A, FLAC, OGG); optional if you only transcribe raw `.wav`:

```bash
# macOS
brew install ffmpeg

# Ubuntu / Debian
sudo apt install ffmpeg

# Windows (winget)
winget install ffmpeg
```

**CUDA + cuDNN** — optional, for significantly faster transcription (see [faster-whisper benchmarks](https://github.com/SYSTRAN/faster-whisper) for hardware-specific numbers):

```bash
# Install CUDA Toolkit from https://developer.nvidia.com/cuda-downloads
# Install cuDNN from https://developer.nvidia.com/cudnn

# Verify the full transcription backend (not just PyTorch)
python3 -c "from faster_whisper import WhisperModel; print('faster-whisper OK')"
python3 -c "import torch; print('CUDA:', torch.cuda.is_available())"
```

**Fallback behavior**: without FFmpeg, only `.wav` files are transcribed; other formats are organized by filename/metadata but not content-analyzed. Without CUDA, transcription runs on CPU (slower but fully functional).

See the [Installation Guide](docs/admin/installation.md) for troubleshooting and advanced configuration.

## Development

```bash
# Run tests
pytest

# Lint
ruff check src/
```

## Configuration

Config lives in `config/file-organizer/config.yaml` relative to your config home. Override with `FILE_ORGANIZER_CONFIG`.

---

**Status**: Alpha | **Version**: 2.0.0-alpha.1 | **Last Updated**: 2026-03-01
