Build Imagyx with virtualized browsing and local AI - #1
Conversation
…agyx into agent/tauri-vue-prototype
… to look cool add: minimize/close etc.
and added copy-information to the same spotlight search and thubmnail image
… adding more language
add: spotlight result via translate3d for gpu rendering of animations the max we can
…th your embedding
add search input with stuff etc
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 752e425548
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| "resizable": true, | ||
| "fullscreen": false, | ||
| "center": true, | ||
| "visible": false, |
There was a problem hiding this comment.
Show onboarding on the first production launch
On a fresh production install, the main window starts hidden and lib.rs only shows it under debug_assertions; meanwhile onboarding.initialize() opens the first-run dialog inside that hidden window. The user therefore sees neither the required onboarding nor an obvious application window unless they discover the tray menu, so startup should reveal the main window when onboarding has not been completed.
AGENTS.md reference: AGENTS.md:L85-L85
Useful? React with 👍 / 👎.
| previewImage.value = | ||
| store.images.find((image) => image.id === imageId) ?? null; |
There was a problem hiding this comment.
Load the Spotlight-selected image directly by ID
When Spotlight opens an older search result in Imagyx, this first refreshes the blank-query browse view, which contains only the 48 newest images, and then searches that page for the requested ID. Any selected result outside that first page produces null, so the main window opens without the requested preview; retrieve the image by ID or pass the selected asset instead of relying on the current browse page.
Useful? React with 👍 / 👎.
| for folder in initial_folders { | ||
| folder_watcher | ||
| .watch(folder) | ||
| .map_err(AppError::Watcher)?; |
There was a problem hiding this comment.
Reconcile followed folders when the watcher starts
After files are added, changed, or deleted while Imagyx is not running, startup merely registers each existing folder with the native watcher. Filesystem watchers do not replay events that occurred while the process was stopped, so the SQLite library and search results remain stale until another event happens or the user manually reindexes; enqueue an initial index_folder pass after each watch is installed.
AGENTS.md reference: AGENTS.md:L64-L64
Useful? React with 👍 / 👎.
| private async runPendingIndex(folderId?: string) { | ||
| await ensureRustProfileListener() | ||
| const pending = await imagyxApi.pendingImages(folderId) | ||
| if (pending.length === 0) { |
There was a problem hiding this comment.
Continue indexing after the 20,000-image pending page
For a library with more than 20,000 missing embeddings, pendingImages() returns only the Rust-side MAX_PENDING_IMAGES page, but this method processes that single array and marks the runtime ready without fetching another page. The remaining images stay semantically unindexed until the user manually presses Resume—potentially repeatedly—so completion should request subsequent pending pages until none remain.
AGENTS.md reference: AGENTS.md:L63-L64
Useful? React with 👍 / 👎.
| if let Some(existing) = state | ||
| .database | ||
| .folders() | ||
| .map_err(|error| error.to_string())? | ||
| .into_iter() | ||
| .find(|folder| folder.path == canonical_string) |
There was a problem hiding this comment.
Reject overlapping followed-folder roots
When a user follows both a directory and one of its descendants, this check accepts both because it only detects exact path equality. Since the schema permits each image path to have only one folder_id, scans of the two roots repeatedly move descendant images between folders, making folder-filtered results unstable and allowing removal of one followed folder to delete images still covered by the other; reject ancestor/descendant overlaps or model folder membership separately.
Useful? React with 👍 / 👎.
What changed
src/components/uiRust architecture cleanup
The Rust backend is now split into focused, small modules instead of large
commands.rs,db.rsandindexer.rsfiles:Implementation files are kept below 200 lines; tests that would make a module too large live in dedicated test submodules.
Search performance
Vector search and indexing
RwLock<Vec<VectorEntry>>with an incrementalVectorStoreVec<f32>for better cache localityDELETE ... RETURNINGDevelopment tracing
src-tauri/src/tracing/debug_assertions, without adding a runtime dependency or release logging costTests added
Unit tests cover:
Performance plan
The final architecture, budgets and next measurement-driven phases are documented in:
docs/RUST_PERFORMANCE_PLAN.mdThe next large steps are intentionally not mixed into this refactor: reproducible 10k/50k/100k benchmarks, a bounded multi-stage indexing pipeline, event-level watcher commands, persistent jobs, a persisted vector snapshot, HNSW only if required by p95 measurements, and native Rust ONNX inference as a separate packaging project.
Existing browsing and filesystem work
Validation status
The refactor and unit tests are committed to the existing draft PR branch. No GitHub Actions workflow was triggered because this repository uses manual
workflow_dispatch, and this environment could not obtain a local checkout to execute Cargo or npm commands. This PR therefore does not claim that the latest head has compiled or passed tests.Please validate the latest head locally with:
Recommended manual smoke tests:
Notes