Skip to content

Private, self-hosted face Β· object Β· location search for your Proton PhotosΒΆ

Search your photo library
like Google Photos β€” but private.

Proton Faces indexes your end-to-end encrypted Proton Photos locally so you can search faces, places, and objects without ever uploading a single byte back.

Live demo login β€” username demo Β· password protonface-demo-2026-Q9vK3m

Browsing the Proton Faces mobile app inside an iPhone frame

What it doesΒΆ

Proton Photos are end-to-end encrypted β€” so nobody but you (and your own machine) can ever look at them. That also means you have to do the searching. Proton Faces turns your encrypted photo library into a fully searchable archive, without ever uploading a single byte back.

πŸ‘₯ PeopleΒΆ

RetinaFace + ArcFace detect and embed every face; HDBSCAN clusters them into persons you can name.

πŸ” "Who is this?"ΒΆ

Drop a photo of a face β†’ find every other photo of the same person.

🏷️ Face tagging UX¢

Face-crop covers, clickable face boxes on each photo, name one face and all look-alikes are auto-tagged.

πŸ—ΊοΈ PlacesΒΆ

GPS reverse-geocoding β†’ interactive world map with clustered markers (Leaflet + OSM).

Zero-shot CLIP β€” type "dog", "car", "beach", "Lille".

πŸ“± iPhone (HEIC) photosΒΆ

Proton serves no preview β†’ we decode the full-res file locally and generate our own thumbnail.

🧩 Unassigned queue¢

Review faces that didn't cluster yet and name them in bulk.

🎬 Videos¢

Detected and indexed, hidden from photo grids (no preview available).

Privacy-first by design. No telemetry. No cloud APIs. The only network calls go to Proton's servers. All ML runs locally (ONNX Runtime + CLIP on CPU, no GPU required). The bridge is strictly read-only against Proton.

See it in actionΒΆ

Type dog, beach, then Lille β€” results re-rank in real time.

How it worksΒΆ

flowchart LR
    A[Proton Photos<br/>end-to-end encrypted] -->|read-only| B[proton-bridge<br/>Bun + Proton SDK]
    B -->|timeline diff<br/>NDJSON streamed| C[indexer container]
    C -->|thumbnail β†’ WebP| D[FastAPI app]
    C -->|face detection<br/>CLIP embedding<br/>HDBSCAN clustering| E[(SQLite index<br/>+ thumbs)]
    D -->|serves| F[Web UI<br/>:8080]
    E --> D
  • proton-bridge authenticates with your existing Proton session and is the only component that ever talks to Proton. Strictly read-only β€” no uploads, no writes, no deletions.
  • indexer runs recognition (faces + CLIP), generates thumbnails, clusters people, and reverse-geocodes GPS β€” all in the background.
  • app serves the FastAPI search API and the vanilla-JS web UI on :8080.
  • Every photo is processed once: thumbnail downloaded (or decoded locally for HEIC) β†’ recognition run β†’ small 512px thumbnail cached β†’ original bytes discarded.

Try it without a Proton accountΒΆ

Want to poke at a running instance right now? Open the live demo β€” a hosted demo instance with a curated library of free CC0/Unsplash photos. Log in with username demo and password protonface-demo-2026-Q9vK3m.

Or run the same demo locally: proton-faces ships with a built-in demo mode that replaces the Proton bridge with a curated fixture of free CC0/Unsplash photos. docker compose --profile demo up -d and you're browsing a populated library in under a minute β€” no Proton credentials required.

Read the demo mode guide β†’

Where to next?ΒΆ

Guide Description
Installation Docker compose, single-process, local dev
Quickstart 5-minute tour: log in, search "dog", open People, name a face
Demo mode Run the full app without a Proton account
User guide Walk through every view, feature, and shortcut
Mobile & PWA Install the app on your phone, offline shell, mobile layout
Architecture Three containers, two SQLite writers, zero telemetry
API reference Every REST endpoint
Configuration Every environment variable
Security & privacy What's on disk, what's not, and how tokens work
FAQ Common questions

This project is not affiliated with Proton AG. "Proton", "Proton Drive" and "Proton Photos" are trademarks of their respective owners. Use at your own risk.