SD card to dated perfection in one drag. Prettier, friendlier, still macOS native.
Full wizard setup, EXIF renaming, live progress, dry-run, verbose mode, conflict handling, and robust error reporting.
snapimport(first run โ wizard)snapimport import --dry-run(preview)snapimport import(do it)
snapimport setup- Re-run the wizardsnapimport reset-demo- Developer reset to first-run state
- Seamless Setup: First-time wizard guides you through configuration in under 20 seconds.
- Smart SD Detection: Automatically detects macOS SD cards with camera files, skips system volumes.
- Chunked Copy with Progress: Fast, resumable file copying with a silky smooth Rich progress bar.
- EXIF-Based Renaming: Renames photos using
DateTimeOriginalto YY-MM-DD-###.ext format, sequences restart per day. - Permission Handling: Prompts for
sudo chownif files are root-owned, just like the original. - Logging: Tracks imported files in
seen-files.txtfor auditing. - Dry Run Mode: Preview exact renames before committing.
- Rich Terminal UI: Eye candy everywhere โ panels, tables, prompts, all dark/light theme friendly.
uv tool install snapimportpipx install snapimportgit clone https://github.com/ImBisy/SnapImport.git
cd snapimport
uv build
uv tool install --force .Run snapimport without arguments. The wizard will prompt for your photos and logs directories.
snapimport importCopies from detected SD card to your photos folder, renames, and logs.
snapimport import --dry-runShows a table of all planned renames without touching files.
snapimport rename /path/to/photosRenames files in the given folder using the same logic.
snapimport detect-sdLists all /Volumes with camera file detection status.
Stored in ~/.config/snapimport/config.toml:
# SnapImport Configuration
# Edit these paths anytime. Nothing else needed for v1.
photos_dir = "~/Pictures/Photos"
logs_dir = "~/Pictures/SnapImport-Logs"All common RAW and JPG: ORF, JPG, CR2, CR3, NEF, NRW, ARW, SR2, SRF, RAF, RW2, PEF, PTX, DNG, RWL, 3FR, IIQ, X3F, XMP.
SnapImport is the spiritual successor to Photo-Renamer, rebuilt from the ground up in Python for modern macOS. It preserves the exact import + rename + log workflow but adds:
- Beautiful, wizard-driven setup
- Live progress bars during copy
- Dry-run previews
- Robust error handling
- Fully typed, tested code
No more shell script hassles โ pure Python magic.
# Run all tests
uv run pytest -q --tb=short
# Run with coverage
uv run pytest --cov=snapimport --cov-report=term-missingunit: Fast isolated tests for individual functionsintegration: Full journey tests using fixturescli: Tests that exercise the Typer CLI via CliRunner
snapimport reset-demo- Developer tool that resets SnapImport to first-run state. Deletes config.toml, first-run marker, seen-files.txt, and import-errors.log. Use--forceto skip confirmation prompt (useful for scripting).
Tests use isolated fixtures in tests/conftest.py:
isolated_config- Creates a temp config dir, patches all config pathsfresh_config- Ensures no config exists (true first-run state)configured_app- Pre-writes a valid config.tomlfake_sd- Creates a temp dir mimicking a real SD cardwizard_inputs- Patches Prompt.ask to feed deterministic answers