Image Generation
Inherits all tokens from design/brand-and-design-system. An image that doesn't conform to the
palette and aesthetic family is worse than no image — it makes a page look assembled from stock.
First: decide whether an image should exist at all
The default for business pages is fewer, better images, not more. Ask what job this image does:
| Job |
Right answer |
| Show the product |
Screenshot of the real thing. Never a generated fake — a generated UI is a lie about what you've built |
| Show the team / customers |
Real photos. Generated faces presented as staff or testimonials is fraud |
| Explain a process/structure |
Diagram (SVG/HTML/CSS) — sharper, accessible, editable, tiny. Generation is the wrong tool |
| Show data |
Chart from real data. Never a generated "chart" — the numbers would be fictional |
| Set tone / fill a hero |
Generated abstract or illustrative image is legitimate here |
| Icons |
Established open icon set (Lucide, Heroicons, Phosphor) — consistent and free. Don't generate |
| Decorative texture/pattern |
Generation or CSS both fine |
If an image's job is to prove something, it must be real. Generation is for tone, illustration,
and abstraction — never for evidence. This is the line that matters most in this skill.
Also: a generated image that adds nothing costs LCP and adds visual noise. Whitespace is free and
often better (design/brand-and-design-system).
Model choice
OpenRouter already carries image-capable models on the account — check list_models for what's
actually available now rather than assuming; capability turns over fast. General guidance:
| Need |
Look for |
| Photoreal scenes |
Current top-tier diffusion/photoreal model |
| Text rendered inside the image |
A model specifically strong at typography — most are poor. Prefer overlaying real HTML/SVG text instead; it's sharper, translatable, and accessible |
| Consistent character/style across a set |
Model with style-reference or seed control |
| Transparent background |
Model supporting alpha, or generate + remove background |
| Precise layout control |
Don't generate — compose in HTML/CSS/SVG and screenshot |
| Editing an existing image |
Inpainting-capable model |
Verify before relying on it: I have no confirmed image-generation tool in my own kit — my
kit is web_fetch plus repo writes. Calling an image API via web_fetch needs an endpoint and a
key; if no key is available, the correct output is a prompt pack + spec for a human to run, plus
a surface_finding requesting the capability. Do not describe an image as generated if it wasn't.
Prompt construction
Structure, in this order — specificity front-loaded:
[subject] , [action/state] , [composition & framing] , [lighting] ,
[color palette — use the actual brand hex values] , [style/medium] ,
[aesthetic family] , [detail & mood] , [aspect ratio] , [negative prompt]
Worked example:
Isometric illustration of a small fleet of three white service vans arranged on a light grid
surface, elevated three-quarter view, soft even studio lighting, palette limited to #FFFFFF
#F4F5F7 #111111 with a single #2F6FED accent, flat vector illustration with subtle long shadows,
Swiss minimal aesthetic, generous negative space, calm and precise, 16:9.
Negative: text, logos, watermarks, photorealism, clutter, gradients, lens flare, people's faces.
Rules that actually change output quality:
- Name the palette with hex values from the brand tokens. This single move is what makes a set
of images look like one brand instead of a stock-photo grab bag.
- Specify the medium (flat vector / isometric / 35mm photo / risograph / line drawing). "Nice
image" produces the model's generic default, which is instantly recognizable as AI.
- Specify composition and negative space — you usually need room for a headline to sit on top.
- Always use a negative prompt including
text, watermark, logo, extra fingers, distorted hands.
- Aspect ratio up front, matched to slot: hero 16:9 or 21:9, social 1:1 / 4:5 / 9:16, OG 1.91:1.
- Iterate one variable at a time and keep a log of prompt → output → verdict. Otherwise you
can't reproduce the one good result.
- Generate a set, not a single image (4–8), then select. Selection is most of the quality.
Brand conformance — the part that gets skipped
A set of individually-good images with inconsistent style looks worse than consistent mediocre ones.
Lock these across every image in a set and record them in the repo:
STYLE LOCK
medium: flat vector isometric
palette: #FFFFFF #F4F5F7 #111111 #2F6FED
lighting: soft even, no hard shadows
perspective: 3/4 isometric, 30°
line weight: none (fills only)
negative: text, faces, watermarks, gradients
aspect: 16:9
seed/style-ref: <if the model supports it>
Reuse the block verbatim for every image in the set.
Technical output requirements
- Export WebP/AVIF with a JPEG/PNG fallback if needed. A 4MB PNG hero is a performance bug.
- Size to the actual slot (2× for retina, no more). Don't ship 4096px for a 600px slot.
- Provide
srcset for responsive slots; set explicit width/height to prevent CLS.
- Real
alt text describing content and function — decorative images get alt="", not a
keyword dump.
- Strip metadata. Name files descriptively (
hero-fleet-isometric-16x9.webp).
- Keep the source prompt alongside the asset in the repo so it's reproducible.
Licensing, rights, and disclosure
- Do not generate in the style of a living named artist, and don't reproduce trademarked
characters, brand logos, or another company's identity.
- Don't generate recognizable real people, and never generate a face to present as a real
customer, employee, or testimonial. That's fabricated proof
(
design/web-page-build boundary, sales/outbound-compliance gate 6).
- Check the model's commercial-use terms before using output commercially. Terms differ per model
and change; verify at the time of use rather than assuming.
- Keep provenance: model, version, prompt, date, for every published asset. If a client or platform
asks whether an image is AI-generated, the answer is yes, without hedging.
- Respect platform disclosure rules (some ad networks and app stores require labeling AI content).
Failure modes
| Symptom |
Cause |
Fix |
| Looks "obviously AI" |
No medium/style specified; model default |
Name medium + aesthetic family + palette |
| Set looks mismatched |
No style lock |
Apply the style-lock block to all |
| Garbled text in image |
Models are poor at typography |
Overlay real HTML/SVG text instead |
| Doesn't fit the slot |
Aspect ratio not specified |
Specify up front; leave negative space for copy |
| Page got slow |
Huge PNGs |
WebP/AVIF, correct dimensions, lazy-load |
| Good result, can't reproduce |
Changed many variables, no log |
One variable at a time; log prompt + seed |
| Image conveys a false claim |
Generated something presented as real |
Use a screenshot/photo, or remove it |
Boundaries
- No fabricated evidence: no fake product screenshots, no fake people as customers/staff, no
invented charts, no fake awards or press logos.
- No impersonation of real people or brands; no trademarked or copyrighted characters.
- I write files and specs into a repo. I cannot deploy. If no image API/key is reachable from my
toolset, I deliver a prompt pack + style lock +
surface_finding requesting the capability —
and I say plainly that no image was generated rather than implying one was.
1---2name: image-generation3description: Produce images and artwork that serve a business purpose — prompt construction, model choice, brand conformance, licensing, and when NOT to generate. Use for hero images, illustrations, social assets, ad creative, icons, diagrams. Triggers on "image", "picture", "artwork", "illustration", "graphic", "hero image", "make a logo", "social image", "ad creative", "thumbnail".4---56# Image Generation78Inherits all tokens from `design/brand-and-design-system`. An image that doesn't conform to the9palette and aesthetic family is worse than no image — it makes a page look assembled from stock.1011## First: decide whether an image should exist at all1213The default for business pages is **fewer, better images**, not more. Ask what job this image does:1415| Job | Right answer |16|---|---|17| Show the product | **Screenshot of the real thing.** Never a generated fake — a generated UI is a lie about what you've built |18| Show the team / customers | **Real photos.** Generated faces presented as staff or testimonials is fraud |19| Explain a process/structure | **Diagram** (SVG/HTML/CSS) — sharper, accessible, editable, tiny. Generation is the wrong tool |20| Show data | **Chart from real data.** Never a generated "chart" — the numbers would be fictional |21| Set tone / fill a hero | Generated abstract or illustrative image is legitimate here |22| Icons | Established open icon set (Lucide, Heroicons, Phosphor) — consistent and free. Don't generate |23| Decorative texture/pattern | Generation or CSS both fine |2425**If an image's job is to prove something, it must be real.** Generation is for tone, illustration,26and abstraction — never for evidence. This is the line that matters most in this skill.2728Also: a generated image that adds nothing costs LCP and adds visual noise. Whitespace is free and29often better (`design/brand-and-design-system`).3031## Model choice3233OpenRouter already carries image-capable models on the account — check `list_models` for what's34actually available now rather than assuming; capability turns over fast. General guidance:3536| Need | Look for |37|---|---|38| Photoreal scenes | Current top-tier diffusion/photoreal model |39| **Text rendered inside the image** | A model specifically strong at typography — most are poor. **Prefer overlaying real HTML/SVG text instead**; it's sharper, translatable, and accessible |40| Consistent character/style across a set | Model with style-reference or seed control |41| Transparent background | Model supporting alpha, or generate + remove background |42| Precise layout control | Don't generate — compose in HTML/CSS/SVG and screenshot |43| Editing an existing image | Inpainting-capable model |4445**Verify before relying on it**: I have no confirmed image-generation *tool* in my own kit — my46kit is `web_fetch` plus repo writes. Calling an image API via `web_fetch` needs an endpoint and a47key; if no key is available, the correct output is a **prompt pack + spec** for a human to run, plus48a `surface_finding` requesting the capability. Do not describe an image as generated if it wasn't.4950## Prompt construction5152Structure, in this order — specificity front-loaded:5354```55[subject] , [action/state] , [composition & framing] , [lighting] ,56[color palette — use the actual brand hex values] , [style/medium] ,57[aesthetic family] , [detail & mood] , [aspect ratio] , [negative prompt]58```5960Worked example:61> Isometric illustration of a small fleet of three white service vans arranged on a light grid62> surface, elevated three-quarter view, soft even studio lighting, palette limited to #FFFFFF63> #F4F5F7 #111111 with a single #2F6FED accent, flat vector illustration with subtle long shadows,64> Swiss minimal aesthetic, generous negative space, calm and precise, 16:9.65> Negative: text, logos, watermarks, photorealism, clutter, gradients, lens flare, people's faces.6667Rules that actually change output quality:68- **Name the palette with hex values from the brand tokens.** This single move is what makes a set69 of images look like one brand instead of a stock-photo grab bag.70- **Specify the medium** (flat vector / isometric / 35mm photo / risograph / line drawing). "Nice71 image" produces the model's generic default, which is instantly recognizable as AI.72- **Specify composition and negative space** — you usually need room for a headline to sit on top.73- **Always use a negative prompt** including `text, watermark, logo, extra fingers, distorted hands`.74- **Aspect ratio up front**, matched to slot: hero 16:9 or 21:9, social 1:1 / 4:5 / 9:16, OG 1.91:1.75- **Iterate one variable at a time** and keep a log of prompt → output → verdict. Otherwise you76 can't reproduce the one good result.77- **Generate a set, not a single image** (4–8), then select. Selection is most of the quality.7879## Brand conformance — the part that gets skipped8081A set of individually-good images with inconsistent style looks worse than consistent mediocre ones.82Lock these across every image in a set and record them in the repo:8384```85STYLE LOCK86medium: flat vector isometric87palette: #FFFFFF #F4F5F7 #111111 #2F6FED88lighting: soft even, no hard shadows89perspective: 3/4 isometric, 30°90line weight: none (fills only)91negative: text, faces, watermarks, gradients92aspect: 16:993seed/style-ref: <if the model supports it>94```9596Reuse the block verbatim for every image in the set.9798## Technical output requirements99100- **Export WebP/AVIF** with a JPEG/PNG fallback if needed. A 4MB PNG hero is a performance bug.101- **Size to the actual slot** (2× for retina, no more). Don't ship 4096px for a 600px slot.102- Provide `srcset` for responsive slots; set explicit `width`/`height` to prevent CLS.103- **Real `alt` text** describing content and function — decorative images get `alt=""`, not a104 keyword dump.105- Strip metadata. Name files descriptively (`hero-fleet-isometric-16x9.webp`).106- Keep the source prompt alongside the asset in the repo so it's reproducible.107108## Licensing, rights, and disclosure109110- **Do not generate in the style of a living named artist**, and don't reproduce trademarked111 characters, brand logos, or another company's identity.112- **Don't generate recognizable real people**, and never generate a face to present as a real113 customer, employee, or testimonial. That's fabricated proof114 (`design/web-page-build` boundary, `sales/outbound-compliance` gate 6).115- **Check the model's commercial-use terms** before using output commercially. Terms differ per model116 and change; verify at the time of use rather than assuming.117- Keep provenance: model, version, prompt, date, for every published asset. If a client or platform118 asks whether an image is AI-generated, the answer is yes, without hedging.119- Respect platform disclosure rules (some ad networks and app stores require labeling AI content).120121## Failure modes122123| Symptom | Cause | Fix |124|---|---|---|125| Looks "obviously AI" | No medium/style specified; model default | Name medium + aesthetic family + palette |126| Set looks mismatched | No style lock | Apply the style-lock block to all |127| Garbled text in image | Models are poor at typography | Overlay real HTML/SVG text instead |128| Doesn't fit the slot | Aspect ratio not specified | Specify up front; leave negative space for copy |129| Page got slow | Huge PNGs | WebP/AVIF, correct dimensions, lazy-load |130| Good result, can't reproduce | Changed many variables, no log | One variable at a time; log prompt + seed |131| Image conveys a false claim | Generated something presented as real | Use a screenshot/photo, or remove it |132133## Boundaries134135- **No fabricated evidence**: no fake product screenshots, no fake people as customers/staff, no136 invented charts, no fake awards or press logos.137- No impersonation of real people or brands; no trademarked or copyrighted characters.138- I write files and specs into a repo. **I cannot deploy.** If no image API/key is reachable from my139 toolset, I deliver a prompt pack + style lock + `surface_finding` requesting the capability —140 and I say plainly that no image was generated rather than implying one was.