Photos is the app most people will open first, so it had to be good — not "good for self-hosted," just good. The benchmark was Apple Photos, and the constraint was that none of it could exist on the server in the clear.
A grid that flows
The library uses a continuous-flow layout: sparse days share a row instead of each claiming a lonely line, so scrolling feels dense and natural. Selection is first-class — drag-select from anywhere (including the empty margins), keyboard shortcuts, an inset selection ring, and a live count that animates as you go.
Under the hood it's virtualized, so a library of tens of thousands of photos scrolls without breaking a sweat — and we spent an embarrassing number of commits making the virtualization range update correctly so the grid never tears or gaps.
Real formats, real metadata
- HEIC and Apple Live Photos upload and display natively.
- Videos play on hover, right in the grid.
- EXIF is parsed client-side — camera, lens, exposure — and the capture location is shown on a map in the details panel.
- Photos sort by true capture date, parsed from mixed-precision timestamps, so your timeline matches what actually happened.
Because everything is E2E, all of this — including the thumbnails and the map — is decrypted only in your browser.
A real editor
The editor saves non-destructive edits as a before/after stack: your original is never overwritten, and you can always step back. Crop, adjust, and compare, then save a new version that lives alongside the source.
Stacks and search
Stacks group related shots — burst sequences, edited versions, collections — behind a single cover with a count, Immich-style, so the grid stays clean.
The part we're proudest of is semantic search. Type "red bike in the snow" and it just works — powered by a CLIP model running on your device. The embeddings are computed locally, encrypted, and ranked client-side, so you get Google-Photos-style search with zero server-side access to your images.
Search that understands your photos, without a single one of them being readable by the server.
It's yours
Every feature here was built under the same rule as the rest of PolarHQ: it has to work entirely from encrypted data the server can't read. Apple-Photos polish, on a server you own. That was the whole assignment.