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

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).
π Free-text searchΒΆ
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).
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.
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 |