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.2.0.tar.gz (98.7 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.2.0-py3-none-any.whl (64.2 kB view details)

Uploaded Python 3

File details

Details for the file chronocatalog-0.2.0.tar.gz.

File metadata

  • Download URL: chronocatalog-0.2.0.tar.gz
  • Upload date:
  • Size: 98.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for chronocatalog-0.2.0.tar.gz
Algorithm Hash digest
SHA256 16e48a5c2b23f9bb66c4980529ed466bdecb6a89f7f2dd1ac842e75afee3205b
MD5 17f79c140ba4f0c447061aa4c081dcbb
BLAKE2b-256 30149f9275f2cede351fdd1ec5361be694e8451f6f1b5834792e82b7b0e5090a

See more details on using hashes here.

Provenance

The following attestation bundles were made for chronocatalog-0.2.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.2.0-py3-none-any.whl.

File metadata

  • Download URL: chronocatalog-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 64.2 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.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8215edd0d849bfeb8e9a22e64dcb1722f0ef15c34d0bfeae460f4fb64e687240
MD5 85ca06087c1b933b7dbc581e82059d85
BLAKE2b-256 fb3455772ce2f4525a59ec2c47c2a53417f9fcb6f08537ad4e718458b5c6f65a

See more details on using hashes here.

Provenance

The following attestation bundles were made for chronocatalog-0.2.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