# imostocky/photo-library-repair architecture

> Architecture diagram of the GitHub repository imostocky/photo-library-repair, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/imostocky/photo-library-repair
- Repository: https://github.com/imostocky/photo-library-repair

## Overview

plr repairs photo libraries through a CLI workflow: scan directories and record image metadata in SQLite, group exact and near-duplicates, plan which pixels and metadata to retain, then materialize selected files and a report in a target folder. The CLI also supports incremental growth, summaries, and plan rollback. Internally, image fingerprinting and EXIF handling supply facts used by grouping and resolution. The graph follows documented workflow links; unsampled implementations and the optional AI planning link are not asserted beyond the README.

Main entry points: [`internal/cli/cli.go`](https://github.com/imostocky/photo-library-repair/blob/devel/internal/cli/cli.go) (Command dispatcher), [`internal/store/store.go`](https://github.com/imostocky/photo-library-repair/blob/devel/internal/store/store.go) (SQLite library), [`internal/ingest/ingest.go`](https://github.com/imostocky/photo-library-repair/blob/devel/internal/ingest/ingest.go) (Directory scan), [`internal/apply/apply.go`](https://github.com/imostocky/photo-library-repair/blob/devel/internal/apply/apply.go) (Apply plans)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_workflow["CLI workflow"]
  node_cli["Command dispatcher<br/>[cli.go]"]
  node_scanner["Directory scan<br/>[ingest.go]"]
  node_reporting["Library report<br/>[cli.go]"]
end

subgraph group_analysis["Image analysis"]
  node_fingerprint["Image fingerprint<br/>[fingerprint.go]"]
  node_phash["Perceptual hash<br/>[phash.go]"]
  node_exifread["EXIF reading<br/>[exif.go]"]
  node_minimalmeta["Minimal EXIF parser<br/>[meta.go]"]
end

subgraph group_library["Library and plans"]
  node_grouper["Duplicate grouping<br/>[group.go]"]
  node_identity["Identity strategies<br/>[identity_exif.go]"]
  node_partition["Incremental partition<br/>[partition.go]"]
  node_planner["Group planning<br/>[cli.go]"]
  node_ai["AI planning<br/>[kronk.go]"]
  node_sqlite[("SQLite library<br/>[store.go]")]
  node_commitlog[("Plan history<br/>[commit.go]")]
end

subgraph group_output["Materialization"]
  node_materializer["Apply plans<br/>[apply.go]"]
  node_exifwrite["EXIF writing<br/>[exifwrite.go]"]
  node_results["Target files and report"]
end

node_user(("CLI user"))

node_user -->|"runs commands"| node_cli
node_cli -->|"runs scan"| node_scanner
node_scanner -->|"fingerprints images"| node_fingerprint
node_fingerprint -->|"computes hash"| node_phash
node_scanner -->|"reads metadata"| node_exifread
node_exifread -->|"falls back to"| node_minimalmeta
node_scanner -->|"records images"| node_sqlite
node_cli -->|"runs grouping"| node_grouper
node_grouper -->|"refines candidates"| node_identity
node_cli -->|"partitions incoming"| node_partition
node_grouper -->|"stores assignments"| node_sqlite
node_cli -->|"runs planning"| node_planner
node_planner -->|"stores plans"| node_sqlite
node_planner -.->|"may use AI"| node_ai
node_cli -->|"runs apply"| node_materializer
node_materializer -->|"reads plans"| node_sqlite
node_materializer -->|"writes metadata"| node_exifwrite
node_exifwrite -->|"writes files"| node_results
node_materializer -->|"writes report"| node_results
node_cli -->|"runs report"| node_reporting
node_reporting -->|"summarizes library"| node_sqlite
node_cli -->|"supports rollback"| node_commitlog

click node_cli "https://github.com/imostocky/photo-library-repair/blob/devel/internal/cli/cli.go"
click node_scanner "https://github.com/imostocky/photo-library-repair/blob/devel/internal/ingest/ingest.go"
click node_fingerprint "https://github.com/imostocky/photo-library-repair/blob/devel/internal/fingerprint/fingerprint.go"
click node_phash "https://github.com/imostocky/photo-library-repair/blob/devel/internal/phash/phash.go"
click node_exifread "https://github.com/imostocky/photo-library-repair/blob/devel/internal/exif/exif.go"
click node_minimalmeta "https://github.com/imostocky/photo-library-repair/blob/devel/internal/meta/meta.go"
click node_grouper "https://github.com/imostocky/photo-library-repair/blob/devel/internal/group/group.go"
click node_identity "https://github.com/imostocky/photo-library-repair/blob/devel/internal/group/identity_exif.go"
click node_partition "https://github.com/imostocky/photo-library-repair/blob/devel/internal/group/partition.go"
click node_planner "https://github.com/imostocky/photo-library-repair/blob/devel/internal/cli/cli.go"
click node_ai "https://github.com/imostocky/photo-library-repair/blob/devel/internal/kronk/kronk.go"
click node_sqlite "https://github.com/imostocky/photo-library-repair/blob/devel/internal/store/store.go"
click node_commitlog "https://github.com/imostocky/photo-library-repair/blob/devel/internal/store/commit.go"
click node_materializer "https://github.com/imostocky/photo-library-repair/blob/devel/internal/apply/apply.go"
click node_exifwrite "https://github.com/imostocky/photo-library-repair/blob/devel/internal/exifwrite/exifwrite.go"
click node_reporting "https://github.com/imostocky/photo-library-repair/blob/devel/internal/cli/cli.go"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_cli,node_scanner,node_reporting,node_user toneBlue
class node_fingerprint,node_phash,node_exifread,node_minimalmeta toneAmber
class node_grouper,node_identity,node_partition,node_planner,node_ai,node_sqlite,node_commitlog toneMint
class node_materializer,node_exifwrite,node_results toneRose
```

## Components

### CLI workflow

- [Command dispatcher](https://github.com/imostocky/photo-library-repair/blob/devel/internal/cli/cli.go): `internal/cli/cli.go`
- [Directory scan](https://github.com/imostocky/photo-library-repair/blob/devel/internal/ingest/ingest.go): `internal/ingest/ingest.go`
- [Library report](https://github.com/imostocky/photo-library-repair/blob/devel/internal/cli/cli.go): `internal/cli/cli.go`

### Image analysis

- [Image fingerprint](https://github.com/imostocky/photo-library-repair/blob/devel/internal/fingerprint/fingerprint.go): `internal/fingerprint/fingerprint.go`
- [Perceptual hash](https://github.com/imostocky/photo-library-repair/blob/devel/internal/phash/phash.go): `internal/phash/phash.go`
- [EXIF reading](https://github.com/imostocky/photo-library-repair/blob/devel/internal/exif/exif.go): `internal/exif/exif.go`
- [Minimal EXIF parser](https://github.com/imostocky/photo-library-repair/blob/devel/internal/meta/meta.go): `internal/meta/meta.go`

### Library and plans

- [Duplicate grouping](https://github.com/imostocky/photo-library-repair/blob/devel/internal/group/group.go): `internal/group/group.go`
- [Identity strategies](https://github.com/imostocky/photo-library-repair/blob/devel/internal/group/identity_exif.go): `internal/group/identity_exif.go`
- [Incremental partition](https://github.com/imostocky/photo-library-repair/blob/devel/internal/group/partition.go): `internal/group/partition.go`
- [Group planning](https://github.com/imostocky/photo-library-repair/blob/devel/internal/cli/cli.go): `internal/cli/cli.go`
- [AI planning](https://github.com/imostocky/photo-library-repair/blob/devel/internal/kronk/kronk.go): `internal/kronk/kronk.go`
- [SQLite library](https://github.com/imostocky/photo-library-repair/blob/devel/internal/store/store.go): `internal/store/store.go`
- [Plan history](https://github.com/imostocky/photo-library-repair/blob/devel/internal/store/commit.go): `internal/store/commit.go`

### Materialization

- [Apply plans](https://github.com/imostocky/photo-library-repair/blob/devel/internal/apply/apply.go): `internal/apply/apply.go`
- [EXIF writing](https://github.com/imostocky/photo-library-repair/blob/devel/internal/exifwrite/exifwrite.go): `internal/exifwrite/exifwrite.go`
- **Target files and report**

### Other components

- **CLI user**

## Connections

- CLI user → Command dispatcher: runs commands
- Command dispatcher → Directory scan: runs scan
- Directory scan → Image fingerprint: fingerprints images (evidence: `internal/ingest/ingest.go`)
- Image fingerprint → Perceptual hash: computes hash
- Directory scan → EXIF reading: reads metadata
- EXIF reading → Minimal EXIF parser: falls back to (evidence: `internal/exif/exif.go`)
- Directory scan → SQLite library: records images
- Command dispatcher → Duplicate grouping: runs grouping (evidence: `internal/cli/cli.go`)
- Duplicate grouping → Identity strategies: refines candidates
- Command dispatcher → Incremental partition: partitions incoming (evidence: `internal/cli/cli.go`)
- Duplicate grouping → SQLite library: stores assignments
- Command dispatcher → Group planning: runs planning (evidence: `internal/cli/cli.go`)
- Group planning → SQLite library: stores plans
- Group planning → AI planning: may use AI
- Command dispatcher → Apply plans: runs apply
- Apply plans → SQLite library: reads plans
- Apply plans → EXIF writing: writes metadata (evidence: `internal/apply/apply.go`)
- EXIF writing → Target files and report: writes files
- Apply plans → Target files and report: writes report
- Command dispatcher → Library report: runs report (evidence: `internal/cli/cli.go`)
- Library report → SQLite library: summarizes library
- Command dispatcher → Plan history: supports rollback (evidence: `internal/cli/cli.go`)
