Loading library…

📸 🎥 Media Clusterer

Media Clusterer lays your photos and videos out on a map where similar pictures sit close together, and finds them when you describe them in words ("a dog on the beach"). It all runs in this browser: your files are never uploaded.

🧭 How it works

  1. The AI model downloads once (300–900 MB, depending on the device) and is kept in the browser's cache, so later visits start fast.
  2. Each picture becomes a list of numbers (an "embedding") that describes what is in it. Videos are sampled as a few frames. This happens on your device and is cached, so a folder is only processed once.
  3. The map places pictures with similar numbers near each other. Search turns your words into the same kind of numbers and shows the closest pictures.

⚙️ Which AI runs on this device

  • EmbeddingGemma 2 on WebGPU: most computers and phones with a graphics chip. Best results.
  • EmbeddingGemma 2 on WebNN: phones whose graphics chip is too slow for WebGPU, such as the Pixel 10 (PowerVR). Needs chrome://flags → "WebNN API" turned on. About 3 seconds per photo there.
  • nomic: the fallback when neither works. Smaller and less accurate, but runs anywhere, even without a graphics chip.

The badge in the top bar shows the model and backend in use. To see how fast each option is here, open the test page: WebNN (NPU) · WebGPU · CPU. You can switch models in ⚙️ Settings.

🖱️ Controls

  • Pan: drag · Zoom: scroll or pinch · Open: tap a picture
  • Search: type a description in the bar at the bottom
  • Resume: reopen your last folder without processing it again
  • Keyboard: press ? for all shortcuts

🔒 Privacy and storage

Files stay on your device. The model files come from Hugging Face (or the mirror set in Settings); the embeddings are stored in this browser (IndexedDB) until you press Reset. Supported formats: JPG, PNG, WebP, MP4, WebM.

⌨️ Keyboard Shortcuts

← → ↑ ↓ or W A S DNearest photo in that direction on the map
N / PNext / previous photo by date
RRandom photo
EBack to the photo before the last random jump
SpacePlay / pause the slideshow (asks the order — date, random or similarity — the first time)
EnterOpen the highlighted photo on the map
/Jump to the search box
EscClose the viewer or this dialog
?Show this guide
`Toggle the debug overlay
Drag · Scroll / pinch · ClickPan · Zoom · Open a photo

▶ Play slideshow

Starts from the current photo. Tap ⏸ (or Space, or the photo) to pause and ▶ to resume. Closing the photo stops it.

⚙️ 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.
How many image tokens each photo gets. Switch to Light if the GPU resets while embedding. Each choice keeps its own cache, and changing it reloads the page.
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.

    ⚠️ WebGPU is turned off for this GPU

    1. Copy this address and paste it into the address bar:
    2. Set Unsafe WebGPU Support to Enabled.
    3. Tap Relaunch, then reopen this page.

    Chrome keeps WebGPU off on GPUs or drivers with known bugs, so with the flag on, embedding may be slow or the GPU may reset. Turn the flag back to Default if that happens.

    EXIF Data