
Immich Exif : Write your Immich metadata back into the photo files
Hello everyone!
I'm the guy behind Immich Stack, Immich Places and Findich (yes, me again, and all apps compatible with V3!)
When I released Immich Places, several of you asked the same thing: "nice, but can this go into the files themselves?". I said it would be my next project, so here it is!
Everything you fix in Immich (locations, dates, ratings, descriptions) lives in the Immich database, not in your photos. Export a photo, open it in Lightroom, or migrate to another tool in 10 years: all of it is gone.
So I built Immich Exif, a CLI tool that downloads each asset, embeds the missing metadata directly into the file with exiftool, and replaces the asset on your server.
What it does:
- Writes GPS, city/state/country, dates (with the correct timezone), ratings, descriptions and camera info into the standard EXIF/XMP/IPTC tags
- Shows you a diff for each photo before touching anything (confirm/skip/quit), or run it unattended with
-y - Keeps your albums, favorites, shared links, stacks and live photo pairs intact
- Photos and videos (mp4/mov/m4v)
- Already-synced assets are skipped, so you can re-run it (or cron it) on a big library
- Works with Immich v3 and older versions
- As all files needs to be downloaded, edited and reuploaded, it's a slow process (depends on your internet speed). Start with small albums to dry-run/test and see how it runs :)
About safety, because editing, patching, removing might be a destructive action:
-dry-runshows every change and writes nothing- Downloads AND re-uploads are checksum-verified before the original is touched
- The replaced original always goes to the Immich trash, never permanently deleted
- Anything unexpected (duplicate, mid-run edit on the server, missing checksum) makes it stop to prevent destruction
- I tested it on my 30k library without issues, but we never know, so keep backups
But as always, please start with -dry-run, and as always, keep backups, KEEP BACKUPS!
Fast setup:
Prebuilt binary (you just need exiftool, brew install exiftool on macOS, apt install libimage-exiftool-perl on Debian/Ubuntu). Grab it from the releases page, then:
export IMMICH_URL=https://your-immich-server.com
export IMMICH_API_KEY=your-api-key
immich-exif -dry-run <asset-id> # preview one photo, writes nothing
immich-exif -album <album-id> # one album, interactive (confirm/skip each photo)
immich-exif -y -workers 4 -all # the whole library, unattended
Or build from source (Go 1.24+):
git clone https://github.com/Majorfi/immich-exif
cd immich-exif/src && go build -o immich-exif .
Or with docker (bundles exiftool):
docker run --rm \
-e IMMICH_URL=https://your-immich-server.com \
-e IMMICH_API_KEY=your-api-key \
ghcr.io/majorfi/immich-exif:latest -dry-run <asset-id>
A .env file in the working directory works too. You can see all the flags available in the readme in the repo.
Disclaimers: I'm not affiliated with the Immich team, so this is just a community tool. As always, I provide it as-is, and I'll keep an eye on issues and fix what I can. You should always keep backups, and use it at your own risk. AI was used for documentation, drafting, and review.
GitHub: https://github.com/Majorfi/immich-exif
Release: https://github.com/Majorfi/immich-exif/releases
Website: https://immich.quub.tech/exif
Sponsoring: https://github.com/sponsors/Majorfi
Thanks everyone and happy to answer questions!
And do a backup