You're an aviation photographer who just returned from RIAT or spent a day at the Mach Loop. You took thousands of RAW shots of fast jets, helicopters, and flybys β and now you're facing the real challenge:
- You want to sort through all your photos and identify the best shots.
- Tools like Lightroom or Capture One are powerful, but importing and checking each image is time-consuming.
- The default Windows Photos viewer lets you browse, but:
- It's clunky with RAW files.
- You have to zoom in manually to check sharpness.
- There's no easy way to filter out blurry images.
I've been there myself β I still haven't finished editing my 500GB of RIAT 2024 photos because of how tedious this process is. That frustration is exactly what inspired me to build RAWviewer.
RAWviewer is a lightweight, focused image viewer built specifically for photographers who shoot a lot β especially in aviation, wildlife, or sports.
- Instant file previewing: No import steps β just drag & drop.
- Zoom in with a single key to check sharpness immediately.
- Stay in zoomed mode while browsing with arrow keys.
- Quickly remove blurry photos from the queue with
β(moves them to a discard folder). - No complex controls to memorize β just the essential keys to move fast.
This is a pre-filtering tool, letting you go through hundreds of RAW files efficiently before committing to editing them in Lightroom or Photoshop.
RAWviewer is a fast, modern, cross-platform image viewer for Windows and macOS, built with PyQt6. It supports advanced zooming, panning, and direct file association, allowing RAW files to be opened with a double-click.
- Cross-platform support: Windows and macOS
- Ultra-Fast Performance: Instant folder loading (scans thousands of images in milliseconds) using optimized algorithms
- High-Fidelity Thumbnails: Uses high-quality LANCZOS resampling and 2x oversampling for crystal-clear previews on Retina and 4K displays.
- Smart Prefetching: Predictively loads relevant images in the background for zero-latency navigation
- Memory-First Cache (Default): Uses fast in-memory caching by default with no disk/SQLite writes
- Optional Persistent Cache: Set
RAWVIEWER_PERSISTENT_CACHE=1to re-enable disk/SQLite cache persistence - Gallery View: Justified grid layout with virtualized rendering, EXIF-aware ordering, and current-image positioning
- Gallery search (macOS + Core ML bundle): Free-text semantic ranking plus structured metadata filters (
camera:, ISO, GPS,format:/ext:, and more β see README table below) - Wide RAW format support: Canon (CR2, CR3), Nikon (NEF), Sony (ARW), Adobe DNG, and many more
- Robust Orientation Handling: Definitive fixes for Sony ARW and other RAW formats, ensuring images are always displayed upright
- Pillarbox-Free Gallery: Accurately calculates aspect ratios to prevent black bars in the gallery view
- macOS File Association: Fully integrated with macOS Finder; can be set as the default viewer and supports double-click to open
- Intuitive navigation: Keyboard shortcuts, mouse controls, and scroll wheel support
- Zoom functionality: Fit-to-window and 100% zoom modes with smooth panning, including native Mac trackpad pinch-to-zoom
- File management: Move images to discard folder or delete permanently
- EXIF data display: View camera settings, focal length, ISO, aperture, and capture information with robust metadata extraction
- Session persistence: Remembers your last opened folder, image, and view mode
- Single-image histogram: Press
Hto show or hide the strip while viewing one image - Portable executable: No Python installation required for users
- Professional Startup: Synchronized native and Qt splash screens for a flicker-free, premium launch experience.
- Modern UI: Material Design 3 aesthetics with Font Awesome icons (via qtawesome) and non-intrusive loading indicators
- Platform-specific chrome: On Windows, the bottom bar omits Share (no stable system share without WinRT interop); Share remains on macOS.
- Non-destructive visual rotate: Rotate in viewer by 90Β° steps without modifying original files (including RAW), with gallery-visible tiles refreshed immediately.
- Precision Focus Area Detection: Overlays the camera's focus point(s) using manufacturer-specific MakerNote data (Canon, Nikon, Sony) plus EXIF SubjectArea/SubjectLocation with orientation-aware mapping and robust coordinate scaling.
- Download the latest release from the Releases Page
- Download
RAWviewer.exedirectly (no zip extraction needed) - Double-click
RAWviewer.exeto launch - Optional: Create a desktop shortcut or pin to taskbar
- Download the latest release from the Releases Page
- Download and extract
RAWviewer-v2.0.0-macOS.zip - Drag
RAWviewer.appto your Applications folder - Double-click to launch from Applications or Launchpad
- First launch: Right-click β "Open" if blocked by Gatekeeper
- Space: Toggle between fit-to-window and 100% zoom
G: Toggle between Gallery View and Single Image ViewEsc: Return to Gallery View (from Single View)β/βarrows: Navigate between imagesβ: Move current image to Discard folder- Delete: Delete current image (with confirmation)
H: Show or hide the single-image histogram stripF: Toggle dashed focus/subject indicator overlay (amber = maker AF, lime = EXIF subject area)
Open the bottom search panel. The search field placeholder is Search gallery.
- On macOS with bundled Core ML models, free-text queries run semantic ranking over the images that pass any filters below.
- Important: Words like
face,faces,people,person, andhumanare not sent to the neural search: they filter by the Vision face-detection count stored at index time (same ashas:face). If no faces were detected (distant subjects, backs to camera, silhouettes), those photos are excludedβtry free-text phrases instead, e.g.crowd,pedestrians,spectators. - Formats: Prefer
format:jpegΒ·format:raw(type jpeg/ext rawwith a space also normalize). Loose phrasesfile jpeg/file rawmap toformat:so.jpgmatches JPEG synonyms andrawcovers typical camera RAW extensions (not only filenames containing the substringraw). - You can combine a description with structured filters on one line (see examples).
- Clear the field or use the Γ control to restore the full folder.
Separate tokens with spaces. Filters use key:value or comparison forms.
| Kind | Example |
|---|---|
| Free text + filter | jet takeoff camera:sony iso<800 |
| Camera / lens | camera:canon Β· lens:70-200 |
| ISO / year | iso<=800 Β· year>=2024 |
| Place | city:tokyo Β· country:jp Β· admin:california |
| File name | filename:_dsc or name:img_ |
| File format | format:cr3 Β· type:jpeg Β· ext:jpg,png Β· format:raw (same set as src/raw_file_extensions.py) |
| Date prefix | date:2024-05 |
| GPS / faces | has:gps Β· no:gps Β· has:face Β· people Β· person Β· no:face |
Optional: stronger semantic models (advanced). The app bundle uses MobileCLIP2-S0 for speed and size. From the same MobileCLIP2 family, S2 or B checkpoints usually score better on open-vocabulary retrieval at the cost of a larger Core ML package and slower indexingβexport with python scripts/export_mobileclip2_coreml.py --model MobileCLIP2-S2 (todayβs --for-app flow names files mobileclip2_s0_*; you can replace those mlpackages after export or adjust filenames to match). You can also set environment variable RAWVIEWER_MOBILECLIP_VARIANT=s2 to prefer Appleβs downloadable MobileCLIP S2 Core ML models (a different architecture than MobileCLIP2, but often strong for general photo text queries).
Bundled macOS Core ML models are discovered automatically in common app/resource paths.
Both naming schemes are supported:
- Apple Hub naming:
mobileclip_s2_image.mlpackage+mobileclip_s2_text.mlpackage - App export naming (
--for-app):mobileclip2_s0_image.mlpackage+mobileclip2_s0_text.mlpackage
- Double-click: Zoom in to the clicked point (from fit), or zoom out to fit
- Pinch (Mac/Windows Trackpad) or Ctrl+Scroll: Smoothly zoom in/out with smart cursor anchoring
- Click and drag: Pan image when zoomed in
- Drag and drop: Open images or folders
- Scroll Wheel (fit-to-window): Navigate images - Scroll down = previous, Scroll up = next
- Scroll Wheel (zoom mode): Pan image vertically
- Horizontal Wheel (zoom mode): Pan image horizontally (left/right)
- Scroll Wheel (Gallery View): Scroll through the image grid
When focus/subject indicator is enabled (F):
- Space from fit-to-window zooms to the focus/subject box center.
- Double-click still zooms to your clicked point (same as normal mode).
- Canon: CR2, CR3
- Nikon: NEF
- Sony: ARW
- Adobe: DNG
- Olympus: ORF
- Panasonic: RW2
- Fujifilm: RAF
- Hasselblad: 3FR
- Pentax: PEF
- Samsung: SRW
- Sigma: X3F
- And many more supported by LibRaw
- JPEG: JPG, JPEG
- TIFF: TIF, TIFF
- HEIF: HEIF
- Python 3.8 or higher
- pip (Python package manager)
Option 1: Using batch script (recommended)
# Run the automated build script
build_windows.batOption 2: Manual build
# Activate virtual environment (if using one)
rawviewer_env\Scripts\activate
# Install dependencies
pip install -r requirements.txt
# Build executable
python build.py# Run the automated build script
./build_macos.shAll dependencies are listed in requirements.txt:
- PyQt6 >= 6.6.0
- rawpy >= 0.25.0
- numpy >= 2.0.0
- Pillow >= 10.0.0
- send2trash >= 1.8.0
- pyinstaller >= 6.0.0
- natsort >= 8.4.0
- exifread >= 3.0.0
- psutil >= 5.9.0
- pyqtgraph >= 0.13.0
- qtawesome >= 1.2.0
- "Windows protected your PC": Click "More info" β "Run anyway"
- Antivirus warnings: Add RAWviewer to your antivirus exclusions
- Performance issues: Try running as administrator
- AttributeError with stdout: This is normal for windowed builds - the application runs without a console window
- "App is damaged" or "Unverified Developer": This is common for locally built apps. Our build script automatically clears the quarantine flag, but if it persists, run
xattr -cr dist/RAWviewer.appin your terminal. - Gatekeeper warnings: Right-click the app β "Open" β "Open" anyway. This "registers" the app with macOS.
- Permission Denied / Cannot Read Folder: Modern macOS requires explicit permission for apps to access the Desktop or Documents.
- Go to System Settings > Privacy & Security > Full Disk Access.
- Click the + button and add
RAWviewer.app. - Toggle it to ON.
- "Open with" behavior: For the very first launch, if you see a malware warning, open the app directly via Right-click -> "Open". This "registers" the app with macOS, after which "Right-click -> Open with" will work perfectly.
- "Semantic search unavailable" / asks to download models even in packaged app:
- Open
RAWviewer.app/Contents/Resources/models/mobileclip2_coreml/. - Confirm either S2 pair (
mobileclip_s2_*) or S0 app-export pair (mobileclip2_s0_*) exists, plusbpe_simple_vocab_16e6.txt.gz. - If missing, rebuild with
models/mobileclip2_coreml/present before runningpython build.py.
- Open
We're continuously working to improve RAWviewer. Here are some features planned for future releases:
- Batch Operations: Select and process multiple images at once
- Newer camera models: Support for the latest camera releases may be limited due to LibRaw library compatibility
- Proprietary RAW formats: Some manufacturers' newest RAW formats may not be fully supported immediately after camera release
- Firmware updates: Camera firmware updates may introduce RAW format changes that require LibRaw updates
RAWviewer uses a modern, optimized architecture:
- ImageLoadManager: Manages all image loading tasks using a thread pool and priority queue
- UnifiedImageProcessor: Handles all image types (RAW, JPEG, TIFF, etc.) with a unified interface
- Cache System: Memory-first cache by default, with optional persistent disk cache via env flag
- Smart Caching: Efficient image and video caching for faster navigation
- Thread Pool: Reuses threads to avoid creation/destruction overhead
- Event-Driven: Permanent signal connections for better performance
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.
If you encounter any issues:
- Check the troubleshooting section above
- Search existing GitHub issues
- Create a new issue with detailed information about your problem
If you find RAWviewer useful and it's become part of your workflow, feel free to buy me a coffee β or chip in to help fund my RIAT tickets for next year
Enjoy viewing your RAW photos with RAWviewer! πΈ