What is exiftool?
A single command-line program that can read and write over 25,000 metadata tags across hundreds of file formats. Created by Phil Harvey in 2003 — free, open-source, and the gold standard for metadata work.
👨‍💻

Created by Phil Harvey

One person. Maintained continuously since 2003. Used by NASA, the Library of Congress, Adobe, and thousands of studios worldwide.

🆓

Completely Free

No license, no subscription, no per-seat cost. Install once, run forever. Works on Windows, macOS, and Linux.

📋

25,000+ Tags

Reads and writes EXIF, IPTC, XMP, JFIF, GeoTIFF, GPS, MakerNotes, and hundreds of other metadata formats.

🗂️

Hundreds of File Formats

JPEG, TIFF, PNG, PDF, DNG, CR2, ARW, PSD, and more. One tool handles every format in our collection.

Batch Processing

Run one command against an entire folder — or a million files. Processes recursively, in parallel, with filters.

🔒

Non-Destructive

Never touches pixel data. Metadata is rewritten in the header segments only. The image itself is identical before and after.

How exiftool reads a file
Run exiftool on any image and it prints every embedded metadata tag. You can ask for everything, or filter to specific fields.
Read all metadata from a file
$ exiftool golden-lab-pool-ramp.jpg
 
ExifTool Version Number : 12.76
File Name : golden-lab-pool-ramp.jpg
File Size : 3.2 MB
Image Width : 4500
Image Height : 3000
Camera Model Name : Canon EOS R5
ISO : 400
Shutter Speed : 1/500
Aperture : 2.8
GPS Latitude : 41.8500 N
GPS Longitude : 87.6500 W
Subject : hr:pool-ramp, golden-retriever, large-dog, pool, lifestyle
Copyright : © 2026 HandiProducts Inc.
Creator : ···
Read only the keyword tags
$ exiftool -Subject golden-lab-pool-ramp.jpg
 
Subject : hr:pool-ramp, golden-retriever, large-dog, pool, lifestyle
How exiftool writes tags to a file
Writing is just as simple. exiftool modifies the XMP segment in-place and backs up the original by default. The pixel data is never touched.
Write a set of keywords to a file
# -Subject= sets keywords (replaces any existing)
# -XMP:Subject= targets the XMP segment specifically
# Separate multiple keywords with commas
 
$ exiftool
  -XMP:Subject="hr:pool-ramp"
  -XMP:Subject+="golden-retriever"
  -XMP:Subject+="large-dog"
  -XMP:Subject+="pool"
  -XMP:Subject+="lifestyle"
  -overwrite_original
  golden-lab-pool-ramp.jpg
 
1 image files updated
Append a single tag without disturbing existing ones
# += appends to the list; = replaces the whole list
 
$ exiftool -XMP:Subject+="wet" -overwrite_original golden-lab-pool-ramp.jpg
 
1 image files updated
Commands we use in the tagging system
Every step of our workflow maps to one or two exiftool commands.
Step 1 — Inspect
Read existing tags before writing
exiftool -Subject photo.jpg
Check what's already there before the AI proposes new tags. Prevents duplicates and shows what human reviewers already approved.
Step 2 — Tag
Write AI-proposed tags to the file
exiftool -XMP:Subject="tag1" -XMP:Subject+="tag2" -overwrite_original photo.jpg
Writes the AI's proposed keyword list into the XMP segment. Uses = for the first tag (sets/replaces), += for each additional (appends).
Step 3 — Correct
Apply a reviewer's edits after review
# Remove a wrong tag
exiftool -XMP:Subject-="wrong-tag" -overwrite_original photo.jpg
 
# Add a missing tag
exiftool -XMP:Subject+="missed-tag" -overwrite_original photo.jpg
-= removes a specific value from the list. += appends. Both leave all other tags untouched.
Batch
Process an entire folder at once
# Tag every JPEG in a folder
exiftool -r -ext jpg -XMP:Subject+="batch-tag" -overwrite_original ./batch-01/
 
