AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
SKILL verified MIT Self-run

Image Ad Clone

skill-krusemediallc-uni1-image-ad-image-ad-clone · by krusemediallc

Use when the user wants to reverse-engineer an existing image ad into a reusable, parameterizable prompt template that can be reused with any brand and any product. Triggers on phrases like "clone this ad as a template", "reverse engineer this ad", "turn this ad into a prompt", "extract a template from this image", "make this ad reusable", "add this to my prompt library", "study this ad and make…

— No reviews yet
0 installs
35 views
0.0% view→install

Install

$ agentstack add skill-krusemediallc-uni1-image-ad-image-ad-clone

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • ✓ Prompt-injection patterns
  • ✓ Secret / credential exfiltration
  • ✓ Dangerous shell & filesystem operations
  • ✓ Untrusted network calls
  • ✓ Known-malicious package signatures

What it can access

  • ✓ Network access No
  • ✓ Filesystem access No
  • ✓ Shell / process execution No
  • ● Environment & secrets Used
  • ✓ Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/skill-krusemediallc-uni1-image-ad-image-ad-clone)

Reliability & compatibility

✓ Security review passed
0 installs to date
— no reviews yet
○ 4mo ago

Declared compatibility

Claude CodeClaude Desktop

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of Image Ad Clone? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

image-ad-clone

Take an existing image ad and turn it into a reusable, parameterizable uni-1 prompt template that can be plugged into any brand. Output: a new entry appended to the user's prompt library, ready to be used by uni1-image-ad (or anywhere else) on future generations.

This is the template-creation skill. The companion skill uni1-image-ad is the template-using skill (it generates and uploads ads from filled-in templates). They're meant to be installed together.

