Image Triage is a PySide6 desktop application for rapidly browsing and culling very large folders of images. It uses a virtualized thumbnail grid, asynchronous folder scanning, background thumbnail generation, and both memory and disk caches so scrolling stays responsive even with tens of thousands of files.
.NEF support for thumbnails and previewArrow keys: move selectionPage Up / Page Down / Home / End: jump through the gridSpace or Enter: open full-screen previewDelete: move selected file to trash when availableW: accept the selected imageX: reject the selected imageK: move selected file into a _keep subfolderM: move selected file to a folder you choose0-5: assign a ratingT: assign tagsEsc: close full-screen previewpy -3 -m pip install -e .
py -3 -m image_triage
If the py launcher is not available on your machine, run the commands with your local Python executable instead.
If you are updating an existing install, rerun the install command so dependencies stay in sync:
py -3 -m pip install -e .
The Windows app includes Help > Check For Updates.... By default it checks the latest GitHub Release for tylermcm/ImageTriage, looks for an .msi asset, downloads it, and launches msiexec so the newer MSI can upgrade the existing install without requiring an uninstall.
For this to work in production:
project.version in pyproject.toml and __version__ in image_triage/_version.py for every release.upgrade_code in setup_msi.py unchanged.v1.1.4. The Build And Release Windows MSI GitHub Actions workflow builds the MSI and uploads it to that GitHub Release.sha256 value so downloads can be verified before install.To use a custom feed instead of GitHub Releases, set IMAGE_TRIAGE_UPDATE_FEED_URL to the URL of a JSON document like:
{
"version": "1.1.4",
"installer_url": "https://example.com/downloads/ImageTriage-1.1.4.msi",
"sha256": "0123456789abcdef...",
"release_notes_url": "https://example.com/releases/1.1.4"
}
Build and install a local AppImage from this repo with:
bash packaging/install_linux.sh
That script will:
.linux_build_venv~/.local/opt/ImageTriage~/.local/bin/image-triage~/.local/share/applicationsIf you already have a built AppImage, install just that file:
bash packaging/install_linux.sh --appimage /path/to/ImageTriage-0.1.0-x86_64.AppImage
Useful options:
--skip-build: reuse the newest AppImage in ./dist--install-dir PATH: change the install target--no-desktop: skip desktop entry creationGitHub Actions also builds an AppImage artifact on pull requests, pushes to main, and manual runs through build-linux-appimage.yml. Pushing a matching v* tag builds the same AppImage and uploads it to that GitHub Release.
The Linux build and the Windows MSI now share the same AI runtime staging logic through freeze_support.py, so both package types bundle the same integrated AICullingPipeline tree, helper launchers, and Python-side AI dependencies.
The active CLI-Culler source lives in the in-repo aiculler package and is the default AI culler implementation used by the app. CLIP/TOPIQ weights remain outside git; set IMAGE_TRIAGE_AICULLER_MODEL_ROOT to point at a local models directory when the defaults do not apply.
On first launch, the app offers to download the AI model into:
~/.cache/image_triage_ai_cache/models/DinoV3
If the user skips that step, the older bundled AI pipeline stays unavailable until the model is installed.
6 commits
1 commits
Python
99.3%
Image Triage is a PySide6 desktop application for rapidly browsing and culling very large folders of images. It uses a virtualized thumbnail grid, asynchronous folder scanning, background thumbnail generation, and both memory and disk caches so scrolling stays responsive even with tens of thousands of files.
.NEF support for thumbnails and previewArrow keys: move selectionPage Up / Page Down / Home / End: jump through the gridSpace or Enter: open full-screen previewDelete: move selected file to trash when availableW: accept the selected imageX: reject the selected imageK: move selected file into a _keep subfolderM: move selected file to a folder you choose0-5: assign a ratingT: assign tagsEsc: close full-screen previewpy -3 -m pip install -e .
py -3 -m image_triage
If the py launcher is not available on your machine, run the commands with your local Python executable instead.
If you are updating an existing install, rerun the install command so dependencies stay in sync:
py -3 -m pip install -e .
The Windows app includes Help > Check For Updates.... By default it checks the latest GitHub Release for tylermcm/ImageTriage, looks for an .msi asset, downloads it, and launches msiexec so the newer MSI can upgrade the existing install without requiring an uninstall.
For this to work in production:
project.version in pyproject.toml and __version__ in image_triage/_version.py for every release.upgrade_code in setup_msi.py unchanged.v1.1.4. The Build And Release Windows MSI GitHub Actions workflow builds the MSI and uploads it to that GitHub Release.sha256 value so downloads can be verified before install.To use a custom feed instead of GitHub Releases, set IMAGE_TRIAGE_UPDATE_FEED_URL to the URL of a JSON document like:
{
"version": "1.1.4",
"installer_url": "https://example.com/downloads/ImageTriage-1.1.4.msi",
"sha256": "0123456789abcdef...",
"release_notes_url": "https://example.com/releases/1.1.4"
}
Build and install a local AppImage from this repo with:
bash packaging/install_linux.sh
That script will:
.linux_build_venv~/.local/opt/ImageTriage~/.local/bin/image-triage~/.local/share/applicationsIf you already have a built AppImage, install just that file:
bash packaging/install_linux.sh --appimage /path/to/ImageTriage-0.1.0-x86_64.AppImage
Useful options:
--skip-build: reuse the newest AppImage in ./dist--install-dir PATH: change the install target--no-desktop: skip desktop entry creationGitHub Actions also builds an AppImage artifact on pull requests, pushes to main, and manual runs through build-linux-appimage.yml. Pushing a matching v* tag builds the same AppImage and uploads it to that GitHub Release.
The Linux build and the Windows MSI now share the same AI runtime staging logic through freeze_support.py, so both package types bundle the same integrated AICullingPipeline tree, helper launchers, and Python-side AI dependencies.
The active CLI-Culler source lives in the in-repo aiculler package and is the default AI culler implementation used by the app. CLIP/TOPIQ weights remain outside git; set IMAGE_TRIAGE_AICULLER_MODEL_ROOT to point at a local models directory when the defaults do not apply.
On first launch, the app offers to download the AI model into:
~/.cache/image_triage_ai_cache/models/DinoV3
If the user skips that step, the older bundled AI pipeline stays unavailable until the model is installed.
6 commits
1 commits
Python
99.3%