Skip to main content

Gen-Z-flavored AI photo organizer CLI/TUI

Project description

  ____  _____  ___  _  _____  ___   _   _  __  __  ____
 |  _ \|_ _\ \/ / |/ \|  _  || _ \ | | | ||  \/  ||  _ \
 | |_) || | \  /| | _ | |_| || | || | | | || |\/| || |_) |
 |  __/ | | /  \| ||_||  _  || |_||_|_|_|||_|  |_||  __/
 |_|   |___/_/\_\_|   |_| |_||___/         |_|     |_|

because your camera roll is a cry for help ๐Ÿซ 

Python 3.10+ License: MIT Tests Type Checked

PixelDump is an agentic AI photo organizer that uses vision LLMs to sort your camera roll into intelligently named folders. It deduplicates near-identical shots, groups photos into events, and writes folder names with the energy of a chronically-online friend.


โœจ what it does

  • ๐Ÿ“ธ Sorts photos into events โ€” uses EXIF dates + GPS clustering, not just "by year"
  • ๐Ÿง  Vision-LLM classification โ€” Claude Code (no API key), Claude API, or local Ollama (Gemma 3 / LLaVA)
  • ๐Ÿ’€ Catches duplicates โ€” exact (SHA-256) and near-duplicate (perceptual hash)
  • ๐Ÿท๏ธ Three naming vibes โ€” corporate, chaotic, or unhinged (your call)
  • ๐Ÿ“‚ Granular document routing โ€” screenshots, bills, boarding passes, prescriptions, and more each land in their own typed folder automatically
  • โ†ฉ๏ธ Undo support โ€” every move is logged in a manifest, fully reversible
  • ๐Ÿ›Ÿ Dry-run by default โ€” preview before anything moves
  • ๐Ÿ” Resumable โ€” interrupt a run, pick up where you left off
  • ๐Ÿงพ Receipt at the end โ€” stats, easter eggs, and a roast

๐Ÿš€ quick start

pip install pixeldump
pixeldump run ~/Pictures/CameraRoll

The first run drops you into an interactive wizard. After that, flags are your friends:

# show me what you'd do, don't actually move anything (default)
pixeldump run ~/Photos --dry-run

# yes, do it
pixeldump run ~/Photos --apply

# use claude-code provider (no API key needed)
pixeldump run ~/Photos --provider claude-code --apply

# corporate mode, sass off, batch hard
pixeldump run ~/Photos --mode corporate --sass 0 --apply

# how much will Claude cost me?
pixeldump run ~/Photos --estimate

# undo the last run
pixeldump undo ~/Photos/.pixeldump/manifests/20260509_143022.json

๐Ÿท๏ธ naming modes (with real examples)

The vision model looks at the photos and writes the folder name based on what it actually sees. Pick your aesthetic:

Mode Example output
--mode corporate ๐Ÿข 2024_03/tokyo_client_summit/ ยท 2024_06/sarah_alex_wedding_tuscany/ ยท 2024_07/team_offsite_q2_2024/
--mode chaotic ๐Ÿ”ฅ 2024_03/ate_in_tokyo_fr/ ยท 2024_06/main_character_bali_era/ ยท 2024_07/family_chaos_thanksgiving/
--mode unhinged ๐Ÿซ  2024_03/proof_i_touched_grass/ ยท 2024_06/the_yassification_of_brunch/ ยท 2024_07/my_villain_era_in_milan/

๐Ÿง  provider setup

PixelDump supports three vision providers. Run pixeldump setup to configure whichever you want.

Claude Code (recommended โ€” no API key required):

If you already have Claude Code installed and logged in, PixelDump reuses your existing session. Nothing extra to configure.

# confirm claude is on your PATH
claude --version
pixeldump setup   # pick "claude-code"

Claude API (best accuracy, pay-per-use):

export ANTHROPIC_API_KEY=sk-ant-...
pixeldump setup   # pick "claude"

Ollama (fully local, free, slower):

# install ollama from https://ollama.com
ollama pull gemma3
pixeldump setup   # pick "ollama"

Auto-detection order when --provider auto (the default): claude-code โ†’ claude API โ†’ ollama. Override with --provider claude-code, --provider claude, or --provider ollama.

๐Ÿ“ output structure

After a run, your photo directory looks like this:

