diff --git a/projects/judge-dashboard/api/submit-ratings.mjs b/projects/judge-dashboard/api/submit-ratings.mjs index f984d9f..f91ce6e 100644 --- a/projects/judge-dashboard/api/submit-ratings.mjs +++ b/projects/judge-dashboard/api/submit-ratings.mjs @@ -50,16 +50,21 @@ export default async function handler(req, res) { const r = rated[idx]; try { const tile = `H${r.hero_idx ?? "?"}·C${r.cut_idx ?? "?"}·${r.format ?? "?"}`; - let fileUploadId = null; - if (r.image) { - fileUploadId = await uploadImageToNotion(notionKey, r.image, `${tile}.png`); - } + // Upload both the rated output AND the input hero in parallel so Goke + // can correlate ratings back to what the workflow actually saw. + const [fileUploadId, heroFileUploadId] = await Promise.all([ + r.image ? uploadImageToNotion(notionKey, r.image, `${tile}-output.png`) : null, + r.hero_url ? uploadImageToNotion(notionKey, r.hero_url, `${tile}-hero.png`).catch(e => { console.warn(`hero upload failed for ${tile}:`, e?.message); return null; }) : null, + ]); const page = await createNotionPage(notionKey, databaseId, { voter: judge, company, vote: r.rating, feedback: (r.feedback || "").trim(), fileUploadId, + heroFileUploadId, + heroSourceUrl: r.hero_url || "", + prompt: (r.prompt || "").trim(), sourceUrl: r.image || "", tile, briefLabel, @@ -154,6 +159,8 @@ async function createNotionPage(token, databaseId, row) { if (row.tile) properties["Tile"] = { rich_text: [{ text: { content: row.tile } }] }; if (row.briefLabel) properties["Brief label"] = { rich_text: [{ text: { content: row.briefLabel } }] }; if (row.sourceUrl) properties["Source URL"] = { url: row.sourceUrl }; + if (row.heroSourceUrl) properties["Hero source URL"] = { url: row.heroSourceUrl }; + if (row.prompt) properties["Prompt"] = { rich_text: [{ text: { content: row.prompt.slice(0, 1900) } }] }; if (row.costUsd != null) properties["Cost USD"] = { number: row.costUsd }; if (row.runtimeSeconds != null) properties["Runtime s"] = { number: row.runtimeSeconds }; if (row.fileUploadId) { @@ -161,6 +168,11 @@ async function createNotionPage(token, databaseId, row) { files: [{ name: row.tile || "image", type: "file_upload", file_upload: { id: row.fileUploadId } }], }; } + if (row.heroFileUploadId) { + properties["Hero image"] = { + files: [{ name: `${row.tile || "hero"}-hero`, type: "file_upload", file_upload: { id: row.heroFileUploadId } }], + }; + } const res = await fetch(`${NOTION_API_BASE}/pages`, { method: "POST", headers: notionHeaders(token, true), diff --git a/projects/judge-dashboard/index.html b/projects/judge-dashboard/index.html index 0d3d869..53fd134 100644 --- a/projects/judge-dashboard/index.html +++ b/projects/judge-dashboard/index.html @@ -1678,24 +1678,24 @@

Step 5: Generate variants

brandLogo: { preview_url: `${PRESET_ASSET_BASE}/chanel/logo.png`, runflow_uri: `${PRESET_ASSET_BASE}/chanel/logo.png`, filename: "logo.png" } }, runs: [ - {"hero_idx": 1, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c1-1x1.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 1, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c1-9x16.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 1, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c1-4x5.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 1, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c2-1x1.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 1, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c2-9x16.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 1, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c2-4x5.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 2, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c1-1x1.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 2, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c1-9x16.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 2, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c1-4x5.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 2, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c2-1x1.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 2, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c2-9x16.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 2, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c2-4x5.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 3, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c1-1x1.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 3, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c1-9x16.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 3, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c1-4x5.jpg", "cost": 0.028979, "duration_ms": 40824}, - {"hero_idx": 3, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c2-1x1.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 3, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c2-9x16.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 3, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c2-4x5.jpg", "cost": 0.026492, "duration_ms": 37290} + {"hero_idx": 1, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c1-1x1.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Make hers unforgettable\". Subhead text: \"From the icon to the everyday\". Call to action: \"Shop the collection\". Audience: Holiday gift. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero1.jpg"}, + {"hero_idx": 1, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c1-9x16.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Make hers unforgettable\". Subhead text: \"From the icon to the everyday\". Call to action: \"Shop the collection\". Audience: Holiday gift. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero1.jpg"}, + {"hero_idx": 1, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c1-4x5.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Make hers unforgettable\". Subhead text: \"From the icon to the everyday\". Call to action: \"Shop the collection\". Audience: Holiday gift. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero1.jpg"}, + {"hero_idx": 1, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c2-1x1.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Your signature, refined\". Subhead text: \"Three icons, one collection\". Call to action: \"Discover\". Audience: Fragrance loyalist. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero1.jpg"}, + {"hero_idx": 1, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c2-9x16.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Your signature, refined\". Subhead text: \"Three icons, one collection\". Call to action: \"Discover\". Audience: Fragrance loyalist. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero1.jpg"}, + {"hero_idx": 1, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c2-4x5.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Your signature, refined\". Subhead text: \"Three icons, one collection\". Call to action: \"Discover\". Audience: Fragrance loyalist. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero1.jpg"}, + {"hero_idx": 2, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c1-1x1.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Make hers unforgettable\". Subhead text: \"From the icon to the everyday\". Call to action: \"Shop the collection\". Audience: Holiday gift. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero2.jpg"}, + {"hero_idx": 2, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c1-9x16.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Make hers unforgettable\". Subhead text: \"From the icon to the everyday\". Call to action: \"Shop the collection\". Audience: Holiday gift. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero2.jpg"}, + {"hero_idx": 2, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c1-4x5.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Make hers unforgettable\". Subhead text: \"From the icon to the everyday\". Call to action: \"Shop the collection\". Audience: Holiday gift. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero2.jpg"}, + {"hero_idx": 2, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c2-1x1.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Your signature, refined\". Subhead text: \"Three icons, one collection\". Call to action: \"Discover\". Audience: Fragrance loyalist. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero2.jpg"}, + {"hero_idx": 2, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c2-9x16.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Your signature, refined\". Subhead text: \"Three icons, one collection\". Call to action: \"Discover\". Audience: Fragrance loyalist. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero2.jpg"}, + {"hero_idx": 2, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c2-4x5.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Your signature, refined\". Subhead text: \"Three icons, one collection\". Call to action: \"Discover\". Audience: Fragrance loyalist. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero2.jpg"}, + {"hero_idx": 3, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c1-1x1.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Make hers unforgettable\". Subhead text: \"From the icon to the everyday\". Call to action: \"Shop the collection\". Audience: Holiday gift. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero3.jpg"}, + {"hero_idx": 3, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c1-9x16.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Make hers unforgettable\". Subhead text: \"From the icon to the everyday\". Call to action: \"Shop the collection\". Audience: Holiday gift. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero3.jpg"}, + {"hero_idx": 3, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c1-4x5.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Make hers unforgettable\". Subhead text: \"From the icon to the everyday\". Call to action: \"Shop the collection\". Audience: Holiday gift. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero3.jpg"}, + {"hero_idx": 3, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c2-1x1.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Your signature, refined\". Subhead text: \"Three icons, one collection\". Call to action: \"Discover\". Audience: Fragrance loyalist. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero3.jpg"}, + {"hero_idx": 3, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c2-9x16.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Your signature, refined\". Subhead text: \"Three icons, one collection\". Call to action: \"Discover\". Audience: Fragrance loyalist. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero3.jpg"}, + {"hero_idx": 3, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c2-4x5.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Your signature, refined\". Subhead text: \"Three icons, one collection\". Call to action: \"Discover\". Audience: Fragrance loyalist. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero3.jpg"} ] }, { @@ -1719,24 +1719,24 @@

Step 5: Generate variants

brandLogo: { preview_url: `${PRESET_ASSET_BASE}/runflow/logo.png`, runflow_uri: `${PRESET_ASSET_BASE}/runflow/logo.png`, filename: "logo.png" } }, runs: [ - {"hero_idx": 1, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c1-16x9.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 1, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c1-4x5.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 1, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c1-1x1.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 1, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c2-16x9.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 1, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c2-4x5.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 1, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c2-1x1.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 2, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c1-16x9.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 2, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c1-4x5.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 2, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c1-1x1.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 2, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c2-16x9.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 2, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c2-4x5.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 2, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c2-1x1.jpg", "cost": 0.025475, "duration_ms": 35885}, - {"hero_idx": 3, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c1-16x9.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 3, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c1-4x5.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 3, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c1-1x1.jpg", "cost": 0.026282, "duration_ms": 37070}, - {"hero_idx": 3, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c2-16x9.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 3, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c2-4x5.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 3, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c2-1x1.jpg", "cost": null, "duration_ms": null} + {"hero_idx": 1, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c1-16x9.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero1.jpg"}, + {"hero_idx": 1, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c1-4x5.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero1.jpg"}, + {"hero_idx": 1, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c1-1x1.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero1.jpg"}, + {"hero_idx": 1, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c2-16x9.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero1.jpg"}, + {"hero_idx": 1, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c2-4x5.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero1.jpg"}, + {"hero_idx": 1, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c2-1x1.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero1.jpg"}, + {"hero_idx": 2, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c1-16x9.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero2.jpg"}, + {"hero_idx": 2, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c1-4x5.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero2.jpg"}, + {"hero_idx": 2, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c1-1x1.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero2.jpg"}, + {"hero_idx": 2, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c2-16x9.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero2.jpg"}, + {"hero_idx": 2, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c2-4x5.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero2.jpg"}, + {"hero_idx": 2, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c2-1x1.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero2.jpg"}, + {"hero_idx": 3, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c1-16x9.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero3.jpg"}, + {"hero_idx": 3, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c1-4x5.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero3.jpg"}, + {"hero_idx": 3, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c1-1x1.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero3.jpg"}, + {"hero_idx": 3, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c2-16x9.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero3.jpg"}, + {"hero_idx": 3, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c2-4x5.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero3.jpg"}, + {"hero_idx": 3, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c2-1x1.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero3.jpg"} ] }, { @@ -1760,24 +1760,24 @@

Step 5: Generate variants

brandLogo: { preview_url: `${PRESET_ASSET_BASE}/ikea/logo.jpg`, runflow_uri: `${PRESET_ASSET_BASE}/ikea/logo.jpg`, filename: "logo.jpg" } }, runs: [ - {"hero_idx": 1, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c1-9x16.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 1, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c1-16x9.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 1, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c1-4x5.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 1, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c2-9x16.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 1, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c2-16x9.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 1, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c2-4x5.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 2, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c1-9x16.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 2, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c1-16x9.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 2, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c1-4x5.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 2, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c2-9x16.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 2, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c2-16x9.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 2, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c2-4x5.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 3, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c1-9x16.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 3, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c1-16x9.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 3, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c1-4x5.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 3, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c2-9x16.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 3, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c2-16x9.jpg", "cost": null, "duration_ms": null}, - {"hero_idx": 3, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c2-4x5.jpg", "cost": null, "duration_ms": null} + {"hero_idx": 1, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c1-9x16.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero1.jpg"}, + {"hero_idx": 1, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c1-16x9.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero1.jpg"}, + {"hero_idx": 1, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c1-4x5.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero1.jpg"}, + {"hero_idx": 1, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c2-9x16.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero1.jpg"}, + {"hero_idx": 1, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c2-16x9.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero1.jpg"}, + {"hero_idx": 1, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c2-4x5.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero1.jpg"}, + {"hero_idx": 2, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c1-9x16.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero2.jpg"}, + {"hero_idx": 2, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c1-16x9.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero2.jpg"}, + {"hero_idx": 2, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c1-4x5.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero2.jpg"}, + {"hero_idx": 2, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c2-9x16.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero2.jpg"}, + {"hero_idx": 2, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c2-16x9.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero2.jpg"}, + {"hero_idx": 2, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c2-4x5.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero2.jpg"}, + {"hero_idx": 3, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c1-9x16.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero3.jpg"}, + {"hero_idx": 3, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c1-16x9.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero3.jpg"}, + {"hero_idx": 3, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c1-4x5.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero3.jpg"}, + {"hero_idx": 3, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c2-9x16.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero3.jpg"}, + {"hero_idx": 3, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c2-16x9.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero3.jpg"}, + {"hero_idx": 3, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c2-4x5.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero3.jpg"} ] } ]; @@ -1972,6 +1972,8 @@

