Browsing and labeling in a browser
videre can produce visual content based on the command.
- A static file saved into
<library>/.viderefolder or a local web server. You can open static file directly viaopen <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 |
Why the difference exists
Section titled “Why the difference exists”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.
Reviewing duplicates
Section titled “Reviewing duplicates”The default, and the one to run before deleting anything.
videre dedupe --htmlGroups 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.
Naming people
Section titled “Naming people”videre faces # detect and group firstvidere gallery # browse /people and name peoplePeople 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.
Live browsing
Section titled “Live browsing”videre galleryOne 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.
HEIC is faster here than it looks
Section titled “HEIC is faster here than it looks”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:
videre --library ~/Photos watch --heic # Ctrl-C once counts settlevidere gallerySharing a report
Section titled “Sharing a report”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:
videre dedupe --html for-sharing.htmlThe 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.
Caveats
Section titled “Caveats”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.