7871d52d39c9fe40026f597c6f2838202c4f9ffb
BackgroundTasks: dismiss no longer calls clearTaggingJobs; dismissal only updates local dismissed state DuplicateFinder: entering the view clears stale groups when the stored scan scope differs from selectedFolderId; duplicateScanFolderId is recorded on each scan and cache load so scope is always tracked Tagger threshold: set_tagger_threshold now sets TAGGER_SESSION_DIRTY so the worker rebuilds its WdTagger instance and applies the new threshold on the next batch Region search global scope: fetch offset+limit+2 candidates before removing the source image so has_more is accurate across pages Region search pagination: loadMoreImages now sets loadingImages and checks galleryRequestToken before appending results, preventing duplicate pages and stale responses corrupting a new collection Folder recovery: when index_folder detects a missing path it records the error in a new folders.scan_error column (ensure_column migration) and emits done without deleting images, preserving them for recovery. A new update_folder_path command rewrites image paths in the DB before reindexing so thumbnails and embeddings are not needlessly regenerated for unchanged files. The sidebar shows an amber warning icon on affected folders and a recovery banner with Locate Folder and Remove actions
Phokus
A local-first desktop media library for browsing, filtering, and curating image and video folders.
Features
- Add and remove media folders; background indexing with live progress
- Browse all media or filter by folder, type (image/video), favorites, or star rating
- Filename search, semantic search (
/s query), and tag search (/t tag) - Similar image search — find visually similar media by image or selected region
- AI tagging via WD tagger (ONNX, CPU/DirectML) with confidence threshold control
- Explore view — visual cluster map and tag cloud for browsing by theme
- Duplicate finder — scan for exact duplicates by file hash with bulk delete
- Lightbox preview with keyboard navigation, inline tag editing, and rating controls
- Sort by date, name, size, rating, or duration
- Grid density controls (compact / comfortable / detail)
Supported formats
| Images | Videos |
|---|---|
| jpg, jpeg, png, gif, bmp | mp4, mov, m4v |
| tiff, tif, webp, avif, heic, heif | webm |
Stack
- Tauri 2 + Rust backend
- React 19 + TypeScript + Zustand
- SQLite +
sqlite-vec(vector search) - ONNX Runtime (
ort) for AI tagging - Candle (Rust ML) for visual embeddings
- FFmpeg sidecar for video thumbnails and metadata
- Vite + Tailwind CSS v4
Development
Prerequisites: Node.js 20+, pnpm, Rust toolchain, Tauri system prerequisites for Windows.
pnpm install
# Run with hot-reload (frontend + Rust)
pnpm dev:app
# Frontend only
pnpm dev:vite
# Production build
pnpm build:app
How it works
- Add a folder from the sidebar — the Rust indexer walks it recursively.
- Supported files are written to SQLite with metadata (path, dimensions, media type, etc.).
- Background workers generate thumbnails, compute visual embeddings, and run AI tagging.
- Progress events stream back to the UI while the gallery updates incrementally.
- Embeddings power semantic search and the similar images feature via an HNSW index.
Languages
TypeScript
60.4%
Rust
37.5%
CSS
1.3%
Shell
0.4%
JavaScript
0.2%
Other
0.2%