LyAhn 7871d52d39 fix: five PR review bugs and folder-recovery UX for missing/renamed folders
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
2026-06-07 09:00:32 +01:00
2026-04-05 19:12:48 +01:00

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

  1. Add a folder from the sidebar — the Rust indexer walks it recursively.
  2. Supported files are written to SQLite with metadata (path, dimensions, media type, etc.).
  3. Background workers generate thumbnails, compute visual embeddings, and run AI tagging.
  4. Progress events stream back to the UI while the gallery updates incrementally.
  5. Embeddings power semantic search and the similar images feature via an HNSW index.
S
Description
Local-first image gallery with semantic search and AI tagging (Tauri + React + Rust)
Readme MIT 14 MiB
Languages
TypeScript 60.4%
Rust 37.5%
CSS 1.3%
Shell 0.4%
JavaScript 0.2%
Other 0.2%