Agent skill

Photo Metadata

by jamditis in jamditis/claude-skills-journalism

Embeds photo IPTC/EXIF/XMP metadata, caption, credit, alt text, license, AI-source label, GPS stripping, and C2PA credentials.

MITAuto-check passed

Install Photo Metadata

skills CLI
$ npx skills add jamditis/claude-skills-journalism --skill photo-metadata -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install jamditis/claude-skills-journalism photo-metadata --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/jamditis/claude-skills-journalism.git skills-src && mkdir -p .claude/skills && cp -r skills-src/journalism-core/skills/photo-metadata .claude/skills/photo-metadata && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
photo-metadata
GitHub stars
417
Token cost
~4.1k tokens
SKILL.md length
1,856 words
Files
5
Skills in repo
53
Repo updated
First seen
Licence
MIT

At a glance

Embeds photo IPTC/EXIF/XMP metadata, caption, credit, alt text, license, AI-source label, GPS stripping, and C2PA credentials.

  • Works in 7 steps: Caption only what is visible. Describe… → Label people from visible evidence. Name… → Always write alt text, it is not the… → …
  • SKILL.md covers Overview, When to use, The discipline (what agents… and Quick reference, the fields…, plus 8 more sections
  • Runs Python scripts from its folder; calls brew, pip and python3; reaches cv.iptc.org and creativecommons.org

What it does

Photo Metadata is an agent skill from jamditis/claude-skills-journalism. Embeds photo IPTC/EXIF/XMP metadata, caption, credit, alt text, license, AI-source label, GPS stripping, and C2PA credentials.

Its SKILL.md is about 4.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 5 other files (for example `agents/openai.yaml`, `embed.py` and `reference.md`).

The repository describes itself as: Claude Code skills for journalism, media, and academia - verification, FOIA, data journalism, academic writing, and more. The licence is MIT.

Example prompts

  • “Use the photo-metadata skill to embed photo IPTC/EXIF/XMP metadata, caption, credit, alt text, license, AI-source label, GPS stripping, and C2PA…”
  • “/photo-metadata”

Requirements

  • Python 3

Workflow steps

7 steps, taken from the first numbered list in SKILL.md.

  1. Caption only what is visible. Describe what the frame shows, not what you were told. Do not infer events, intent, identities…
  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…
  3. Always write alt text, it is not the caption. Write both: a short screen-reader description in XMP-iptcCore:AltTextAccessibility and the…
  4. Label how the image was made, and never lie about it. If an image is AI-generated or AI-edited, say so in XMP-iptcExt:DigitalSourceType…
  5. Strip GPS when the location could endanger someone. A protester, a source, an abuse survivor, a minor, embedded coordinates can reveal a…
  6. Keep structured fields neutral. Editorial framing or a contested label belongs in Headline, never in City, Caption-Abstract, or the…
  7. Verify the round-trip from source. Read the metadata back from the written file, not from your buffer. After any upload or transfer…

What it can do on your machine

Read from SKILL.md and the folder at commit e3e2172. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships script files (Python), which the agent can run.

    Shell commands in SKILL.md call:

    • brew
    • pip
    • python3

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • cv.iptc.org
    • creativecommons.org

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Photo Metadata loads about 4.1k tokens when it runs. Until then it costs about 35 tokens; SKILL.md has 1,856 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~35
When it runs · the whole SKILL.md, loaded when a task matches
~4.1k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from jamditis/claude-skills-journalism at commit e3e2172, republished under its MIT licence (© jamditis). 1,856 words, ~4,069 tokens.

Download SKILL.mdSave it as .claude/skills/photo-metadata/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.
name
photo-metadata
description
Embeds photo IPTC/EXIF/XMP metadata, caption, credit, alt text, license, AI-source label, GPS stripping, and C2PA credentials.

Photo metadata

Overview

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.

One exiftool pass writes the EXIF, IPTC, and XMP layers together and leaves every other tag (camera settings, shot time) untouched. Modern software reads XMP first, legacy IPTC-IIM second, EXIF only for date and GPS, so write XMP everywhere and add IIM as a compatibility copy on JPEG/TIFF (HEIC, AVIF, and WebP have no IIM slot at all; see reference.md).

Two things changed since this workflow was "caption, credit, copyright." First, how an image was made now belongs in the metadata: the IPTC Digital Source Type field labels a camera photo versus an AI-generated one, and platforms (Meta, Google) and the EU AI Act increasingly read it. Second, cryptographic provenance (C2PA / "Content Credentials") is arriving on wire images and cameras, a signed layer exiftool can read but not write. Both are covered below.

A capable model already knows the field names. The hard part is not the mechanics, it is the judgment below. Lead with that.

When to use

  • Prepping press photos for a wire so partner newsrooms can search, credit, and republish them
  • Adding required photographer attribution and a reuse license before publishing or sharing
  • Labeling how an image was made, a straight photo, an AI-generated illustration, an AI-edited composite
  • Batch-tagging a shoot (a folder of images)
  • Making images accessible (embedded alt text) and rights-clear (copyright or Creative Commons)
  • Reading and sanity-checking the C2PA Content Credentials on an image that arrived from an agency

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); signing a Content Credential (exiftool can't, use c2patool, below).

The discipline (what agents get wrong)

These are the failures a capable agent makes anyway. They matter more than any tag name.

  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.
  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.
  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. IPTC keeps these deliberately distinct, the caption states facts and is shown on the page; the alt text is read aloud by a screen reader, so do not just copy one into the other. Agents routinely write the caption and skip the alt text.
  4. Label how the image was made, and never lie about it. If an image is AI-generated or AI-edited, say so in XMP-iptcExt:DigitalSourceType; if it is a straight photo, digitalCapture states that plainly. Do the honest thing and label it; do the diligent thing and, on an inbound file, never strip an existing Digital Source Type or C2PA credential, that erases a disclosure someone made on purpose.
  5. Strip GPS when the location could endanger someone. A protester, a source, an abuse survivor, a minor, embedded coordinates can reveal a home or a safe house. Remove GPS from the published derivative (-gps:all=) while keeping the caption and credit; keep a full-GPS archival master only where location is editorial evidence. GPS is the single highest-risk tag in the file.
  6. 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.
  7. 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. Most social platforms re-encode on upload and strip IPTC, XMP, GPS, and C2PA (see reference.md), so "I embedded it" is not "it arrived."

Quick reference, the fields that carry the weight

RoleIPTC (IIM)XMPEXIF
PhotographerBy-linedc:CreatorArtist
CreditCredit (org, max 32 chars)photoshop:Credit (full name / org)-
CaptionCaption-Abstractdc:DescriptionImageDescription
Alt text (short)-iptcCore:AltTextAccessibility-
Extended description-iptcCore:ExtDescrAccessibility (complex images; not the caption)-
How it was made-iptcExt:DigitalSourceType (full CV URI)-
KeywordsKeywords (repeatable)dc:Subject-
CopyrightCopyrightNoticedc:RightsCopyright
License (CC)-xmpRights:Marked/WebStatement/UsageTerms, cc:License (legacy)-
License / discovery-xmpRights:WebStatement, plus:LicensorName/LicensorURL (Google)-
HeadlineHeadlinephotoshop:Headline-
LocationSub-location/City/Province-State/Country-*iptcCore:Location, photoshop:City/State/Country-
DateDateCreatedphotoshop:DateCreatedDateTimeOriginal (source of truth)

Digital Source Type values (fully AI → trainedAlgorithmicMedia, AI-edited → compositeWithTrainedAlgorithmicMedia, straight photo → digitalCapture), the full IPTC controlled vocabulary, the IPTC-IIM byte limits, the PLUS/Google-licensing and Creative Commons field sets, the C2PA tooling, and the AP caption recipe: see reference.md.

One pass that writes all three layers

bash
CAPTION="A crowd holds signs outside the Mercer County Courthouse, Friday, June 19, 2026, in Trenton, N.J. (Dana Rivera/Example News Collective)"
ALT="A crowd of people holding handmade signs stands on the steps of a stone courthouse."
# how the image was made, a full IPTC CV URI (see reference.md for all values)
DST="http://cv.iptc.org/newscodes/digitalsourcetype/digitalCapture"

exiftool -codedcharacterset=utf8 -overwrite_original -P \
  -EXIF:Artist="Dana Rivera" -XMP-dc:Creator="Dana Rivera" -IPTC:By-line="Dana Rivera" \
  -IPTC:Credit="Example News Collective" -XMP-photoshop:Credit="Dana Rivera / Example News Collective" \
  -IPTC:Caption-Abstract="$CAPTION" -XMP-dc:Description="$CAPTION" -EXIF:ImageDescription="$CAPTION" \
  -XMP-iptcCore:AltTextAccessibility="$ALT" \
  -XMP-iptcExt:DigitalSourceType="$DST" \
  -IPTC:Keywords="protest" -IPTC:Keywords+="Trenton" \
    -XMP-dc:Subject="protest" -XMP-dc:Subject+="Trenton" \
  -EXIF:Copyright="(c) 2026 Example News Collective. Licensed CC BY 4.0." \
    -IPTC:CopyrightNotice="(c) 2026 Example News Collective. CC BY 4.0." \
    -XMP-dc:Rights="(c) 2026 Example News Collective. Licensed CC BY 4.0." \
  -XMP-xmpRights:Marked=True \
    -XMP-xmpRights:WebStatement="https://creativecommons.org/licenses/by/4.0/" \
    -XMP-xmpRights:UsageTerms="Licensed CC BY 4.0. Credit: Dana Rivera / Example News Collective." \
    -XMP-cc:License="https://creativecommons.org/licenses/by/4.0/" \
    -XMP-cc:AttributionName="Dana Rivera / Example News Collective" \
  -IPTC:City="Trenton" -IPTC:Province-State="New Jersey" \
    -IPTC:Country-PrimaryLocationName="United States" -IPTC:Country-PrimaryLocationCode="USA" \
  "-IPTC:DateCreated<EXIF:DateTimeOriginal" "-IPTC:TimeCreated<EXIF:DateTimeOriginal" \
    "-XMP-photoshop:DateCreated<EXIF:DateTimeOriginal" \
  photo.jpg

-P preserves the file's modification time; drop it if you want the write to touch the timestamp. Extended accessibility descriptions for complex images (charts, infographics) go in XMP-iptcCore:ExtDescrAccessibility, a separate field from the caption, added only when the alt text plus surrounding text can't convey the image.

Then verify from the file (the step agents skip):

bash
exiftool -G1 -s -IPTC:By-line -IPTC:Caption-Abstract -XMP-iptcCore:AltTextAccessibility \
  -XMP-iptcExt:DigitalSourceType -XMP-cc:License -IPTC:Keywords photo.jpg

Label how an image was made (AI and synthetic)

XMP-iptcExt:DigitalSourceType records origin from the IPTC controlled vocabulary. The value is a full URI, exiftool does not validate it, so a bare word or a typo is silently accepted and useless. The three every newsroom needs:

bash
BASE="http://cv.iptc.org/newscodes/digitalsourcetype"
# a straight camera photo, worth stating even for real news images
exiftool -XMP-iptcExt:DigitalSourceType="$BASE/digitalCapture" photo.jpg
# fully AI-generated (a trained model produced the whole image)
exiftool -XMP-iptcExt:DigitalSourceType="$BASE/trainedAlgorithmicMedia" ai.jpg
# a real photo edited with generative AI (inpaint / outpaint / generative fill)
exiftool -XMP-iptcExt:DigitalSourceType="$BASE/compositeWithTrainedAlgorithmicMedia" edited.jpg

Meta and Google read this field to auto-label AI content, and the EU AI Act's machine-readable-disclosure duty (Article 50, enforcement from August 2026) is pushing it from nice-to-have toward required. IPTC 2025.1 adds companion fields, AISystemUsed, AISystemVersionUsed, AIPromptInformation, AIPromptWriterName (exiftool ≥ 13.40). Full vocabulary and the retired terms to avoid: reference.md.

Show full SKILL.md (809 more words)Show less

Content Credentials (C2PA): provenance exiftool can read but not sign

A Content Credential is a cryptographically signed C2PA manifest bound to the pixels, who made the image, in what tool, and whether AI was involved, increasingly shipped by cameras (Leica M11-P, Nikon Z6III, Sony Alpha) and agencies (AFP, AP, BBC pilots). It is a different layer from IPTC/XMP and answers a different question: not "what does the file claim" but "who signed this, and has it changed since."

exiftool reads it and cannot write or verify it:

bash
exiftool -G1 -a -jumbf:all incoming.jpg     # report the C2PA/JUMBF manifest (no signature check)

That shows the manifest as data, it does not validate the signature or the signer. For a real check, drop the file into verify.contentauthenticity.org and confirm the signer is the agency you expect. To create a credential, use Adobe/CAI tooling, c2patool (brew install c2patool) or pip install c2pa-python, not exiftool.

Writing metadata to a signed file breaks its credential. A C2PA hard binding hashes the asset, and that hash covers the embedded metadata, so any exiftool write, caption, credit, GPS strip, even the tagging in this skill, leaves the manifest present but invalid. "Never strip the credential" is necessary but not sufficient. On an inbound signed file, either leave the original untouched and do your metadata work on a derivative you will re-sign with c2patool, or accept that the embedded credential no longer validates and say so. Do not embed metadata into a signed original and treat its credential as still good.

Two more cautions worth stating to any newsroom: a valid credential proves a signature and a chain, not that the scene is real (a camera will happily sign a photo of a screen), and most social platforms strip the manifest on upload, so on-platform provenance often survives only via "durable" watermark/fingerprint recovery. See reference.md.

Strip GPS for a publish-safe derivative

Remove location without touching the caption, credit, copyright, or source type:

bash
exiftool -gps:all= "-xmp:GPS*=" -overwrite_original photo.jpg
exiftool -a -G1 -gps:all "-xmp:GPS*" photo.jpg   # verify, this must print nothing

Use the -xmp:GPS*= wildcard, not just the three main coordinates: destination and image-direction fields (GPSDestLatitude, GPSImgDirection) are also a location and would otherwise survive. Keep the full-GPS file as a locked archival master where coordinates are editorial evidence (geolocation, verification). Publish the stripped copy. embed.py --strip-gps does this for a whole folder after tagging.

Licensing that shows up in search (Google Images)

To earn the Google Images "Licensable" badge and a working "Get this image" link, set the web statement of rights (the trigger) and the PLUS licensor fields:

bash
exiftool -XMP-xmpRights:Marked=True \
  -XMP-xmpRights:WebStatement="https://example.org/license/photo123" \
  -XMP-plus:LicensorName="Example News" -XMP-plus:LicensorURL="https://example.org/buy/photo123" \
  photo.jpg

The web statement is xmpRights:WebStatement, not dc:Rights, a common and costly mix-up. A Creative Commons license routes through the same WebStatement field with the CC deed URL. Details and the full PLUS field set: reference.md.

Batch tagging a folder

For a shoot, drive exiftool from a manifest instead of one command per file. embed.py in this directory takes a folder plus a JSON manifest (constant credit, license, licensor, and Digital Source Type fields, then per-image alt text, caption, extended description, keywords, and an optional per-image source-type override), writes tagged copies, reads each one back to confirm the metadata landed, and, with --strip-gps, removes GPS from the copies. It accepts a Digital Source Type shorthand (digitalCapture) or a full URI and refuses anything else rather than embedding a broken value. Run python3 embed.py --help.

Common mistakes (from baseline testing)

MistakeFix
Wrote a caption, no alt textAlways write AltTextAccessibility too, they are different fields
Copied the caption into the alt text (or ExtDescrAccessibility)IPTC keeps these distinct; write a real screen-reader sentence, keep ExtDescr for complex images only
By-line/Credit/City silently truncatedThose IIM fields cap at 32 chars; put the full credit in XMP-photoshop:Credit
Caption states things not in the frameDescribe only what is visible; move unseeable context out
AI-generated image left unlabeledSet DigitalSourceType to trainedAlgorithmicMedia (or the right composite value)
DigitalSourceType set to a bare wordThe value must be the full http://cv.iptc.org/... URI; exiftool won't validate it
Stripped an inbound file's Digital Source Type or C2PANever erase a disclosure, preserve provenance on files you receive
Published with GPS still embeddedStrip with -gps:all= when location could endanger a subject or source
WebStatement put in dc:RightsThe Google/licensing web statement is xmpRights:WebStatement
Editorial label in City or captionPut framing in Headline; keep structured fields neutral
Assumed the upload kept the metadataRe-read from the destination; most social platforms strip IPTC/XMP/GPS/C2PA
Keywords as one comma-joined stringWrite repeatable Keywords records (and a dc:Subject list)
Set a CC license note in plain text onlyAdd xmpRights:WebStatement (CC deed URL) + xmpRights:Marked

Real-world impact

Embedded metadata is what lets a partner newsroom find a photo, credit it correctly, and republish it under a clear license without ever contacting the photographer. It is also, now, where an image says whether a human or a model made it, and where a signed Content Credential travels. Strip it, and the same photo is an orphaned file, no credit, no license, no provenance.

© jamditis, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 4 other files in journalism-core/skills/photo-metadata of jamditis/claude-skills-journalism.

  • SKILL.md
  • agents/openai.yaml
  • embed.py
  • reference.md
  • test_embed.py

Open the folder on GitHubat commit e3e2172

Compare with similar skills

Photo Metadata next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Photo Metadata compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Photo Metadata this skilljamditis/claude-skills-journalism417—~4.1kAutomated safety check: PassMIT
Photoscodewhale-hq/Codewhale41k—~386Automated safety check: PassMIT
Captions Overlay Rulesheygen-com/hyperframes59k1 repos~1.5kAutomated safety check: PassApache-2.0
EmbedsBuilderIO/agent-native7.1k—~279Automated safety check: PassNone
Video Captionsthedaviddias/Front-End-Checklist74k—~1kAutomated safety check: PassMIT
Vector Embedruvnet/ruflo74k—~591Automated safety check: NotesMIT

Similar skills

  • Photos

    codewhale-hq/Codewhale

    Search a local macOS Photos library and export selected copies when the user asks to find or use their own photos.

    41k GitHub stars~386 tokensUpdated today
    Auto-check passed
  • Captions Overlay Rules

    heygen-com/hyperframes

    Rules for captioning talking-head and launch videos: classify each phrase as drop, rail or embed, and composite captions over the film instead of reserving space.

    59k GitHub starsUsed in 1 repo~1.5k tokens
    Media & CreativeAuto-check passed
  • Embeds

    BuilderIO/agent-native

    Inline, popup, and floating-button embeds — snippet generation and theming.

    7.1k GitHub stars~279 tokensUpdated today
    Frontend & DesignAuto-check passed
  • Video Captions

    thedaviddias/Front-End-Checklist

    A skill your agent uses when applies to all <video elements and third-party video embeds (YouTube, Vimeo) where the page owner controls the content.

    74k GitHub stars~1k tokensUpdated 3 days ago
    Media & CreativeAuto-check passed
  • Vector Embed

    ruvnet/ruflo

    Generate embeddings via npx ruvector@0.2.25 embed text (ONNX all-MiniLM-L6-v2, 384-dim), normalize, and store in HNSW index

    74k GitHub stars~591 tokensUpdated today
    AI & LLM EngineeringAuto-check: notes
  • Remotion Captions

    remotion-dev/remotion

    Official

    Transcribing, displaying and animating captions. An agent skill from remotion-dev/remotion.

    63k GitHub starsUsed in 5 repos~294 tokens
    Media & CreativeAuto-check passed

More from jamditis/claude-skills-journalism

All 53 skills in this repo
  • Web Design Picker

    jamditis/claude-skills-journalism

    A skill your agent uses when creating distinct website directions, a client review picker, asset catalog, previews, and Cloudflare-ready handoffs.

    417 GitHub stars~3.1k tokensUpdated 5 days ago
    Auto-check passed
  • Okf Wiki

    jamditis/claude-skills-journalism

    Builds an Open Knowledge Format (OKF) knowledge base from existing docs, notes, or a repo.

    417 GitHub stars~4.7k tokensUpdated 5 days ago
    Auto-check passed
  • Private Secret Scanning

    jamditis/claude-skills-journalism

    Local Gitleaks scans for staged changes, push ranges, and full history in private repos, with redacted reports.

    417 GitHub stars~1.8k tokensUpdated 5 days ago
    Auto-check passed
  • Data Journalism

    jamditis/claude-skills-journalism

    Acquire, clean, analyze, verify, visualize, and explain data for journalism.

    417 GitHub stars~1.6k tokensUpdated 5 days ago
    Auto-check passed
  • Document Design

    jamditis/claude-skills-journalism

    Creates print-ready HTML that exports to PDF. An agent skill from jamditis/claude-skills-journalism.

    417 GitHub stars~1.9k tokensUpdated 5 days ago
    Auto-check passed
  • Using Superjawn

    jamditis/claude-skills-journalism

    Establishes how to find and use skills, requiring Skill tool invocation before any response.

    417 GitHub stars~1.5k tokensUpdated 5 days ago
    Auto-check passed

Questions about Photo Metadata

What does Photo Metadata do?

Embeds photo IPTC/EXIF/XMP metadata, caption, credit, alt text, license, AI-source label, GPS stripping, and C2PA credentials. Photo Metadata is an agent skill from jamditis/claude-skills-journalism. Embeds photo IPTC/EXIF/XMP metadata, caption, credit, alt text, license, AI-source label, GPS stripping, and C2PA credentials.

How do I install Photo Metadata in Claude Code?

Run `npx skills add jamditis/claude-skills-journalism --skill photo-metadata -a claude-code`. Or copy the skill folder (journalism-core/skills/photo-metadata in jamditis/claude-skills-journalism) into .claude/skills/photo-metadata in your project. Claude Code loads it when a task matches its description.

How do I install Photo Metadata in Codex?

Run `npx skills add jamditis/claude-skills-journalism --skill photo-metadata -a codex`. Or copy the skill folder (journalism-core/skills/photo-metadata in jamditis/claude-skills-journalism) into .agents/skills/photo-metadata in your project. Codex loads it when a task matches its description.

Can I use Photo Metadata in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add jamditis/claude-skills-journalism --skill photo-metadata -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/photo-metadata, .gemini/skills/photo-metadata, .github/skills/photo-metadata and .opencode/skills/photo-metadata in your project.

What does Photo Metadata need to run?

Going by SKILL.md and its folder, Photo Metadata needs Python for the scripts in its folder and the command-line tools its instructions call (brew, pip and python3). Our summary lists: Python 3.

Does Photo Metadata access the network?

SKILL.md names 2 domains. In commands or code: cv.iptc.org and creativecommons.org; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.

Is Photo Metadata safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Photo Metadata use?

Photo Metadata is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Photo Metadata use?

About 4.1k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Photo Metadata?

Skills that share tags, products or a category with Photo Metadata: Photos (codewhale-hq/Codewhale, 41k stars), Captions Overlay Rules (heygen-com/hyperframes, 59k stars), Embeds (BuilderIO/agent-native, 7.1k stars) and Video Captions (thedaviddias/Front-End-Checklist, 74k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Photo Metadata?

jamditis (a GitHub user) maintains it in jamditis/claude-skills-journalism, which has 417 GitHub stars. The repository holds 53 skills in this directory. The repository was last updated on October 4, 2026.

Source: jamditis/claude-skills-journalism on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.