Skip to main content

Pikapika Organizer — Downloads Folder Organizer

Pikapika Logo

Automatically organize your files by extension with one command

Python 3.13 MIT License uv compatible CI Release

📚 View Documentation | 🐍 PyPI Package | 🐛 Report Issues

“Pika Pika (ピカピカ)” is an onomatopoeia in Japanese, meaning “shiny” or “sparkly”. This project is mainly used to clean your folders of clutter and manage them efficiently. It automatically files items into category folders (Images, Documents, Archives, Installers, etc.) and optionally quarantines junk files such as partial downloads.

Built with Python 3.13 and the uv workflow.


Features

  • Dry run mode (--dry-run) shows every planned move before mutating files.
  • Category routing using an editable extension map in src/pikapika/__init__.py.
  • Junk handling for extensions like .crdownload, .tmp, .part: quarantine them or send them to the Recycle Bin (via send2trash).
  • Duplicate safety — automatically renames conflicts (file (1).pdf).
  • Recursive mode to organize nested folders while skipping known system directories (.git, __pycache__, etc.).

Requirements

  • Python 3.13+
  • uv for dependency and virtualenv management

Optional:

  • send2trash (installed automatically) if you want junk files to go to the system trash instead of _Quarantine.

Installation

pip install pikapika-organizer

Install from GitHub Packages

uv add --index-url https://python.pkg.github.com/arizmuajianisan/ pikapika-organizer

Or for temporary installation:

uv pip install --index-url https://python.pkg.github.com/arizmuajianisan/ pikapika-organizer

Useful helpers are available via make:

make help
# test, check, format, run, clean, ...

If you prefer plain commands:

uv run pytest              # run tests
uv run ruff check          # lint
uv run ruff format         # format
uv run pikapika-organizer --dry-run  # execute CLI

Usage

Run commands from the project root (or install the package and use the pikapika-organizer entry point globally).

uv run pikapika-organizer --help

Common flags

Flag Description
--path PATH Downloads directory to organize. Defaults to the current user's Downloads.
--dry-run Print intended operations without touching the filesystem.
--recursive Walk subdirectories (skips known system folders automatically).
--quarantine-junk Move old junk files to _Quarantine.
--junk-days N Minimum age (days) for junk files before action (default: 7).
--trash-junk Send junk files to the OS trash (requires send2trash).

Examples

# Preview current user's Downloads
uv run pikapika-organizer --dry-run

# Organize a specific folder for real
uv run pikapika-organizer --path "D:\Downloads" 

# Go recursive and quarantine stale junk (>= 10 days old)
uv run pikapika-organizer --recursive --quarantine-junk --junk-days 10

# Send junk to Recycle Bin instead of _Quarantine
uv run pikapika-organizer --quarantine-junk --trash-junk

Customizing categories

Edit the CATEGORIES dictionary in src/pikapika_organizer/__init__.py:

CATEGORIES = {
    "Images": {".png", ".jpg", ".svg"},
    "Documents": {".pdf", ".docx", ".md"},
    "Archives": {".zip", ".iso"},
}

Add or rename folders, or introduce new buckets (e.g., "DesignAssets", "DiskImages"). Always run with --dry-run after changes to verify they behave as expected.


Development workflow

uv sync --group dev   # install everything
make check            # lint (ruff)
make format           # format (ruff fmt)
make test             # run pytest suite
make run              # run CLI in-place

The test suite (tests/test_pikapika.py) covers:

  • extension categorization
  • duplicate handling
  • junk quarantine/trash flow
  • recursive traversal and skip logic

Release Process

This project uses automated releases via GitHub Actions, similar to release-it for JavaScript projects.

Quick Release (Recommended)

# Patch release (bug fixes)
make release-patch

# Minor release (new features)
make release-minor

# Major release (breaking changes)
make release-major

Manual Release Steps

# 1. Run the release script
uv run python scripts/release.py patch

# 2. The script will:
#    - Check git status is clean
#    - Run tests and linting
#    - Update version in pyproject.toml
#    - Build package
#    - Create and push git tag (e.g., v0.1.1)

# 3. GitHub Actions will automatically:
#    - Run comprehensive tests
#    - Build and validate package
#    - Publish to TestPyPI
#    - Verify TestPyPI installation
#    - Publish to production PyPI
#    - Create GitHub Release with changelog

Dry Run Mode

# Preview what would happen without making changes
uv run python scripts/release.py patch --dry-run

Release Workflow Details

  • Trigger: Git tags starting with v (e.g., v0.1.0, v1.2.3)
  • Testing: Multi-platform tests (Ubuntu, Windows, macOS)
  • Publishing: TestPyPI → PyPI (with verification)
  • Release Notes: Auto-generated changelog from git commits
  • Badges: Updated automatically after release

Troubleshooting

  • Hardlink warning during uv sync
    Set UV_LINK_MODE=copy (or run with uv sync --link-mode=copy) when working across filesystems that do not support hardlinks.

  • --trash-junk no-ops
    Ensure send2trash is installed (it is pulled in automatically when using uv sync --group dev). On Windows you might need to reopen the shell after installation.

  • Downloads path seems wrong
    Supply an explicit path with --path when using redirected or network-backed folders.


License

MIT — see the LICENSE file for details. Feel free to fork, tweak, and ship improvements. Contributions welcome!

Metadata

Release files for pikapika-organizer 0.9.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pikapika-organizer 0.9.0
File Size Uploaded
pikapika_organizer-0.9.0.tar.gz 10.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pikapika-organizer 0.9.0
File Interpreter ABI Platform
pikapika_organizer-0.9.0-py3-none-any.whl Python 3 none any Details

Total release size: 18.7 kB

Release files / pikapika_organizer-0.9.0.tar.gz

Download URL pikapika_organizer-0.9.0.tar.gz
Size 10.8 kB
Tags Source
SHA-256 checksum
How to use checksums
5dcb369111c9d0b56ccfa49264ad5b126f52c2560f775ded7c66d0a56a9a1e76
BLAKE2b-256 checksum
How to use checksums
60a0a1a34730357f9d5e9923faea1758c7b87845941a892dc8b211d2709e7c7f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / pikapika_organizer-0.9.0-py3-none-any.whl

Download URL pikapika_organizer-0.9.0-py3-none-any.whl
Size 7.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4a58d07e4d4db63678684ed9730a523b860a6fb75c902add7dd164fb40dcf6b5
BLAKE2b-256 checksum
How to use checksums
1b13c50974d5e432be584f9e0d898ab216db8bc78a8935496ab70a03b47db5ac
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release history Release notifications | RSS feed

This release

0.9.0 This release

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.3.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page