Search by meaning
Describe it the way you remember it. Sift finds the photo, screenshot, PDF page or passage that matches, whatever the file is called.
Press Super + S and describe what you're looking for. Sift finds the photo, screenshot, PDF page or document that matches, on your machine.
…the tenant shall not keep pets of any kind on the premises without the prior written consent of the landlord…
Describe it the way you remember it. Sift finds the photo, screenshot, PDF page or passage that matches, whatever the file is called.
Invoice numbers, error codes and names match as written, including text read out of screenshots. Codes and numbers weigh double.
Every page is read on its own, and Enter opens the PDF at the one that matched. Scans and slides are read as pictures.
Found by what they show, plus the text in them, read with tesseract.
Name a few photos “me”, then search “me in the mountains”. One command deletes every faceprint.
EmbeddingGemma 2 runs on llama.cpp on your machine. No account, no cloud, no telemetry.
A shell plugin: the panel and the bar indicator live in omarchy-shell and follow your theme.
The model stops when there's nothing to read. Indexing runs at idle priority and waits on battery.
Skips keys, certificates, .env files and code. Never changes, moves or uploads a file.
Enter opens, Ctrl+Enter shows it in the folder, Ctrl+C copies the file to paste anywhere.
Watches the folders you pick. PDFs page by page, documents in ~450-token passages, pictures as pictures, screenshot text with OCR.
PyMuPDF · Pillow · tesseract · inotify
EmbeddingGemma 2 turns every page, passage and picture into a vector, on the GPU, only while there's work.
llama.cpp · Vulkan · Q8_0
One local SQLite file: a float16 vector per page, passage and picture, plus a full-text index over names and text.
SQLite WAL · FTS5
Meaning and exact words, blended. Only files that stand out count as meaning matches; weaker ones wait behind Tab.
z-scored meaning · word coverage
folders ─► sift-indexer ─► readers ─► llama-server (EmbeddingGemma 2, Vulkan) ─► index.db panel ─► sift daemon ─► query vector (CPU, ~20 ms) ─► meaning + exact words ─► results
The daemon and indexer are small Python glue. The model only runs while there's something to read, then it's stopped and its memory is freed.
EmbeddingGemma 2 on llama.cpp with Vulkan. dGPU is the RX 5500M, iGPU the Ryzen's Vega; Sift picks the discrete one. Documents are faster: about 50 ms a passage.
Measured on a Ryzen 5 5600H laptop with 15 GB of RAM and a Radeon RX 5500M.
$ omarchy pkg add cmake ninja shaderc vulkan-headers spirv-headers tesseract tesseract-data-eng$ git clone https://github.com/ommgh/sift ~/projects/sift && ~/projects/sift/install.sh
The installer builds llama.cpp with Vulkan, downloads the model (checksummed), links the plugin and starts two user services. Uninstalling is three commands, listed in the README.