A modern photo organization tool for sorting, grouping, and managing your photo library.
- Date Sorting - Group photos by year, month, or day
- Location Sorting - Automatic GPS-based grouping with reverse geocoding
- Camera Sorting - Organize by camera make/model
- Manual Location Tagging - Tag photos without GPS data
- Configurable Location Format - Choose suburb, city, or full address display
- Thumbnails - Large preview icons
- Tiles - Medium icons with metadata
- List - Compact rows
- Details - Table view with columns
- Duplicate Finder - Perceptual-hash scan with side-by-side review, auto-mark (keep largest/oldest/newest), and Recycle Bin cleanup
- Search Bar - Live filter by filename, camera, or location
- Type & Date Filters - Narrow by file format or date range presets
- Map View - GPS-tagged photos on an OpenStreetMap map with thumbnail popups
- Load videos alongside photos (MP4, MOV, AVI, MKV, WebM, M4V, WMV, and more)
- First-frame thumbnails with play badge, duration in the details panel
- Double-click opens your system video player
- Sort, group, search, rename, and move/copy videos like photos
- Dark (default) and Light themes - switch live in Settings β Display
- Batch Rename - Custom patterns (date, location, sequence)
- Move/Copy - Organize into folders with undo support
- Rotate - Lossless EXIF-based rotation
- Delete - Move to Recycle Bin (can be restored)
- Preview - Full-size preview with metadata panel
- Fullscreen Viewer - Double-click for fullscreen with zoom, pan, and keyboard navigation
- Explorer-style Selection - Ctrl+click to toggle, Shift+click for ranges
- Session Restore - Recent folders menu; reopens your last folder on startup
- β‘ Batch Processing - Chain multiple operations: Resize β Rotate β Rename β Watermark β WebP
- Mass Resize - Resize by percentage, max dimension, or exact size
- Text Watermark - Custom text with system fonts, color, and opacity
- Image Watermark - Use any image as a watermark (logos, signatures)
- WebP Conversion - Convert to WebP for optimized web uploads
- Output saved to subfolders (
Batch Processed/,Resized/,Watermarked/,WebP/)
- Standard: JPG, PNG, GIF, BMP, TIFF, WebP
- RAW: CR2, CR3, NEF, ARW, DNG, RAF, ORF, RW2
- HEIC/HEIF: iPhone photos
- Video: MP4, MOV, AVI, MKV, WebM, M4V, WMV, MPG, 3GP, MTS
- Python 3.10 or higher
- Windows 10/11 (primary), Linux/macOS (experimental)
# Clone the repository
git clone https://github.com/xersbtt/PhotoTidy.git
cd PhotoTidy
# Install dependencies
pip install -r requirements.txt
# Run the application
python main.pypip install pytest
python -m pytest tests/- Click π File menu to open folder, files, or add folders
- Drag & drop files or folders onto the window
| Shortcut | Action |
|---|---|
Ctrl+O |
Open folder |
Ctrl+F |
Focus search bar |
Ctrl+A |
Select all |
Ctrl+D |
Deselect all |
Ctrl+Click |
Toggle photo selection |
Shift+Click |
Select range |
Double-click |
Open fullscreen viewer |
Ctrl+Z |
Undo |
Ctrl+1/2/3/4 |
Switch view mode |
F2 |
Rename selected |
F5 |
Refresh |
F1 |
About |
Ctrl+, |
Settings |
In the fullscreen viewer: scroll to zoom, drag to pan, β/β to navigate, F to fit, 1 for 100%, Esc to close.
Right-click any photo for quick actions:
- Open File / Show in Explorer
- Select/Deselect
- Rename / Set Location
- Remove from View
- Delete (Recycle Bin)
PhotoTidy/
βββ main.py # Application entry point
βββ config.py # Configuration and constants
βββ requirements.txt # Python dependencies
βββ LICENSE # MIT License
βββ README.md
βββ CHANGELOG.md
βββ assets/
β βββ banner.png # GitHub banner image
β βββ icon.png # Application icon
βββ core/ # Core functionality
β βββ photo.py # Photo/video data model
β βββ metadata.py # EXIF and video metadata extraction
β βββ thumbnail.py # Thumbnail generation (with cache cap)
β βββ geocoding.py # Reverse geocoding
β βββ location_store.py # Persistent manual location tags
β βββ operations.py # File operations (move/copy)
β βββ image_processing.py # Resize, watermark, WebP conversion
β βββ batch_pipeline.py # Batch processing pipeline engine
βββ sorting/ # Sorting strategies
β βββ base.py # Base strategy interface
β βββ date_sorter.py # Date-based sorting
β βββ location_sorter.py # Location-based sorting
β βββ camera_sorter.py # Camera-based sorting
β βββ compound_sorter.py # Multi-criteria sorting
β βββ dynamic_sorter.py # Dynamic sorting
β βββ grouped.py # Photo grouping
βββ tests/ # Pytest test suite
βββ ui/ # User interface
β βββ main_window.py # Main application window
β βββ theme.py # Dark/light theme system
β βββ toolbar.py # Toolbar with actions
β βββ search_bar.py # Search and filter bar
β βββ filter_panel.py # Filter/sort controls
β βββ group_widget.py # Photo group display
β βββ photo_thumbnail.py # Thumbnail widget
β βββ view_items.py # List/detail view items
β βββ preview_panel.py # Photo preview
β βββ fullscreen_viewer.py # Fullscreen viewer with zoom/pan
β βββ image_loader.py # Shared full-res image loading
β βββ metadata_panel.py # EXIF metadata display
β βββ flow_layout.py # Flow layout for thumbnails
β βββ rename_dialog.py # Batch rename dialog
β βββ location_dialog.py # Location tagging dialog
β βββ duplicates_dialog.py # Duplicate finder dialog
β βββ map_dialog.py # Map view of GPS photos
β βββ resize_dialog.py # Batch resize dialog
β βββ watermark_dialog.py # Watermark dialog
β βββ convert_dialog.py # WebP conversion dialog
β βββ batch_dialog.py # Batch processing dialog
β βββ settings_dialog.py # Settings dialog
β βββ about_dialog.py # About dialog
βββ utils/ # Utilities
βββ renamer.py # Batch renaming logic
βββ rotate.py # Image rotation
βββ hash.py # File hashing
- PySide6 - Qt-based GUI framework
- Pillow - Image processing
- pillow-heif - HEIC/HEIF support
- exifread - EXIF metadata extraction
- rawpy - RAW file processing
- geopy - Reverse geocoding
- send2trash - Safe file deletion (Recycle Bin)
- imagehash - Perceptual hashing for duplicate detection
- opencv-python-headless - Video thumbnails and metadata
This project is licensed under the MIT License - see the LICENSE file for details.
Contributions are welcome! Please feel free to submit a Pull Request.
- Nominatim for geocoding services
- Qt/PySide6 for the GUI framework
