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.3.0.tar.gz (134.1 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.3.0-py3-none-any.whl (64.9 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for chronocatalog-0.3.0.tar.gz
Algorithm Hash digest
SHA256 1ba78466e842d49f6dc624f25f93c36bd274a0d0d3f86bf73b78b2e10e3d2c3e
MD5 04162569a90d469138470798be993938
BLAKE2b-256 f173f048ca3b76c02a78f655d02bf5c22898dfb388dafb07d6b746755e59dfa2

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: chronocatalog-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 64.9 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.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 71fdf352fe1b4fd9ddc78747b1489623f069d344a2847ecae625e37263553282
MD5 634c2ccf1dc4dcf02c45debf8bcb03ad
BLAKE2b-256 34a4f6a9cfbda4b749ddf4cac78be7a3d29d559bd5509a2dec5ab7828861d6f5

See more details on using hashes here.

Provenance

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