$npx -y skills add gooseworks-ai/goose-skills --skill remix-graphic-ad-from-referenceRecreate a static graphic ad (Pinterest pin, IG/FB feed image, poster) from a reference image, swapping in a new brand's product and new copy while keeping the reference's layout, composition, and visual energy. ALWAYS generated with GPT Image 2 in edit-the-reference mode (fal-ai
| 1 | # remix-graphic-ad-from-reference |
| 2 | |
| 3 | ## Purpose |
| 4 | |
| 5 | Given **one reference ad image** + a **target product** + **new copy**, produce a finished static ad |
| 6 | that keeps the reference's *layout and composition* but swaps the product and words for the new brand. |
| 7 | This powers the app's "pick a Pinterest ad you like → get the same ad for your product" flow. |
| 8 | |
| 9 | It does **not** invent layouts and it does **not** regenerate the whole scene from scratch. It reads |
| 10 | the reference, then recreates it with GPT Image 2: |
| 11 | |
| 12 | - **GPT Image 2 (edit the reference) — ALWAYS use this as the generator.** Run it in **image-edit |
| 13 | mode on the reference itself** to preserve the layout/composition and swap in the new product + |
| 14 | copy. This is the engine for EVERY remix (premium look). FAL slug `fal-ai/gpt-image-1/edit-image`. |
| 15 | - **HTML overlay (goose-graphics) — NOT a generation engine.** It is only an optional FINISHING |
| 16 | step: if GPT bakes garbled/misspelled copy, overlay crisp text on top of the GPT output. Never use |
| 17 | it as the primary generator — a remix must always be generated by GPT Image 2. |
| 18 | |
| 19 | |
| 20 | ## Inputs |
| 21 | |
| 22 | | Input | Required | Notes | |
| 23 | |---|---|---| |
| 24 | | `reference_image` | yes | The ad to recreate (local path or URL). One image. | |
| 25 | | `product` | yes | Target product: a clean product render/photo (PNG/webp). Pull the **real** brand asset; grounding/swapping on it is what keeps the label correct. **If the brand asset is a multi-product lineup, crop to the ONE relevant product first** — the remix grounds on a single clean product per `product_slot` (use `product_images_needed` from the slot map for how many distinct products the layout needs). | |
| 26 | | `copy_changes` | optional | If omitted, **the agent auto-writes it** from the brand pack mapped to the template's `slot_map` (see Phase 0.5). New headline, benefit callouts, social-proof line, discount/badge text. Keep the reference's *structure* (same zones), swap the words. | |
| 27 | | `brand` | recommended | Palette (hex), font, logo/wordmark, voice — from `get_brand_kit` / a `brand-research` pack. | |
| 28 | | `style_source` | optional | **`template` (DEFAULT)** keeps the reference ad's palette/theme; **`brand`** recolours to the brand kit's documented palette. See "Brand grounding" below. The caller sets it (e.g. the user asks to "match my brand colours" → `brand`); absent → `template`. | |
| 29 | | `route_hint` | optional | Engine override. Default is **always `gpt_image_2`**; `html` is only a text-overlay finishing step, never the generator. | |
| 30 | | `aspect` | optional | Inherit from the reference; map to the renderer canvas. Default 4:5 / 1080×1350. | |
| 31 | | `remix_spec` | optional | The precomputed spec from the template library (`slot_map` + `gen_prompt` + `remix_engine`). **If present, SKIP Phase 0 re-analysis** — the slots and prompt are already authored. This is the normal path when remixing a library template. | |
| 32 | | `remix_mode` | from template | `product` (swap a physical product) or `ui` (SaaS/app ad — swap the app screenshot/UI, NEVER insert a product). Tagged on the template. | |
| 33 | | `app_screenshot` | for `ui` mode | The brand's app/UI screenshot to drop into the device frame (used instead of `product` when `remix_mode:ui`). | |
| 34 | |
| 35 | ## Brand grounding — read the kit, never improvise (do this before generating) |
| 36 | |
| 37 | The brand context comes from `get_brand_kit` (structured): `colors` (palette hex), `typography`, |
| 38 | `products[]` (with `imageUrls` + `name`/`description`), `screenshotUrls`, and `referenceImages[]` |
| 39 | (each tagged with `productName` + `kind: "product" | "website_screenshot"`). **Read the full kit, not |
| 40 | a preview.** |
| 41 | |
| 42 | ### Palette — by `style_source` (default `template`) |
| 43 | **Default to `template`. Use `brand` ONLY when the user explicitly asks** (e.g. "use/match my brand |
| 44 | colours", "make it on-brand"). Do NOT switch to `brand` on your own judgment — keeping the reference's |
| 45 | look is the expected default. |
| 46 | - **`template` (default):** keep the **reference ad's** colours/theme; the brand contributes only its |
| 47 | product image, logo, and copy/voice — NOT its colours. |
| 48 | - **`brand` (only on explicit user request):** recolour the layout to the brand kit's `colors` |
| 49 | (primary/accent/bg/text). |
| 50 | - **NEVER invent a colour.** Every colour in the output must come from EITHER the reference |
| 51 | (`template`) OR the kit's documented `colors` (`brand`). Do **not** pull an accent off the logo, a |
| 52 | mascot, a product, or "what looks nice." If |