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.2.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.2-py3-none-any.whl (65.7 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for pixeldump-0.1.2.tar.gz
Algorithm Hash digest
SHA256 08d62ff5e0e3ced6162bd9e92510ad5f90547685355fa217a373b7e717256383
MD5 93bf722b7fa8336c0c9c3baf8e48e76e
BLAKE2b-256 86c2e115caf8d24602143666cd290685a711151932142d60075a00d22e66c4c8

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for pixeldump-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 dbe7e449d6a9e20e0221197921b286723be6c177d7303a608d81315186e12cd4
MD5 41ad9f05ab63e27777e6a88d8de6ba0b
BLAKE2b-256 bc0d9007ca764f8be8291dde6a5f00d0c4ac8fae3c41e511fa695413a1eec239

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