Step 5: Generate variants

status: r.image || r.local_image ? "succeeded" : "failed", cost: r.cost ?? null, duration_ms: r.duration_ms ?? null, + prompt: r.prompt || null, + hero_url: r.hero_url || p.uploads?.[`hero${r.hero_idx}`]?.preview_url || null, })); const payload = { id: batchId, @@ -2912,6 +2914,8 @@

Step 5: Generate variants

image: r.image, cost: r.cost, duration_ms: r.duration_ms, rating: LIKES[r.id] || null, feedback: FEEDBACK[r.id] || null, + prompt: r.prompt || r.payload?.prompt || null, + hero_url: r.hero_url || r.payload?.primary_design_ref || null, })), }; try { diff --git a/projects/judge-dashboard/tools/build-presets.py b/projects/judge-dashboard/tools/build-presets.py index 1dd149f..439c183 100644 --- a/projects/judge-dashboard/tools/build-presets.py +++ b/projects/judge-dashboard/tools/build-presets.py @@ -158,7 +158,7 @@ def download(url, dest): def main(): # Phase 1: submit every (hero × cut × format) in parallel — Runflow handles # the queue, we just collect run_ids and poll them as a batch afterwards. - jobs = [] # list of dicts: pid, hi, ci, fmt, run_id + jobs = [] # list of dicts: pid, hi, ci, fmt, run_id, prompt, hero_url for p in PRESETS: pid = p["id"] pdir = PRESETS_DIR / pid @@ -172,11 +172,7 @@ def main(): if (pdir / "runs" / local_name).exists(): print(f" ⏭ {pid} h{hi}c{ci}{fmt}: already on disk, skip") continue - payload = build_payload( - hero_url, fmt, cut, p["brand"], logo_url, - hero_urls[1] if len(hero_urls) > 1 else hero_url, - hero_urls[2] if len(hero_urls) > 2 else hero_url, - ) + payload = build_payload(hero_url, fmt, cut, p["brand"], logo_url) try: sub = submit(payload) rid = sub.get("run_id") or sub.get("id") @@ -184,7 +180,10 @@ def main(): print(f" ✗ {pid} h{hi}c{ci}{fmt}: submit had no run id") continue print(f" → {pid} h{hi}c{ci}{fmt}: submitted {rid}") - jobs.append({"pid": pid, "hi": hi, "ci": ci, "fmt": fmt, "run_id": rid}) + jobs.append({ + "pid": pid, "hi": hi, "ci": ci, "fmt": fmt, "run_id": rid, + "prompt": payload["prompt"], "hero_url": hero_url, + }) except Exception as e: print(f" ✗ {pid} h{hi}c{ci}{fmt}: submit error: {e}") print(f"\nsubmitted {len(jobs)} runs, polling…\n") @@ -231,27 +230,35 @@ def poll_job(job): results_by_key[key] = {**r, "status": "succeeded", "image": img_url, "cost": float(final.get("cost") or 0) or None, "duration_ms": final.get("duration_ms")} print(f" ⚠ {key}: download failed: {e}") - # Phase 3: assemble output by preset. + # Phase 3: assemble output by preset. Every tile gets the prompt + hero_url + # that produced it so Goke can correlate ratings to inputs in Notion. out_presets = [] for p in PRESETS: pid = p["id"] + hero_urls = [f"{ASSET_BASE}/{pid}/{f}" for f in p["heroes"]] + logo_url = f"{ASSET_BASE}/{pid}/{p['logo']}" if p.get("logo") else "" runs = [] for hi in range(1, len(p["heroes"]) + 1): for ci in range(1, len(p["cuts"]) + 1): for fmt in p["formats"]: key = f"{pid}/h{hi}c{ci}{fmt}" r = results_by_key.get(key, {}) - # Fall back to disk if a prior pass already saved this combo. local_name = f"h{hi}-c{ci}-{fmt.replace(':','x')}.jpg" local_path = PRESETS_DIR / pid / "runs" / local_name if not r and local_path.exists(): r = {"status": "succeeded", "image": f"{ASSET_BASE}/{pid}/runs/{local_name}"} + # Reconstruct the prompt + hero_url deterministically from + # the preset definition so skipped tiles get the right + # context (build_payload is pure given the same inputs). + payload = build_payload(hero_urls[hi-1], fmt, p["cuts"][ci-1], p["brand"], logo_url) runs.append({ "hero_idx": hi, "cut_idx": ci, "format": fmt, "status": r.get("status") or "failed", "image": r.get("image"), "cost": r.get("cost"), "duration_ms": r.get("duration_ms"), + "prompt": payload["prompt"], + "hero_url": hero_urls[hi-1], }) out_presets.append({"id": pid, "runs": runs}) pathlib.Path("/tmp/presets-output.json").write_text(json.dumps(out_presets, indent=2))