Skip to main content

Deterministic, verifiable naming for photo and video archives

Project description

ChronoCatalog

CI PyPI

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

MIT

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

chronocatalog-0.4.0.tar.gz (142.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

chronocatalog-0.4.0-py3-none-any.whl (70.6 kB view details)

Uploaded Python 3

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

Hashes for chronocatalog-0.4.0.tar.gz
Algorithm Hash digest
SHA256 90c3f063bdc194890735c7cee622c70ec626f5092e8796081aecd27e5fd00897
MD5 577a8345927ca3eff423c0009f59694a
BLAKE2b-256 f66327d6a63e2fdc5683d2a9c6eac9039e24a629bf026f25920408f15a63ffd8

See more details on using hashes here.

Provenance

The following attestation bundles were made for chronocatalog-0.4.0.tar.gz:

Publisher: release.yml on chronocatalog/chronocatalog

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for chronocatalog-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 975f3ca2ef691b6d9972464af5d14725834b26b0adc65f8373ed03cfe8ad559d
MD5 ba7a1714a2f963ffb0df40e3398e6ad9
BLAKE2b-256 5f2d249d53fce14d647643a196e29c48a036dc3ebb70862e33790c8f0b19d31a

See more details on using hashes here.

Provenance

The following attestation bundles were made for chronocatalog-0.4.0-py3-none-any.whl:

Publisher: release.yml on chronocatalog/chronocatalog

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page