Skip to main content
AIDiveForge AIDiveForge
🪄

Product-Shot Background Swap

Image & Video · by AIDiveForge · Apr 20, 2026 · Intermediate

Plan and verify a product-background replacement against preservation constraints.

Get an edit brief and a before/after acceptance checklist.

Free · 2 KB · SKILL.md, instructions and example files. Requires the source photo, rights to edit it and an image-editing tool for actual output.

A worked example

A small example to try before using your own data.

Input

{
  "product": "clear glass bottle with blue label",
  "background": "cream #F4EBDD",
  "preserve": [
    "label text",
    "bottle shape",
    "contact shadow"
  ]
}

Expected result

Edit brief: replace only the background with #F4EBDD; preserve the clear bottle, blue label text/geometry and grounded contact shadow. Inspect transparency and reflections against the new background. Status: brief prepared; no edited image is claimed.

What to check: Preservation requirements are explicit, and proposed edits are not mislabeled as delivered image files.

Limits: Automated editing can change small text and reflective edges. Final visual comparison is required.

Worked example included. Model-specific performance and vendor compatibility have not been benchmarked.

Installation options and other formats

Install this skill

An agent skill starts with SKILL.md. The ZIP also includes its examples and any helper scripts. Drop the file into your tool of choice — or pick a different format if you use Cursor, Windsurf, Copilot, or something else.

Download SKILL.md
python3 - <<'ADF_SKILL_INSTALL'
import hashlib, io, os, stat, tempfile, urllib.request, zipfile
from pathlib import Path, PurePosixPath
folder = "product-shot-background-swap"
root = Path(os.environ.get('ADF_SKILL_ROOT', str(Path.home() / '.claude' / 'skills'))).expanduser()
destination = root / folder
if destination.exists() or destination.is_symlink():
    raise SystemExit('An installation already exists. Back it up and merge the ZIP deliberately.')
root.mkdir(parents=True, exist_ok=True)
request = urllib.request.Request("https://aidiveforge.com/skill/product-shot-background-swap.zip", headers={'User-Agent': 'AIDiveForge-Resource-Installer/1.0 (+https://aidiveforge.com/skills/)'})
with urllib.request.urlopen(request, timeout=30) as response:
    data = response.read(8 * 1024 * 1024 + 1)
if len(data) > 8 * 1024 * 1024 or hashlib.sha256(data).hexdigest() != "5bb16aed2dfa3fd78184d1a9f192085c22eb75b807422889e78420f237c6dc31":
    raise SystemExit('The download did not match this reviewed bundle. No files were installed.')
with zipfile.ZipFile(io.BytesIO(data)) as archive, tempfile.TemporaryDirectory(prefix='.adf-skill-', dir=root) as temporary:
    members = archive.infolist()
    if len(members) > 100 or sum(m.file_size for m in members) > 16 * 1024 * 1024:
        raise SystemExit('Unexpected archive size')
    for member in members:
        name = PurePosixPath(member.filename)
        if name.is_absolute() or '..' in name.parts or not name.parts or name.parts[0] != folder or '\\' in member.filename or stat.S_ISLNK(member.external_attr >> 16):
            raise SystemExit('Unsafe archive entry; nothing was installed')
        target = Path(temporary).joinpath(*name.parts)
        if member.is_dir():
            target.mkdir(parents=True, exist_ok=True)
        else:
            target.parent.mkdir(parents=True, exist_ok=True)
            with target.open('xb') as stream:
                stream.write(archive.read(member))
    staged = Path(temporary) / folder
    if not (staged / 'SKILL.md').is_file() or destination.exists() or destination.is_symlink():
        raise SystemExit('The skill could not be installed without replacing existing data')
    os.rename(staged, destination)
print('Installed the complete skill folder:', destination)
ADF_SKILL_INSTALL

Claude Code: ~/.claude/skills/product-shot-background-swap/SKILL.md. Codex: ~/.codex/skills/product-shot-background-swap/SKILL.md. Keep the complete ZIP folder when helper scripts are included.

🧠 Why it works

Preservation requirements are explicit, and proposed edits are not mislabeled as delivered image files.

⚙️ How it works

  1. Inspect the product boundaries, logo/text, transparent parts, contact shadow and reflective surfaces.
  1. Define the new background through a supplied palette or reference and state what must remain unchanged.
  1. Use the available editor’s mask/reference mechanism rather than asking it to redraw the product indiscriminately.
  1. Compare actual output with the source for altered geometry, labels, reflections, edge halos and missing contact shadows.
  1. Return the edited file only after an edit was actually performed; otherwise return the precise brief and pending checks.

Description

Get an edit brief and a before/after acceptance checklist.

Requires the source photo, rights to edit it and an image-editing tool for actual output.

Limits: Automated editing can change small text and reflective edges. Final visual comparison is required.

Recommended Use

Tools and workflow packs this skill pairs well with. Forge picks are auto-generated from category + capability signals; Community picks are added by people who've used the pairing.