Tempio Docs

How Tempio makes ad stills

The two layers of a generated still — a copy-free scene from an image model, then copy, compliance line and logo set by Tempio's renderer from typed fields — how a preset and a compliance line are chosen and enforced, what a reference is, the scene-text check, resize against edit, the monthly allowance and a workspace's own key, and what every generation records.

Last reviewed 2026-09-23.

A generated still is two layers. An image model draws a scene: the product, the set, the light and the empty space the copy will sit in, closed by the instruction that the image carries no text, letters, numbers, logos or watermarks. Then Tempio's renderer sets the headline, sub-line, badge, call to action, compliance line and the kit's logo over it, from typed fields, in the kit's colours and typeface.

Why the copy never goes to the model

A model asked to draw copy invents it: prize counts, foreign footers, spec lists nobody wrote. So the model is never asked to draw a word. The badge, sub-line, call to action and compliance line never reach it; the one exception is a graphic ad with no product named, where the headline is the subject the composition is about. Every word Tempio sets comes from a typed field; a scene still showing text after one retry is kept and flagged (the text check, below).

Fill fields from list_creative_presets (which fields a preset draws, which are required, each ceiling) and from get_brand_kit (the voice to write in, the forbidden words). Never put a claim, a price or a permit in a field you were not given.

Fields and refusals

Ceilings: headline 28 characters, sub-line 80, badge 20, call to action 16, spec lines eight of 60, compliance line unlimited. A preset may lower a ceiling, never raise one. All of these are refused at the request, before a row is written or the meter touched: a field the preset does not draw, a field over its ceiling, a forbidden word (whole word, any case), a field starting MISSING:, a preset that photographs a product with no kit product named, a ratio the preset does not draw, and a workspace with no brand kit.

The compliance line

The kit holds a template with {permit} (the first permit) and {permits} (all of them, comma-joined). The four promo presets require the line, and a request without it is refused. Fill it from the kit's template with the permit you were given; creative_brief does so from its permit argument. With no permit, write MISSING: permit and ask the person; the marker is refused at the service, so it can never be drawn onto an ad.

Choosing a preset

  • product_shot: one product, studio or lifestyle; 4:5, 9:16, 1:1.
  • graphic_ad: flat brand-colour composition; needs no product; 4:5, 9:16.
  • marketplace_listing: catalogue still, product centred; 1:1, 4:5.
  • prize_hero: the launch still of a promotion; 4:5, 9:16.
  • spec_sheet: the prize with up to eight spec lines; 4:5, 9:16.
  • urgency_story: the deadline in the badge, full-screen; 9:16 only.
  • early_bird: one very large badge, such as a multiplier; 4:5, 9:16.

The last four are promo presets.

References

A reference is an image and nothing else: a library ad, an earlier still or a media-library image. Its composition is matched; its copy is never carried. Clone is the verb that uses one (a Create ignores it), and it needs the workspace's own image key. Tempio's provider draws from the prompt alone and refuses a Clone or an Edit with a sentence saying a key is needed.

The text check

After each scene a vision model answers whether it contains legible text. A yes regenerates once with the instruction restated and the failure named; that retry is not counted. A second yes keeps the still with the scene_has_text warning: say so before handing it over, and offer a fresh generation or an edit. A check that cannot run never fails a still. font_fallback means Geist replaced a family that could not be fetched.

Resize against edit

resize_creative draws another ratio from the stored scene: no model, nothing counted, seconds. A copy change re-draws every ratio the still holds, also free, so five headlines are five stills of one scene. An edit with instructions changes the scene itself and is one generation.

The meter and a workspace's own key

Generations a period: Free 10, Plus 100, Pro 300, Scale unlimited. Agent-message packs are never spent on them. A failed generation is refunded. An empty pool refuses generate_creatives with forbidden and the usage; a batch larger than what is left is queued with creative_pool_short, and the stills past the limit fail as pool_exhausted without being charged.

A workspace holding its own OpenAI or Google key generates every verb on it and outside the pool; each generation is still recorded with a byo_key bypass. The newest key generates when both are stored. A vendor may bill a call that timed out, so never tell a person nothing was charged.

Using a still in an ad

register_creative_media copies one composite into the media library for an ad account and drafts one upload_media, unless the platform already holds the bytes or an upload is waiting. After it applies and the row carries its platformExternalId, draft create_ad with creative.media: [{ mediaAssetId, platformExternalId, role }]. Both are change requests at the gate.

What every generation records

The adapter, the model id and the provider's version string as reported (null when none is), the prompt hash actually sent (it changes on the text-check retry), the attempt, the cost in minor units with its currency or both null, the duration, the status, and the failure reason when there is one.

Sources

  • renderComposite, renderAllAspects — layer two, and the field gate every word passes — repo://apps/app/lib/ads/creative/render/index.ts (read 2026-09-23)
  • requestBatch, resizeAsset, updateAssetFields, registerCreativeForAd — the refusals before anything is spent — repo://apps/app/lib/ads/creative/creative.service.ts (read 2026-09-23)
  • The seven system presets, their fields, ratios and the no-text instruction — repo://apps/app/lib/ads/creative/presets/seed.ts (read 2026-09-23)
  • The kit: roles, typography, voice, compliance template, forbidden words, products — repo://apps/app/lib/ads/creative/brand-kit.service.ts (read 2026-09-23)
  • resolveProvider — the workspace's own key first, then Tempio's provider — repo://apps/app/lib/ads/creative/providers/index.ts (read 2026-09-23)
  • consumeCreativeGeneration, refunds, the own-key bypass and the pool pre-check — repo://apps/app/lib/billing/creative-credits.service.ts (read 2026-09-23)
  • The creative layer spec: the fourteen decisions and the amendments — repo://docs/superpowers/specs/2026-09-19-creative-layer-design.md (read 2026-09-23)