Problem
PictoPy's library is entirely user-initiated. Nothing surfaces unless you go looking for it: no "this day last year", no trip recap, no prompt to revisit anything. Every other photo app does this, and PictoPy already stores everything needed to — capture dates, GPS, face clusters, SigLIP2 embeddings and semantic labels — it just never uses them to offer anything.
There is an existing memory_clustering.py, but it is not a foundation to build on. It re-clusters the entire library on every API call, persists nothing, and has no notion of ranking or of "have I already seen this?". A large portion of it is unreachable, and it carries a hardcoded 30-city reverse-geocode table.
Proposal
Persisted, scored photo collections that surface on their own, shown in a full-screen story viewer.
Curation — three triggers
Memories should be idempotent: regenerating must not produce a different set from the same photos, and must never resurface something already watched or dismissed.
Ranking
Naming
Videos
Story viewer
API
Data quality prerequisites
Memories are only as good as the capture dates behind them, and there are known problems here that have to be fixed first — a library copied from another machine currently reads as though every photo was taken on import day:
Pipeline integration
Out of scope for the first pass
- Desktop notifications (Tauri background task, launch-time trigger) — worth its own PR, but the schema should be designed with it in mind from the start
- Rediscovery — bringing a memory back after it hasn't been seen for months. The first pass will produce a queue that drains; this is what turns it into something ongoing
Acceptance criteria
Problem
PictoPy's library is entirely user-initiated. Nothing surfaces unless you go looking for it: no "this day last year", no trip recap, no prompt to revisit anything. Every other photo app does this, and PictoPy already stores everything needed to — capture dates, GPS, face clusters, SigLIP2 embeddings and semantic labels — it just never uses them to offer anything.
There is an existing
memory_clustering.py, but it is not a foundation to build on. It re-clusters the entire library on every API call, persists nothing, and has no notion of ranking or of "have I already seen this?". A large portion of it is unreachable, and it carries a hardcoded 30-city reverse-geocode table.Proposal
Persisted, scored photo collections that surface on their own, shown in a full-screen story viewer.
Curation — three triggers
Memories should be idempotent: regenerating must not produce a different set from the same photos, and must never resurface something already watched or dismissed.
Ranking
Naming
Videos
Story viewer
API
/memorieswith proper response models — list, single story, "the one to surface now", generate, mark viewed/dismissed, deleteData quality prerequisites
Memories are only as good as the capture dates behind them, and there are known problems here that have to be fixed first — a library copied from another machine currently reads as though every photo was taken on import day:
Pipeline integration
Out of scope for the first pass
Acceptance criteria