| name | photo-watermark |
| description | Use whenever a user wants to add a visible watermark (logo image OR text) to a photo. Supports configurable position (9-grid keywords like 'bottom-right', 'center'), opacity, scale, and text color. Auto-pulls logo and company name from the IMM agent's brand cache at /mnt/user-data/uploads/.imm_brand.json if available, otherwise asks for a logo file or text string. Independent of the photo-metadata-inspector — does NOT touch metadata; if user wants both metadata removal AND watermarking, the inspector handles that flow. Triggers on phrases like "add my logo to this photo", "watermark this image", "put a copyright on this", "brand this photo", "add a watermark", "stamp this with my logo". |
Photo Watermark
Adds a visible logo or text watermark to a photo. Standalone — works whether or not the photo has been scrubbed. Pulls brand identity from the shared cache so you usually don't have to specify anything.
When this fires
- "Add my logo to this photo"
- "Watermark this image"
- "Put a copyright on this"
- "Brand this photo before I post it"
- "Stamp this with my logo"
- "Add 'Premier Equipment' to the corner"
- "Add a watermark to all these listing photos"
The flow
Step 1 — Resolve the watermark source
In priority order:
- Inline logo provided in the user's message (uploaded file) → use that
- Inline text provided ("watermark this with 'Sold by Premier'") → use that
- Brand cache at
/mnt/user-data/uploads/.imm_brand.json → use the logo from there
- Brand cache has only a company name (no logo) → use text
© <company_name>
- Nothing available → ask the user:
"What watermark would you like to apply? Drop a logo file (PNG/SVG) or tell me what text to add (e.g. '© Premier Equipment')."
Step 2 — Apply the watermark
import sys
sys.path.insert(0, 'scripts')
from watermark import apply_watermark
apply_watermark(
input_path="/mnt/user-data/uploads/photo.jpg",
output_path="/mnt/user-data/outputs/photo_watermarked.jpg",
logo_path="/tmp/premier_logo.png",
text="© Premier Equipment",
position="bottom-right",
opacity=0.65,
scale=0.18,
padding=24,
text_color="#FFFFFF",
text_shadow=True,
)
Step 3 — Confirm placement
Show the watermarked photo. If it looks off, offer to redo with:
- A different
position (top-left / top-center / top-right / middle-left / center / middle-right / bottom-left / bottom-center / bottom-right)
- Different
opacity (more transparent if it dominates, more opaque if it disappears)
- Different
scale (smaller if the logo overwhelms, larger if it's barely visible)
Position grid
top-left top-center top-right
middle-left center middle-right
bottom-left bottom-center bottom-right
Default: bottom-right. Most photography conventions place the watermark there — it's far from the focal point but always visible.
Recommended settings by photo type
| Photo type | Position | Opacity | Scale |
|---|
| Equipment listing (product clearly framed) | bottom-right | 0.65 | 0.18 |
| Hero shot for marketing | bottom-right | 0.55 | 0.20 |
| Detail / close-up (limited corners) | top-right or center | 0.45 | 0.15 |
| Inspection / forensic photo | bottom-center | 0.85 | 0.22 |
| Social media (square crop) | bottom-right | 0.70 | 0.16 |
Critical rules
- Does NOT touch metadata. If the user wants both metadata removal AND a watermark, route to
photo-metadata-inspector which can call this skill as its option 2.
- Uses brand cache by default. Same cache as the IMM spec agent —
/mnt/user-data/uploads/.imm_brand.json. Don't re-prompt for the logo if it's there.
- Inline overrides win. If the user pastes "use logo XYZ.png" or "watermark text 'For Sale'", that takes precedence over the cache.
- Always show the result. Don't just save the file silently — present_files() it and ask if placement looks right.
- One photo or many. If the user drops a folder or multiple photos, batch-watermark all of them with the same settings.
File map
scripts/watermark.py — the engine (logo overlay + text overlay with full controls)
Anti-patterns
- ❌ Watermarking a photo that still has metadata baked in — direct them to the inspector first if privacy matters
- ❌ Picking a position that covers the main subject — always default bottom-right unless told otherwise
- ❌ 100% opacity (no transparency) — looks amateurish, suggests the watermark wasn't intentional
- ❌ Asking for the logo when the brand cache has one — silently use it; only ask if cache is empty