3
stars
38
commits
C#
primary language
Aug 16, 2026
updated
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.
No account. No internet required after setup. No cloud storage of your photos or their embeddings. Everything runs on your machine.

Echo indexes your photos locally using 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. All of this happens on-device — the model, the index, and your photos never leave your computer.
Backend — Python 3.11, FastAPI, CLIP via HuggingFace Transformers, FAISS, SQLite Frontend — C# / .NET 8, WinForms, WebView2 (HTML/CSS/JS UI), DWM APIs for acrylic blur
echo/
├── backend/
│ ├── main.py — FastAPI app + all endpoints
│ ├── model.py — CLIP model loading
│ ├── indexer.py — image embedding + FAISS indexing
│ ├── searcher.py — text query embedding + search
│ ├── database.py — SQLite operations
│ ├── watcher.py — filesystem watcher for auto-indexing
│ ├── paths.py — resolves where user data vs. bundled resources live
│ └── echo-backend.spec — PyInstaller build spec
├── frontend/EchoApp/
│ ├── Program.cs — entry point
│ ├── BootstrapAppContext.cs — first-run backend setup, inside the message loop
│ ├── AppContext.cs — tray icon, hotkey, first-run auto-indexing
│ ├── BackendManager.cs — spawns/manages the Python backend process
│ ├── BackendDownloader.cs — downloads the backend package on first run
│ ├── IndexingWatcher.cs — polls indexing progress, tray notifications
│ ├── SearchWindow.cs — floating search UI
│ ├── FolderManagerWindow.cs — folder management UI
│ ├── EchoBridge.cs — JS ↔ C# bridge for the WebView2 UI
│ └── ui/ — HTML/CSS/JS frontend
└── echo-setup.iss — Inno Setup installer script
The 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, verifies it with a SHA-256 checksum, and extracts it — a one-time setup step with its own progress window.
User data (the SQLite database, FAISS index, and thumbnail cache) lives in %LOCALAPPDATA%\Echo, independent of wherever the app itself is installed.
Download the latest installer from the Releases page 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.
Backend:
cd backend
python -m venv .venv
.venv\Scripts\Activate.ps1
pip install -r requirements.txt
uvicorn main:app --reload
Frontend:
cd frontend/EchoApp
dotnet run
# 1. Build the backend
cd backend
pyinstaller echo-backend.spec
# 2. Zip and host it (e.g. as a GitHub Release asset), then update the
# BackendDownloadUrl and ExpectedSha256 constants in BackendDownloader.cs
# 3. Publish the frontend
cd frontend/EchoApp
dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true
# 4. Compile echo-setup.iss with Inno Setup
MIT — see LICENSE for details.
38 commits
C#
44.2%
HTML
29.1%
Python
23.8%
Inno Setup
2.9%
3
stars
38
commits
C#
primary language
Aug 16, 2026
updated
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.
No account. No internet required after setup. No cloud storage of your photos or their embeddings. Everything runs on your machine.

Echo indexes your photos locally using 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. All of this happens on-device — the model, the index, and your photos never leave your computer.
Backend — Python 3.11, FastAPI, CLIP via HuggingFace Transformers, FAISS, SQLite Frontend — C# / .NET 8, WinForms, WebView2 (HTML/CSS/JS UI), DWM APIs for acrylic blur
echo/
├── backend/
│ ├── main.py — FastAPI app + all endpoints
│ ├── model.py — CLIP model loading
│ ├── indexer.py — image embedding + FAISS indexing
│ ├── searcher.py — text query embedding + search
│ ├── database.py — SQLite operations
│ ├── watcher.py — filesystem watcher for auto-indexing
│ ├── paths.py — resolves where user data vs. bundled resources live
│ └── echo-backend.spec — PyInstaller build spec
├── frontend/EchoApp/
│ ├── Program.cs — entry point
│ ├── BootstrapAppContext.cs — first-run backend setup, inside the message loop
│ ├── AppContext.cs — tray icon, hotkey, first-run auto-indexing
│ ├── BackendManager.cs — spawns/manages the Python backend process
│ ├── BackendDownloader.cs — downloads the backend package on first run
│ ├── IndexingWatcher.cs — polls indexing progress, tray notifications
│ ├── SearchWindow.cs — floating search UI
│ ├── FolderManagerWindow.cs — folder management UI
│ ├── EchoBridge.cs — JS ↔ C# bridge for the WebView2 UI
│ └── ui/ — HTML/CSS/JS frontend
└── echo-setup.iss — Inno Setup installer script
The 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, verifies it with a SHA-256 checksum, and extracts it — a one-time setup step with its own progress window.
User data (the SQLite database, FAISS index, and thumbnail cache) lives in %LOCALAPPDATA%\Echo, independent of wherever the app itself is installed.
Download the latest installer from the Releases page 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.
Backend:
cd backend
python -m venv .venv
.venv\Scripts\Activate.ps1
pip install -r requirements.txt
uvicorn main:app --reload
Frontend:
cd frontend/EchoApp
dotnet run
# 1. Build the backend
cd backend
pyinstaller echo-backend.spec
# 2. Zip and host it (e.g. as a GitHub Release asset), then update the
# BackendDownloadUrl and ExpectedSha256 constants in BackendDownloader.cs
# 3. Publish the frontend
cd frontend/EchoApp
dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true
# 4. Compile echo-setup.iss with Inno Setup
MIT — see LICENSE for details.
38 commits
C#
44.2%
HTML
29.1%
Python
23.8%
Inno Setup
2.9%