{"slug": "show-hn-echo-offline-semantic-image-search-for-windows-clip-and-faiss", "title": "Show HN: Echo – Offline semantic image search for Windows (CLIP and FAISS)", "summary": "Developer kelvinolabanji released Echo v1.0.1, a fully offline semantic image search tool for Windows that indexes photos locally using OpenAI's CLIP model (openai/clip-vit-base-patch32) and Facebook's FAISS vector library, letting users search in plain English without sending images or embeddings to the cloud. Echo runs a Python 3.11/FastAPI backend with a C#/.NET 8 WinForms frontend, is summoned by the Win+Shift+F global hotkey, and stores its SQLite database, FAISS index and thumbnail cache in %LOCALAPPDATA%\\Echo. Because the bundled backend exceeds 600MB, the installer ships only the frontend and downloads the backend package on first launch, verifying it with a SHA-256 checksum.", "body_md": "A fully local, offline semantic image search tool for Windows. Describe what you're looking for in plain English — \"sunset over water,\" \"my dog on the couch,\" \"receipt from last week\" — and Echo finds matching photos instantly, without ever sending anything to the cloud.\n\nNo account. No internet required after setup. No cloud storage of your photos or their embeddings. Everything runs on your machine.\n\nEcho indexes your photos locally using [CLIP](https://github.com/openai/CLIP) (`openai/clip-vit-base-patch32`), which turns both images and text descriptions into vectors in the same embedding space. Searching just means turning your query into a vector and finding the closest image vectors with [FAISS](https://github.com/facebookresearch/faiss). All of this happens on-device — the model, the index, and your photos never leave your computer.\n\n- **Global hotkey** (Win+Shift+F) summons a floating search panel from anywhere in Windows\n- **Instant, as-you-type search** across all your indexed folders\n- **Automatic first-run setup** — indexes your Pictures folder automatically on first launch\n- **Live folder management** — add/remove indexed folders, with real-time progress\n- **File system watching** — new photos dropped into an indexed folder get picked up automatically\n- **Tray notifications** for indexing start/completion\n- **UI** that feels like a native Windows feature, not a third-party app\n- **Fully offline** — after initial setup, no internet connection is required\n\n**Backend** — Python 3.11, FastAPI, CLIP via HuggingFace Transformers, FAISS, SQLite\n**Frontend** — C# / .NET 8, WinForms, WebView2 (HTML/CSS/JS UI), DWM APIs for acrylic blur\n\n```\necho/\n├── backend/\n│   ├── main.py            — FastAPI app + all endpoints\n│   ├── model.py            — CLIP model loading\n│   ├── indexer.py          — image embedding + FAISS indexing\n│   ├── searcher.py         — text query embedding + search\n│   ├── database.py         — SQLite operations\n│   ├── watcher.py           — filesystem watcher for auto-indexing\n│   ├── paths.py            — resolves where user data vs. bundled resources live\n│   └── echo-backend.spec   — PyInstaller build spec\n├── frontend/EchoApp/\n│   ├── Program.cs                — entry point\n│   ├── BootstrapAppContext.cs    — first-run backend setup, inside the message loop\n│   ├── AppContext.cs             — tray icon, hotkey, first-run auto-indexing\n│   ├── BackendManager.cs         — spawns/manages the Python backend process\n│   ├── BackendDownloader.cs      — downloads the backend package on first run\n│   ├── IndexingWatcher.cs        — polls indexing progress, tray notifications\n│   ├── SearchWindow.cs           — floating search UI\n│   ├── FolderManagerWindow.cs    — folder management UI\n│   ├── EchoBridge.cs             — JS ↔ C# bridge for the WebView2 UI\n│   └── ui/                       — HTML/CSS/JS frontend\n└── echo-setup.iss          — Inno Setup installer script\n```\n\nThe backend bundles CLIP, PyTorch, Transformers, and FAISS — 600MB+ once packaged, which is too large for a lightweight installer. So the installer ships only the (small) frontend; on first launch, the app downloads the backend package from this repo's [Releases](https://github.com/kelvinolabanji/echo/releases/download/v1.0.1/echo-backend.zip), verifies it with a SHA-256 checksum, and extracts it — a one-time setup step with its own progress window.\n\nUser data (the SQLite database, FAISS index, and thumbnail cache) lives in `%LOCALAPPDATA%\\Echo`, independent of wherever the app itself is installed.\n\nDownload the latest installer from the [Releases page](https://github.com/kelvinolabanji/echo/releases/download/v1.0.1/EchoSetup-1.0.0.exe) and run it. On first launch, Echo will download and set up its search engine (a few hundred MB, one-time) before it's ready to use.\n\n**Backend:**\n\n```\ncd backend\npython -m venv .venv\n.venv\\Scripts\\Activate.ps1\npip install -r requirements.txt\nuvicorn main:app --reload\n```\n\n**Frontend:**\n\n```\ncd frontend/EchoApp\ndotnet run\n# 1. Build the backend\ncd backend\npyinstaller echo-backend.spec\n\n# 2. Zip and host it (e.g. as a GitHub Release asset), then update the\n#    BackendDownloadUrl and ExpectedSha256 constants in BackendDownloader.cs\n\n# 3. Publish the frontend\ncd frontend/EchoApp\ndotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true\n\n# 4. Compile echo-setup.iss with Inno Setup\n```\n\n- CLIP performs slighty better on real photos than on stylized/animated content (wallpapers, posters, cartoon screenshots)\n- Windows only (WinForms + WebView2)\n\n- ONNX-quantized model for faster CPU indexing\n- OCR layer for finding photos by text they contain (screenshots, receipts, signs, documents)\n- Video support — extracting and indexing frames so video files become searchable the same way photos are\n\nMIT — see [LICENSE](https://github.com/kelvinolabanji/echo/blob/main/LICENSE) for details.", "url": "https://wpnews.pro/news/show-hn-echo-offline-semantic-image-search-for-windows-clip-and-faiss", "canonical_source": "https://github.com/kelvinolabanji/echo", "published_at": "2026-11-03 08:32:32+00:00", "updated_at": "2026-11-03 08:52:19.050407+00:00", "lang": "en", "topics": ["ai-tools", "computer-vision", "ai-products", "artificial-intelligence"], "entities": ["Echo", "kelvinolabanji", "OpenAI", "CLIP", "FAISS", "Meta", "Windows", "FastAPI"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/show-hn-echo-offline-semantic-image-search-for-windows-clip-and-faiss", "markdown": "https://wpnews.pro/news/show-hn-echo-offline-semantic-image-search-for-windows-clip-and-faiss.md", "text": "https://wpnews.pro/news/show-hn-echo-offline-semantic-image-search-for-windows-clip-and-faiss.txt", "jsonld": "https://wpnews.pro/news/show-hn-echo-offline-semantic-image-search-for-windows-clip-and-faiss.jsonld"}}