Skip to content

Browsing and labeling in a browser

videre can produce visual content based on the command.

  • A static file saved into <library>/.videre folder or a local web server. You can open static file directly via open <filename> command from terminal or via finder on MacOS or via Linux equivalent.
  • A local server that you need to navigate to provided URL (http://127.0.0.1:7878) to open. There you can view your media files, duplicates, files grouped by date, face clusters, a map and automatic events, and you can label people you know.
You want to Command What you get
Check duplicates before delete videre dedupe --html A file
Check duplicates before delete videre gallery and browse /duplicates A local server
Find photos videre search --location "Berlin" --html A file
Many more features videre gallery A local server

A static file has to contain everything, because it is opened via file:// with nothing running. That makes it portable and permanent, but it cannot show anything computed on demand.

Named faces and place names are looked up per photo, so they need a backend. That is the whole reason gallery is a server rather than something that bakes results into a file.

It also changes how images load. A static report links to your files with file://. A served page cannot, because browsers refuse to load a file:// subresource from an http:// page, so image bytes come through an endpoint instead.

The default, and the one to run before deleting anything.

Terminal window
videre dedupe --html

Groups are sorted by wasted space, each file badged KEEP or REMOVE, with thumbnails, sizes, dates, GPS and paths. Expand or collapse all, and re-sort by wasted space or by date.

This is the same grouping and the same KEEP choice that videre dedupe will print, so what you see is what will happen. Group members share their pixels but not always their metadata, so you are reviewing which path survives, which matters most when one copy is on a drive you think of as the backup, and whose dates and location survive with it.

Near-duplicates found by dedupe --similar (fingerprints from embed) appear here for eyeballing, and deliberately never in dedupe’s pipeable output.

Terminal window
videre faces # detect and group first
videre gallery # browse /people and name people

People tab has three sections:

  • People, ones you have named (default on the right-hand side, you can move it on top)
  • Unassigned clusters, groups it is confident about but has no name for
  • Singletons, faces it could not group

Drag a cluster’s handle onto a person card to assign it, or click New Person to create one from it. One drag can name forty photos, which is the whole point.

Assigning a face to a person freezes it: reclustering and retuning never move a named face. You remove a label here, or wipe everything with videre faces --reset. Removing a person returns their faces to the unassigned pool, and the next grouping pass regroups them.

Each cluster links to a detail page at /people/cluster/<id>, showing every face full size, with per-face remove and assign for the odd wrong member. A person’s page is /people/person/<name>, and both link back to People. Dissolve cluster breaks a wrongly-merged group back into singletons without deleting any faces, and is usually a better fix than retuning the whole clustering.

Clicking a face opens the full-resolution original, served by the backend rather than linked, since a page on http:// cannot navigate to file://.

Names are written back as you go. Stop with Ctrl-C or Save & Close, then search --person works.

Retuning later with faces --recluster does not lose names, because they are stored per face rather than per group.

Terminal window
videre gallery

One server, every view on its own route. The lightbox shows each photo’s named faces, clicking one jumps to that person, and places are reverse-geocoded on demand.

Route Shows
/ Every file
/duplicates Duplicate groups
/date Year, month, day drill-down
/people Face groups, and where you name them

A strip along the top of every page switches between them, so none of them needs to be typed.

Duplicates used to share / with the file list. They have their own route now, so the page everyone lands on shows files and nothing else.

Those used to be flags on a single page, and combining them needed a table to explain which one won. Routes need no such explanation, which is why they replaced the flags in 0.18.0.

Server mode never converts HEIC up front. Thumbnails are produced per request and taken from the cache when present, which is why the page opens immediately instead of taking minutes on a HEIC-heavy library.

Warm the cache first and the first click is fast too:

Terminal window
videre --library ~/Photos watch --heic # Ctrl-C once counts settle
videre gallery

Static reports link to your photos with file://, which resolves only on the machine that generated them. Sent to someone else, the page loads and every image is broken.

To produce something that travels, embed the images:

Terminal window
videre dedupe --html for-sharing.html

The page links to your files by path, so it is small but only complete on the machine holding them. Embedding the images instead is not currently offered: report --heic used to do it, and went with that command in 0.20.0.

The default port can move. gallery binds 7878 and, when that is taken, advances to the next free port (7879, 7880, …), so two galleries for different libraries run side by side without assigning ports. Check the startup line for the address actually bound; an explicit --port is used exactly and fails when that port is busy.

Served image bytes come from an allowlist. The endpoint only serves paths already recorded in the database, so it is not a general file server. It does mean anything that can reach localhost:7878 can read those images while it is running.

A static report is a snapshot. It reflects the database when generated. After deleting duplicates, regenerate it.

Files missing from disk are still listed. A static page reads the database, so a photo deleted outside videre appears until videre prune removes its row.

Similarity search needs videre embed, and lives only in gallery. A static page cannot carry it: matching against every vector needs the database, which an exported file does not have. Without embeddings, gallery still serves every view and says so rather than failing.

The Similar button on a card ranks the whole library against that photo. The server does the ranking, so it works at any library size, and the page never downloads a vector. It appears only once the library has embeddings; with none there is nothing to rank against, so the button is omitted rather than shown and failing when clicked.

Nothing leaves your machine. The server binds to 127.0.0.1, and the pages make no external requests.