Skip to main content
AIDiveForge AIDiveForge
📢

Ad Creative Variant Generator

Design & Media · by AIDiveForge · Apr 20, 2026 · Intermediate

Draft ad variants under explicit character limits and supported claims.

Get labeled variants with counts and a claim-preservation check.

Free · 2 KB · SKILL.md, instructions and example files. Provide the platform limits, audience, offer, approved claims and required disclosures.

A worked example

A small example to try before using your own data.

Input

{
  "offer": "Free invoice template",
  "headline_limit": 30,
  "body_limit": 60,
  "approved_claims": [
    "Editable template"
  ],
  "variants": 2
}

Expected result

[
  {
    "headline": "Your next invoice, ready",
    "body": "Start with a free, editable invoice template."
  },
  {
    "headline": "Make invoicing simpler",
    "body": "Get the free template and edit it for your client."
  }
]

What to check: Every headline is at most 30 characters and every body at most 60; no time-savings or performance claim is introduced.

Limits: Editorial preference does not predict campaign performance. No ad is purchased or published by this workflow.

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 = "ad-creative-variant-generator"
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/ad-creative-variant-generator.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() != "22b6b5fb35bdd418f2d776bd8cce0a22133ae119eec52ad80db6dcdc643e520b":
    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/ad-creative-variant-generator/SKILL.md. Codex: ~/.codex/skills/ad-creative-variant-generator/SKILL.md. Keep the complete ZIP folder when helper scripts are included.

🧠 Why it works

Every headline is at most 30 characters and every body at most 60; no time-savings or performance claim is introduced.

⚙️ How it works

  1. Separate approved claims from proposed positioning and preserve all required disclosures.
  1. Choose one message angle per variant rather than changing the offer between variants.
  1. Write headline/body combinations and count characters using the platform’s documented rules or a stated approximation.
  1. Reject unsupported guarantees, invented scarcity or omitted conditions.
  1. Rank variants by a stated editorial rubric and label performance as untested until an experiment runs.

Description

Get labeled variants with counts and a claim-preservation check.

Provide the platform limits, audience, offer, approved claims and required disclosures.

Limits: Editorial preference does not predict campaign performance. No ad is purchased or published by this workflow.

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.