Photos/
โ”œโ”€โ”€ 2024/
โ”‚   โ”œโ”€โ”€ 2024_03/                        # month folder groups all events from that month
โ”‚   โ”‚   โ”œโ”€โ”€ ate_good_in_tokyo/          # LLM-named event subfolders live inside
โ”‚   โ”‚   โ””โ”€โ”€ cherry_blossom_picnic/
โ”‚   โ”œโ”€โ”€ 2024_06/
โ”‚   โ”‚   โ”œโ”€โ”€ sarah_alex_wedding_tuscany/
โ”‚   โ”‚   โ””โ”€โ”€ main_character_bali_era/
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ screenshots/                    # document-type folders sit flat under the year
โ”‚   โ”œโ”€โ”€ screenshots_apps/
โ”‚   โ”œโ”€โ”€ screenshots_conversations/
โ”‚   โ”œโ”€โ”€ screenshots_social/
โ”‚   โ”œโ”€โ”€ screenshots_memes/
โ”‚   โ”œโ”€โ”€ screenshots_web/
โ”‚   โ”œโ”€โ”€ screenshots_maps/
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ documents_receipts/
โ”‚   โ”œโ”€โ”€ documents_bills/
โ”‚   โ”œโ”€โ”€ documents_financial/            # bank statements, credit cards, tax docs, paychecks
โ”‚   โ”œโ”€โ”€ documents_ids/                  # passports, licences, insurance cards, visas
โ”‚   โ”œโ”€โ”€ documents_travel/               # boarding passes, hotel confirmations, event tickets
โ”‚   โ”œโ”€โ”€ documents_medical/              # prescriptions, lab results, vaccine records
โ”‚   โ”œโ”€โ”€ documents_legal/                # contracts, leases, certificates
โ”‚   โ””โ”€โ”€ documents_misc/                 # menus, business cards, whiteboards, QR codes
โ”‚
โ”œโ”€โ”€ 2023/
โ”‚   โ””โ”€โ”€ ...
โ”œโ”€โ”€ _review/
โ”‚   โ”œโ”€โ”€ duplicates/        # near-identical shots โ€” highest-res copy kept
โ”‚   โ”œโ”€โ”€ no_date/           # photos with no EXIF date
โ”‚   โ””โ”€โ”€ low_confidence/    # photos the AI wasn't sure about (confidence < 0.5)
โ””โ”€โ”€ .pixeldump/
    โ”œโ”€โ”€ manifests/         # one JSON per run, used for undo
    โ”œโ”€โ”€ runs/              # per-run logs
    โ””โ”€โ”€ thumbnails/        # cached thumbnails

Events land in YYYY/YYYY_MM/event_name/ so each month is its own browsable folder. Documents and screenshots sit flat under the year (YYYY/documents_receipts/) since they accumulate all year and don't need month grouping.

๐Ÿงฐ all flags

pixeldump run TARGET [OPTIONS]

  --provider [claude-code|claude|ollama|auto]  vision LLM provider (default: auto)
  --mode [corporate|chaotic|unhinged]  folder name vibe (default: chaotic)
  --sass [0-3]                         personality intensity (default: 2)
  --burst-hours INT                    event clustering gap (default: 72h)
  --batch-size INT                     photos per LLM batch (default: 5)
  --concurrency INT                    parallel hashing workers (default: 4)
  --include-videos                     also sort .mp4/.mov by date
  --skip-duplicates                    don't run dup detection
  --skip-clustering                    classify each photo individually
  --output PATH                        sort into a different dir (copy mode)
  --dry-run / --apply                  preview vs. execute (default: dry-run)
  --quiet                              minimal output, no live dashboard
  --no-wizard                          skip the interactive wizard
  --estimate                           print cost estimate and exit

pixeldump undo MANIFEST [--yes]        reverse a previous run
pixeldump status TARGET                show the most recent manifest
pixeldump config [--reset]             show or reset config
pixeldump setup                        re-run provider setup

๐Ÿ’ธ cost

Claude Code: free โ€” runs inside your existing Claude Code subscription, no extra charges.

Claude API: rough rule of thumb ~$0.001 per photo, since PixelDump batches photos by event and sends one classification call per cluster (not per photo). A 1,500-photo library typically costs under $2. Use --estimate to see the exact number for your library before running.

Ollama: free, just slower. Bring your GPU energy.

๐Ÿ”’ your photos stay yours

  • Claude Code reuses your local CLI session โ€” 512px thumbnails are passed to the local claude process, same data boundary as using Claude Code interactively
  • Local Ollama sees nothing leave your machine
  • Claude API receives 512px thumbnails (not full-resolution photos), and Anthropic does not train on API inputs
  • Nothing is ever deleted. Files are moved, never removed. Every operation is logged and reversible.
  • Config files containing API keys are written with owner-only permissions (mode 0600)

๐Ÿ› ๏ธ development

git clone https://github.com/your-handle/pixeldump
cd pixeldump
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pre-commit install

make test           # pytest
make lint           # ruff
make typecheck      # mypy --strict

Architecture: see docs/ARCHITECTURE.md. Contributing: see .github/CONTRIBUTING.md.

๐Ÿค contributing

Issues and PRs welcome. Look for good first issue labels. The sass engine especially welcomes new lines โ€” see src/pixeldump/assets/sass_lines.json.

๐Ÿ“œ license

MIT. See LICENSE.


built by me because my photos folder was a crime scene

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

pixeldump-0.1.1.tar.gz (50.8 kB view details)

Uploaded Source

Built Distribution

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

pixeldump-0.1.1-py3-none-any.whl (65.7 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for pixeldump-0.1.1.tar.gz
Algorithm Hash digest
SHA256 e9a8896bb28776c85ea39dd12259f6389a1bba36d18d301eb8f7818346bb5a0a
MD5 75974d996a35b4399fe650cefe7921df
BLAKE2b-256 31bb29a6ba2425154c63119e22f99a34fdf0f10f0d97d31dd8e1d64004bfc755

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for pixeldump-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 331c1bf451162b011cd4df419445f011a016686be332c50588f2bb933547a95f
MD5 976a52f840543e30487cb003c8d8b584
BLAKE2b-256 ce986fe1f5dad4e02aa0e3c2ec7db05395283c9b5ba289858e689bfc2e0b76cf

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