| Crates.io | canon-archive |
| lib.rs | canon-archive |
| version | 0.1.1 |
| created_at | 2026-01-23 21:56:03.721993+00 |
| updated_at | 2026-01-24 10:04:00.132281+00 |
| description | A CLI tool for organizing large media libraries into a canonical archive |
| homepage | |
| repository | https://github.com/robklg/canon |
| max_upload_size | |
| id | 2065556 |
| size | 603,901 |
Canon helps you understand and take control of digital assets spread across many drives, backups, and years.
Scan your devices, enrich with metadata, discover what you have, and archive selected files to a canonical location — at your own pace, in small, revisitable steps.
| Feature | Description |
|---|---|
| Multi-root scanning | Index files across multiple drives and backups |
| Extensible metadata | Enrich with facts from any external tool (exiftool, etc.) |
| Powerful filtering | Boolean expressions with modifiers, path accessors, and globs |
| Content deduplication | Identify duplicates by hash across all sources |
| Integrity validation | Detect corruption and verify transfers with partial hashing |
| Offline queryable | Explore metadata even when source drives are disconnected |
| Cluster and apply | Generate manifests, preview changes, and archive with confidence |
cargo install canon-archive
This installs the canon binary.
For the optional canonargs helper (used in enrichment pipelines):
cargo install canonargs
Full documentation is available at robklg.github.io/canon.
The documentation covers:
# Scan your sources and archive
canon scan --add --role source /path/to/photos
canon scan --add --role archive /Volumes/Archive
# Enrich with EXIF metadata
canon worklist --where 'source.ext|lowercase IN (jpg, jpeg)' \
| ./scripts/exif-worklist.sh \
| canon import-facts
# Explore what you have
canon facts --key content.DateTimeOriginal|year
canon ls --where 'content.geo.city=Amsterdam'
# Archive a selection
canon cluster generate \
--where 'content.DateTimeOriginal|year=2023' \
--dest /Volumes/Archive/Photos/2023
# Edit manifest.toml to customize the output pattern, then:
canon apply manifest.toml --dry-run
canon apply manifest.toml