High-performance, cross-platform media asset manager aimed at smooth gallery browsing of 100k–1M photos. 面向十万~百万张照片流畅画廊式浏览的高性能跨平台媒体资源管理器。
Status: active development. Image browsing + AI semantic search are implemented. 状态:活跃开发中。已实现图片浏览与 AI 语义搜索。
- Backend | 后端: Rust + Tauri v2 — SQLite (
rusqlite+ WAL, writeMutex+ readr2d2pool),rayon(CPU parallelism),fast_image_resize, WIC GPU decode (Windows),kamadak-exif. Chinese-CLIP semantic search runs its ONNX Runtime (ort, DirectML) inference in a separateai-workersubprocess, keeping the host binary free ofort. - Frontend | 前端: Vue 3 (
<script setup>) + Pinia + Vue Router + Vite + TypeScript, vanilla CSS variables.
- Two-phase scan | 两阶段扫描: fast scan (header-only dimensions) shows the grid in seconds; background enrichment (EXIF/XMP/Live Photo) runs silently.
- Backend Justified Layout | 后端两端对齐布局: the layout is computed in Rust and cached in memory; the frontend pulls only the visible rows (row-level virtualization).
- Resident layout cache holds only render-essential fields per item; heavy metadata (EXIF/GPS/path/filename) is fetched on demand for the visible viewport (
get_meta_for_viewport). - O(1) layout index: thumbnail write-back and adjacent-item navigation use an
id → (row, col)index (no full-table scans). - Bucket virtualization (large libraries): the grid renders only a few fixed-size segments driven by a wishlist single-flight fetch pump; a custom logical scrollbar maps logical↔physical scroll and caps the physical spacer under the browser's ~16.7M px element-height limit.
- AI semantic search: CLIP embeddings kept resident in a half-precision (f16) cache; cosine similarity computed with
rayon.
See plan-docs/ for the full design — the refactor_2026/ series (Part0–Part8) is the current architecture of record, and todo.md tracks live status.
Prerequisites: Node.js + Rust toolchain + Tauri v2 prerequisites (on Windows: WebView2 runtime, MSVC).
npm install
npm run tauri dev # run the desktop app in dev mode | 开发模式运行桌面应用npm run build # type-check (vue-tsc) + build the frontend
npm run tauri build # produce a release bundle | 生成发布包Backend-only checks | 仅后端检查:
cargo check --manifest-path src-tauri/Cargo.toml --tests
cargo test --manifest-path src-tauri/Cargo.toml --lib layout::cache::testssrc-tauri/src/
db/ connection pool, schema, migrations, queries, models
scanner/ two-phase scan: fast_scan, enricher, walker, metadata, live_photo
layout/ justified layout algorithm + in-memory cache (+ O(1) index)
thumbnail/ generation pipeline, sized cache, thumbhash, EXIF fast path
engine/ image decode engines (image-rs + WIC GPU)
ai/ CLIP engine pool, embedding pipeline, resident search cache
ipc/ Tauri command handlers (scan/layout/media/thumbnail/search/ai/...)
src/
components/ layout shell, media grid/thumb/detail, sidebar, settings
composables/ virtual scroll, justified layout consumer, request queue, ...
stores/ Pinia stores (media/scan/ui/filter/config/ai)
Copyright 2026 The Scrollery Authors.
The open-source core (this repository) is licensed under the Apache License 2.0; third-party attributions are listed in NOTICE.md. 开源核心(本仓库)以 Apache-2.0 授权;第三方组件署名见 NOTICE.md。
The "Scrollery" name and logo are trademarks and are not licensed under Apache-2.0 — see TRADEMARK.md. Contributions require the CLA; see CONTRIBUTING.md. 「Scrollery」名称与标识属商标,不在 Apache-2.0 授权范围内(见 TRADEMARK.md);贡献代码须签署 CLA,流程见 CONTRIBUTING.md。