# Export all tags to CSV
exiftool -r -csv -Subject ./batch-01/ > tags.csv
-r recurses into subfolders. -ext jpg limits to JPEGs only. -csv outputs a spreadsheet-ready tag report.
Export
Generate a sidecar XMP file
# Create a .xmp sidecar without touching the original
exiftool -o %.xmp photo.jpg
Useful for RAW formats that don't support embedded XMP. Creates photo.xmp alongside the original. Adobe apps read sidecar files natively.
Verify
Confirm tags were written correctly
# Read back immediately after writing
exiftool -Subject photo.jpg
 
Subject : hr:pool-ramp, golden-retriever ···
Always verify after a write step. Our tagging agent does this automatically and flags any mismatch before moving to the next file.
= vs += — the most important distinction
Getting this wrong either wipes existing tags or duplicates them. Understand it once and it becomes automatic.
=  Replaces the entire list
# Before: Subject = [dog, pet, outdoors]
 
exiftool -XMP:Subject="pool-ramp" photo.jpg
 
# After: Subject = [pool-ramp]
# ⚠️ dog, pet, outdoors are gone!

Use = only at the start of a tag session — when you're setting keywords from scratch and want to replace whatever was there before.

+=  Appends to the existing list
# Before: Subject = [dog, pet, outdoors]
 
exiftool -XMP:Subject+="pool-ramp" photo.jpg
 
# After: Subject = [dog, pet, outdoors, pool-ramp]
# ✅ Existing tags preserved

Use += when adding one tag to an existing set, or adding a correction after review. Safe to run multiple times — won't duplicate if the tag is already present.

Where exiftool fits in the tagging pipeline
exiftool is the write step. The AI does the thinking; exiftool does the writing.
🖼️

Image arrives

New photo added to the batch. Stored locally or on SharePoint.

JPEG / DNG / TIFF
🤖

AI analyzes

Vision model looks at the image and proposes a keyword list based on rules.md.

proposed tags
🔧

exiftool writes

Agent runs exiftool to embed the proposed tags into the file's XMP segment.

-XMP:Subject=...
👁️

Human reviews

Holly opens the review form, edits wrong tags, notes the correction reason.

approved / corrected
🔧

exiftool corrects

Corrections are applied with -= and += to update the file in place.

-XMP:Subject-=...

exiftool runs twice per image: once when the AI tags it, once when corrections come back from review.

How it compares to alternatives
Option Writes XMP to file Works from script/agent Free Batch All formats Notes
exiftool ✅ Yes Yes Yes Yes Yes Reference implementation. Command-line, scriptable, 25k+ tags.
Adobe Lightroom Yes No No — $10/mo Yes Yes GUI only. Can't be called from a script or agent. Requires human to open.
Python Pillow Partial Yes Yes Yes No Reads EXIF but XMP write support is incomplete. Not reliable for our use case.
SharePoint metadata columns No API only Subscription Yes No Stored in SharePoint only. Lost if the file moves. Vendor lock-in.
SaaS DAM tools Varies Varies No — $hundreds/mo Yes Varies Expensive, proprietary, lock-in. Tags often stored in the platform's DB, not the file.
Does exiftool have a GUI?
Short answer: no. But in our system, that doesn't matter — you never touch it directly.
What exiftool looks like
Terminal — no GUI
$ exiftool -XMP:Subject="pool-ramp" photo.jpg
1 image files updated

exiftool is purely a command-line tool — a black terminal window, typed commands, text output. There are a handful of third-party GUI wrappers built by photographers for manual metadata editing, but they’re niche tools and not part of our workflow.

What you see in our system
🖊️
The Tag Review Form
Holly’s only interface. Click to approve, edit chips, add notes.

Neither Nathan nor Holly ever opens a terminal. The agent calls exiftool invisibly in the background — the same way a database runs behind a website. Your interface is the HTML review form. exiftool is infrastructure.

🔑 The one thing to remember

exiftool is a read/write head for image files — like a text editor, but for metadata. It doesn't manage collections, build UIs, or run servers. It does one thing: it reads and writes metadata inside files with perfect reliability across every major format. That's exactly what our tagging agent calls — once to propose tags, and once to lock in corrections. Everything else (the AI reasoning, the review UI, the learning loop) is built around exiftool as the final write step.

Think of it like a secretary who controls physical access to a filing cabinet. The AI says “put these labels on this folder.” Holly says “actually, change that label.” The secretary (exiftool) is the only one who opens the cabinet and makes the change. Nothing else — not the AI, not the review UI — touches the file directly.