|
1
|
--- |
|
2
|
name: ad-creative |
|
3
|
description: Design static ad creatives for social media and display advertising campaigns. |
|
4
|
--- |
|
5
|
|
|
6
|
# Ad Creative Maker |
|
7
|
|
|
8
|
Design static ad creatives for social media ads, display banners, and digital advertising campaigns. Build production-ready ads via the design subagent and present them as iframes on the canvas. |
|
9
|
|
|
10
|
## When to Use |
|
11
|
|
|
12
|
- User needs ad creatives for Facebook, Instagram, LinkedIn, Google Display, or TikTok |
|
13
|
- User wants banner ads or display advertising assets |
|
14
|
|
|
15
|
- User needs multiple ad variants for A/B testing |
|
16
|
- User wants ad copy and visual design together |
|
17
|
|
|
18
|
- User wants to iterate on ad creative based on performance data |
|
19
|
- User asks for carousel ads (Instagram, Facebook, X/Twitter) |
|
20
|
|
|
21
|
- User wants retargeting/remarketing ad creatives |
|
22
|
- User provides their own product photos or brand images and wants ads built around them |
|
23
|
|
|
24
|
- User needs ads in multiple sizes/formats (square + portrait + landscape) |
|
25
|
- User wants a product launch or teaser campaign |
|
26
|
|
|
27
|
- User wants seasonal or holiday-themed ads |
|
28
|
- User needs app install ad creatives |
|
29
|
|
|
30
|
- User wants to refresh or update existing ads without performance data |
|
31
|
- User asks to make ads that match their website's look and feel |
|
32
|
|
|
33
|
## When NOT to Use |
|
34
|
|
|
35
|
- Organic social media content (use content-machine skill) |
|
36
|
- Video ads or animated content (use storyboard skill for planning) |
|
37
|
|
|
38
|
- Full landing pages (use the artifacts skill) |
|
39
|
|
|
40
|
## Golden Rules (check before every ad) |
|
41
|
|
|
42
|
1. **<20 words total on the image** — everything else goes in primary text / description fields |
|
43
|
2. **Only 4 elements per ad**: Logo, Hero, Benefit line, CTA button |
|
44
|
|
|
45
|
3. **Flat solid background colors only** — no gradients, no patterns, no textures (exception: awareness/launch ads may use a hero image as the background) |
|
46
|
4. **Real brand logo, always** — never substitute plain text for a logo (see Logo Extraction below) |
|
47
|
|
|
48
|
5. **Left-align content** — logo top-left, text left-aligned, CTA left-aligned. Centered layouts look generic. |
|
49
|
|
|
50
|
## Methodology |
|
51
|
|
|
52
|
### Step 1: Creative Brief |
|
53
|
|
|
54
|
Gather: Platform and Format, Objective, Target audience, Key message, CTA, Brand assets, Performance data (if iterating). |
|
55
|
|
|
56
|
**Brand research (mandatory before building):** Always use web search to look up the brand's actual visual identity before designing. Search for `[brand] brand font typeface typography`and`[brand] brand colors hex`. Use the brand's real fonts, colors, and visual language — never guess or substitute generic alternatives. If the official fonts are commercial/licensed, find the closest Google Fonts alternatives used in the brand's own guidelines. Common pairings: a sans-serif for headlines (e.g., Poppins) and a serif for body text (e.g., Lora). Include these in the subagent task instructions so every angle uses the correct brand identity. |
|
57
|
|
|
58
|
**Font loading (mandatory in every ad HTML):** After identifying the brand's fonts (or closest Google Fonts alternatives), include them in the head of every ad HTML file: |
|
59
|
|
|
60
|
```html |
|
61
|
|
|
62
|
<head> |
|
63
|
|
|
64
|
<link rel="preconnect" href="https://fonts.googleapis.com"> |
|
65
|
|
|
66
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> |
|
67
|
|
|
68
|
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;700;900&family=Lora:wght@400;700&display=swap" rel="stylesheet"> |
|
69
|
|
|
70
|
<style> |
|
71
|
|
|
72
|
.headline { font-family: 'Poppins', sans-serif; } |
|
73
|
|
|
74
|
.benefit { font-family: 'Lora', serif; } |
|
75
|
|
|
76
|
</style> |
|
77
|
|
|
78
|
</head> |
|
79
|
|
|
80
|
``` |
|
81
|
|
|
82
|
Always specify the exact weights needed (400, 700, 900). Never rely on browser defaults or system fonts — every ad must load its fonts explicitly. |
|
83
|
|
|
84
|
**Extract real brand colors from the site (mandatory).** Do not trust web search results for colors — they are frequently wrong. Instead, fetch the actual CSS from the brand's website: |
|
85
|
|
|
86
|
```bash |
|
87
|
|
|
88
|
curl -s -L "https://brand.com" | grep -iE '(theme-color|TileColor|mask-icon.*color)' | head -5 |
|
89
|
|
|
90
|
curl -s -L "https://brand.com" | tr -d '\n' | grep -oP 'href="[^"]*\\css[^"]*"' | head -3 |
|
91
|
|
|
92
|
curl -s "https://brand.com/path/to/style.css" | grep -oP '#[0-9a-fA-F]{3,8}' | sort -u |
|
93
|
|
|
94
|
``` |
|
95
|
|
|
96
|
### Step 2: Platform Specifications (2025-2026) |
|
97
|
|
|
98
|
#### Meta (Facebook/Instagram) — Visual |
|
99
|
|
|
100
|
| Placement | Dimensions | Safe zone | |
|
101
|
|
|
102
|
|---|---|---| |
|
103
|
|
|
104
|
| Feed (square) | 1080x1080 | ~100px margin all edges | |
|
105
|
|
|
106
|
| Feed (portrait) — **preferred** | 1080x1350 (4:5) | 4:5 outperforms 1:1 on CTR | |
|
107
|
|
|
108
|
| Stories | 1080x1920 | Top 14% + bottom 20% = dead zones | |
|
109
|
|
|
110
|
| Reels | 1080x1920 | Top 14% + bottom 35% = dead zones | |
|
111
|
|
|
112
|
| **Universal safe core**|**1010x1280 centered** | Works across all placements | |
|
113
|
|
|
114
|
Upload at 2x pixel density for Retina sharpness. JPG/PNG, 30MB max. |
|
115
|
|
|
116
|
#### Meta — Text |
|
117
|
|
|
118
|
| Element | Limit | Notes | |
|
119
|
|
|
120
|
|---|---|---| |
|
121
|
|
|
122
|
| Primary text | ~72 chars visible in Reels / 125 in Feed | Write for 72 | |
|
123
|
|
|
124
|
| Headline | 40 chars rec | Below image | |
|
125
|
|
|
126
|
| Description | 30 chars rec | Often hidden on mobile | |
|
127
|
|
|
128
|
#### Google Ads |
|
129
|
|
|
130
|
**RSA:** Headlines 30 chars (each must work standalone — Google mixes randomly), Descriptions 90 chars, up to 15 headlines / 4 descriptions. Pin sparingly — pinning drops Ad Strength. |
|
131
|
|
|
132
|
**RDA:** Landscape 1200x628 (1.91:1), Square 1200x1200 (required), Portrait 1200x1500 (4:5, optional). Short headline 30 chars, Long headline 90 chars, Description 90 chars. All images 5MB or less, keep under 150KB for fast load. |
|
133
|
|
|
134
|
**Highest-inventory static sizes** (if uploading fixed banners): 300x250, 728x90, 320x50, 300x600, 336x280. |
|
135
|
|
|
136
|
**Performance Max:** Same asset pool serves across Search/Display/YouTube/Gmail/Maps/Discover. Upload all 3 image ratios + a YouTube video — don't let Google auto-generate one. |
|
137
|
|
|
138
|
#### LinkedIn Ads |
|
139
|
|
|
140
|
Intro text 150 chars rec (600 max), Headline 70 chars rec (200 max), Image 1200x627 or 1200x1200. |
|
141
|
|
|
142
|
#### TikTok Ads |
|
143
|
|
|
144
|
1080x1920 (9:16), Ad text 100 chars max (~80 visible). Spark Ads (boosting organic creator posts) outperform In-Feed Ads on engagement. |
|
145
|
|
|
146
|
#### X / Twitter Ads |
|
147
|
|
|
148
|
| Placement | Dimensions | |
|
149
|
|
|
150
|
|---|---| |
|
151
|
|
|
152
|
| Single image | 1200x675 (1.91:1) or 1080x1080 (1:1) | |
|
153
|
|
|
154
|
| Carousel cards | 1080x1080 (1:1), 2-6 cards | |
|
155
|
|
|
156
|
| Portrait | 1080x1350 (4:5) | |
|
157
|
|
|
158
|
Tweet text 280 chars (~100 visible with media). Card headline 70 chars. |
|
159
|
|
|
160
|
### Step 3: Determine Campaign Mode |
|
161
|
|
|
162
|
Before defining angles, determine whether this is **direct-response**or**awareness/launch**. |
|
163
|
|
|
164
|
#### Direct-Response (default) |
|
165
|
|
|
166
|
Use for conversion, lead generation, app installs, purchases. This is the default — most ad requests are direct-response. |
|
167
|
|
|
168
|
#### Awareness / Launch Campaigns |
|
169
|
|
|
170
|
Use for product launches, brand announcements, event teasers, top-of-funnel awareness. Prioritize mood and brand impression over clicks. |
|
171
|
|
|
172
|
##### Key differences from direct-response |
|
173
|
|
|
174
|
- **No CTA button on the image.** The CTA lives in the post text or link, not the visual. |
|
175
|
- **Even less text: ~10-15 words max** — typically brand name, one positioning line, and a date/tagline. |
|
176
|
|
|
177
|
- **Visual metaphor over product shots.** Use evocative imagery that communicates feeling or aspiration. |
|
178
|
- **Multiple visual worlds per campaign.** For carousels or multi-asset campaigns, create 3-5 distinct aesthetic treatments — different palettes, subjects, moods — while keeping typography and logo placement consistent. |
|
179
|
|
|
180
|
- **Layout pattern:** Logo (top corner) then Hero visual (fills most of the frame) then Brand name/headline (bottom, large, bold) then Subtitle + date (smaller, below headline). |
|
181
|
- **Hero images allowed.** Unlike direct-response, awareness ads may use a full-bleed generated image as the background (see Image Guidance below). |
|
182
|
|
|
183
|
**When to use awareness mode:** Pre-launch teasers, brand-building campaigns, event promotion, or when the user says "announce," "tease," "launch," or asks for something "premium" without conversion goals. |
|
184
|
|
|
185
|
### Step 3b: Define Angles |
|
186
|
|
|
187
|
Before writing individual copy, establish 3-5 distinct angles — different reasons someone would click: |
|
188
|
|
|
189
|
| Category | Example | |
|
190
|
|
|
191
|
|----------|---------| |
|
192
|
|
|
193
|
| Pain point | "Stop wasting time on X" | |
|
194
|
|
|
195
|
| Outcome | "Achieve Y in Z days" | |
|
196
|
|
|
197
|
| Social proof | "Join 10,000+ teams who..." | |
|
198
|
|
|
199
|
| Curiosity | "The X secret top companies use" | |
|
200
|
|
|
201
|
| Identity | "Built for [specific role/type]" | |
|
202
|
|
|
203
|
| Urgency | "Limited time: get X free" | |
|
204
|
|
|
205
|
| Contrarian | "Why [common practice] doesn't work" | |
|
206
|
|
|
207
|
**For retargeting ads**, adjust angles for warm audiences who already know the brand: |
|
208
|
|
|
209
|
- Reminder: "Still thinking about X?" |
|
210
|
- Incentive: "Come back for 15% off" |
|
211
|
|
|
212
|
- Social proof: "See why 10,000 others chose us" |
|
213
|
- Scarcity: "Only 3 left in your size" |
|
214
|
|
|
215
|
- Objection handling: "Free returns, no risk" |
|
216
|
|
|
217
|
### Step 4: Design Principles |
|
218
|
|
|
219
|
- **Under 20 words total on the image** — this is the most important rule. Icons, stats rows, feature grids, and badges all violate this. If it doesn't fit in Logo + Hero + Benefit + CTA, it belongs in the primary text. |
|
220
|
- Visual hierarchy: Logo (top-left) then Hero element then Benefit then CTA |
|
221
|
|
|
222
|
- WCAG 4.5:1 contrast minimum |
|
223
|
- CTA: contrasting color, rounded corners, verb-first, left-aligned |
|
224
|
|
|
225
|
- **No gradients** — flat solid colors only. Use different solid colors across ads for variety. Exception: awareness/launch ads may use a bottom readability gradient over a hero image. |
|
226
|
|
|
227
|
### Steps 5-6: Generate and Validate Copy |
|
228
|
|
|
229
|
Vary word choice, specificity, tone, and structure across angles. Always validate character counts before delivering. Include counts in your output. |
|
230
|
|
|
231
|
```text |
|
232
|
|
|
233
|
## Angle: [Pain Point — Manual Reporting] |
|
234
|
|
|
235
|
### Headlines (30 char max) |
|
236
|
|
|
237
|
1. "Stop Building Reports by Hand" (29) |
|
238
|
2. "Automate Your Weekly Reports" (28) |
|
239
|
|
|
240
|
3. "Reports in 5 Min, Not 5 Hrs" (27) |
|
241
|
|
|
242
|
### Descriptions (90 char max) |
|
243
|
|
|
244
|
1. "Marketing teams save 10+ hours/week with automated reporting. Start free." (73) |
|
245
|
2. "Connect your data sources once. Get automated reports forever. No code required." (80) |
|
246
|
|
|
247
|
``` |
|
248
|
|
|
249
|
### Step 7: Build Ad Creatives |
|
250
|
|
|
251
|
#### File Setup |
|
252
|
|
|
253
|
Place all ad HTML files in `artifacts/mockup-sandbox/public/ads/`— served by the mockup-sandbox Vite dev server at`/__mockup/ads/filename.html`. |
|
254
|
|
|
255
|
After copying image assets from `attached_assets/`, always fix permissions: |
|
256
|
|
|
257
|
```bash |
|
258
|
|
|
259
|
chmod 644 artifacts/mockup-sandbox/public/ads/*.png artifacts/mockup-sandbox/public/ads/*.jpg |
|
260
|
|
|
261
|
``` |
|
262
|
|
|
263
|
Files copied from `attached_assets/`default to`rw-------` (unreadable by the server). |
|
264
|
|
|
265
|
#### Cache Busting |
|
266
|
|
|
267
|
Canvas iframes cache aggressively. After editing any ad file, increment `?v=N` on the iframe URL: |
|
268
|
|
|
269
|
```text |
|
270
|
|
|
271
|
https://your-domain.dev/__mockup/ads/angle1.html?v=2 |
|
272
|
|
|
273
|
``` |
|
274
|
|
|
275
|
#### Parallel Subagents — Full Task Template |
|
276
|
|
|
277
|
Launch one design subagent per angle simultaneously. Each subagent gets a complete, self-contained task with all brand details, the HTML structure, and styling rules baked in. **Do not assume the subagent knows any of the golden rules — repeat them explicitly.** |
|
278
|
|
|
279
|
```javascript |
|
280
|
|
|
281
|
await startAsyncSubagent({ |
|
282
|
|
|
283
|
task: `Create a production-ready ad creative as a standalone HTML file. |
|
284
|
|
|
285
|
**Brand:** |
|
286
|
|
|
287
|
- Name: [Brand Name] |
|
288
|
- Primary color: [hex] | Secondary: [hex] | Accent: [hex] |
|
289
|
|
|
290
|
- Headline font: [Font Name] (Google Fonts — load via link tag in head) |
|
291
|
- Body font: [Font Name] (Google Fonts — load via link tag in head) |
|
292
|
|
|
293
|
- Logo: [inline SVG code or path to logo file] |
|
294
|
|
|
295
|
**Ad Details:** |
|
296
|
|
|
297
|
- Platform: [Meta Feed / Google Display / LinkedIn / TikTok / X] |
|
298
|
- Angle: [Pain Point / Outcome / Social Proof / etc.] |
|
299
|
|
|
300
|
- Headline: "[exact headline text]" |
|
301
|
- Benefit: "[one short benefit line]" |
|
302
|
|
|
303
|
- CTA: "[verb-first CTA text]" |
|
304
|
- Background color: [hex — flat solid, NO gradients] |
|
305
|
|
|
306
|
**File:** Write to artifacts/mockup-sandbox/public/ads/[filename].html |
|
307
|
|
|
308
|
**MANDATORY HTML STRUCTURE — follow exactly:** |
|
309
|
|
|
310
|
The ad must use this structure: |
|
311
|
|
|
312
|
- html/body: width 100vw, height 100vh, overflow hidden, margin 0, padding 0 |
|
313
|
- .ad container: width 100vw, height 100vh, solid background color (NO gradients), flex column, justify-content space-between, padding 6vh 7vw |
|
314
|
|
|
315
|
- .logo: top-left, inline SVG at height 5vh |
|
316
|
- .middle: flex column, gap 3vh, containing headline, benefit, and CTA |
|
317
|
|
|
318
|
- .headline: brand headline font, font-size 8vw, font-weight 900, line-height 1.1 |
|
319
|
- .benefit: brand body font, font-size 3vw, slightly transparent white |
|
320
|
|
|
321
|
- .cta: inline-block, padding 2vh 5vw, accent color background, border-radius 1vw, font-weight 700, align-self flex-start (LEFT-ALIGNED) |
|
322
|
- .footer: font-size 1.8vw, subtle color, brand URL |
|
323
|
|
|
324
|
**RULES — do not violate:** |
|
325
|
|
|
326
|
- Only 4 elements: Logo, Headline, Benefit, CTA. No icons, stats, badges, feature grids, or dividers. |
|
327
|
- Under 20 words total visible on the ad. |
|
328
|
|
|
329
|
- Flat solid background color — NO gradients, NO patterns. |
|
330
|
- All sizing in vw/vh — NO fixed pixel dimensions. |
|
331
|
|
|
332
|
- Left-align everything — logo top-left, text left-aligned, CTA left-aligned. Do NOT center. |
|
333
|
- Load fonts from Google Fonts in the head. Do NOT use system fonts or Inter. |
|
334
|
|
|
335
|
- The CTA button must use a contrasting accent color and be verb-first.`, |
|
336
|
|
|
337
|
specialization: "DESIGN", |
|
338
|
|
|
339
|
relevantFiles: ["artifacts/mockup-sandbox/public/ads/[filename].html"] |
|
340
|
|
|
341
|
}); |
|
342
|
|
|
343
|
// Repeat for each angle — all launch simultaneously |
|
344
|
|
|
345
|
``` |
|
346
|
|
|
347
|
After launching, call the `wait_for_background_tasks` tool to wait for every ad-design subagent. Then embed each ad as an iframe on the canvas using `apply_canvas_actions`, and call `presentArtifact({ artifactId, shapeIds: [...] })` with the IDs of the new iframe shapes. |
|
348
|
|
|
349
|
#### Viewport-Relative Sizing (mandatory) |
|
350
|
|
|
351
|
```css |
|
352
|
|
|
353
|
html, body { |
|
354
|
|
|
355
|
margin: 0; padding: 0; |
|
356
|
|
|
357
|
width: 100vw; height: 100vh; |
|
358
|
|
|
359
|
overflow: hidden; |
|
360
|
|
|
361
|
} |
|
362
|
|
|
363
|
``` |
|
364
|
|
|
365
|
All internal sizing must use vw/vh. No fixed pixel dimensions on containers. |
|
366
|
|
|
367
|
#### Ad HTML Structure (mandatory pattern) |
|
368
|
|
|
369
|
Every ad must follow this exact structure — 4 elements, no more: |
|
370
|
|
|
371
|
```html |
|
372
|
|
|
373
|
<div class="ad"> |
|
374
|
|
|
375
|
<div class="logo"><!-- SVG or img --></div> |
|
376
|
|
|
377
|
<div class="middle"> |
|
378
|
|
|
379
|
<div class="headline">Hero text here</div> |
|
380
|
|
|
381
|
<div class="benefit">One short benefit line.</div> |
|
382
|
|
|
383
|
<div class="cta">Verb-first CTA</div> |
|
384
|
|
|
385
|
</div> |
|
386
|
|
|
387
|
<span class="footer">brand.com</span> |
|
388
|
|
|
389
|
</div> |
|
390
|
|
|
391
|
``` |
|
392
|
|
|
393
|
```css |
|
394
|
|
|
395
|
.ad { |
|
396
|
|
|
397
|
width: 100vw; |
|
398
|
|
|
399
|
height: 100vh; |
|
400
|
|
|
401
|
background: \#SOLID_COLOR; |
|
402
|
|
|
403
|
display: flex; |
|
404
|
|
|
405
|
flex-direction: column; |
|
406
|
|
|
407
|
justify-content: space-between; |
|
408
|
|
|
409
|
padding: 6vh 7vw; |
|
410
|
|
|
411
|
box-sizing: border-box; |
|
412
|
|
|
413
|
} |
|
414
|
|
|
415
|
.middle { |
|
416
|
|
|
417
|
display: flex; |
|
418
|
|
|
419
|
flex-direction: column; |
|
420
|
|
|
421
|
gap: 3vh; |
|
422
|
|
|
423
|
} |
|
424
|
|
|
425
|
``` |
|
426
|
|
|
427
|
Do not add icons, stats rows, feature grids, badges, dividers, or any decorative elements. If you are tempted to add a 5th element, move that information to the primary text instead. |
|
428
|
|
|
429
|
#### Image Guidance |
|
430
|
|
|
431
|
##### When to use generated images |
|
432
|
|
|
433
|
- Awareness/launch campaigns — the hero image IS the ad, with text overlaid on a bottom gradient |
|
434
|
- When the user explicitly requests photo-based or image-heavy ads |
|
435
|
|
|
436
|
###### When NOT to use images (default for direct-response) |
|
437
|
|
|
438
|
- Standard direct-response ads use flat solid color backgrounds with bold typography |
|
439
|
- The 4-element rule (Logo, Hero text, Benefit, CTA) works best without competing with a background image |
|
440
|
|
|
441
|
###### If using a hero image (awareness/launch mode only) |
|
442
|
|
|
443
|
Generate images using `generateImage`from the media-generation skill. Save to`artifacts/mockup-sandbox/public/images/`and reference via`/__mockup/images/[filename].png`. |
|
444
|
|
|
445
|
Image prompt strategy: |
|
446
|
|
|
447
|
- Lead with a specific, tangible subject (object, scene, or person) |
|
448
|
- Specify lighting (studio, dramatic, golden hour, Rembrandt) |
|
449
|
|
|
450
|
- Specify camera quality ("shot on Hasselblad," "editorial photography") |
|
451
|
- Add negative prompts: "text, words, letters, logos, watermark, blurry, low quality, cartoon, illustration" |
|
452
|
|
|
453
|
- Each ad should use a different visual metaphor — same brand, different visual world |
|
454
|
|
|
455
|
Image-first HTML structure (awareness/launch only): |
|
456
|
|
|
457
|
```css |
|
458
|
|
|
459
|
.ad { |
|
460
|
|
|
461
|
width: 100vw; height: 100vh; |
|
462
|
|
|
463
|
position: relative; overflow: hidden; |
|
464
|
|
|
465
|
} |
|
466
|
|
|
467
|
.hero-img { |
|
468
|
|
|
469
|
position: absolute; inset: 0; |
|
470
|
|
|
471
|
width: 100%; height: 100%; |
|
472
|
|
|
473
|
object-fit: cover; |
|
474
|
|
|
475
|
} |
|
476
|
|
|
477
|
.gradient-overlay { |
|
478
|
|
|
479
|
position: absolute; bottom: 0; width: 100%; |
|
480
|
|
|
481
|
height: 50vh; |
|
482
|
|
|
483
|
background: linear-gradient(transparent, rgba(0,0,0,0.8)); |
|
484
|
|
|
485
|
} |
|
486
|
|
|
487
|
.content { |
|
488
|
|
|
489
|
position: absolute; bottom: 0; left: 0; |
|
490
|
|
|
491
|
padding: 6vh 7vw; |
|
492
|
|
|
493
|
} |
|
494
|
|
|
495
|
``` |
|
496
|
|
|
497
|
**If the user provides their own images:** Use the user's images instead of generating new ones. Copy from `attached_assets/`to`artifacts/mockup-sandbox/public/images/`, fix permissions with`chmod 644`, and reference via`/__mockup/images/[filename]`. Use the awareness/launch image-first layout structure above. |
|
498
|
|
|
499
|
#### Brand Logo Extraction |
|
500
|
|
|
501
|
Always use the brand's actual logo — never substitute plain text for a logo. |
|
502
|
|
|
503
|
**Step 1: Extract the SVG directly from the brand's website.** This is the most reliable method — the actual logo is already embedded in their HTML: |
|
504
|
|
|
505
|
```bash |
|
506
|
|
|
507
|
curl -s -L "https://brand.com" | tr -d '\n' | grep -oP '<svg viewBox="[^"]*"[^>]*>.*?</svg>' | head -1 > /tmp/brand-logo.svg |
|
508
|
|
|
509
|
wc -c /tmp/brand-logo.svg |
|
510
|
|
|
511
|
``` |
|
512
|
|
|
513
|
Should be over 1KB for a real logo. |
|
514
|
|
|
515
|
**Step 2: Verify the extracted SVG path data is complete.** SVG path data can be silently truncated during shell extraction. Always verify the max coordinates fit within the viewBox: |
|
516
|
|
|
517
|
```bash |
|
518
|
|
|
519
|
node -e " |
|
520
|
|
|
521
|
const fs = require('fs'); |
|
522
|
|
|
523
|
const svg = fs.readFileSync('/tmp/brand-logo.svg', 'utf8'); |
|
524
|
|
|
525
|
const dMatch = svg.match(/d=\([^\\]+)\\/); |
|
526
|
|
|
527
|
if (dMatch) { |
|
528
|
|
|
529
|
const d = dMatch[1]; |
|
530
|
|
|
531
|
console.log('Path data length:', d.length); |
|
532
|
|
|
533
|
console.log('Last 80 chars:', d.slice(-80)); |
|
534
|
|
|
535
|
const nums = d.match(/[\d.]+/g).map(Number); |
|
536
|
|
|
537
|
const maxX = Math.max(...nums.filter((_, i) => i % 2 === 0)); |
|
538
|
|
|
539
|
console.log('Max X:', maxX); |
|
540
|
|
|
541
|
} |
|
542
|
|
|
543
|
" |
|
544
|
|
|
545
|
``` |
|
546
|
|
|
547
|
If path data length is under ~2000 characters for a wordmark logo, the data was likely truncated. Re-extract with a larger buffer. |
|
548
|
|
|
549
|
**Step 3: Embed inline.** Embedding the SVG directly in the HTML avoids file permission issues, eliminates loading delays, and scales perfectly: |
|
550
|
|
|
551
|
```html |
|
552
|
|
|
553
|
<svg viewBox="0 0 100 32" fill="none" xmlns="http://www.w3.org/2000/svg" |
|
554
|
|
|
555
|
style="height:5vh;width:auto;"> |
|
556
|
|
|
557
|
<path fill-rule="evenodd" clip-rule="evenodd" d="..." fill="white"/> |
|
558
|
|
|
559
|
</svg> |
|
560
|
|
|
561
|
``` |
|
562
|
|
|
563
|
Use `fill="white"`on dark backgrounds,`fill="#BrandDarkColor"` on light backgrounds. |
|
564
|
|
|
565
|
**Step 4: Position the logo top-left, not centered.** The logo should sit in the top-left corner as part of the visual hierarchy. Do not center-align logos — centered layouts look generic and reduce brand recognition. |
|
566
|
|
|
567
|
**Fallback: If the website doesn't have an inline SVG**, search for `[brand] logo SVG site:wikimedia.org OR site:brandfetch.com`. As a last resort, use a logo + wordmark pattern with the brand's font. |
|
568
|
|
|
569
|
**If using an image file for the logo**, always use both max-width and max-height together: |
|
570
|
|
|
571
|
```css |
|
572
|
|
|
573
|
.logo-img { |
|
574
|
|
|
575
|
max-width: 38vw; |
|
576
|
|
|
577
|
max-height: 12vh; |
|
578
|
|
|
579
|
width: auto; |
|
580
|
|
|
581
|
height: auto; |
|
582
|
|
|
583
|
object-fit: contain; |
|
584
|
|
|
585
|
} |
|
586
|
|
|
587
|
``` |
|
588
|
|
|
589
|
Never use `width: Xvw; height: auto` alone on a square logo — at width 38vw, a square image is also 38vh tall and will overflow its container into content below. |
|
590
|
|
|
591
|
Logo images have built-in padding. The visible logo mark may only occupy 50-70% of the image dimensions. Size the image larger than you'd expect. |
|
592
|
|
|
593
|
##### Logos without transparent backgrounds |
|
594
|
|
|
595
|
| Scenario | Strategy | |
|
596
|
|
|
597
|
|---|---| |
|
598
|
|
|
599
|
| Ad bg color matches logo bg exactly | Use that logo version — backgrounds blend seamlessly | |
|
600
|
|
|
601
|
| White ad background | Use white-background logo + mix-blend-mode: multiply | |
|
602
|
|
|
603
|
```css |
|
604
|
|
|
605
|
.logo-img { mix-blend-mode: multiply; } |
|
606
|
|
|
607
|
``` |
|
608
|
|
|
609
|
#### Canvas Layout |
|
610
|
|
|
611
|
Place ad iframes side-by-side in a row for easy comparison. Use square iframes (600x600) so they fit on the canvas without clipping. Space them with ~50px gutters: |
|
612
|
|
|
613
|
```text |
|
614
|
|
|
615
|
x=0, y=0: [Iframe: Angle 1] (600x600) |
|
616
|
|
|
617
|
x=650, y=0: [Iframe: Angle 2] (600x600) |
|
618
|
|
|
619
|
x=1300, y=0: [Iframe: Angle 3] (600x600) |
|
620
|
|
|
621
|
``` |
|
622
|
|
|
623
|
**For portrait/stories ads (9:16):** Use 608x1080 iframes: |
|
624
|
|
|
625
|
```text |
|
626
|
|
|
627
|
x=0, y=0: [Iframe: Story 1] (608x1080) |
|
628
|
|
|
629
|
x=658, y=0: [Iframe: Story 2] (608x1080) |
|
630
|
|
|
631
|
x=1316, y=0: [Iframe: Story 3] (608x1080) |
|
632
|
|
|
633
|
``` |
|
634
|
|
|
635
|
**For multi-format output** (same angle in multiple sizes): Stack formats vertically per angle: |
|
636
|
|
|
637
|
```text |
|
638
|
|
|
639
|
x=0, y=0: [Iframe: Angle 1 — Square] (600x600) |
|
640
|
|
|
641
|
x=0, y=650: [Iframe: Angle 1 — Portrait] (450x600) |
|
642
|
|
|
643
|
x=650, y=0: [Iframe: Angle 2 — Square] (600x600) |
|
644
|
|
|
645
|
x=650, y=650: [Iframe: Angle 2 — Portrait] (450x600) |
|
646
|
|
|
647
|
``` |
|
648
|
|
|
649
|
**For carousel ads:** Place cards in sequence left-to-right: |
|
650
|
|
|
651
|
```text |
|
652
|
|
|
653
|
x=0, y=0: [Iframe: Card 1] (600x600) |
|
654
|
|
|
655
|
x=650, y=0: [Iframe: Card 2] (600x600) |
|
656
|
|
|
657
|
x=1300, y=0: [Iframe: Card 3] (600x600) |
|
658
|
|
|
659
|
x=1950, y=0: [Iframe: Card 4] (600x600) |
|
660
|
|
|
661
|
``` |
|
662
|
|
|
663
|
Do not add text labels above iframe shapes — iframes already display their componentName in the title bar. Set componentName to something descriptive like "Angle 1: Outcome — Think deeper. Get further." |
|
664
|
|
|
665
|
**With landing page mock-ups** (optional — include when the user wants to see the full click-through experience): Place the landing page iframe next to each ad: |
|
666
|
|
|
667
|
```text |
|
668
|
|
|
669
|
x=0, y=0: [Iframe: Angle 1 Ad] (600x600) |
|
670
|
|
|
671
|
x=650, y=0: [Iframe: Angle 1 Landing] (1280x720) |
|
672
|
|
|
673
|
x=0, y=650: [Iframe: Angle 2 Ad] (600x600) |
|
674
|
|
|
675
|
x=650, y=650: [Iframe: Angle 2 Landing] (1280x720) |
|
676
|
|
|
677
|
``` |
|
678
|
|
|
679
|
The landing page should look like where the ad actually leads — hero section echoing the ad's message, value props, social proof, and a CTA. Not a wireframe. |
|
680
|
|
|
681
|
#### Export |
|
682
|
|
|
683
|
Ads use vw/vh sizing so they adapt to any viewport. For export at specific pixel dimensions: |
|
684
|
|
|
685
|
```bash |
|
686
|
|
|
687
|
npx playwright screenshot artifacts/mockup-sandbox/public/ads/angle1.html --viewport-size=1080,1080 -o angle1-1080.png |
|
688
|
|
|
689
|
npx playwright screenshot artifacts/mockup-sandbox/public/ads/angle1.html --viewport-size=1080,1350 -o angle1-portrait.png |
|
690
|
|
|
691
|
npx playwright screenshot artifacts/mockup-sandbox/public/ads/story1.html --viewport-size=1080,1920 -o story1.png |
|
692
|
|
|
693
|
``` |
|
694
|
|
|
695
|
The user can also screenshot each iframe directly from the canvas, or open the HTML files in a browser at the desired size. |
|
696
|
|
|
697
|
## Prompt-Specific Workflows |
|
698
|
|
|
699
|
### Carousel Ads |
|
700
|
|
|
701
|
When the user asks for carousel ads (Instagram, Facebook, X/Twitter): |
|
702
|
|
|
703
|
1. Each card should be a self-contained visual — assume viewers swipe quickly. |
|
704
|
2. Use a **consistent structural layout**across cards (same typography placement, same logo position) with**varying content/colors** per card. This "same but different" effect rewards swiping. |
|
705
|
|
|
706
|
3. For Instagram/Facebook carousels: 1080x1080 per card, 2-10 cards. |
|
707
|
4. For X/Twitter carousels: 1080x1080 per card, 2-6 cards with optional headline/URL per card. |
|
708
|
|
|
709
|
5. Launch one subagent per card in parallel. Include the card number and total count so the subagent can create a coherent sequence. |
|
710
|
6. Arrange cards left-to-right on the canvas so the user can see the swipe flow. |
|
711
|
|
|
712
|
### Retargeting / Remarketing Ads |
|
713
|
|
|
714
|
When the user asks for retargeting ads: |
|
715
|
|
|
716
|
1. Adjust copy for **warm audiences** who already know the brand — don't introduce the brand, remind them. |
|
717
|
2. Use retargeting-specific angles: Reminder, Incentive, Social Proof, Scarcity, Objection Handling (see Step 3b). |
|
718
|
|
|
719
|
3. Consider dynamic elements: "Still interested in [product]?", "Your cart is waiting", etc. |
|
720
|
4. Shorter, more direct copy — they already know you. |
|
721
|
|
|
722
|
### User-Provided Images |
|
723
|
|
|
724
|
When the user uploads their own product photos or brand images: |
|
725
|
|
|
726
|
1. Copy from `attached_assets/`to`artifacts/mockup-sandbox/public/images/`. |
|
727
|
2. Run `chmod 644` on all copied files. |
|
728
|
|
|
729
|
3. Use the awareness/launch image-first layout (full-bleed image with gradient overlay and text on top). |
|
730
|
4. Do NOT generate new images — use the user's images as-is. |
|
731
|
|
|
732
|
5. Adapt the text overlay colors to work with the specific image's brightness/contrast. |
|
733
|
|
|
734
|
### Multi-Format Output |
|
735
|
|
|
736
|
When the user needs the same ad in multiple sizes: |
|
737
|
|
|
738
|
1. Create one HTML file per size variant (e.g., `angle1-square.html`,`angle1-portrait.html`,`angle1-landscape.html`). |
|
739
|
2. The HTML structure stays the same — vw/vh sizing handles the adaptation. But adjust font sizes and padding for extreme aspect ratios (landscape needs smaller headline vw, portrait can go bigger). |
|
740
|
|
|
741
|
3. Stack formats vertically per angle on the canvas for easy comparison. |
|
742
|
4. Test each format at its target pixel dimensions to verify nothing clips or overflows. |
|
743
|
|
|
744
|
### Awareness / Launch Campaigns (2) |
|
745
|
|
|
746
|
When the user asks for a launch, teaser, or brand awareness campaign: |
|
747
|
|
|
748
|
1. Switch to awareness mode (see Step 3 above). |
|
749
|
2. Generate hero images using `generateImage` — each ad should use a different visual metaphor. |
|
750
|
|
|
751
|
3. Use image-first layout with gradient overlay. |
|
752
|
4. No CTA button on the image. ~10-15 words max. |
|
753
|
|
|
754
|
5. For multi-card campaigns, maintain identical text layout and logo placement across cards while varying the hero visual and color palette. |
|
755
|
|
|
756
|
### Seasonal / Holiday Ads |
|
757
|
|
|
758
|
When the user asks for holiday or seasonal ads: |
|
759
|
|
|
760
|
1. Use the standard methodology but adjust angles for urgency and timeliness. |
|
761
|
2. Incorporate seasonal colors subtly — don't overwhelm the brand identity. The brand's colors should still dominate; seasonal colors are accents. |
|
762
|
|
|
763
|
3. Include time-bound CTAs: "Order by Dec 15 for guaranteed delivery", "48-hour flash sale". |
|
764
|
4. Consider the platform's ad approval timeline — submit 3-5 days before the holiday. |
|
765
|
|
|
766
|
### App Install Ads |
|
767
|
|
|
768
|
When the user asks for app install ad creatives: |
|
769
|
|
|
770
|
1. CTA should be app-specific: "Download Free", "Get the App", "Try It Free". |
|
771
|
2. Consider showing a device mockup or screenshot (if the user provides one). |
|
772
|
|
|
773
|
3. For Google App Campaigns: supply landscape (1200x628), portrait (1200x1500), and square (1200x1200) images. |
|
774
|
4. Keep the value proposition ultra-clear — users decide in 1-2 seconds whether to install. |
|
775
|
|
|
776
|
### Refreshing Existing Ads |
|
777
|
|
|
778
|
When the user wants to update or refresh existing ads without performance data: |
|
779
|
|
|
780
|
1. Review the existing ads (ask the user to share them or describe them). |
|
781
|
2. Keep the same brand identity and overall strategy. |
|
782
|
|
|
783
|
3. Freshen: new headline variations, new background colors, new angles that weren't tested. |
|
784
|
4. Do NOT change what's working — if the user says "these are doing fine, just want fresh versions," keep the structure and vary the copy/colors. |
|
785
|
|
|
786
|
## Iterating from Performance Data |
|
787
|
|
|
788
|
When the user provides performance data: |
|
789
|
|
|
790
|
1. **Analyze winners**: Identify winning themes, structures, word patterns, and character utilization in top performers (by CTR, conversion rate, or ROAS). |
|
791
|
2. **Analyze losers**: Identify themes that fall flat and common patterns in underperformers. |
|
792
|
|
|
793
|
3. **Generate new variations**: Double down on winning themes, extend winning angles, test 1-2 new unexplored angles, avoid patterns from underperformers. |
|
794
|
4. **Document the iteration**: Track what was learned, what's being tested, and what angles were retired. |
|
795
|
|
|
796
|
Present the analysis to the user before building new ads: |
|
797
|
|
|
798
|
```text |
|
799
|
|
|
800
|
## Performance Analysis |
|
801
|
|
|
802
|
### Winners (keep and extend) |
|
803
|
|
|
804
|
- Pain point angles performing 2.3x above average CTR |
|
805
|
- Headlines with specific numbers ("75% faster") outperform vague claims |
|
806
|
|
|
807
|
### Losers (retire) |
|
808
|
|
|
809
|
- Curiosity angles underperforming — audience is solution-aware, not problem-aware |
|
810
|
- Long headlines (over 25 chars) getting truncated on mobile |
|
811
|
|
|
812
|
### New Test Plan |
|
813
|
|
|
814
|
- 2 new pain point variations (doubling down on winner) |
|
815
|
- 1 social proof angle (untested category) |
|
816
|
|
|
817
|
- Retire all curiosity angles |
|
818
|
|
|
819
|
``` |
|
820
|
|
|
821
|
## Research Before Writing |
|
822
|
|
|
823
|
Use web search to find examples of top-performing ads in the user's vertical. Search for ad breakdowns, swipe files, and case studies — e.g. `[industry] top performing Facebook ads 2026`or`[industry] TikTok ad examples`. Reverse-engineer: what hook, what angle, what visual pattern. Don't guess what works — look it up. |
|
824
|
|
|
825
|
## Common Mistakes |
|
826
|
|
|
827
|
### Content overload (most common) |
|
828
|
|
|
829
|
- Adding icons, stats rows, feature grids, or badges — these violate the under-20-word rule. Each ad should have exactly 4 elements: Logo, Hero, Benefit, CTA. |
|
830
|
- Using gradients instead of flat solid colors (except awareness/launch hero images) |
|
831
|
|
|
832
|
- Centering all content instead of left-aligning (left-aligned text feels more intentional and professional) |
|
833
|
|
|
834
|
#### Logo issues |
|
835
|
|
|
836
|
- Using plain text instead of the brand's actual logo — always extract the real SVG from the brand's website first |
|
837
|
- Truncated SVG path data — always verify path length and max coordinates after extraction |
|
838
|
|
|
839
|
- Not checking that the SVG viewBox contains the full logo (max X/Y must be within viewBox bounds) |
|
840
|
|
|
841
|
##### Brand identity |
|
842
|
|
|
843
|
- Trusting web search for brand colors — always extract actual hex values from the site's CSS |
|
844
|
- Using generic fonts (e.g., Inter) instead of the brand's actual typeface |
|
845
|
|
|
846
|
- Not loading fonts via Google Fonts link in the HTML head — relying on system fonts |
|
847
|
|
|
848
|
###### Technical |
|
849
|
|
|
850
|
- width Xvw with height auto alone on square logo images (overflows container) |
|
851
|
- Forgetting chmod 644 on assets copied from attached_assets (server can't read them) |
|
852
|
|
|
853
|
- Not incrementing ?v=N on iframe URLs after editing HTML files |
|
854
|
- Placing ad files in the wrong directory (use artifacts/mockup-sandbox/public/ads/, not client/public/ads/) |
|
855
|
|
|
856
|
###### Copy |
|
857
|
|
|
858
|
- RSA headlines that only work in sequence (Google mixes them — each must stand alone) |
|
859
|
- Writing for the 125-char feed limit when Reels only shows 72 |
|
860
|
|
|
861
|
- All angles being the same message reworded (vary the psychology, not the synonyms) |
|
862
|
- Text in the bottom 35% of a 9:16 ad (covered by platform UI) |
|
863
|
|
|
864
|
- Letting Performance Max auto-generate video — always supply your own |
|
865
|
|
|
866
|
###### Subagent delegation |
|
867
|
|
|
868
|
- Not including the full HTML structure template in the subagent task — subagents will invent their own layout |
|
869
|
- Not repeating the golden rules in each subagent task — they don't inherit context from the main agent |
|
870
|
|
|
871
|
- Not specifying font loading instructions — subagents will use system fonts |
|
872
|
- Not providing the exact brand colors and logo SVG — subagents will guess |