Skip to main content

LLM-powered directory organizer using Google Gemini

Project description

sortai

LLM-powered directory organizer. Uses Google Gemini to suggest a folder structure from filenames and (for text-based files) the first ~500 characters of content, then moves files into the suggested subfolders.

  • Dry-run by default – see exactly what would move where before touching anything.
  • Confirm before apply – with --apply, you are prompted to confirm before any files are moved.

📦 PyPI Package: https://pypi.org/project/sortai/0.1.0/

Install

Install from PyPI:

pip install sortai

Or view the package on PyPI.

Development install from source:

git clone https://github.com/ajs2583/sortai.git
cd sortai
pip install -e .

Setup

Set your Google Gemini API key (required):

export GEMINI_API_KEY=your_key_here

Get a key at: https://aistudio.google.com/app/apikey

You can copy .env.example to .env and set GEMINI_API_KEY there; load it with your shell or a tool like python-dotenv if you use one (sortai does not load .env automatically).

Demo

Demo

(Placeholder: add a short GIF showing sortai ./folder, dry-run output, then --apply and confirmation.)

Usage

Command Description
sortai <path> Dry-run: show what would be moved where (default).
sortai <path> --apply After dry-run, prompt and then actually move files.
sortai <path> --depth 2 Organize up to 2 levels of subfolders (e.g. documents/work).
sortai <path> --model gemini-2.5-flash Override Gemini model (default: gemini-2.5-flash).
sortai --version Print version.
sortai --help Show help.

Example output

Before (flat directory):

my-folder/
├── report.pdf
├── notes.txt
├── budget.csv
├── vacation.jpg
└── readme.md

Dry-run:

$ sortai ./my-folder
Dry run – would move:
  report.pdf  ->  documents/
  notes.txt   ->  documents/
  budget.csv  ->  finance/
  vacation.jpg ->  images/
  readme.md   ->  (keep at root)
Run with --apply to perform moves.

After applying:

my-folder/
├── readme.md
├── documents/
│   ├── report.pdf
│   └── notes.txt
├── finance/
│   └── budget.csv
└── images/
    └── vacation.jpg

Supported file types for content reading

sortai reads the first ~500 characters of content for:

  • .pdf (first page via pdfplumber)
  • .txt, .md, .csv (plain text)
  • .docx (paragraph text via python-docx)

All other files are categorized by filename and extension only.

Releasing

GitHub Releases (Automated)

  1. Bump version in pyproject.toml and sortai/__init__.py (e.g., 0.1.00.1.1).

  2. Commit and push:

    git add pyproject.toml sortai/__init__.py
    git commit -m "Bump version to 0.1.1"
    git push
    
  3. Create and push a tag:

    git tag v0.1.1
    git push origin v0.1.1
    
  4. GitHub Actions will automatically:

    • Verify version consistency
    • Build the package (wheel + sdist)
    • Create a GitHub release with release notes
    • Attach the built artifacts

The workflow triggers on tags matching v*.*.* (e.g., v0.1.0). You can also trigger it manually from the Actions tab.

Publishing to PyPI

  1. Create a PyPI account (and optionally Test PyPI for testing):

  2. Install build tools (one-time):

    pip install build twine
    
  3. Bump version in pyproject.toml and sortai/__init__.py when releasing a new version.

  4. Build the package (from the project root):

    python -m build
    

    This creates dist/sortai-0.1.0.tar.gz and a wheel.

  5. Upload to PyPI (manual):

    twine upload dist/*
    

    Twine will prompt for your PyPI username and password. Prefer an API token (username: __token__, password: your token) over your account password.

    Or enable automated PyPI upload: Add your PyPI API token as a GitHub secret named PYPI_API_TOKEN, then edit .github/workflows/release.yml and change if: false to if: true in the "Upload to PyPI" step. Releases will then automatically publish to PyPI.

    To try Test PyPI first:

    twine upload --repository testpypi dist/*
    

    Then install with: pip install -i https://test.pypi.org/simple/ sortai

Note: If the name sortai is already taken on PyPI, change the name in pyproject.toml to something unique (e.g. sortai-cli) and publish under that name.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sortai-0.1.1.tar.gz (10.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sortai-0.1.1-py3-none-any.whl (10.4 kB view details)

Uploaded Python 3

File details

Details for the file sortai-0.1.1.tar.gz.

File metadata

  • Download URL: sortai-0.1.1.tar.gz
  • Upload date:
  • Size: 10.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.1

File hashes

Hashes for sortai-0.1.1.tar.gz
Algorithm Hash digest
SHA256 363e419763386f184e71d82d170674f56a796bbd6aefca7ca012485fc38f00f9
MD5 eb188fb13ed88c96015ec7c7fd4678c1
BLAKE2b-256 25f8448d151bb357be45b7c9dbde63fabd2ee9f58e661fdc24887ffdbb0966e9

See more details on using hashes here.

File details

Details for the file sortai-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: sortai-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 10.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.1

File hashes

Hashes for sortai-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 6cdc2c8cc02bd19388fac8900dfcdd2de6a76dc69eddef620aa0fb822877cd85
MD5 166b6aeed369984d9249f4d3cfb35677
BLAKE2b-256 7aec83054e2444eb99229deab29f241db9bffd944eb39730e4d8b32163db1775

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page