Classifications table: one row per unique content hash (photo/screenshot/
document/meme/unknown), keyed to embeddings.hash. Zero-shot classification
reuses embeddings videre embed already computed. See
docs/superpowers/specs/2026-07-29-screenshot-document-classification-design.md.
Forward geocoding: place name (e.g. “Berlin, Germany”) -> (lat, lon), via
the free public Nominatim (OpenStreetMap) API, with a local cache so a
repeated query never repeats the network call. See
docs/superpowers/specs/2026-08-01-location-clustering-design.md.
Aggregate library statistics for dashboard-style callers.
Plain queries over an open rusqlite::Connection, shared source of truth
for the gallery’s stats tile, videre stats, and any other embedder.
See docs/superpowers/specs/2026-07-31-dashboard-stats-backend-design.md
(Pass A) for what is and isn’t in scope.
GPS coordinate clustering: groups nearby (lat, lon) points by
haversine distance into named location clusters, persisted to
location_clusters + file_hashes.location_cluster_id. See
docs/superpowers/specs/2026-08-01-location-clustering-design.md.
Per-command pipeline run history and liveness, surfaced by videre stats
and other dashboard-style callers.
See docs/superpowers/specs/2026-07-31-dashboard-stats-pass-b-design.md
for the full design, and in particular why track() below does not rely
on Drop/RAII for the success/failure bookkeeping, only the lock’s
release does, and even that is backstopped by the OS releasing flock on
any process death.
Free-form tags, stored many-to-many by content hash so they follow a photo
across duplicates and moves, exactly like marks. A tag is one opaque string;
a /-separated path is stored verbatim with no hierarchy semantics (that is a
deferred follow-up). Mirrors the shape of videre_core::marks.
Collects the non-face owned labels for one photo hash (image dimensions,
resolved location name, zero-shot category) that a sidecar export needs.
Faces are gathered separately via face_db::labeled_faces_by_hash. Returns
plain data; the binary assembles the XMP model, because that type is
binary-only.