Overview¶
Picturesque is a desktop application that imports photos into an organized library and helps the user cull them: it groups shots into series, scores each photo, and highlights the best ones. Everything runs locally; no photo or metadata leaves the machine.
System context¶
flowchart LR
user([Photographer])
subgraph machine[User's computer]
app[Picturesque]
src[(Source folders)]
clean[(Clean library<br/>photos + XMP sidecars)]
catalog[(Catalog<br/>SQLite + caches)]
models[(AI models)]
end
other[Lightroom / darktable / digiKam]
user --> app
app -- reads, never modifies --> src
app -- copies, organizes --> clean
app <--> catalog
app -- loads --> models
other -- reads ratings/flags --> clean
Source folders are read-only inputs. Picturesque never modifies or deletes them (ADR-0008).
Clean library is the organized output: photos copied into a folder structure rendered from a user template, plus XMP sidecars that carry ratings and pick/reject flags to other tools (ADR-0009).
Catalog is the application’s own state: photo records, metadata, scores, series, decisions, thumbnails and embeddings (ADR-0004).
AI models are ONNX files downloaded once and run on-device (ADR-0006).
Main workflows¶
- Import
Watch import folders; for each photo found, read metadata, resolve GPS to place names offline, render the target path from the template, copy and verify each file, and record it in the catalog, one photo at a time (ADR-0012).
- Analyze
In the background: generate thumbnails and previews, compute technical scores (sharpness, exposure), AI scores (aesthetics, faces and eyes) and embeddings, group photos into series, and rank the best photo in each.
- Cull
Browse the timeline, where each series is drawn inside a frame and the best photo has a green border; pick, reject and rate with the keyboard; filter by metadata and scores. Decisions are stored in the catalog and written to XMP sidecars.
- Output
Move rejects out of the way and export picks.
Technology¶
Concern |
Choice |
Decision |
|---|---|---|
Desktop shell and UI |
Tauri 2, Svelte 5, TypeScript |
|
Code structure |
Cargo workspace with layered crates |
|
Catalog |
SQLite via |
|
Image decoding |
libvips + LibRaw (proposed) |
|
AI inference |
ONNX Runtime via |
|
Reverse geocoding |
Offline GeoNames dataset |
|
Import safety |
Copy, hash, verify; sources read-only |
|
Interoperability |
XMP sidecars |
|
UI transport |
Tauri IPC, plus an HTTP transport for development |
Quality priorities¶
Never lose a photo. Imports are copy-only and verified; destructive actions (moving rejects) require confirmation and can be undone.
Fast culling. The grid and loupe stay responsive while analysis runs in the background.
Private and offline. No network access is needed after models are downloaded.
Interoperable. Decisions are readable by other photo tools.
See Components for the code structure and Data for the data model.