📷 Open source · Desktop app

Photo triage and editing
without leaving the keyboard

Load a folder, browse with arrow keys, move keepers to your album, and edit — all in one fast keyboard-driven workflow. With AI edit powered by Claude or a local Ollama model.

⬇ Get started on GitHub Read the docs
⌨️ Keyboard-first 🎞 20 film simulations ✨ AI edit (Claude & Ollama) 🐍 Python · PyQt6 📄 MIT License
Image Selector — triage view

Everything you need to sort and edit a shoot

From card dump to finished selects — without touching the mouse.

⌨️

Keyboard-first triage

Browse with ← →, move keepers to Album with ↑, send back with ↓, delete to trash with Del. Tab switches focus between Library and Album panels.

🔎

Zoomable preview

Mouse wheel zooms centred on the cursor. Left-drag to pan. Double-click to fit. Zoom resets automatically when you navigate to the next image.

🎨

Non-destructive editing

Full-screen edit mode with Brightness, Contrast, Exposure, Saturation, Shadows, and Highlights sliders. The original file is never touched until you click Save As.

🎞

20 film simulations

Fujifilm-inspired looks: Provia, Velvia, Astia, Classic Chrome, Acros, Neopan 1600, T64, Pro 400H, Superia, and more. A filter manager lets you hide the ones you never use.

AI edit suggestions

Type a prompt — "warm cinematic look", "too dark fix it" — and all sliders update automatically. Works with Claude (Anthropic API) or a local Ollama vision model for free.

✂️

Crop tool

Interactive crop overlay with 8 drag handles, aspect-ratio locked to the original, and a rule-of-thirds grid. Confirm with Enter or the Apply Crop button.

🔄

Rotate

Quick rotate 90° CW with R in triage (saves immediately). Rotate left / right in edit mode as part of the non-destructive pipeline — applied only at save time.

🛡️

File safety

Moves preserve original timestamps. Deletes go to the system trash. Saves write to a temp file first then rename atomically — the original is safe until the write succeeds.

↩️

Undo & history

Single-level undo for moves (Ctrl+Z). AI edits can be undone with a dedicated ↩ Undo AI button that appears after each suggestion is applied.

Describe the look — AI does the rest

Type a natural-language prompt and every slider updates automatically. Works with two backends.

✨ Claude (Anthropic API)

Best image understanding. ~$0.01–0.02 per suggestion. Requires an API key from console.anthropic.com.

🖥 Ollama (free, local)

Runs entirely on your machine — no account, no cost, no internet. Install Ollama, pull a vision model (gemma3n recommended), and the button enables automatically.

too dark and flat warm cinematic look convert to black and white documentary street feel fix overexposure rotate left

After each suggestion an ↩ Undo AI button appears — one click restores the previous state exactly.

Image Selector — edit mode with AI panel

20 Fujifilm-inspired looks

All tone curves computed analytically in NumPy — no external LUT files. A ⚙ Manage button lets you hide the ones you don't use.

Provia
Velvia
Astia
Classic Chrome
Classic Neg
Acros ●
Eterna
Sepia ●
Faded / Matte
Cross Process
Fortia SP
Neopan 1600 ●
T64 (Tungsten)
Pro 800Z
Pro 400H
Pro 160C
Pro 160S
Superia 1600
Superia 400
Superia 100

● Monochrome

Up and running in minutes

Python 3.11+, Linux / macOS / Windows. No build step — just clone and run.

1

Clone and create a virtual environment

You'll need Python 3.11+ and Git. A virtual environment keeps dependencies isolated.

2

Install dependencies

One pip command installs PyQt6, OpenCV, Pillow, and everything else listed in requirements.txt.

3

Run

Launch with bash launch.sh — it activates the venv automatically. On first launch you'll be asked to choose a Library and Album folder.

# Clone the repository
git clone https://github.com/mnavas/image-selector.git
cd image-selector

# Create and activate a virtual environment
python3 -m venv .venv
source .venv/bin/activate   # Windows: .venv\Scripts\activate

# Install dependencies
pip install -r requirements.txt

# Run
bash launch.sh              # or: python main.py

For platform-specific system packages (Linux libxcb, etc.), desktop launcher setup, AI Edit API key configuration, and Claude Code MCP registration see docs/installation.md.

Help make it better

Image Selector is open source and welcomes contributions of any size.

🐛

Report a bug

Found something that crashes or behaves unexpectedly? Open an issue on GitHub with steps to reproduce and your OS / Python version.

Open an issue →
💡

Suggest a feature

Have an idea for a new filter, keyboard shortcut, or workflow improvement? Open a feature request issue and describe what you'd like to see.

Request a feature →
🔧

Submit a pull request

Fork the repo, create a branch, and send a PR. Check docs/architecture.md first — it explains the module structure and design decisions.

Fork on GitHub →
📖

Improve the docs

Spotted a gap in the user guide or installation instructions? Docs are plain Markdown in the docs/ folder — easy to edit and submit.

Browse the docs →

Keep Image Selector free and actively maintained

Image Selector is built and maintained as a side project. It's free and open source — but development tools, time, and motivation all have a real cost.

If the app saves you time sorting and editing your photos, consider sponsoring the project. Every contribution helps keep it maintained and improving.

All contributions go directly to the developer. No company, no VC behind this.

📄 MIT License

Free and open source

Image Selector is released under the MIT License. Use it, fork it, modify it. No restrictions, no telemetry, no vendor lock-in.

View on GitHub →