Loading library…

📸 🎥 Media Clusterer

Visualize and search your photos & videos locally using AI. Everything runs in-browser — zero uploads, zero server.

🧠 Built With

🖱️ Controls

  • Pan: Click & drag · Zoom: Scroll/pinch
  • Search: Type a description (requires text model)
  • Resume: Reload your last session

✅ Requirements

  • ✓ Modern browser with WebGPU support (Chrome/Edge 113+) — check yours at webgpureport.org
  • ✓ GPU with ≥4GB VRAM recommended
  • ✓ ~380 MB for vision model + ~134 MB for text search (optional)
  • Chrome AI: Chrome 138+ with chrome://flags/#prompt-api-for-gemini-nano enabled
  • ✓ Media formats: JPG, PNG, WebP, MP4, WebM

⚙️ Settings

Skip AI model loading. Photos arranged in a grid by folder and date. Much faster, but no semantic search or smart clustering.
Sapiens2 is pretrained on 1B human images — better for photos of people. Chrome AI uses the browser's built-in Gemini Nano to describe images (Chrome 138+ only, requires chrome://flags/#prompt-api-for-gemini-nano). Takes effect on next model load. Switching requires a page reload.
For offline/corporate networks: a HuggingFace-compatible mirror or proxy base URL (e.g. Artifactory). Leave blank to use huggingface.co.
Any OpenAI-compatible API root. Examples: http://localhost:11434/v1 (Ollama), https://openrouter.ai/api/v1. A bare host works — /v1 is added for you.
Unchecked, the key is kept only until you close the tab. It is never written to your settings and never sent to error reporting.
This mode uploads your photos. Each image is downscaled to a small JPEG and sent to the endpoint above. Everything else in this app stays on your device. Changing any field here requires a page reload, because cached embeddings from a different model cannot be reused.
The prompt sent to Gemini Nano to describe each image. Changes apply to new embeddings only. Only shown when Chrome AI is selected.
When a folder has more than this many files, load a random sample of that size. Set to 0 to load all files.
Tight Sparse
Fast Best
Higher = faster embedding. ⚠️ Too high may crash on low-memory devices.
When enabled, no errors are sent to BugSink. Takes effect after page reload.

📤 Send your photos to this endpoint?

Remote mode works by uploading your images. Each photo is downscaled to a small JPEG and sent to this endpoint to be embedded there instead of in your browser.

What that means depends entirely on who runs that endpoint. If it is a server on your own machine or network, the images do not leave it. If it is a third-party API, your photos are sent to that company and handled under their terms — including any retention or training policy they apply.

Only the downscaled JPEGs and your model choice are sent. Filenames, folder paths and EXIF data stay on your device. Every other mode in this app runs entirely offline.

📡 Couldn't download the model

The model couldn't be fetched from huggingface.co — you may be offline or behind a corporate proxy/firewall. Pick one of the options below, then press Retry.

    Download these on a connected machine (click to open, or copy for curl/wget), then use option A.
    A HuggingFace-compatible base URL. Saved to Settings and reused for future downloads. Leave blank to use huggingface.co.
    EXIF Data