Koubou: App Store Screenshot Generator
Generate professional App Store screenshots using HTML/CSS templates with 100+ real device frames, xcstrings localization, and pixel-perfect Apple dimensions.
Screenshots are advertisements, not documentation. Each slide sells one feeling, outcome, or pain-point solution.
User instructions always take priority over defaults in this skill.
Creative direction is open by default. Use the rules in this skill to enforce impact, readability, and canvas-aware scale, not to make every set look the same.
Rule Hierarchy
Treat the guidance in this skill in this order:
- Hard constraints — readability, scale, thumbnail clarity, truthful product marketing, and real canvas awareness
- Strong defaults — variety, asymmetry, overlap, rhythm, and avoiding generic layouts
- Taste preferences — anti-slop heuristics and stylistic defaults that can be broken when a stronger idea clearly improves the work
If breaking a default produces a better screenshot set, break it deliberately and explain the tradeoff to yourself before generating.
Reference files (read as needed, not upfront):
setup.md — Installation and HTML runtime setup
design-guide.md — Design principles, copywriting rules, CSS rules, HTML template examples
style-intake.md — How to inspect the app's real visual language before asking questions
style-interview.md — Short, high-signal style questions and conversation patterns
yaml-reference.md — YAML config format, localization, assets, devices, sizes
capabilities-reference.md — Full koubou capabilities (content mode, highlights, zoom, gradients)
Phase 1: Setup (silent, automatic)
Check if kou is available first. Do not reinstall or touch Python packaging if kou already works.
Preferred order:
kou --version 2>/dev/null
If kou --version succeeds:
- treat koubou as installed
- do not run
pip, pip3, or playwright install
- do not try to "upgrade" or "fix" the user's environment proactively
- always run
kou setup-html before generating, because this skill is HTML-only and the command is designed to be safe to repeat
If kou --version fails, read setup.md and follow the least invasive path for the environment.
For HTML rendering support:
- always use
kou setup-html
- do not skip it just because HTML worked in a previous run
- do not run
playwright install chromium directly
Only inform the user if setup fails. Never mutate a working installation.
Phase 2: Read The App, Then Ask
Do not begin with a generic style questionnaire. Inspect the app's real visual language first, then ask only what is still missing or ambiguous.
Read style-intake.md before asking style questions. Follow this order.
2.1 Style discovery (mandatory before style questions)
Inspect local project sources first. Search automatically before asking the user for visual direction.
Prioritize these sources:
Assets.xcassets, app icons, illustrations, logos, color assets
- Existing screenshots and marketing folders:
.maestro/
screenshots/
AppStore/
fastlane/screenshots/
marketing/
- Product docs and positioning:
README*
CLAUDE.md
- launch plans, landing-page copy, docs folders
- Design tokens and UI code:
- CSS variables
- SwiftUI colors, gradients, materials, typography choices
- web theme files and shared design constants
- Prior App Store artifacts if they exist:
- previous templates
- old screenshot campaigns
- localized marketing assets
Extract and summarize at least these signals:
- dominant colors and accent colors
- overall contrast: dark, light, mixed, muted, vivid
- UI density: airy, balanced, dense
- shape language: sharp, soft, rounded, card-heavy, flat
- iconography and illustration style
- typography direction if visible
- copy tone: calm, technical, playful, premium, warm, urgent
- whether the app feels calm, technical, warm, energetic, polished, playful, etc.
If the app style is clear:
- summarize the detected signals to the user in plain language
- confirm that you will build from that direction instead of restarting from a generic template language
If the signals are weak, missing, or contradictory:
- say what you found
- ask focused follow-up questions about the uncertainty instead of asking a broad design questionnaire
2.2 Intent interview (short, high-signal)
Read style-interview.md and ask only the minimum needed. Keep it conversational. Do not dump every question at once.
Required style questions when still needed:
- What feeling should the campaign project: premium, playful, editorial, utilitarian, technical, warm, etc.?
- Are there App Store references, brands, or screenshot sets that should influence the direction?
- What is visually forbidden: loud gradients, glassmorphism, dark-only, card grids, overly playful styling, etc.?
- What visual trait from the app itself must still be recognizable in the screenshots?
Optional questions only when still unresolved:
- Preferred type direction or font personality
- Light, dark, or mixed bias
- Density preference: more air vs more information
- Whether the set should feel tightly consistent or visibly varied across slides
2.3 Product information (still required)
After style discovery starts, collect the remaining production inputs naturally:
- App: Name, what it does (1 sentence), main value proposition
- Screenshots: Where are the app captures? Search automatically first:
- If found, show what you found and confirm
- If not found, ask how the user generates them
- Prefer clean simulator captures that show the app UI clearly. If the user can choose, prefer recent 6.1-inch iPhone captures as the source material
- Features to highlight: Prioritized list of features/benefits (recommend 3-5). Each slide = 1 feature
- Hero assets: App icon or other brand asset. Search automatically before asking
- Slide count: How many screenshots (recommend 3-5 to start, Apple allows up to 10)
Optional only if relevant:
- Device: Default is
iPhone 16 Pro - Black Titanium - Portrait. Only ask if iPad/Mac/other makes sense
- Localization: Only if the project already has xcstrings or multiple language support
- Extra assets: Floating UI elements, badges, supporting illustrations
- Additional constraints: Required claims, forbidden styles, or marketing constraints
2.4 Style decision (mandatory before HTML)
Before drafting templates, explicitly decide and internally lock these six items:
brand signals detected
chosen campaign style
copy voice
background system
device composition rhythm
variation plan across slides
Each item must be justified by either:
- app evidence from style discovery, or
- direct user feedback from the interview
If you cannot justify one of these, keep asking focused questions before designing.
Derived (do NOT ask unless blocked)
- Background gradients or textures from brand colors and UI mood
- Layout distribution (hero → feature-top → feature-bottom → alternating)
- Headline copy from features and value proposition
- Secondary palette from the app's actual palette
- Canvas class from
project.device + project.output_size via kou inspect-frame
- Whether the app name should appear at all. Default: omit it unless it adds real brand value at readable size
- Whether the app icon should appear. Default: use it sparingly on hero or closing slides, not as a tiny decorative marker
Principle: if context is available locally, use it before asking. Style questions come after inspection, not before.
Phase 3: Generate
Read design-guide.md before generating templates. Read yaml-reference.md before writing config.
Create working directory (e.g., AppStore/ or wherever makes sense for the project)
Run kou setup-html
Read project.device and project.output_size from the YAML
Run kou inspect-frame "<device>" --output-size <size> --output json and use that geometry before writing CSS
Draft the narrative arc and 2-3 headline/subtitle options per slide before touching layout. Pick the strongest one first. Copy quality comes before CSS
Translate the style decision into a campaign brief:
- what the set should feel like
- what motifs are allowed
- what motifs are banned
- how much variation the first 5 slides should show
Create templates/ with HTML templates — minimum 3 distinct layouts, and the first 3 slides must not repeat the same composition archetype
In every HTML template, add data-kou-id and data-kou-role to these elements before writing any CSS:
- Main headline:
data-kou-id="headline" data-kou-role="headline"
- Supporting copy:
data-kou-id="subtitle" data-kou-role="supporting"
- Primary device image:
data-kou-id="device" data-kou-role="device"
- Feature titles/subs (closing/feature slides):
data-kou-id="feature-N-title" data-kou-role="feature-title", data-kou-id="feature-N-sub" data-kou-role="feature-sub"
Without these, the layout sidecar elements array will be empty and post-render QA is blind. See design-guide.md template examples for correct annotation patterns.
Create config.yaml with koubou config (read yaml-reference.md for format)
Use CSS that adapts to the canvas and copy length: use vw or clamp() deliberately, prefer CSS Grid, overlap, and absolute-positioned layers, and verify the final computed text scale on the real canvas
Before writing HTML: plan text/device zones for each slide (which area owns what percentage of the canvas). Do not start CSS until zones are clear
Run: kou generate config.yaml --output json
For each generated HTML screenshot, read layout_path from the JSON result and inspect the sidecar before deciding the layout is acceptable
Post-render QA (mandatory — do not skip):
- Review each generated slide visually
- Open each
*.layout.json sidecar referenced by layout_path
- Check against the rejection checklist in
design-guide.md
- Check that the rendered set still reflects the app style you discovered instead of generic App Store defaults
- Use layout JSON only for objective geometry: positions, occupied space, proportions, and mathematical overlaps
- If
elements is empty for an HTML slide that should be measured, treat that as missing or broken annotation and fix the template
- Verify: no emoji icons, no identical card grids, no decentered devices, no text below minimum scale, no unintentional device cropping (device top/notch must be visible on hero slides; screen content must be readable)
- Apply the logo-swap test: would these slides work for a competitor?
- If any slide fails, fix and regenerate before showing to the user
Open output folder: open <output_dir>
Ask if the user wants adjustments — iterate on specific slides without regenerating everything
Iteration Rules
- When user asks to change a specific slide, only modify that template + config entry
- When user asks for a global style change (colors, fonts, mood, density, boldness), update all templates
- Re-run
kou generate config.yaml --output json after changes so the new layout_path values and sidecars stay in sync
- Use
kou live config.yaml if user wants real-time preview while editing
- If a slide feels small, first increase scale or switch layout. Do not hide the problem with extra gradients or labels
- If copy forces tiny text, rewrite the copy or choose a more suitable layout; never accept a timid slide because "the text had to fit"
- Keep variety high: the goal is campaign consistency, not layout repetition
- Do not stop after the first successful render if the output still violates the design rules or rejection checklist
- If the user asks for a mood change, reinterpret the whole set inside the quality limits instead of defending the previous defaults
- If screenshot and layout JSON disagree, trust the rendered screenshot for taste and investigate the annotation or render timing instead of forcing a layout decision from stale geometry
Hard Rules
Hard constraints
- Never use emoji as icons — use CSS shapes (accent bars, dots) or text-only
- Never use banned copy phrases — "revolutionary", "seamless", "unlock", "game-changing", etc.
- Apply the logo-swap test — if a competitor's name would fit, the set is too generic
- Every HTML template must have
data-kou-id annotations — at minimum: headline, subtitle, and device. If elements in the layout sidecar is empty after generation, annotations are missing — fix the template before QA passes. Do not present unannotated slides to the user.
Scale
- On tall iPhone portrait (
iPhone6_9, iPhone6_7), hero headlines must be >=10vw, side-layout headlines >=10vw, subtitles >=4.5vw
- Use
vw or clamp() only if the computed size still clears the minimum on the target canvas
- On contrast or closing slides, the content cluster must occupy 60%+ of canvas height
Strong defaults
- Do not use the same upright, centered phone composition on consecutive slides
- Do not leave large empty bands (>15% canvas height) between headline and device
- Avoid combining
rotate() + translate() on centered devices unless the visual center still feels intentional after render
- Do not use a simple centered flex column when the slide needs overlap, edge-breaking crops, or layered composition
- Plan text/device zones before writing CSS (see design-guide.md Device-Text Zone Planning)
- If you use card grids, stagger, emphasize, or simplify them unless a strict grid genuinely serves the concept
Content
- Do not add tiny top labels, category labels, or app-name headers by default
- Do not render the app name as small decorative text unless clearly readable and strategic
- Do not use app icons as tiny corner decorations; if used, they should be a real brand element
- Do not use awkward, literal, or unnatural headlines just to be short
- Do not start layout work before the slide narrative and copy are coherent
Process
- If the first 3 slides do not already feel App Store-ready, keep iterating before presenting them
- Do not present the first technically successful render as final — always review against the rejection checklist in design-guide.md
- Do not let the rules flatten the creative direction. A strange but strong composition is valid if it stays readable and high-impact
- Defaults can be broken when the final result is stronger, clearer, and more specific to the app
- Do not start from the generic fallback of dark gradient + centered phone + big white headline unless the app genuinely supports that language or the user explicitly wants it
- You should be able to explain to yourself why the campaign looks like this app and not a competitor with the same feature list
Key Technical Details
How assets work in HTML templates
In template HTML, reference assets with {{asset_name}}. In the YAML config, map asset_name to a file path under assets:.
Koubou automatically pre-renders each image asset with the configured device frame before passing it to the HTML template. The template receives a composited image (screenshot inside device frame) — it just places it with <img src="{{asset_name}}">.
To disable frame for a specific screenshot: set frame: false in its YAML definition.
Template variable substitution
variables: in YAML → {{key}} in HTML → localizable text (extracted to xcstrings)
assets: in YAML → {{key}} in HTML → image file paths (pre-rendered with device frame)
Layout JSON for HTML screenshots
For HTML screenshots, Koubou can emit a compact sidecar JSON with measured layout geometry.
- Use
data-kou-id on any element that should be measurable
- Use
data-kou-role only when the role helps the model interpret the element
- Keep annotations minimal and structural, not exhaustive
- Good defaults: annotate the main headline, supporting copy, and primary device or hero image
Example:
<h1 data-kou-id="headline" data-kou-role="headline">{{headline}}</h1>
<p data-kou-id="subtitle" data-kou-role="supporting">{{subtitle}}</p>
<img data-kou-id="device" data-kou-role="device" src="{{app_screenshot}}" alt="">
Generation workflow:
- Run
kou generate config.yaml --output json
- Read
layout_path from the command output
- Open the referenced
*.layout.json
Interpretation rules:
- Geometry fields are normalized ratios from
0..1
elements contains only annotated nodes
overlaps contains only mathematical box intersections
- Use this file to understand layout facts, not to decide taste
- Do not invent subjective rules such as "too small" from the JSON alone; combine the geometry with the actual screenshot review
Output structure
{output_dir}/{language}/{device_name}/{screenshot_id}.png
Non-localized projects skip the language directory.
Device frame names
Use exact names from kou list-frames. Common ones:
iPhone 16 Pro - Black Titanium - Portrait
iPhone 16 Pro Max - Black Titanium - Portrait
iPad Pro 13 - M4 - Space Gray - Portrait
Search with: kou list-frames "iPhone 16"
Frame inspection for layout decisions
Use kou inspect-frame "<device>" --output-size <size> --output json to get:
- real frame size
- screen bounds and screen bbox
- safe margins
- coverage ratio
- orientation
canvas_class
Use this data to choose typography scale, crop aggressiveness, and layout density.
Output sizes (App Store dimensions)
| Name |
Dimensions |
Devices |
iPhone6_9 |
1320x2868 |
iPhone 16 Pro Max, 15 Pro Max |
iPhone6_7 |
1290x2796 |
iPhone 15/14/13 Pro Max, Plus |
iPhone6_5 |
1242x2688 |
iPhone 11 Pro Max, XS Max |
iPhone6_1 |
1179x2556 |
iPhone 16/15/14/13 Pro |
iPhone5_5 |
1242x2208 |
iPhone 8 Plus, 7 Plus |
iPadPro13 |
2064x2752 |
iPad Pro 13" M4 |
iPadPro12_9 |
2048x2732 |
iPad Pro 12.9" |
iPadPro11 |
1668x2388 |
iPad Pro 11" |
Custom: output_size: [1320, 2868]
1---2name: koubou3description: Generate App Store screenshots using HTML/CSS templates with real device frames. Creates professional, localized screenshots for iPhone, iPad, Mac, and Watch. Use when user wants to create, design, or update App Store screenshots.4---56# Koubou: App Store Screenshot Generator78Generate professional App Store screenshots using HTML/CSS templates with 100+ real device frames, xcstrings localization, and pixel-perfect Apple dimensions.910> Screenshots are advertisements, not documentation. Each slide sells one feeling, outcome, or pain-point solution.1112**User instructions always take priority over defaults in this skill.**1314**Creative direction is open by default.** Use the rules in this skill to enforce impact, readability, and canvas-aware scale, not to make every set look the same.1516## Rule Hierarchy1718Treat the guidance in this skill in this order:19201. **Hard constraints** — readability, scale, thumbnail clarity, truthful product marketing, and real canvas awareness212. **Strong defaults** — variety, asymmetry, overlap, rhythm, and avoiding generic layouts223. **Taste preferences** — anti-slop heuristics and stylistic defaults that can be broken when a stronger idea clearly improves the work2324If breaking a default produces a better screenshot set, break it deliberately and explain the tradeoff to yourself before generating.2526Reference files (read as needed, not upfront):27- `setup.md` — Installation and HTML runtime setup28- `design-guide.md` — Design principles, copywriting rules, CSS rules, HTML template examples29- `style-intake.md` — How to inspect the app's real visual language before asking questions30- `style-interview.md` — Short, high-signal style questions and conversation patterns31- `yaml-reference.md` — YAML config format, localization, assets, devices, sizes32- `capabilities-reference.md` — Full koubou capabilities (content mode, highlights, zoom, gradients)3334## Phase 1: Setup (silent, automatic)3536Check if `kou` is available first. Do not reinstall or touch Python packaging if `kou` already works.3738Preferred order:3940```bash41kou --version 2>/dev/null42```4344If `kou --version` succeeds:45- treat koubou as installed46- do **not** run `pip`, `pip3`, or `playwright install`47- do **not** try to "upgrade" or "fix" the user's environment proactively48- always run `kou setup-html` before generating, because this skill is HTML-only and the command is designed to be safe to repeat4950If `kou --version` fails, read `setup.md` and follow the least invasive path for the environment.5152For HTML rendering support:53- always use `kou setup-html`54- do **not** skip it just because HTML worked in a previous run55- do **not** run `playwright install chromium` directly5657Only inform the user if setup fails. Never mutate a working installation.5859## Phase 2: Read The App, Then Ask6061Do not begin with a generic style questionnaire. Inspect the app's real visual language first, then ask only what is still missing or ambiguous.6263Read `style-intake.md` before asking style questions. Follow this order.6465### 2.1 Style discovery (mandatory before style questions)6667Inspect local project sources first. Search automatically before asking the user for visual direction.6869Prioritize these sources:70711. `Assets.xcassets`, app icons, illustrations, logos, color assets722. Existing screenshots and marketing folders:73 - `.maestro/`74 - `screenshots/`75 - `AppStore/`76 - `fastlane/screenshots/`77 - `marketing/`783. Product docs and positioning:79 - `README*`80 - `CLAUDE.md`81 - launch plans, landing-page copy, docs folders824. Design tokens and UI code:83 - CSS variables84 - SwiftUI colors, gradients, materials, typography choices85 - web theme files and shared design constants865. Prior App Store artifacts if they exist:87 - previous templates88 - old screenshot campaigns89 - localized marketing assets9091Extract and summarize at least these signals:9293- dominant colors and accent colors94- overall contrast: dark, light, mixed, muted, vivid95- UI density: airy, balanced, dense96- shape language: sharp, soft, rounded, card-heavy, flat97- iconography and illustration style98- typography direction if visible99- copy tone: calm, technical, playful, premium, warm, urgent100- whether the app feels calm, technical, warm, energetic, polished, playful, etc.101102If the app style is clear:103- summarize the detected signals to the user in plain language104- confirm that you will build from that direction instead of restarting from a generic template language105106If the signals are weak, missing, or contradictory:107- say what you found108- ask focused follow-up questions about the uncertainty instead of asking a broad design questionnaire109110### 2.2 Intent interview (short, high-signal)111112Read `style-interview.md` and ask only the minimum needed. Keep it conversational. Do not dump every question at once.113114Required style questions when still needed:1151161. What feeling should the campaign project: premium, playful, editorial, utilitarian, technical, warm, etc.?1172. Are there App Store references, brands, or screenshot sets that should influence the direction?1183. What is visually forbidden: loud gradients, glassmorphism, dark-only, card grids, overly playful styling, etc.?1194. What visual trait from the app itself must still be recognizable in the screenshots?120121Optional questions only when still unresolved:1221235. Preferred type direction or font personality1246. Light, dark, or mixed bias1257. Density preference: more air vs more information1268. Whether the set should feel tightly consistent or visibly varied across slides127128### 2.3 Product information (still required)129130After style discovery starts, collect the remaining production inputs naturally:1311321. **App**: Name, what it does (1 sentence), main value proposition1332. **Screenshots**: Where are the app captures? Search automatically first:134 - If found, show what you found and confirm135 - If not found, ask how the user generates them136 - Prefer clean simulator captures that show the app UI clearly. If the user can choose, prefer recent 6.1-inch iPhone captures as the source material1373. **Features to highlight**: Prioritized list of features/benefits (recommend 3-5). Each slide = 1 feature1384. **Hero assets**: App icon or other brand asset. Search automatically before asking1395. **Slide count**: How many screenshots (recommend 3-5 to start, Apple allows up to 10)140141Optional only if relevant:1421436. **Device**: Default is `iPhone 16 Pro - Black Titanium - Portrait`. Only ask if iPad/Mac/other makes sense1447. **Localization**: Only if the project already has xcstrings or multiple language support1458. **Extra assets**: Floating UI elements, badges, supporting illustrations1469. **Additional constraints**: Required claims, forbidden styles, or marketing constraints147148### 2.4 Style decision (mandatory before HTML)149150Before drafting templates, explicitly decide and internally lock these six items:151152- `brand signals detected`153- `chosen campaign style`154- `copy voice`155- `background system`156- `device composition rhythm`157- `variation plan across slides`158159Each item must be justified by either:160161- app evidence from style discovery, or162- direct user feedback from the interview163164If you cannot justify one of these, keep asking focused questions before designing.165166### Derived (do NOT ask unless blocked)167168- Background gradients or textures from brand colors and UI mood169- Layout distribution (hero → feature-top → feature-bottom → alternating)170- Headline copy from features and value proposition171- Secondary palette from the app's actual palette172- Canvas class from `project.device` + `project.output_size` via `kou inspect-frame`173- Whether the app name should appear at all. Default: omit it unless it adds real brand value at readable size174- Whether the app icon should appear. Default: use it sparingly on hero or closing slides, not as a tiny decorative marker175176**Principle**: if context is available locally, use it before asking. Style questions come after inspection, not before.177178## Phase 3: Generate179180Read `design-guide.md` before generating templates. Read `yaml-reference.md` before writing config.1811821. Create working directory (e.g., `AppStore/` or wherever makes sense for the project)1832. Run `kou setup-html`1843. Read `project.device` and `project.output_size` from the YAML1854. Run `kou inspect-frame "<device>" --output-size <size> --output json` and use that geometry before writing CSS1865. Draft the narrative arc and 2-3 headline/subtitle options per slide before touching layout. Pick the strongest one first. Copy quality comes before CSS1876. Translate the style decision into a campaign brief:188 - what the set should feel like189 - what motifs are allowed190 - what motifs are banned191 - how much variation the first 5 slides should show1927. Create `templates/` with HTML templates — **minimum 3 distinct layouts**, and the first 3 slides must not repeat the same composition archetype1938. In every HTML template, add `data-kou-id` and `data-kou-role` to these elements **before writing any CSS**:194 - Main headline: `data-kou-id="headline" data-kou-role="headline"`195 - Supporting copy: `data-kou-id="subtitle" data-kou-role="supporting"`196 - Primary device image: `data-kou-id="device" data-kou-role="device"`197 - Feature titles/subs (closing/feature slides): `data-kou-id="feature-N-title" data-kou-role="feature-title"`, `data-kou-id="feature-N-sub" data-kou-role="feature-sub"`198199 Without these, the layout sidecar `elements` array will be empty and post-render QA is blind. See `design-guide.md` template examples for correct annotation patterns.2009. Create `config.yaml` with koubou config (read `yaml-reference.md` for format)20110. Use CSS that adapts to the canvas and copy length: use `vw` or `clamp()` deliberately, prefer CSS Grid, overlap, and absolute-positioned layers, and verify the final computed text scale on the real canvas20211. **Before writing HTML**: plan text/device zones for each slide (which area owns what percentage of the canvas). Do not start CSS until zones are clear20312. Run: `kou generate config.yaml --output json`20413. For each generated HTML screenshot, read `layout_path` from the JSON result and inspect the sidecar before deciding the layout is acceptable20514. **Post-render QA** (mandatory — do not skip):206 - Review each generated slide visually207 - Open each `*.layout.json` sidecar referenced by `layout_path`208 - Check against the rejection checklist in `design-guide.md`209 - Check that the rendered set still reflects the app style you discovered instead of generic App Store defaults210 - Use layout JSON only for objective geometry: positions, occupied space, proportions, and mathematical overlaps211 - If `elements` is empty for an HTML slide that should be measured, treat that as missing or broken annotation and fix the template212 - Verify: no emoji icons, no identical card grids, no decentered devices, no text below minimum scale, no unintentional device cropping (device top/notch must be visible on hero slides; screen content must be readable)213 - Apply the logo-swap test: would these slides work for a competitor?214 - If any slide fails, fix and regenerate before showing to the user21515. Open output folder: `open <output_dir>`21616. Ask if the user wants adjustments — iterate on specific slides without regenerating everything217218### Iteration Rules219220- When user asks to change a specific slide, only modify that template + config entry221- When user asks for a global style change (colors, fonts, mood, density, boldness), update all templates222- Re-run `kou generate config.yaml --output json` after changes so the new `layout_path` values and sidecars stay in sync223- Use `kou live config.yaml` if user wants real-time preview while editing224- If a slide feels small, first increase scale or switch layout. Do not hide the problem with extra gradients or labels225- If copy forces tiny text, rewrite the copy or choose a more suitable layout; never accept a timid slide because "the text had to fit"226- Keep variety high: the goal is campaign consistency, not layout repetition227- Do not stop after the first successful render if the output still violates the design rules or rejection checklist228- If the user asks for a mood change, reinterpret the whole set inside the quality limits instead of defending the previous defaults229- If screenshot and layout JSON disagree, trust the rendered screenshot for taste and investigate the annotation or render timing instead of forcing a layout decision from stale geometry230231## Hard Rules232233### Hard constraints234- **Never use emoji as icons** — use CSS shapes (accent bars, dots) or text-only235- **Never use banned copy phrases** — "revolutionary", "seamless", "unlock", "game-changing", etc.236- **Apply the logo-swap test** — if a competitor's name would fit, the set is too generic237- **Every HTML template must have `data-kou-id` annotations** — at minimum: `headline`, `subtitle`, and `device`. If `elements` in the layout sidecar is empty after generation, annotations are missing — fix the template before QA passes. Do not present unannotated slides to the user.238239### Scale240- On tall iPhone portrait (`iPhone6_9`, `iPhone6_7`), hero headlines must be `>=10vw`, side-layout headlines `>=10vw`, subtitles `>=4.5vw`241- Use `vw` or `clamp()` only if the computed size still clears the minimum on the target canvas242- On contrast or closing slides, the content cluster must occupy 60%+ of canvas height243244### Strong defaults245- Do not use the same upright, centered phone composition on consecutive slides246- Do not leave large empty bands (>15% canvas height) between headline and device247- Avoid combining `rotate()` + `translate()` on centered devices unless the visual center still feels intentional after render248- Do not use a simple centered flex column when the slide needs overlap, edge-breaking crops, or layered composition249- Plan text/device zones before writing CSS (see design-guide.md Device-Text Zone Planning)250- If you use card grids, stagger, emphasize, or simplify them unless a strict grid genuinely serves the concept251252### Content253- Do not add tiny top labels, category labels, or app-name headers by default254- Do not render the app name as small decorative text unless clearly readable and strategic255- Do not use app icons as tiny corner decorations; if used, they should be a real brand element256- Do not use awkward, literal, or unnatural headlines just to be short257- Do not start layout work before the slide narrative and copy are coherent258259### Process260- If the first 3 slides do not already feel App Store-ready, keep iterating before presenting them261- Do not present the first technically successful render as final — always review against the rejection checklist in design-guide.md262- Do not let the rules flatten the creative direction. A strange but strong composition is valid if it stays readable and high-impact263- Defaults can be broken when the final result is stronger, clearer, and more specific to the app264- Do not start from the generic fallback of dark gradient + centered phone + big white headline unless the app genuinely supports that language or the user explicitly wants it265- You should be able to explain to yourself why the campaign looks like this app and not a competitor with the same feature list266267## Key Technical Details268269### How assets work in HTML templates270271In template HTML, reference assets with `{{asset_name}}`. In the YAML config, map `asset_name` to a file path under `assets:`.272273Koubou automatically pre-renders each image asset with the configured device frame before passing it to the HTML template. The template receives a composited image (screenshot inside device frame) — it just places it with `<img src="{{asset_name}}">`.274275To disable frame for a specific screenshot: set `frame: false` in its YAML definition.276277### Template variable substitution278279- `variables:` in YAML → `{{key}}` in HTML → localizable text (extracted to xcstrings)280- `assets:` in YAML → `{{key}}` in HTML → image file paths (pre-rendered with device frame)281282### Layout JSON for HTML screenshots283284For HTML screenshots, Koubou can emit a compact sidecar JSON with measured layout geometry.285286- Use `data-kou-id` on any element that should be measurable287- Use `data-kou-role` only when the role helps the model interpret the element288- Keep annotations minimal and structural, not exhaustive289- Good defaults: annotate the main headline, supporting copy, and primary device or hero image290291Example:292293```html294<h1 data-kou-id="headline" data-kou-role="headline">{{headline}}</h1>295<p data-kou-id="subtitle" data-kou-role="supporting">{{subtitle}}</p>296<img data-kou-id="device" data-kou-role="device" src="{{app_screenshot}}" alt="">297```298299Generation workflow:300301- Run `kou generate config.yaml --output json`302- Read `layout_path` from the command output303- Open the referenced `*.layout.json`304305Interpretation rules:306307- Geometry fields are normalized ratios from `0..1`308- `elements` contains only annotated nodes309- `overlaps` contains only mathematical box intersections310- Use this file to understand layout facts, not to decide taste311- Do not invent subjective rules such as "too small" from the JSON alone; combine the geometry with the actual screenshot review312313### Output structure314315```316{output_dir}/{language}/{device_name}/{screenshot_id}.png317```318319Non-localized projects skip the language directory.320321### Device frame names322323Use exact names from `kou list-frames`. Common ones:324- `iPhone 16 Pro - Black Titanium - Portrait`325- `iPhone 16 Pro Max - Black Titanium - Portrait`326- `iPad Pro 13 - M4 - Space Gray - Portrait`327328Search with: `kou list-frames "iPhone 16"`329330### Frame inspection for layout decisions331332Use `kou inspect-frame "<device>" --output-size <size> --output json` to get:333- real frame size334- screen bounds and screen bbox335- safe margins336- coverage ratio337- orientation338- `canvas_class`339340Use this data to choose typography scale, crop aggressiveness, and layout density.341342### Output sizes (App Store dimensions)343344| Name | Dimensions | Devices |345|------|-----------|---------|346| `iPhone6_9` | 1320x2868 | iPhone 16 Pro Max, 15 Pro Max |347| `iPhone6_7` | 1290x2796 | iPhone 15/14/13 Pro Max, Plus |348| `iPhone6_5` | 1242x2688 | iPhone 11 Pro Max, XS Max |349| `iPhone6_1` | 1179x2556 | iPhone 16/15/14/13 Pro |350| `iPhone5_5` | 1242x2208 | iPhone 8 Plus, 7 Plus |351| `iPadPro13` | 2064x2752 | iPad Pro 13" M4 |352| `iPadPro12_9` | 2048x2732 | iPad Pro 12.9" |353| `iPadPro11` | 1668x2388 | iPad Pro 11" |354355Custom: `output_size: [1320, 2868]`