All projects

Data & algorithms

Photato

A self-hosted photo library in Rust that organizes existing folders without ever writing to the original photos.

Technologies: Rust · SQLite · ONNX Runtime · Leaflet

Stage: Version 0.5; usable for testing against an existing photo library

Screenshot tour

Open full page

Step through Photato's timeline, places map, events and face grouping. These are screenshots from a local run against public-domain and CC0 photos, not a live instance.

Photato's Photos view showing a grid of Yosemite photos from June 23, 2023, with ratings and favorites, and a year rail running from 2023 back to 1850.

A photo library that leaves the photos alone

Photato is a photo library for a small self-hosted installation. It browses folders of photos that already exist, rather than importing them into its own storage. Original photos, videos and sidecar files are read-only inputs. Albums, tags, ratings, favorites, people and descriptions live in Photato’s separate catalog, so deleting an album or correcting a face never touches a file.

It is a single Rust program with SQLite by default, so it needs no database server, Redis, Node.js or machine-learning service. Firebird, PostgreSQL and MariaDB are optional for running several application instances against one shared catalog.

The screenshots on this page come from Photato running on my machine against a small demo library, not my own photos. They show 21 CC0 photos from Yosemite and Zion and 10 public-domain portraits; the credits are at the end. Photato itself does not run on this website.

Places and events, from the photos’ own metadata

Photato reads capture times, camera details and GPS from EXIF, and descriptions, dates and locations from Google Photos JSON sidecars. Sidecars are read, never rewritten.

Nearby GPS coordinates become suggested places, and photos taken close together in time become suggested events. There is no reverse-geocoding service, and the map loads tiles only when you open it. Photos without GPS are never given a guessed location: the Zion photos in the demo have capture times but no coordinates, so they form events but stay off the map.

Photato's Places view: an OpenStreetMap map of Yosemite Valley with photo clusters along the Merced River, beside a panel of the 11 photos taken in that area.
Places groups the Yosemite photos by their GPS coordinates. Map data © OpenStreetMap contributors.
Photato's Events view showing the Yosemite Valley hike event: 11 photos from June 23, 2023, with ratings and favorites.
Events are suggested from capture times. I renamed the three suggestions in the demo, as a user would.

People, grouped on your own machine

Face detection and grouping run locally with pinned, hash-verified models through ONNX Runtime’s CPU backend; no photos are uploaded. Photato proposes groups of unknown people, and you name, merge, split, confirm or correct them. Corrections survive later analysis and rescans, and merges can be undone.

In the demo, analysis put all four Lincoln portraits in one group and all three of Douglass. It split Mark Twain in two: the 1907 portrait of him at 71 formed its own group, apart from photographs from 1867 and 1871. One merge corrected it, which is the review workflow Photato is built around.

Photato's People view with three named people: Abraham Lincoln with 4 photos, Mark Twain with 3, and Frederick Douglass with 3.
The People view after naming the three groups and merging Mark Twain's 1907 portrait.
Abraham Lincoln's page in Photato, showing four portraits dated February 9, 1864, November 8, 1863, April 6, 1861, and 1858.
A person's photos in date order. The portraits' dates come from their sidecars.

Built to be trusted with a real library

Scans run as durable background jobs with bounded parallelism, progress, error reports and cancellation. A file that disappears is marked missing only after a complete, error-free scan, so a cancelled or failed scan never hides photos. Missing entries keep their organization and cached previews. An audit command records the SHA-256, size, modification time and mode of every original before testing and verifies them afterward.

Search uses SQLite full-text search across filenames, paths, cameras, descriptions, tags, and people, place and event names. The gallery has a scrolling date timeline, folders, favorites, an archive, exact-duplicate detection, keyboard navigation and a slideshow.

What it is not yet

Version 0.5 is usable for testing against an existing library, but it is not a complete replacement for a project like Immich. Phone backup and mobile apps, uploads, multiple users, sharing links, visual search, crop and color editing, and video transcoding are not implemented.

Demo photo credits

The Yosemite photos are by Brush1988 and the Zion photos by Vulturesong, both released under CC0 on Wikimedia Commons. The portraits are public domain. Year-only and circa dates are entered as January 1, which is why one Lincoln portrait shows January 1, 1858.

Portrait sources