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

ADR-0002

Code structure

Cargo workspace with layered crates

ADR-0003

Catalog

SQLite via rusqlite

ADR-0004

Image decoding

libvips + LibRaw (proposed)

ADR-0005

AI inference

ONNX Runtime via ort

ADR-0006

Reverse geocoding

Offline GeoNames dataset

ADR-0007

Import safety

Copy, hash, verify; sources read-only

ADR-0008

Interoperability

XMP sidecars

ADR-0009

UI transport

Tauri IPC, plus an HTTP transport for development

ADR-0010

Quality priorities

  1. Never lose a photo. Imports are copy-only and verified; destructive actions (moving rejects) require confirmation and can be undone.

  2. Fast culling. The grid and loupe stay responsive while analysis runs in the background.

  3. Private and offline. No network access is needed after models are downloaded.

  4. Interoperable. Decisions are readable by other photo tools.

See Components for the code structure and Data for the data model.