memo-pic
One photo a day, described before the story behind it is lost.
How it works
memo-pic indexes a photo library over SMB and identifies photos still missing metadata. A daily session serves one set — a burst of photos the scanner grouped by capture time — rather than isolated images, so context carries across the batch and a date typed once can land on all twelve prints from the same afternoon. Sessions prefetch on home Wi-Fi and run offline, with edits queued and written back later.
Everything the app authors is written to XMP sidecar files next to each photo; original files are never modified. That constraint was chosen deliberately — embedded EXIF/XMP rewriting is where file corruption actually happens, and a sidecar write can't damage an original. Sidecars are also read by other tools in the same library, so descriptions added here show up elsewhere for free. Photos are identified by a SHA-256 content hash rather than a file path, so the index survives renames and moves on the share.
Highlights
- Habit-loop design: a weighted sampler serves clustered sessions instead of an infinite oldest-first backlog, because tedium is what kills the habit.
- Sidecar-only metadata writes with an XMP engine that round-trips unknown namespaces, so another tool's fields are preserved rather than clobbered.
- Three-way merge with set-union for tags and people, scalar conflict detection, and a compare-and-swap write loop for safe concurrent writers.
- Content-hash identity that survives renames and moves across the share.
- Scan-group handling for print scanners: the plain scan, the enhanced rendition, and the handwritten back of a print recognised as one physical photo.
- Correctness-critical engine split into a pure-JVM Gradle module with no Android dependencies, unit-testable on any JDK against golden files.
- Explicit safety rules for coexisting with an existing MemoryLink library — skipped paths, no embedded writes, legacy format detection.