$npx -y skills add jamditis/claude-skills-journalism --skill photo-metadataUse when preparing photos or images for a news wire, publication, photo CMS, or archive — embedding caption, byline, credit, alt text, keywords, copyright or Creative Commons license, and location into a file's IPTC, EXIF, and XMP metadata, or batch-tagging a folder of press phot
| 1 | # Photo metadata |
| 2 | |
| 3 | ## Overview |
| 4 | |
| 5 | Metadata embedded in an image file travels with the file. Photo CMSs (Photo Mechanic, Lightroom, Capture One) and wire intake systems read a photo's caption, credit, and rights from its IPTC and XMP blocks — not from a separate document or the email it arrived in. If the caption, credit, alt text, and license are not *inside* the file, they are gone the moment the photo is downloaded, forwarded, or re-uploaded. |
| 6 | |
| 7 | One `exiftool` pass writes the EXIF, IPTC, and XMP layers together and leaves every other tag (camera settings, shot time) untouched. |
| 8 | |
| 9 | **A capable model already knows the field names.** The hard part is not the mechanics — it is the judgment below. Lead with that. |
| 10 | |
| 11 | ## When to use |
| 12 | |
| 13 | - Prepping press photos for a wire so partner newsrooms can search, credit, and republish them |
| 14 | - Adding required photographer attribution and a reuse license before publishing or sharing |
| 15 | - Batch-tagging a shoot (a folder of images) |
| 16 | - Making images accessible (embedded alt text) and rights-clear (copyright or Creative Commons) |
| 17 | |
| 18 | **When not to use:** editing pixels (this is metadata only); writing alt text for an HTML `<img>` (use `accessibility-compliance`); preserving web pages as evidence (use `web-archiving`). |
| 19 | |
| 20 | ## The discipline (what agents get wrong) |
| 21 | |
| 22 | These are the failures a capable agent makes anyway. They matter more than any tag name. |
| 23 | |
| 24 | 1. **Caption only what is visible.** Describe what the frame shows, not what you were told. Do not infer events, intent, identities, relationships, or legal status you cannot see. "Demonstrators gather to protest a court ruling" is a claim about facts not in the frame; "A crowd holds signs outside a courthouse" is the photo. |
| 25 | 2. **Label people from visible evidence.** Name an agency or role only from a visible marking — a labeled vest, a uniform, a badge, a patch. Otherwise write "officers in tactical gear," "a man in a blue shirt." Never assert someone's immigration or legal status (no "detainee," no "undocumented") unless it is unambiguous in the frame. |
| 26 | 3. **Always write alt text — it is not the caption.** Write both: a short screen-reader description in `XMP-iptcCore:AltTextAccessibility` and the publishable caption in `IPTC:Caption-Abstract`. Agents routinely write the caption and skip the alt text. |
| 27 | 4. **Keep structured fields neutral.** Editorial framing or a contested label belongs in `Headline`, never in `City`, `Caption-Abstract`, or the location fields. Partner newsrooms apply their own language; clean structured fields let them. |
| 28 | 5. **Verify the round-trip from source.** Read the metadata back *from the written file*, not from your buffer. After any upload or transfer, re-read it *from the destination* — a 200 response proves the bytes were accepted, not that the metadata survived. |
| 29 | |
| 30 | ## Quick reference — the fields that carry the weight |
| 31 | |
| 32 | | Role | IPTC (IIM) | XMP | EXIF | |
| 33 | |------|-----------|-----|------| |
| 34 | | Photographer | `By-line` | `dc:Creator` | `Artist` | |
| 35 | | Credit | `Credit` (org, max 32 chars) | `photoshop:Credit` (full name / org) | — | |
| 36 | | Caption | `Caption-Abstract` | `dc:Description`, `iptcCore:ExtDescrAccessibility` | `ImageDescription` | |
| 37 | | Alt text (short) | — | `iptcCore:AltTextAccessibility` | — | |
| 38 | | Keywords | `Keywords` (repeatable) | `dc:Subject` | — | |
| 39 | | Copyright | `CopyrightNotice` | `dc:Rights` | `Copyright` | |
| 40 | | License (CC) | — | `cc:License`, `xmpRights:Marked`/`WebStatement`/`UsageTerms` | — | |
| 41 | | Headline | `Headline` | `photoshop:Headline` | — | |
| 42 | | Location | `Sub-location`/`City`/`Province-State`/`Country-*` | `iptcCore:Location`, `photoshop:City`/`State`/`Country` | — | |
| 43 | | Date | `DateCreated` | `photoshop:DateCreated` | `DateTimeOriginal` (source of truth) | |
| 44 | |
| 45 | Full tag list, the IPTC-IIM byte limits, the Creative Commons field set, and the AP caption recipe: see `reference.md`. |
| 46 | |
| 47 | ## One pass that writes all three layers |
| 48 | |
| 49 | ```bash |
| 50 | CAPTION="A crowd holds signs outside the Mercer County Courthouse, Friday, June 19, 2026, in Trenton, N.J. (Dana Rivera/Example News Collective)" |
| 51 | ALT="A crowd of people holding handmade signs stands on the steps of a stone courthouse." |
| 52 | |
| 53 | exiftool -codedcharacterset=utf8 -overwrite_original \ |
| 54 | -EXIF:Artist="Dana Rivera" -XMP-dc:Creator="Dana Rivera" -IPTC:By-line="Dana Rivera" \ |
| 55 | -IPTC:Credit="Example News Collective" -XMP-photoshop:Credit="Dana Rivera / Example News Collective" \ |
| 56 | -IPTC:Caption-Abstract="$CAPTION" -XMP-dc:Description="$CAPTION" \ |
| 57 | -EXIF:ImageDescription="$CAPTION" -XMP-iptcCore:ExtDescrAccessibility="$CAPTION" \ |
| 58 | -XMP-iptcCore:AltTextAccessibility="$ALT" \ |
| 59 | -IPTC:Keywords="protest" -IPTC:Keywords+="Trenton" \ |
| 60 | -XMP-dc:Subject="protest" -XMP-dc |