Skip to content

amys94fr/Mirafold

Repository files navigation

Mirafold

Mirafold

The local-first photo intelligence app for Windows.

Find any photo with a sentence. Cluster faces. Dedupe duplicates. All on your machine.

MIT License GitHub stars Tauri 2 React 19 Python 3.10+ Windows


Why Mirafold

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.

✨ Features

  • 🔍 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 scansmtime + 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 in src/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).

🎬 Demo

Mirafold demo

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.

🏗️ Architecture

┌────────────────────────────────────────────────────────────────┐
│                    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.

🚀 Quick start

Prerequisites

  • 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

Install

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 pycountry

Run in dev

pnpm tauri:dev

First launch compiles ~440 Rust crates (~3–5 min). Subsequent launches use the cache and start in seconds.

Build a Windows installer

pnpm tauri:build

Output: apps/desktop/src-tauri/target/release/bundle/{msi,nsis}/.

🆚 Comparison

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 ⚠️ Optional ⚠️ Imports 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.

🗺️ Roadmap

  • 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.

🛠️ Tech stack

🤝 Contributing

Issues and PRs welcome. Before submitting a PR:

  1. Run pnpm typecheck in apps/desktop/.
  2. Make sure the sidecar still starts (python apps/ml-service/run.py and curl http://127.0.0.1:8765/health).
  3. If you touched the React UI, screenshot the change in the PR.
  4. Keep prose ASCII-friendly (the project's print pipeline on Windows is cp1252-sensitive).

See CONTRIBUTING.md for the full guide.

💝 Sponsor

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.

Sponsor on GitHub

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.

⭐ Star history

If Mirafold saves you a few hours of photo scrolling, hit the star button. It directly influences who finds the project on GitHub.

📜 License

MIT — see LICENSE. Built with ❤️ for people who'd rather keep their memories on their own hard drive.

About

Find any photo with a sentence. Cluster faces. Dedupe. All offline, on Windows. Local-first AI photo intelligence powered by OpenCLIP and OpenCV.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors