Skip to main content

Chronify

Go command-line media tooling

Chronify

A terminal-based photo and video organizer for large media libraries. Chronify scans folders recursively and organizes files into year/month folders using a cautious, dry-run-first workflow.

YYYY/MMOrganizes photos and videos into predictable year/month folders.
Dry-runDefault behavior is preview-only, with CSV manifests for review.
MetadataPrioritizes embedded and external metadata before filename dates.
Safe movesFalls back to copy-and-delete when moving files across drives.

Problem

Large media libraries need cautious migration

Photo and video collections often live across laptops, external drives, camera dumps, phone exports, screenshots, and chat app folders. Chronify is designed for organizing those collections without loading media contents into memory or forcing risky first-run moves.

Recursive scanning

Chronify scans nested folders and supports large collections without reading full media contents into memory.

Photo and video support

It supports common image, RAW, HEIC/HEIF, and video formats, making it suitable for mixed media libraries.

Manifest-first workflow

Every dry-run and apply run can produce a CSV manifest so the migration can be inspected and audited.

GoCLIRecursive scanMetadataCSV manifestExternal drives

Output

Library structure

Media Library/
2024/
05/
IMG_20240509_100322.jpg
VID_20240509_120000.mov
_unknown_date/
scan-without-date.png

Date detection

Metadata first, filename second

Chronify chooses dates in a layered order so trusted media metadata wins when available, while still handling real-world filenames from cameras, phones, screenshots, and WhatsApp exports.

1. Native metadata

Uses embedded metadata for supported JPEG, TIFF/DNG-style, PNG, and WebP files.

2. Optional tools

When -metadata auto is enabled, Chronify can use ffprobe, exiftool, or macOS mdls if present.

3. Fallbacks

It then checks filename patterns, filesystem modified time, and finally routes unknown files into _unknown_date/.

Workflow

Recommended usage

The default run is a dry-run. Review the manifest first, then apply the organization with either move or copy mode.

go build -o chronify .
./chronify \
-source "/Volumes/Camera Dump" \
-dest "/Volumes/Media Library"
./chronify \
-source "/Volumes/Camera Dump" \
-dest "/Volumes/Media Library" \
-apply \
-mode move
./chronify \
-source "/Volumes/Camera Dump" \
-dest "/Volumes/Media Library" \
-apply \
-mode copy

Controls

Useful flags

Input and output

-source selects the folder to scan recursively.

-dest selects where YYYY/MM folders will be created.

-report sets the CSV manifest path, or none.

Execution mode

-apply performs changes; omitted means dry-run.

-mode chooses move or copy.

-conflict chooses rename or skip for duplicates.

Date and media filters

-media selects all, images, or videos.

-metadata selects auto, native, or never.

-min-year and -max-year bound accepted media dates.

Examples

Common operations

./chronify -source ~/Pictures/import -dest ~/Pictures/library -media images
./chronify -source ~/Pictures/import -dest ~/Pictures/library -apply -conflict skip
./chronify -source ~/Pictures/import -dest ~/Pictures/library -modtime=false