a40e5c27710b22dffa475bdbcd1fe91588cfc158
Merges feat/watchdog-exif-timeline into main. - Adaptive filesystem watchdog: switches between inotify/ReadDirectoryChanges and polling with zero CPU when idle; watcher events update sidebar counts live - EXIF taken_at: extracted at index time and stored as a sortable column; new taken_asc/taken_desc sort orders; migration is safe on existing DBs - Timeline view: virtualised month-grouped grid (react-virtual v3), reuses ImageTile/ContextMenu, Calendar icon in Sidebar, defaults to taken_asc sort - Bug fixes: startup migration panic on existing DBs without taken_at column, "Unknown Date" grouping due to null created_at fallback, watcher not updating folder image counts, cols overflow in Timeline grid
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%