---
title: Batch Image Generation
description: Mass-produce on-brand images from one reusable layout — one Compositor template, N outputs.
updated: 2026-06-11
---

The **Compositor** node (`compv3`) can render one image — or it can render an
entire batch of on-brand images from a single reusable layout. One template,
N outputs: same logo, fonts, and structure on every image, with the
background photo and copy swapped per output. This is how you build ad
factories, carousel generators, and any "make me 10 of these" pipeline.

## The mental model

A Compositor's saved layers **are the template**: a background image, a scrim,
a headline, a subline, a logo — whatever you design in the editor. Batch mode
adds a table of **data rows** on top:

- Each **row** becomes one output image.
- A row's **keys match layer names**: a `headline` key replaces the Headline
  layer's text on that image; a `background` key (an image URL) replaces the
  Background layer's image.
- **Empty or missing keys keep the template value.** Layers you never
  reference (the logo, the brand bar) render identically on every image —
  they're the implicit "global" layers of your layout.

So a 3-row table over a 6-layer template yields 3 finished images that share
everything except the cells you filled in.

## Feeding the rows

There are two ways to provide rows, and they have a strict precedence:

### 1. The Data port (wired — overrides everything)

Wire any node that emits a JSON **array of objects** into the Compositor's
**Data (Batch)** port. Each object is one row:

```json
[
  {
    "background": "https://…/meal-1.jpg",
    "headline": "KNOW YOUR MACROS",
    "subline": "SCAN IT. START FREE."
  },
  {
    "background": "https://…/meal-2.jpg",
    "headline": "EVERY MEAL, TRACKED",
    "subline": "TRY 7 DAYS FREE"
  }
]
```

While a Data edge is wired, **these rows are the batch** — the editor's Batch
tab shows them read-only.

### 2. The Batch tab (manual authoring)

Open the Compositor editor and switch to the **Batch** tab to author rows by
hand in a spreadsheet — one column per text/image layer, one row per output.
Rows persist on the node and are used **only when no Data edge is wired**.

## The AI factory pattern

The reason batch mode exists: pair it with an LLM and an image generator to
mass-produce finished creatives in one run.

```text
LLM ("write 5 ad concepts as JSON")
  → JSON Extract (array of image prompts) → Loop → Image Gen (5 photos)
  → Build Batch Data  ← (records JSON from the LLM)
  → Compositor (Data port) → 5 finished, on-brand ads
```

The **Build Batch Data** utility zips the LLM's records (headline, subline,
etc.) with the generated image URLs into the row array the Compositor
expects — and it re-zips automatically whenever you regenerate an image
upstream, so the batch stays current without re-running anything else.

## Output

A batch Compositor emits an **array of images** (`image[]`, plus `count`),
which downstream nodes — an Output preview, a publishing node — consume like
any multi-image result. Rendering is free: the Compositor is a layout
engine, not an AI model, so re-rendering a batch after a template tweak or a
new upstream image costs no credits.

## Live preview

With a Data edge wired, the editor canvas previews the **first row** of your
live data — what you see is what row 1 will render. The Batch tab shows
every row with a per-row preview thumbnail.

## Limits

- Up to **50 rows** per batch render.
- The Batch tab shows live preview thumbnails for the first **24** rows
  (all rows still generate).

## Automating it

The [Wireflow Claude skill](/docs/skill) can build this entire pattern from a
prompt — template, data wiring, and all — so "make me 10 product ads from
these photos" becomes a single instruction. See the skill's compositor
reference for the exact JSON shapes.

---

Documentation index: fetch https://www.wireflow.ai/llms.txt for the full list of Wireflow docs.
