Desktop photo manager with on-device AI classification
Browse your filesystem, view photos with EXIF metadata, and classify images into categories using on-device AI models — no cloud, no API keys, fully private.
Screenshot placeholder — add your screenshot to docs/screenshot.png
- AI-Powered Classification — Run ConvNeXt V2 or MobileNetV3 models locally via ONNX Runtime with GPU acceleration (DirectML / CoreML / CUDA)
- Find Similar Photos — Cosine similarity search on model embeddings powered by sqlite-vec
- Group by Color — Organize photos by dominant color using CIELAB color space with Fixed Palette or K-Means clustering
- EXIF Metadata Panel — Camera make/model, exposure, aperture, ISO, GPS, and more
- Blazing Fast Browsing — Lazy-loaded thumbnails via
IntersectionObserver, handles thousands of images without freezing - 100% Offline — Everything runs on your machine. No cloud. No telemetry.
- Grid view and List view toggle
- Lazy-loaded thumbnails — only generates thumbnails for photos visible in the viewport
- Sort by name, size, or date (ascending/descending)
- Real-time filename and tag search
- File watcher for auto-refresh when files change externally (debounced ~300ms)
- Tag filtering with multi-select dropdown
- Models: ConvNeXt V2 Base/Large (ImageNet-22K, 384x384) and MobileNetV3 Large (ImageNet-1K, 224x224)
- Runtime: ort (ONNX Runtime) with GPU acceleration
- Automatic model download on first use
- Top-K predictions with confidence scores
- Optional auto-organize: move or copy images into subfolders by predicted class
- Embeddings stored in SQLite for similarity search
- Select a photo and find visually similar images using cosine similarity on model embeddings
- Non-blocking background indexing with progressive results
- Adjustable similarity threshold via toolbar slider
- Organize photos by dominant color in CIELAB color space
- Fixed Palette or K-Means Clustering (via kentro) with configurable cluster count
- Toggle-able info panel with camera details
- Supports: camera make/model, date taken, exposure time, aperture, ISO, focal length, dimensions, orientation, GPS coordinates, flash, white balance, software
- Histogram display
Backend (Rust): Tauri commands expose filesystem operations, thumbnail generation, EXIF parsing, and ML inference. The classifier uses ONNX Runtime (via ort) with ImageNet normalization (NCHW format, softmax post-processing). Embeddings are stored in sqlite-vec for cosine similarity search. Heavy tasks (thumbnails, color extraction) are parallelized with rayon.
Frontend (React + TypeScript): State managed via useReducer + React Context. No external UI libraries. Thumbnails load lazily per-item using IntersectionObserver with an in-memory cache.
| Layer | Technology |
|---|---|
| Framework | Tauri 2 |
| Frontend | React 18, TypeScript 5.6, Vite 6 |
| Backend | Rust (2021 edition) |
| ML Runtime | ort (ONNX Runtime — DirectML, CoreML, CUDA) |
- Node.js v18+
- Rust (stable)
- Tauri CLI prerequisites for your platform
# Clone the repository
git clone https://github.com/srad/PhotoLense.git
cd PhotoLense
# Install frontend dependencies
npm install
# Run in development mode
npm run tauri dev
# Build for production
npm run tauri build- Open a folder and click Classify in the toolbar
- Select a model (MobileNetV3 Large, ConvNeXt Base, or ConvNeXt Large) and configure options (top-K, organize, GPU)
- Click Start Classification
- The app downloads the ONNX model (first time only), loads it via ONNX Runtime, then for each image:
- Resizes and center-crops to the model's input size (224x224 or 384x384)
- Normalizes with ImageNet mean/std (NCHW tensor)
- Runs inference and applies softmax for top-K class predictions
- Stores L2-normalized logit embeddings in sqlite-vec for similarity search
- If "Organize" is enabled, images are moved or copied into subfolders named by their top predicted class
PhotoLense runs on Windows, macOS, and Linux. ONNX Runtime binaries are downloaded automatically during build. Drive listing uses the Windows API on Windows and falls back to / on Unix systems.
Contributions are welcome! Feel free to open an issue or submit a pull request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/my-feature) - Commit your changes (
git commit -m 'Add my feature') - Push to the branch (
git push origin feature/my-feature) - Open a Pull Request
PolyForm Noncommercial License 1.0.0 means it is free for non-commecial purposes.