Deterministic, verifiable naming for photo and video archives
Project description
ChronoCatalog
Deterministic, verifiable naming for photo and video archives.
chronocatalog renames every photo and video to an identity derived
purely from the file itself — the capture time plus a slice of the
content hash:
20260703_150727_9b677b64.nef
└──────┬──────┘ └──┬───┘
capture time hash
That name is a stable, unique identifier with properties a filename usually doesn't have:
- Chronological by construction. Sorting by name is sorting by
capture time, across every camera, phone and scanner — no rolling
counters, no
IMG_0001 (2).jpg. - Verifiable. Because the name is reproducible from the file, the whole archive can be re-checked at any time: corruption is told apart from legitimate edits, and duplicates identify themselves.
- Groups stay whole. A RAW master, its XMP/PP3 sidecars and its editor derivatives share one name and are renamed together, atomically.
Install
$ pip install chronocatalog
Python 3.11+ and ExifTool on PATH; no other
dependencies.
Usage
| command | what it does |
|---|---|
import |
copy a memory card into the archive, named on arrival; exit 0 certifies the card is fully accounted for — safe to format |
verify |
recompute every name and report what disagrees, classified by meaning (corruption vs. expected drift vs. date mismatch) |
rename |
bring stale names in line, atomically per file group |
inject |
let a DAM (Lightroom Classic) rename the masters it manages, via a metadata token |
organize |
report-only triage for messy trees: proposals, duplicates, undatable files |
history / undo / resume |
every apply is journaled: list runs, revert them, finish interrupted ones |
Safety first: every command is a dry run unless --apply. Applies are
validated as a whole before anything is touched, journaled before the
first change, applied atomically per group, resumable after
interruption and revertable — and a file whose capture time cannot be
resolved is reported, never renamed. Nothing is ever overwritten.
See the command guide for details, output formats and the exit-code contract, and DESIGN.md for why it works this way.
Configuration
An archive is described by a TOML file; every setting has a sensible default. See six complete example setups — from a single folder of photos to a Lightroom workflow and a naming-scheme migration — and the annotated example config for every option.
License
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file chronocatalog-0.4.0.tar.gz.
File metadata
- Download URL: chronocatalog-0.4.0.tar.gz
- Upload date:
- Size: 142.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
90c3f063bdc194890735c7cee622c70ec626f5092e8796081aecd27e5fd00897
|
|
| MD5 |
577a8345927ca3eff423c0009f59694a
|
|
| BLAKE2b-256 |
f66327d6a63e2fdc5683d2a9c6eac9039e24a629bf026f25920408f15a63ffd8
|
Provenance
The following attestation bundles were made for chronocatalog-0.4.0.tar.gz:
Publisher:
release.yml on chronocatalog/chronocatalog
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
chronocatalog-0.4.0.tar.gz -
Subject digest:
90c3f063bdc194890735c7cee622c70ec626f5092e8796081aecd27e5fd00897 - Sigstore transparency entry: 2139755558
- Sigstore integration time:
-
Permalink:
chronocatalog/chronocatalog@e456e54bd5f39ee80964354725d16412e1ab1f5c -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/chronocatalog
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@e456e54bd5f39ee80964354725d16412e1ab1f5c -
Trigger Event:
push
-
Statement type:
File details
Details for the file chronocatalog-0.4.0-py3-none-any.whl.
File metadata
- Download URL: chronocatalog-0.4.0-py3-none-any.whl
- Upload date:
- Size: 70.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
975f3ca2ef691b6d9972464af5d14725834b26b0adc65f8373ed03cfe8ad559d
|
|
| MD5 |
ba7a1714a2f963ffb0df40e3398e6ad9
|
|
| BLAKE2b-256 |
5f2d249d53fce14d647643a196e29c48a036dc3ebb70862e33790c8f0b19d31a
|
Provenance
The following attestation bundles were made for chronocatalog-0.4.0-py3-none-any.whl:
Publisher:
release.yml on chronocatalog/chronocatalog
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
chronocatalog-0.4.0-py3-none-any.whl -
Subject digest:
975f3ca2ef691b6d9972464af5d14725834b26b0adc65f8373ed03cfe8ad559d - Sigstore transparency entry: 2139755572
- Sigstore integration time:
-
Permalink:
chronocatalog/chronocatalog@e456e54bd5f39ee80964354725d16412e1ab1f5c -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/chronocatalog
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@e456e54bd5f39ee80964354725d16412e1ab1f5c -
Trigger Event:
push
-
Statement type: