The basemap module: the offline PMTiles archive and its bounded
first-use downloader.
The offline basemap archive: one PMTiles file per machine, downloaded
once on first /map use into the shared geo cache, then served to the
gallery client by a Range-capable endpoint. View time never touches the
network.
Known classes of failure, attached where the cause is detected and read
where the error is logged. A lower level adds one with
.context(ErrorKind::...); the boundary that logs the error finds it with
ErrorKind::in_chain and records its code and remediation. Adding a
variant is how a new failure class gets a remediation; nothing matches on
error text.
Where per-command logs live, the one function that turns a failure into a
logged event, and the reader. Writer and reader share the names here so
they cannot disagree about the layout.
The fix-dates target transform, shared by [videre fix-dates](the command
that applies it) and videre status (which reports how many rows would
change without applying anything).
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.
Library-scoped advisory locks: how videre processes coordinate around one
library, keyed by the library’s own state directory instead of a
process-global home.
Small key-value state for library-scoped bookkeeping that is neither a
pipeline run nor a setting: one row per key, integer values, table
created on first use. Used today for the face recluster watermark; kept
generic so the next piece of watch state does not grow its own table.
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.
GPS coordinate clustering: groups nearby (lat, lon) points by
haversine distance into named location clusters, persisted to
location_clusters + file_hashes.location_cluster_id.
How long the last full place recompute and face regroup took, so videre watch can choose per batch between redoing the whole partition and placing
only the new files.
A flush hook for process exits that bypass main: the SIGINT handler
exits with 130 from inside core, so the binary registers how to flush its
buffered output and the handler calls it first.
The shared status model: one producer for everything that reports
pipeline state, so the CLI, stats, and the MCP tools cannot drift
into telling different stories about the same library (the duplication
this closes was flagged as DEBT:8).
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.