2026-10-12 17:32:56 +02:00
|
|
|
# searchi
|
|
|
|
|
|
|
|
|
|
**Find what matters. Locally.**
|
2026-10-12 15:45:57 +02:00
|
|
|
|
2026-10-12 19:16:23 +02:00
|
|
|
Local desktop search for Windows, macOS and Linux, under active development.
|
|
|
|
|
Production readiness is tracked in [the roadmap](docs/ROADMAP.md).
|
2026-10-12 15:45:57 +02:00
|
|
|
|
2026-10-12 19:57:34 +02:00
|
|
|

|
|
|
|
|
|
|
|
|
|
*The production UI searching real fixture files with Google EmbeddingGemma 2.
|
|
|
|
|
Captured on Windows with CPU inference in the read-only local browser capture harness;
|
|
|
|
|
native window chrome is omitted.*
|
|
|
|
|
|
2026-10-12 19:16:23 +02:00
|
|
|
## What works
|
2026-10-12 15:45:57 +02:00
|
|
|
|
2026-10-12 19:16:23 +02:00
|
|
|
Search combines instant indexed filenames, SQLite FTS5 content retrieval, and
|
|
|
|
|
**real Google EmbeddingGemma 2** vectors in a persisted HNSW index. PDF pages,
|
|
|
|
|
DOCX paragraphs and text passages retain their source locations. The same
|
|
|
|
|
shared Rust service now indexes **images, video frames, movie soundtracks,
|
|
|
|
|
audio and music**: actual pixels and sound enter Google's media projector in
|
|
|
|
|
the same 768-dimensional space as text queries. No generated captions,
|
|
|
|
|
simulated embeddings, replacement model, or Granola service is required.
|
|
|
|
|
Existing artist/title tags contribute keyword matches.
|
2026-10-12 15:45:57 +02:00
|
|
|
|
2026-10-12 19:16:23 +02:00
|
|
|
The desktop is the primary interface. It automatically prepares verified local
|
|
|
|
|
models, indexes selected folders, and prewarms its query worker. Image previews
|
|
|
|
|
and audio/video controls use narrowly scoped local assets; timestamp results
|
|
|
|
|
seek inside the preview without autoplay. Open file launches the default
|
|
|
|
|
application, whose exact opening position is not controlled by Searchi.
|
|
|
|
|
The CLI provides the same retrieval engine without a GUI.
|
2026-10-12 15:45:57 +02:00
|
|
|
|
2026-10-12 19:16:23 +02:00
|
|
|
**Media search is experimental.** File retrieval works on the independent seed
|
|
|
|
|
corpus, but precise spoken-topic timestamps, music hard negatives, and no-answer
|
|
|
|
|
handling still need improvement. Nearest-neighbor results are not calibrated
|
|
|
|
|
confidence. Video frames are sampled across the movie; every fleeting scene is
|
|
|
|
|
not guaranteed. Audio windows cover the primary stream within explicit resource
|
|
|
|
|
limits. See [actual media quality and failures](docs/MEDIA-QUALITY.md).
|
|
|
|
|
|
|
|
|
|
Production supports compiled hardware acceleration with CPU fallback. All
|
|
|
|
|
Windows VM tests use CPU only. Files, extracted text, metadata and embeddings
|
|
|
|
|
stay local; treat the index as sensitive. Initial verified model provisioning
|
|
|
|
|
requires approximately 865 MB of downloads. Search performs no remote inference.
|
2026-10-12 17:26:14 +02:00
|
|
|
|
2026-10-12 19:57:34 +02:00
|
|
|
## See searchi working
|
|
|
|
|
|
|
|
|
|
### A familiar dark theme
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
Light and dark themes follow the operating system preference. The selected
|
|
|
|
|
result retains its source location and extracted passage. Matching query words
|
|
|
|
|
are highlighted in results and previews. A small, collapsed **Why this result?**
|
|
|
|
|
detail is available when you want the explanation.
|
|
|
|
|
|
|
|
|
|
### Find a photo from what you remember
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
Actual image pixels are indexed by the Google model. The selected photo is
|
|
|
|
|
loaded from the indexed fixture file for preview.
|
|
|
|
|
|
|
|
|
|
### Understand where the time goes
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
Normal searches show a compact timing summary. Optional performance details
|
|
|
|
|
break down the real request into measured stages, including worker inference,
|
|
|
|
|
retrieval, filtering and ranking.
|
|
|
|
|
|
|
|
|
|
The [capture workflow](tools/desktop-capture/README.md) and
|
|
|
|
|
[capture manifest](docs/screenshots/capture-manifest.json) record the queries,
|
|
|
|
|
runtime, measured responses and image hashes. The photo sources and licenses
|
|
|
|
|
are listed in [the media fixture documentation](fixtures/media/README.md).
|
|
|
|
|
These browser captures supplement the open native desktop QA gates.
|
|
|
|
|
|
2026-10-12 17:26:14 +02:00
|
|
|
## Copy-and-paste setup prompt
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
Set up Searchi from https://tea.karlcom.de/karl/searchi.git in a new searchi
|
2026-10-12 19:16:23 +02:00
|
|
|
folder, or reuse the checkout without overwriting local changes. Read AGENTS.md,
|
|
|
|
|
SKILLS.md, docs/ROADMAP.md, docs/BUILDING.md and apps/desktop/README.md first.
|
|
|
|
|
Inspect the OS/tools. Install supported missing prerequisites: Git, stable Rust,
|
|
|
|
|
Node.js 24 LTS, Python 3.11+, CMake, native C/C++ tools and Tauri dependencies.
|
|
|
|
|
Preserve credentials and never print secrets. Prefer established Rust crates
|
|
|
|
|
and portable native tools; keep engine APIs shared by CLI and desktop.
|
|
|
|
|
For Karl's Windows VM set SEARCHI_FORCE_CPU=1 and
|
|
|
|
|
WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS='--disable-gpu --disable-accelerated-video-decode'
|
|
|
|
|
before tests or launch. Never enable a GPU provider in that VM.
|
|
|
|
|
From the repository root:
|
2026-10-12 17:26:14 +02:00
|
|
|
python tools/embeddinggemma2/build_runtime.py --backend cpu --jobs 2
|
|
|
|
|
python tools/embeddinggemma2/stage_runtime.py --backend cpu
|
2026-10-12 19:16:23 +02:00
|
|
|
python tools/media-runtime/provision.py --stage
|
|
|
|
|
The decoder manifest supports Windows/Linux x86-64 and ARM64; macOS decoder
|
|
|
|
|
packaging is still a gate. On unsupported hosts report the real blocker and
|
|
|
|
|
use explicitly verified native tools only when their provenance is known.
|
|
|
|
|
Run cargo test --workspace --locked, cargo fmt --all --check and
|
2026-10-12 17:26:14 +02:00
|
|
|
cargo clippy --workspace --all-targets --locked -- -D warnings.
|
|
|
|
|
Run cargo test --manifest-path apps/desktop/src-tauri/Cargo.toml --locked.
|
2026-10-12 19:16:23 +02:00
|
|
|
In apps/desktop run npm ci, npm test, npm run format:check and npm run build.
|
|
|
|
|
Launch the real app with npm run tauri -- dev. Allow automatic verified Google
|
|
|
|
|
model setup and retained-worker warmup. Never substitute another model or mocks.
|
|
|
|
|
Ask which folders I want indexed; don't index my whole home automatically.
|
|
|
|
|
Verify filename/content/image/music/video searches and persistence on selected
|
|
|
|
|
files. Inspect media failure reports and actual preview seeking. Read
|
|
|
|
|
MEDIA-QUALITY.md before claiming precise speech timestamps or reliable absence.
|
|
|
|
|
Report actual checks and blockers. Do not publish a release or claim production
|
|
|
|
|
readiness, GPU validation, native visual QA, or untested OS coverage.
|
2026-10-12 17:26:14 +02:00
|
|
|
```
|
|
|
|
|
|
2026-10-12 19:16:23 +02:00
|
|
|
This is developer setup, not an installer. The worker builder also accepts
|
|
|
|
|
`auto`, `metal`, `vulkan` and `cuda`; each requires its platform SDK and separate
|
|
|
|
|
hardware validation. Standalone FFmpeg/FFprobe and notices are staged for the
|
|
|
|
|
desktop; end users should not install tools or configure decoder paths.
|
2026-10-12 17:26:14 +02:00
|
|
|
|
2026-10-12 19:16:23 +02:00
|
|
|
## Headless setup
|
2026-10-12 15:45:57 +02:00
|
|
|
|
2026-10-12 19:16:23 +02:00
|
|
|
Build with `cargo build --release --locked -p searchi-cli`. No Node, Tauri,
|
|
|
|
|
WebView or display server is needed. Build the native Google worker separately,
|
|
|
|
|
and provision verified assets and FFmpeg tools:
|
2026-10-12 15:45:57 +02:00
|
|
|
|
|
|
|
|
```sh
|
2026-10-12 19:16:23 +02:00
|
|
|
python tools/embeddinggemma2/build_runtime.py --backend cpu --jobs 2
|
|
|
|
|
python tools/media-runtime/provision.py
|
|
|
|
|
cargo run -p searchi-cli -- setup --model-dir .searchi/models/embeddinggemma2
|
|
|
|
|
cargo run -p searchi-cli -- index --db searchi.sqlite --root /path/to/files
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
On native Linux, unified document/media indexing and hybrid search use:
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
|
./target/release/searchi embed --db searchi.sqlite --model-dir .searchi/models/embeddinggemma2 --embedding-worker .searchi/runtime/cpu/searchi-gemma-worker --ffmpeg .searchi/media-runtime/bin/ffmpeg --ffprobe .searchi/media-runtime/bin/ffprobe --cpu-threads 1
|
|
|
|
|
./target/release/searchi search --db searchi.sqlite 'the recording about orange soil' --model-dir .searchi/models/embeddinggemma2 --embedding-worker .searchi/runtime/cpu/searchi-gemma-worker --cpu-threads 1
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
These are current interfaces, not executed Linux release evidence. Windows uses
|
|
|
|
|
`Release/searchi-gemma-worker.exe` and `ffmpeg.exe`/`ffprobe.exe` instead.
|
|
|
|
|
`embed` includes media by default and reports failures. Use `--text-only`
|
|
|
|
|
explicitly for document-only vectors. `setup` provisions Google assets, not
|
|
|
|
|
worker/decoder executables. Installed release CLIs discover decoders under
|
|
|
|
|
`media-runtime/bin` beside the CLI; explicit paired paths or
|
|
|
|
|
`SEARCHI_FFMPEG_PATH`/`SEARCHI_FFPROBE_PATH` override discovery. Search never
|
|
|
|
|
silently downloads missing helpers. CLI invocations load their own worker;
|
|
|
|
|
the desktop retains a prewarmed worker for interactive queries.
|
|
|
|
|
|
|
|
|
|
## Search performance
|
|
|
|
|
|
|
|
|
|
Normal searches show result counts, measured search time and time until results
|
|
|
|
|
are displayed. Enable **Performance details** in desktop settings to
|
|
|
|
|
inspect UI scheduling, native queue/lock time, keyword retrieval, actual Google
|
|
|
|
|
query inference, ANN/cache/filter work and ranking. Export the current trace as
|
|
|
|
|
local JSON for comparison; tracing sends no telemetry and excludes search text
|
|
|
|
|
and file paths. Nested stages and parallel retrieval lanes overlap.
|
|
|
|
|
|
|
|
|
|
For headless diagnostics, append `--performance --json` for basic metrics or
|
|
|
|
|
`--debug-performance --json` for the detailed response. Plain `--json` retains
|
|
|
|
|
the existing results-array format. See [timing boundaries, trace schema and
|
|
|
|
|
reproducible measurements](docs/PERFORMANCE.md).
|
|
|
|
|
|
|
|
|
|
## Development and release
|
|
|
|
|
|
|
|
|
|
The Rust engine, service, media adapter and CLI live under `crates/`; the Tauri
|
|
|
|
|
shell is `apps/desktop`. SQLite, image/jpeg-decoder, USearch/NumKong, and Tauri
|
|
|
|
|
provide established storage, decoding, ANN/SIMD and desktop facilities.
|
|
|
|
|
Extraction and inference use bounded isolated work with explicit errors.
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
|
cargo test --workspace --locked
|
|
|
|
|
cargo fmt --all --check
|
|
|
|
|
cargo clippy --workspace --all-targets --locked -- -D warnings
|
2026-10-12 15:45:57 +02:00
|
|
|
cargo run -p searchi-cli -- --help
|
|
|
|
|
```
|
|
|
|
|
|
2026-10-12 19:16:23 +02:00
|
|
|
See [desktop setup](apps/desktop/README.md), [build/platform constraints](docs/BUILDING.md),
|
|
|
|
|
[semantic bounds](docs/SEMANTIC.md), [executed validation](docs/VALIDATION.md),
|
|
|
|
|
and [brand direction](docs/BRAND.md). Native visual QA, operating-system builds,
|
|
|
|
|
macOS decoder packaging, installers, licensing distribution, signatures,
|
|
|
|
|
upgrades and representative production quality remain release gates.
|
|
|
|
|
Cross-platform source support does not mean signed macOS installers can be
|
|
|
|
|
built on Windows. CI declarations are not evidence of executed platform jobs.
|
2026-10-12 17:26:14 +02:00
|
|
|
|
2026-10-12 19:16:23 +02:00
|
|
|
Record benchmark hardware, corpus, cold/warm state and p95 latency. Never ship
|
|
|
|
|
signing credentials in source control. Licensed under [MIT](LICENSE).
|
|
|
|
|
Repository author: Karl.
|