Rename photos using local Ollama vision models with SQLite audit and undo.
Project description
renaim
Rename photos with a local Ollama vision model, while keeping a SQLite audit trail that can undo rename batches later.
The default filename format keeps the camera filename:
family-at-table_P1120366.RW2
The tool never rewrites image contents. RAW files and large images are converted to small temporary JPEG previews for the model, then the original file is renamed. Filesystem access and modification times are restored after each rename. EXIF data inside the original file is not changed.
Requirements
- macOS
sipsfor RAW/HEIC/large image preview conversion, or ImageMagickmagickas a fallback. - Ollama running locally.
- A multimodal Ollama model, for example:
ollama pull gemma4:e4b
If you prefer another model, pass --model.
Install for development
uv sync --extra dev
uv run renaim --help
The package exposes the renaim command.
Typical workflow
Index files without touching the model:
uv run renaim scan ~/Pictures/Photos
scan streams progress while walking directories, which is useful on NAS
folders where the first traversal can take a while.
Generate suggestions:
uv run renaim suggest ~/Pictures/Photos --model gemma4:e4b
Review and optionally edit suggestions:
uv run renaim review ~/Pictures/Photos
Harmonize near-duplicate labels across the folder:
uv run renaim harmonize ~/Pictures/Photos
Apply approved or pending suggestions:
uv run renaim apply ~/Pictures/Photos
Undo the latest apply batch:
uv run renaim undo ~/Pictures/Photos
Show previous batches:
uv run renaim batches ~/Pictures/Photos
All-night NAS run
For unattended operation, keep the audit DB somewhere local and explicitly opt in to harmonizing and renaming:
uv run renaim run /Volumes/photos/archive \
--db ~/.local/state/renaim/archive.sqlite3 \
--model gemma4:e4b \
--harmonize \
--apply \
--yes
Without --apply, run only scans and stores suggestions.
The shortcut form is:
uv run renaim run /Volumes/photos/archive \
--db ~/.local/state/renaim/archive.sqlite3 \
--model gemma4:e4b \
--yolo
--yolo means --harmonize --apply --yes.
Because run is the default command, this is equivalent:
uvx renaim /Volumes/photos/archive --yolo
Audit database
By default the database is created as .renaim.sqlite3 inside the target
directory. Existing .photo-renamer.sqlite3 databases are still used when found.
Use --db PATH to put it elsewhere.
The database records:
- original and current paths
- file size and filesystem mtime
- model name, prompt version, raw model response, slug, and proposed path
- apply batches and each old path/new path pair
- undo batches
Undo only reverses rename batches made by this tool. It does not try to infer or repair manual moves made afterward.
Weaknesses and limits
This is still a pragmatic local tool, not a full DAM/photo-library system.
- Ollama-only backend. Model calls currently go through Ollama's
/api/generateAPI. Other local runtimes or hosted APIs would need a backend abstraction. - Preview conversion depends on local tools. On macOS it uses
sips; if available, ImageMagickmagickis used as a fallback. RAW support on Linux or NAS hosts will depend on installing a converter that can read your camera files. - Model output is approximate. Vision models can be vague, wrong, or
inconsistent across similar images.
renaim harmonizehelps normalize labels within a folder, but it does not understand your whole photo library. - No embedded metadata writes. The tool does not write the original filename into EXIF/XMP metadata. The SQLite audit DB is the source of truth for undo and history.
- No full-file hashing by default. To keep NAS scans fast, file identity is tracked mainly by path, size, and mtime. This is weaker than content hashes if files are moved or modified outside the tool.
- Undo is scoped to tool-managed renames. If files are manually moved, deleted, or renamed after an apply batch, undo may skip them or warn rather than reconstructing intent.
- Sidecars are not renamed yet. RAW sidecar formats such as
.xmp,.dop,.pp3, or catalog files are not currently moved with the image. - No concurrent-run locking yet. Running multiple
renaimprocesses against the same directory/database is not supported. - The audit DB is local state. If the DB is deleted, rename history and undo information are lost. For NAS use, keep the DB somewhere backed up.
Config
Runtime settings use this precedence:
CLI flags > environment variables > ~/.config/renaim/config.toml > defaults
Show the effective config:
uv run renaim config show
Set your usual model:
uv run renaim config set model gemma4:e4b
uv run renaim config set ollama_url http://localhost:11434
uv run renaim config set timeout 180
uv run renaim config set preview_size 1024
Unset a value:
uv run renaim config unset model
Supported environment variables:
RENAIM_MODEL=gemma4:e4b
RENAIM_OLLAMA_URL=http://localhost:11434
RENAIM_TIMEOUT=180
RENAIM_PREVIEW_SIZE=1024
Useful commands
Limit a trial run:
uv run renaim suggest ~/Pictures/Photos --limit 20
Use another Ollama server or model:
uv run renaim suggest ~/Pictures/Photos \
--ollama-url http://nas.local:11434 \
--model llava:13b
Apply only suggestions explicitly approved in review:
uv run renaim apply ~/Pictures/Photos --approved-only
Preview label harmonization without changing suggestions:
uv run renaim harmonize ~/Pictures/Photos --dry-run
For unattended runs, accept the default canonical label for each near-duplicate group:
uv run renaim harmonize ~/Pictures/Photos --yes
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file renaim-0.1.1.tar.gz.
File metadata
- Download URL: renaim-0.1.1.tar.gz
- Upload date:
- Size: 32.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
63109cfc92d1e73949d1cf30c5186177331faa1a8716f0be663daa3ce7402995
|
|
| MD5 |
a9f2556dc776ac21cc29d69d0fdeb4ee
|
|
| BLAKE2b-256 |
358896ca9f5ccb209bf9fc2f00947741ea562a3f81ff2d7edec581a14dfdd737
|
File details
Details for the file renaim-0.1.1-py3-none-any.whl.
File metadata
- Download URL: renaim-0.1.1-py3-none-any.whl
- Upload date:
- Size: 20.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9c27a69e0126d389cd88666a20f1417d6349dc219fe675ab76f35c480b3113e7
|
|
| MD5 |
b3776b04b7331d5f3a2779e8d6811064
|
|
| BLAKE2b-256 |
4a9498c57a3631a5465ffa2d20c7493a22d1f535e99ca4a719389eddc36628a6
|