Hard rules — never relax

  1. Strip platform/screenshot chrome from analysis. When you describe what's in the reference, you're describing the actual ad creative, not the screenshot wrapper. Do not include iOS status bars, "Sponsored"/"Saved" badges, post text/captions surrounding the image, link-card footers, engagement rows, platform tab bars. If the reference is a screenshot of an ad-in-feed, mentally crop the wrapper. The output template must produce a standalone image that would be uploaded as a Meta creative.
  1. Always validate by generating. A template that hasn't been round-tripped through uni-1 against the original isn't validated. Run at least one generation with --image-ref and compare. Refine the prompt until the structure matches.
  1. Always test the generalized version. Before saving, fill the placeholders with a different brand (use AG1 if the user has no preference — there's a known reference at iterations/ag1-v2/T1-ios-notes/ or the user can supply one) and generate. If the structure breaks, the placeholder set is wrong — fix it.
  1. Never write brand-specific text into the final template. Wordmarks, product names, slogans, specific photographs, hex colors specific to the source brand — all become {placeholders}. Only structural content (layout descriptions, photography style, typography family, composition rules) remains literal.
  1. Save to the user's library, do not silently overwrite. Default save target is ~/.claude/skills/uni1-image-ad/references/prompt-library.md if it exists; otherwise propose a project-local prompt-library.md and ask. If the target template name (e.g., T8 — Apple Notes listicle) collides with an existing entry, ask the user before overwriting.

Inputs the user must provide

| Input | Notes | |---|---| | Reference ad image | Path to a local file (PNG/JPG/WEBP). The thing being reverse-engineered. | | Brand to test against (optional) | If they want the test fill to use a specific brand. Default: AG1 if any AG1 assets exist at ag1-assets/, otherwise ask. | | Save target (optional) | Defaults to ~/.claude/skills/uni1-image-ad/references/prompt-library.md. | | Template tag (optional) | Short identifier like T8, Lifestyle Hero, Carousel Cover — Claude proposes one based on the analysis if not given. |

Workflow

Phase 1: Preflight

  1. The reference image path resolves to an existing file. If not, stop and ask.
  2. LUMA_API_KEY is set in the project .env. If not, instruct the user how to get one.
  3. The companion generate_image.py script is available. Look in this order:
  • ~/.claude/skills/uni1-image-ad/scripts/generate_image.py
  • /skills/uni1-image-ad/scripts/generate_image.py
  • If neither: stop and ask the user to install uni1-image-ad (this skill's hard dependency).
  1. Read the save target. If the file exists, read its current entries to know what tags are taken. If not, plan to create it.

Phase 2: Visual analysis

This is the most important phase. Read the reference image and describe what you see, structurally separating brand-specific content from format/structure. Document each of these:

  • Aspect ratio. Measure or estimate (W:H). Map to the closest Luma-supported ratio: 16:9, 1:1, 1:2, 1:3, 2:1, 2:3, 3:1, 3:2, 9:16. (4:5 and 1.91:1 are NOT supported — use 2:3 and 16:9 respectively.)
  • Format type. What this ad pretends to be: editorial article, product flatlay, comparison table, fake search results, story composite, native UI mimic, etc.
  • Layout structure. Header / hero / footer / grid — how regions are arranged.
  • Typography. Family (geometric sans, condensed sans, serif, handwritten marker, monospace), weight, hierarchy. Do NOT name specific fonts unless they're iconic and necessary; instead describe the feel.
  • Color palette. 3-6 hex codes. Identify which are brand-specific (will become {brand.color_*} variables) vs neutral/structural (white/black/grey backgrounds — stay literal).
  • Photography style. Studio product flatlay, lifestyle UGC, editorial portrait, stock-photo-grid, etc. Describe lighting and lens.
  • Text content (verbatim). Every visible string in the image. Mark which strings are brand-specific (e.g. "AG1", "Drink AG1") vs structural (e.g. "AS SEEN ON", "VS").
  • Decorative / non-text elements. Icons, divider lines, badges, emojis, hand-lettering, sticky-note props.
  • Branded vs structural elements. This is the key column. For everything you've described, mark each piece as [BRAND] (will become a variable) or [STRUCTURE] (stays literal in the template).
  • Chrome to strip. Anything you saw that's a screenshot/platform artifact (iOS status bar, Sponsored badge, engagement row). Note it for explicit exclusion in the prompt.

State this analysis to the user as a compact summary. Don't move on until it's complete.

Phase 3: Draft v1 prompt (faithful, brand-specifics intact)

Write a prompt that, paired with the reference image as --image-ref, would reproduce the ad faithfully. At this stage, leave brand-specific content literal — do not placeholder-ize yet.

Structure the prompt with these sections (omit any that don't apply):

  • Aspect ratio + canvas (e.g. "1:1 static ad creative, 1080x1080, edge-to-edge")
  • Background description
  • Header section (top X% of the image)
  • Main content / hero section
  • Decorative elements (badges, dividers)
  • Bottom section / footer band
  • Typography note (weight, family-feel, hierarchy)
  • Composition / spacing rules
  • Explicit chrome exclusion — name what NOT to render (the script's no-chrome suffix is a safety net; the prompt should also explicitly exclude)

Show the v1 prompt to the user.

Phase 4: Generate with reference

Use the discovered generate_image.py to fire one generation. Pass the original reference as --image-ref and the matched aspect ratio.

/generate_image.py \
  --prompt "$(cat /tmp/v1.prompt)" \
  --aspect-ratio  \
  --image-ref  \
  --out iterations/clone-tmp \
  --env-file .env

(Write the prompt to a temp file to avoid shell-quoting hell.) Wait for completion (~50s with reference). Read the generated image.

Phase 5: Compare and iterate

Show user the original side-by-side description with the generated. Identify deltas:

  • Layout regions misplaced or missing
  • Typography weight wrong
  • Wrong aspect ratio interpretation
  • Brand color drifted
  • Decorative elements (icons, badges) wrong or missing

Refine the prompt based on the deltas. Regenerate. Repeat until the structure is faithful enough to call it "good." Cap at 4 iterations — beyond that, the prompt has a structural problem and needs more dramatic editing rather than tweaking.

Phase 6: Generalize into placeholders

This is where the template becomes reusable. Walk back through the v1 prompt and replace every [BRAND]-marked element from Phase 2 with a {placeholder} variable. Use the standard placeholder vocabulary:

Standard variables (use these names where they fit):

  • {brand.name} — wordmark text
  • {brand.color_primary} — primary brand color hex (e.g. #1A4731)
  • {brand.color_accent} — secondary accent color hex (if used)
  • {brand.product_image_description} — one-line description of the product visible in the ad
  • {brand.tagline} — short brand promise
  • {brand.competitor_category} — for comparison templates: what's being compared against
  • {ad.headline} — top-line headline copy
  • {ad.subcopy} — sub-headline / supporting copy
  • {ad.body} — primary text block
  • {ad.cta_phrase} — CTA button text

Template-specific variables — name them clearly when needed:

  • {checklist_items[]} (Notes-style)
  • {tweet_body} (story templates)
  • {rows[]} (comparison templates)
  • {publication} (editorial templates)
  • {ugc_subject} (UGC photo composite templates)

For each variable: write a 1-line description of what it represents and what kind of value goes in it.

Phase 7: Test the generalized template

Pick a different brand (default AG1 if assets exist; otherwise ask). Substitute test values into every placeholder. Generate again with --image-ref set to the test brand's product photo (NOT the original ad). The output should:

  1. Have the same layout/composition as the original
  2. Show the test brand instead of the source brand
  3. Read as a coherent ad, not a frankenstein

If the test fails the structure breaks under different brand assumptions, return to Phase 6 and refine the placeholder set. Often the fix is making a placeholder that was missed (e.g. you hardcoded a font feel that's specific to one brand).

Phase 8: Document the template

Compose the library entry. Use the format in references/template-format.md — it has the markdown skeleton.

The entry must include:

  • Tag and one-line title (e.g. T8 — Lifestyle hero with overlay text)
  • When to use — 1-2 sentences on positioning fit
  • Aspect ratio recommendation
  • Reference image guidance — what kind of --image-ref to pass when reusing this template (product hero? logo? lifestyle portrait?)
  • Variable schema — every {placeholder} with a 1-line description
  • Template prompt in a fenced code block, ready to copy-paste-fill
  • Example fill — the test fill from Phase 7, showing the variables substituted
  • Validated example path — pointer to the iteration dir (e.g. iterations/clone-2026-05-04/T8/)

Phase 9: Save and confirm

  1. Append the entry to the configured library file. If overwriting an existing tag, ask first.
  2. Print the entry's path so the user can review.
  3. Move the validated PNGs from iterations/clone-tmp/ to a permanent dir keyed by the template tag (e.g. iterations/clone-2026-05-04/T8/).
  4. Tell the user the template is now available for use by uni1-image-ad. Suggest a follow-up: "Want me to make a real ad with this template right now?"

Naming convention for new templates

If the save target already has T1–T7 (the seeded templates), continue with T8, T9, … Use semantic suffixes if helpful: T8 — Lifestyle hero, T9 — Carousel cover. Keep the T part for cross-skill referencing.

Out of scope

  • Generating real ads / uploading to Meta. That's uni1-image-ad. This skill produces templates, period.
  • Reverse-engineering video ads. Image only. Refuse with: "This skill is for static image ads. Video reverse-engineering isn't supported in this version."
  • Multi-template extraction in one run. One reference → one template per skill invocation. If the user has 5 references, do 5 sequential runs (or batch via the same flow once you've done one).
  • Modifying existing templates in the library. If the user wants to revise T3, treat it as a new run pointed at the same library entry — show the diff and ask before overwriting.

Files this skill owns

  • ~/.claude/skills/image-ad-clone/SKILL.md — this file
  • ~/.claude/skills/image-ad-clone/references/template-format.md — load this in Phase 8 before composing the library entry
  • /iterations/clone-// — per-run iteration outputs (gitignored PNGs, kept prompts)

Files this skill writes to (in user space)

  • The configured prompt library (default: ~/.claude/skills/uni1-image-ad/references/prompt-library.md) — appended, never silently overwritten
  • /iterations/clone-//prompt.txt — the final validated prompt
  • /iterations/clone-//v1.png, v2.png, … — each iteration's output

Dependencies

  • The uni1-image-ad skill must be installed (this skill uses its generate_image.py for iteration). If not installed, fail Phase 1 with a clear instruction.
  • LUMA_API_KEY in .env.
  • Python 3.12+ (for the helper script).

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.