d0b41119c60535cf7895666d2c064650fa89d1fa
- Fix root cause: embedding_source_path() returns Result<PathBuf>, returning Err for videos without a thumbnail instead of silently falling back to the raw .mp4 path that CLIP cannot decode - indexer: split embedding batch into pre-failed (no source) and embeddable jobs; pre-failed are marked immediately without hitting the CLIP model - db: retry_failed_embedding_jobs skips videos still without a thumbnail so they no longer re-fail immediately on retry - Add get_failed_embedding_images command listing failed files + error per folder - Gallery: amber warning badge on tiles with embedding_status = 'failed' - BackgroundTasks: fetch and show failed filenames/errors in expanded panel - Toolbar: conditional 'Failed Embeddings' amber filter pill shown when any folder has embedding_failed > 0; filters at DB level via new embedding_failed_only param on get_images / count_images - TagCloud: replaced vocabulary/dictionary label system with representative image thumbnails per cluster; results cached in SQLite by image-id hash
Phokus
Overview
Phokus is a Tauri desktop app for building a fast, local media library from folders on disk. It indexes images and videos, stores metadata in SQLite, and gives you a dense browsing workflow with filtering, favorites, ratings, and a lightbox preview.
The current app is optimized for:
- local folders instead of cloud import flows
- large visual libraries
- quick review and curation
- mixed image and video browsing
Current features
- Add and remove media folders
- Background indexing with progress updates
- Browse all media or filter by folder
- Search by filename
- Filter by images, videos, or favorites
- Sort by modified date, name, or file size
- Grid density controls
- Lightbox preview with keyboard navigation
- Favorite and star-rating metadata saved in SQLite
- Virtualized/local-first architecture built on Tauri + React
Supported formats
Images:
jpgjpegpnggifbmptifftifwebpavifheicheif
Videos:
mp4movm4vwebm
Stack
- Tauri 2
- React 19
- TypeScript
- Zustand
- Rust
- SQLite +
sqlite-vec - Vite
Project structure
src/: React UI, state, and componentssrc-tauri/src/commands.rs: Tauri command surfacesrc-tauri/src/db.rs: SQLite schema and queriessrc-tauri/src/indexer.rs: folder crawling and batch indexingsrc-tauri/src/vector.rs: vector table setup for future semantic workflows
Development
Prerequisites
- Node.js 20+
pnpm- Rust toolchain
- Tauri system prerequisites for Windows
Install
pnpm install
Run in development
pnpm tauri dev
Build
pnpm tauri build
How it works
- Add a folder from the sidebar or Library menu.
- The Rust indexer walks the directory recursively.
- Supported files are written into SQLite with metadata such as path, size, dimensions, media type, rating, and favorite state.
- Progress events stream back to the UI while the gallery updates incrementally.
- The gallery view loads media in pages and opens items in a lightbox for review.
Notes
- This is currently a local desktop library, not a sync product.
- Search is filename-based right now.
- The vector table and embedding fields exist, but semantic search is not wired into the UI yet.
- Some visible UI copy may still use the old working name until the frontend text is updated.
Positioning
The clearest product description today is:
A local-first desktop media library for browsing, filtering, and curating image and video folders.
That description is more accurate than "gallery" alone and gives you a better base for future branding, onboarding copy, and a landing page.
Languages
TypeScript
60.4%
Rust
37.5%
CSS
1.3%
Shell
0.4%
JavaScript
0.2%
Other
0.2%