LyAhn d0b41119c6 Surface failed embeddings and add filter for affected files
- 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
2026-04-06 16:54:03 +01:00
2026-04-05 19:12:48 +01:00
2026-04-06 02:28:52 +01:00

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:

  • jpg
  • jpeg
  • png
  • gif
  • bmp
  • tiff
  • tif
  • webp
  • avif
  • heic
  • heif

Videos:

  • mp4
  • mov
  • m4v
  • webm

Stack

  • Tauri 2
  • React 19
  • TypeScript
  • Zustand
  • Rust
  • SQLite + sqlite-vec
  • Vite

Project structure

  • src/: React UI, state, and components
  • src-tauri/src/commands.rs: Tauri command surface
  • src-tauri/src/db.rs: SQLite schema and queries
  • src-tauri/src/indexer.rs: folder crawling and batch indexing
  • src-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

  1. Add a folder from the sidebar or Library menu.
  2. The Rust indexer walks the directory recursively.
  3. Supported files are written into SQLite with metadata such as path, size, dimensions, media type, rating, and favorite state.
  4. Progress events stream back to the UI while the gallery updates incrementally.
  5. 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.

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%