The local-first photo intelligence app for Windows.
Find any photo with a sentence. Cluster faces. Dedupe duplicates. All on your machine.
You have thousands of photos on your hard drive. Finding one specific shot means scrolling for an hour. You'd love something like Google Photos: type "dog in the snow" and get the right results, see all the photos of your sister automatically grouped together, find every blurry duplicate burning gigabytes.
But you don't want your entire life uploaded to someone's cloud.
Mirafold runs the same kind of AI photo intelligence — CLIP for natural-language search, modern face recognition, perceptual hashing for duplicates — directly on your PC. No accounts, no uploads, no telemetry. Your photos stay where they are.
- 🔍 Natural-language search — Type
"sunset over the ocean","my birthday with cake","crowded street at night". Powered by OpenCLIP ViT-B-32, 512-D embeddings indexed in SQLite. - 👤 Face recognition & people clustering — OpenCV YuNet + SFace detect and embed every face, then Agglomerative Clustering groups them into people you can label.
- 🪞 Duplicates & near-duplicates — Perceptual hashing (pHash + dHash) finds exact copies and visually similar photos with a tunable similarity threshold (default 95%).
- 📍 Place & date grouping — EXIF GPS extracted and reverse-geocoded to city/country offline. Auto-group by folder, year, month, city, country, camera brand, or camera model. Each dimension is also a filter.
- 🖼️ Lightbox & bulk ops — Click to open full-size with prev/next nav, Ctrl+A to select all visible, send to Recycle Bin or rename in bulk with templates (
{n},{date},{orig}). - 🚀 Incremental scans —
mtime+ size cache. Re-scanning a folder of 10,000 photos with no changes takes seconds. - 🌍 Multilingual UI — English and French ship out of the box, auto-detected from your system locale. Add a new language by dropping a JSON file in
apps/desktop/src/i18n/locales/and listing it insrc/i18n/index.ts. - 🔒 100% local — No cloud accounts. No telemetry. No internet required after model download (~600 MB OpenCLIP, ~37 MB face models, one time).
Library with grouping by year/country/camera, faces auto-clustered into people, semantic search returning photos that match a natural-language query. Photos containing identifiable faces are intentionally blurred in this demo; photos with no faces detected (landscapes, sunsets, objects) are shown sharp so you can see what semantic search actually returns. On your own machine, every photo is sharp.
┌────────────────────────────────────────────────────────────────┐
│ Tauri 2 (Rust shell) │
│ ┌────────────────────────┐ ┌────────────────────────────┐ │
│ │ React 19 + Vite UI │ │ Python ML sidecar │ │
│ │ (WebView, dark mode) │◄──►│ FastAPI on 127.0.0.1:8765 │ │
│ └────────────────────────┘ │ │ │
│ │ • Scanner (pHash/dHash) │ │
│ │ • OpenCLIP (ViT-B-32) │ │
│ │ • OpenCV face pipeline │ │
│ │ • EXIF + reverse-geocode │ │
│ │ • Send2Trash / rename │ │
│ └─────────────┬──────────────┘ │
│ ▼ │
│ SQLite + sqlite-vec │
│ (photos, embeddings 512-D + 128-D, clusters) │
└────────────────────────────────────────────────────────────────┘
- Rust spawns the Python sidecar at startup, kills it on close (
kill_on_drop). - React talks to the sidecar over plain HTTP. CORS is whitelisted to
localhost+tauri.localhost. - SQLite + sqlite-vec stores everything in one file (
%LOCALAPPDATA%\Mirafold\library.db). No server, no PostgreSQL, no Docker. - Photos are never copied or moved. Mirafold only reads files and writes thumbnails to its own cache.
- Node.js 22+ and pnpm 10+ (
npm i -g pnpm) - Python 3.10 or 3.11 (3.12+ untested with all ML deps)
- Rust stable 1.95+ (install via rustup)
- Windows 10 or 11
git clone https://github.com/amys94fr/Mirafold.git
cd mirafold
pnpm install
pip install --user -r apps/ml-service/requirements.txt
# Heavy ML deps (~700 MB torch CPU + models)
pip install --user torch torchvision --index-url https://download.pytorch.org/whl/cpu
pip install --user open-clip-torch opencv-python scikit-learn pillow-heif \
reverse_geocoder pycountrypnpm tauri:devFirst launch compiles ~440 Rust crates (~3–5 min). Subsequent launches use the cache and start in seconds.
pnpm tauri:buildOutput: apps/desktop/src-tauri/target/release/bundle/{msi,nsis}/.
| Mirafold | PhotoPrism | Immich | digiKam | Google Photos | |
|---|---|---|---|---|---|
| Local-first (no server) | ✅ Single binary | ❌ Docker | ❌ Docker | ✅ | ❌ Cloud |
| Natural-language search | ✅ CLIP | ✅ TensorFlow | ✅ CLIP | ❌ | ✅ |
| Face clustering | ✅ | ✅ | ✅ | ✅ | ✅ |
| Duplicate detection | ✅ pHash + dHash | ✅ | Limited | ✅ | ❌ |
| Setup time | < 5 min | 30 min Docker | 30 min Docker | Native install | Sign in |
| Re-encodes / moves files | ❌ Reads only | ❌ | N/A | ||
| Footprint | ~10 MB binary + ~1 GB models | ~3 GB Docker | ~3 GB Docker | ~500 MB | N/A |
Mirafold's sweet spot: one user, one PC, photos already organized in folders, wants modern AI features without running a server.
- Core ingest pipeline (scan, hash, thumb, EXIF, GPS, camera, reverse-geocode)
- Duplicates detector (pHash + dHash, union-find grouping)
- OpenCLIP semantic search (text → image)
- OpenCV face detection + recognition + Agglomerative clustering
- React UI with infinite scroll, lightbox, bulk actions, 8 grouping dimensions and live filters
- Map view (cluster GPS-tagged photos on a real map)
- Image → image semantic search ("find more like this")
- Smart albums (saved searches)
- HEIC import with native decoder fallbacks
- Sidecar packaged as standalone binary (PyInstaller) for
tauri build - macOS and Linux builds
Open an issue if you want to drive one of these or have other ideas.
- Shell: Tauri 2 (Rust 1.95)
- UI: React 19, Vite 8, TypeScript 6, Tailwind CSS v4
- ML: OpenCLIP, OpenCV (YuNet + SFace), PyTorch CPU
- Backend: FastAPI, SQLite + sqlite-vec
- Misc: reverse_geocoder, imagehash, send2trash
Issues and PRs welcome. Before submitting a PR:
- Run
pnpm typecheckinapps/desktop/. - Make sure the sidecar still starts (
python apps/ml-service/run.pyandcurl http://127.0.0.1:8765/health). - If you touched the React UI, screenshot the change in the PR.
- Keep prose ASCII-friendly (the project's print pipeline on Windows is cp1252-sensitive).
See CONTRIBUTING.md for the full guide.
Mirafold is built and maintained on personal time, with no company behind it and no plan to introduce a paid tier or telemetry. If the app saves you hours of scrolling or replaces a paid cloud service, you can help keep it that way.
Funds go directly toward:
- Time spent shipping new features (map view, image → image search, smart albums, macOS/Linux builds)
- Code-signing certificates so the Windows installer stops triggering SmartScreen warnings
- A modest GPU budget for testing the heavy ML pipeline on real-world libraries
Free ways to help that also make a real difference: ⭐ star the repo, open thoughtful issues, share Mirafold with someone who'd benefit from it.
If Mirafold saves you a few hours of photo scrolling, hit the star button. It directly influences who finds the project on GitHub.
MIT — see LICENSE. Built with ❤️ for people who'd rather keep their memories on their own hard drive.
