Skip to main contentThe Local Bench

Use case 5 of 13

Search your photo library by description

Type "dog on the beach at sunset" and find it, across 20 years of photos, without a cloud photo service.

Blank instant-photo prints scattered around a phone and one blue frame
Image: generated with Grok Imagine

The real example

Immich smart search

Immich is a self-hosted photo and video library. Its smart search stores CLIP embeddings in Postgres, through the VectorChord extension, so you can search in free text without keywords or tags. Administrators can switch to larger CLIP or SigLIP models for better results, at the cost of more memory and slower indexing; changing model means re-processing the library. Immich's documentation notes its memory and speed figures are estimates that vary by setup.

Sources: Immich: searching · Immich: external libraries

Why run it locally

A photo library is a map of your life, with faces, places, children and documents. Indexing runs once, then search is instant.

Recommended stack

Three tiers built from our builds. Weights-in-memory is our arithmetic (parameters × bits), checked against each device's usable memory; it excludes KV cache and runtime overhead. Runtime compatibility is not validated.

Budget

Silent home server

$1,283Sample

16 GB on GeForce RTX 4060 Ti 16 GB

Weights ≈ 4.5 GB of 15.5 GB usableEstimate

Excludes KV cache and runtime overhead. Runtime compatibility is not validated.

Immich ships its own CLIP models; a small VLM can add captions on top.

Runtime: Immich (Docker) with its built-in CLIP machine-learning container

Mid

Used-3090 24 GB

$1,980Sample

24 GB on GeForce RTX 3090 24 GB (used)

Weights ≈ 6.5 GB of 23.5 GB usableEstimate

Excludes KV cache and runtime overhead. Runtime compatibility is not validated.

Captions from a VLM make text search work for things CLIP misses, such as text in images.

Runtime: Immich + Ollama for captions

Pro

Mac Studio M5 Max

$2,499Sample

36 GB on Mac Studio M5 Max (base)

Weights ≈ 18.8 GB of 27.0 GB usableEstimate

Excludes KV cache and runtime overhead. Runtime compatibility is not validated.

A quiet always-on box; caption new uploads as they arrive.

Runtime: Immich + llama.cpp (Metal)

Setup outline

  1. Run Immich with Docker Compose and import your library (read-only external libraries are supported).
  2. Leave the default CLIP model for a first pass, then try a larger multilingual model if you search in several languages.
  3. Run the Smart Search job and let it finish before judging results.
  4. Optionally caption photos with a local VLM and store captions as descriptions.

Limits

  • CLIP-style search is fuzzy. It finds "beach" well and exact details such as a licence plate poorly.
  • Indexing a large library takes hours on CPU. A GPU shortens it a lot.
  • The model choices in our tiers beyond Immich's built-in CLIP are our suggestions, not part of Immich.

Next: Smarter camera alerts

Build prices come from our build datasheets: GPUs and devices are sourced retail or sold prices; other parts are sample prices until sourced, and the flag on each total says which. Model links go to our datasheets, where each parameter count and licence was checked against the Hugging Face API.