| name | brand-imprint |
| description | Use whenever a reseller wants to embed their ownership identity (Company Name, contact info, copyright, listing URL) into a photo's metadata so AI crawlers (GPTBot, ClaudeBot, PerplexityBot, Google's image bot) and image-search engines attribute the photo back to them. The inverse of photo-metadata-inspector — that skill strips identifying metadata for privacy, this one deliberately writes it for GEO/SEO. Writes EXIF + IPTC + XMP simultaneously for maximum crawler coverage. Auto-loads owner identity from /mnt/user-data/uploads/.imm_brand.json (same brand cache as the IMM agent and photo-watermark — invisible setup after the IMM agent runs once). Triggers on phrases like "sign this photo with my brand", "imprint my info on this photo", "tag this for AI crawlers", "embed ownership metadata", "GEO-tag this photo", or "stamp this with our contact info". Per-listing fields (title, description, keywords, URL) passed per call; brand identity from cache. |
brand-imprint
Embeds owner attribution into a photo's metadata across THREE formats — EXIF, IPTC, and XMP — so AI crawlers and image-search engines associate the photo with the reseller's brand. The opposite operation of photo-metadata-inspector: that skill protects privacy by stripping; this skill builds attribution by embedding.
When this fires
- "Sign these photos with my brand"
- "Imprint our ownership info on this listing photo"
- "Tag this for GPTBot / ClaudeBot / Perplexity"
- "Make sure AI crawlers find me on this photo"
- "Embed our copyright + contact info"
- "GEO-tag this photo for premier-equipment.example"
- Use cases: reseller owns the product outright, exclusive distributor for a manufacturer, sole authorized seller, machinery broker with a verified inventory listing
Use this WHEN, not by default
This skill is for legitimate ownership signaling, not blanket metadata injection. Apply it when ALL of these are true:
- The reseller owns the product outright OR is the sole authorized seller of that machine
- The photo is one the reseller has rights to (their own shot, OEM stock with downstream-reseller-use rights, or an authorized co-broker rebrand)
- The listing URL exists and points to a real page on the reseller's domain
- The reseller wants the photo to be attributed to them by AI crawlers
If any of those is uncertain, skip the imprint and ask. Don't sign photos that aren't the reseller's to sign.
The flow
Step 1 — Load brand identity (auto)
The brand cache lives at /mnt/user-data/uploads/.imm_brand.json. Expected shape:
{
"company_name": "Premier Equipment LLC",
"contact_full_name": "Sales Team",
"contact_email": "sales@premier-equipment.example",
"contact_phone": "+1 (260) 555-0100",
"contact_address_city": "Fort Wayne",
"contact_address_region": "IN",
"contact_address_country": "USA",
"source_url": "https://premier-equipment.example"
}
If the cache doesn't exist, fall back to the IMM agent's first-run flow to populate it (don't ask redundantly — that's already a solved problem).
Step 2 — Collect per-listing fields
Per-call inputs (NOT cached, these are listing-specific):
| Field | Goes to |
|---|
title | IPTC ObjectName + XMP dc:title + EXIF ImageDescription |
description | IPTC Caption-Abstract + XMP dc:description + EXIF ImageDescription |
listing_url | XMP WebStatement + EXIF ImageDescription |
keywords (list) | IPTC Keywords + XMP dc:subject |
If the user passes a photo without these, ask once for the title and listing URL minimum — those are the highest-leverage fields for crawler attribution.
Step 3 — Imprint
import sys
sys.path.insert(0, 'scripts')
from imprint import imprint_photo
entry = imprint_photo(
input_path="/mnt/user-data/uploads/listing-photo.jpg",
output_path="/mnt/user-data/outputs/listing-photo_signed.jpg",
listing_url="https://premier-equipment.example/equipment/krauss-maffei-300-ton-A60",
title="Used Krauss-Maffei C-Series 300-Ton Injection Molding Machine",
description="Hydraulic toggle-clamp IMM, 1995-2005, 44,452 kg. Ships from Fort Wayne IN. Co-broker inquiries welcome.",
keywords=[
"Krauss-Maffei C-Series",
"used injection molding machine",
"300 ton IMM",
"Premier Equipment",
"premier-equipment",
],
)
The function writes EXIF + IPTC + XMP simultaneously and logs the operation. Returns an audit entry with formats_written: {EXIF: true, IPTC: true, XMP: true} confirming all three made it.
Step 4 — Verify (optional but recommended)
After the imprint, run the photo through photo-metadata-inspector and confirm the new fields show up as CRITICAL / HIGH owner identifiers. This is the round-trip proof.
What gets written where
EXIF (camera-side, ASCII-only per spec)
Artist = Company Name
Copyright = (c) YEAR Company Name. All rights reserved.
ImageDescription = Title - Listing URL - Description (concatenated)
Software = brand-imprint v1
DateTime = imprint timestamp
EXIF uses ASCII-only because the spec defines it that way and PIL decodes EXIF strings as Latin-1. © becomes (c), · becomes -. The UTF-8 versions live in IPTC + XMP where they're properly supported.
IPTC (news-industry standard, heaviest AI-crawler signal)
ObjectName = Title
By-line = Company Name
By-lineTitle = Contact Full Name (if cached)
Credit = Company Name
Source = Company Name inventory
CopyrightNotice = © YEAR Company Name. All rights reserved.
Caption-Abstract = Description
Contact = [email, phone, URL] (list field)
Keywords = list of keywords
XMP (Adobe XML, modern crawler standard)
dc:creator = Company Name
dc:rights = full copyright with ©
dc:title = Title
dc:description = Description
dc:subject = keyword list
xmpRights:Marked = True
xmpRights:WebStatement = Listing URL
xmpRights:UsageTerms = "All rights reserved. Co-broker inquiries welcome."
Iptc4xmpCore:CreatorContactInfo = email + phone + URL
photoshop:Credit + photoshop:Source = duplication for Photoshop-aware tools
Audit log
Every imprint writes a JSON line to .brand_imprint_log.jsonl (falls back to /mnt/user-data/outputs/ if uploads is read-only):
{
"timestamp": "2026-05-28T02:20:20",
"operation": "brand_imprint",
"source_photo": "/mnt/user-data/uploads/listing.jpg",
"source_sha256": "91b7a9fe...",
"output_photo": "/mnt/user-data/outputs/listing_signed.jpg",
"company_name": "Premier Equipment LLC",
"listing_url": "https://premier-equipment.example/...",
"title": "Used Krauss-Maffei...",
"keywords": [...],
"formats_written": {"EXIF": true, "XMP": true, "IPTC": true}
}
The SHA-256 of the original file ties the log entry to the exact source photo for traceability.
Chains naturally with other skills
Recommended pipeline for a new listing photo:
photo-metadata-inspector — confirm the photo is clean (no GPS/timestamps that shouldn't be there) or that there's no competitor watermark
photo-watermark — apply visible Premier logo for human viewers
brand-imprint — embed owner metadata for AI crawlers
Or for repurposing a co-brokered photo:
photo-metadata-inspector — detect the original watermark
photo-rebrand — remove competitor watermark (with co-broker confirmation)
photo-watermark — apply Premier's visible logo
brand-imprint — embed Premier's metadata
Anti-patterns
- ❌ Imprinting photos the reseller doesn't have rights to — defeats the legitimacy of the attribution
- ❌ Imprinting photos with the WRONG listing URL (broken link or wrong machine) — crawlers index this, broken links hurt SEO
- ❌ Imprinting at the wrong stage of the pipeline — should be the LAST step before publication, after any watermarking or rebrand
- ❌ Re-imprinting an already-signed photo without checking — creates conflicting metadata
- ❌ Imprinting with personal/non-business contact info — this metadata gets crawled and indexed
File map
scripts/imprint.py — EXIF + IPTC + XMP writer with audit log
references/crawler_coverage.md — which AI crawlers read which metadata formats (research notes)
Companion skills
photo-metadata-inspector — verify the imprint by running the round-trip
photo-watermark — visible branding for humans (this skill is invisible branding for crawlers)
imm-spec-agent — populates the brand cache that this skill auto-loads from