@open-assets/open-assets 0.1.9 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,12 +4,25 @@ Dev server and export tool for app marketing assets. Like Storybook, but for mar
4
4
 
5
5
  Design your App Store screenshots, app icons, logos, OG images, favicons, and more in HTML/CSS/SVG, preview them live in the browser, and export pixel-perfect PNGs at any size — including directly into your Xcode project.
6
6
 
7
- ## Quick Start
7
+ ## Installation
8
8
 
9
9
  ```bash
10
- # Install
11
- npm install --save-dev open-assets
10
+ # npm
11
+ npm install --save-dev @open-assets/open-assets
12
+
13
+ # yarn
14
+ yarn add --dev @open-assets/open-assets
15
+
16
+ # pnpm
17
+ pnpm add --save-dev @open-assets/open-assets
18
+
19
+ # bun
20
+ bun add --dev @open-assets/open-assets
21
+ ```
12
22
 
23
+ ## Quick Start
24
+
25
+ ```bash
13
26
  # Scaffold a new project
14
27
  npx open-assets init
15
28
 
@@ -42,11 +55,20 @@ Creates a `manifest.json`, sample HTML templates, and a `public/` directory for
42
55
 
43
56
  ### 2. Design with Claude Code
44
57
 
45
- Install the open-assets Claude skill, then prompt:
58
+ Install the open-assets Claude Code skill into your project:
59
+
60
+ ```bash
61
+ # Using the built-in command
62
+ npx open-assets skills
46
63
 
64
+ # Or using the Skills CLI
65
+ npx skills add https://github.com/Parra-Inc/open-assets --skill open-assets
47
66
  ```
48
- Now we want to make beautiful screenshots for this app. Install the open-assets
49
- skill from https://github.com/parra-inc/open-assets. Look at the marketing
67
+
68
+ This copies the skill into `.claude/skills/open-assets/` so Claude Code can use it. Then prompt:
69
+
70
+ ```
71
+ Now we want to make beautiful screenshots for this app. Look at the marketing
50
72
  doc and demographics. Design 8 high-converting App Store screenshots that catch
51
73
  your eye as you scroll. Use bold headlines with highlighted keywords, phone
52
74
  mockups with real app screenshots, and close with reviews + a CTA.
@@ -227,6 +249,18 @@ open-assets validate ./assets # Check specific directory
227
249
 
228
250
  Returns exit code 1 if any errors are found — useful in CI pipelines.
229
251
 
252
+ ### `open-assets skills [dir]`
253
+
254
+ Install Claude Code skills into your project. Copies skill files to `.claude/skills/` so Claude Code can generate and manage marketing assets.
255
+
256
+ ```bash
257
+ open-assets skills # Install to current project
258
+ open-assets skills ./my-app # Install to a specific project
259
+
260
+ # Or using the Skills CLI
261
+ npx skills add https://github.com/Parra-Inc/open-assets --skill open-assets
262
+ ```
263
+
230
264
  ### `open-assets init [dir]`
231
265
 
232
266
  Scaffold a new project with a `manifest.json`, sample HTML templates, and a `public/` directory.
@@ -473,4 +473,24 @@ program
473
473
  await scaffoldProject(resolve(dir));
474
474
  });
475
475
 
476
+ // ── skills ──────────────────────────────────────────────────────────────────
477
+
478
+ program
479
+ .command("skills")
480
+ .description("Install Claude Code skills for open-assets into the current project")
481
+ .argument("[dir]", "Target project directory", ".")
482
+ .action(async (dir) => {
483
+ const { cpSync, mkdirSync } = await import("fs");
484
+ const targetDir = resolve(dir);
485
+ const skillsSrc = new URL("../skills", import.meta.url).pathname;
486
+ const skillsDest = join(targetDir, ".claude", "skills");
487
+
488
+ mkdirSync(skillsDest, { recursive: true });
489
+ cpSync(skillsSrc, skillsDest, { recursive: true });
490
+
491
+ console.log(`\n Installed open-assets skills to ${join(targetDir, ".claude", "skills", "open-assets")}\n`);
492
+ console.log(` Claude Code will now use the open-assets skill when you use /open-assets or`);
493
+ console.log(` ask it to create marketing assets.\n`);
494
+ });
495
+
476
496
  program.parse();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-assets/open-assets",
3
- "version": "0.1.9",
3
+ "version": "0.1.11",
4
4
  "description": "Dev server and export tool for app screenshots, icons, and logos. Like Storybook for marketing assets.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -10,6 +10,7 @@
10
10
  "bin/",
11
11
  "lib/",
12
12
  "public/",
13
+ "skills/",
13
14
  "README.md",
14
15
  "LICENSE"
15
16
  ],
@@ -42,5 +43,8 @@
42
43
  "commander": "^13.0.0",
43
44
  "open": "^10.0.0",
44
45
  "puppeteer": "^24.37.5"
46
+ },
47
+ "devDependencies": {
48
+ "@open-assets/open-assets": "^0.1.10"
45
49
  }
46
50
  }
@@ -0,0 +1,497 @@
1
+ ---
2
+ name: open-assets
3
+ description: Generate and manage app marketing assets (screenshots, icons, logos) using HTML/Tailwind with open-assets
4
+ user-invocable: true
5
+ ---
6
+
7
+ ## open-assets
8
+
9
+ open-assets is a dev server and export tool for app marketing assets — screenshots, icons, logos, OG images, favicons, and more — designed as HTML/CSS/SVG files rendered to PNG via Puppeteer. Think Storybook, but for marketing assets.
10
+
11
+ ## Running
12
+
13
+ ```bash
14
+ # Start dev server (preview + export UI)
15
+ open-assets dev
16
+
17
+ # Or with Tailwind
18
+ concurrently "npx @tailwindcss/cli -i src/styles.css -o dist/styles.css --watch" "open-assets dev"
19
+
20
+ # Headless render
21
+ open-assets render --collection screenshots --size iphone-6.9
22
+ open-assets render --collection icon --all
23
+ open-assets render --all
24
+ open-assets render --template 01-hero --all
25
+ open-assets render --platform "App Store"
26
+ open-assets render --force # ignore cache, re-render everything
27
+ ```
28
+
29
+ ## Concepts
30
+
31
+ | Term | Definition |
32
+ |------|-----------|
33
+ | **Collection** | A named group of related assets sharing the same source size and export sizes. One tab in the dev UI. |
34
+ | **Template** | A single source file (HTML or SVG) that produces one image per export size. |
35
+ | **Export Size** | A named output dimension that templates are rendered at (e.g., "iPhone 6.9" → 1320×2868). |
36
+ | **Platform** | Optional grouping label for related export sizes (e.g., "App Store", "Play Store"). |
37
+ | **Source Size** | The dimensions the HTML template is authored at. Puppeteer scales from source → export size. |
38
+ | **Output** | An optional post-render action (e.g., write to Xcode `.appiconset`, copy SVG source). |
39
+
40
+ ## manifest.json
41
+
42
+ The `manifest.json` at the project root defines all asset collections. All collections follow the same unified schema — no `type` field needed.
43
+
44
+ ```json
45
+ {
46
+ "version": 1,
47
+ "name": "App Display Name",
48
+ "publicDir": "public",
49
+ "command": "npx open-assets render --all",
50
+ "collections": [
51
+ {
52
+ "id": "unique-id",
53
+ "label": "Tab Label",
54
+ "sourceSize": { "width": 440, "height": 956 },
55
+ "borderRadius": 4,
56
+ "templates": [
57
+ { "src": "src/screenshots/01-hero.html", "name": "01-hero", "label": "Hero" }
58
+ ],
59
+ "exportSizes": [
60
+ {
61
+ "platform": "App Store",
62
+ "sizes": [
63
+ { "name": "iphone-6.9", "label": "iPhone 6.9\"", "width": 1320, "height": 2868 }
64
+ ]
65
+ }
66
+ ],
67
+ "outputs": [],
68
+ "customExport": { "defaultWidth": 1320, "defaultHeight": 2868 }
69
+ }
70
+ ]
71
+ }
72
+ ```
73
+
74
+ ### Collection Fields
75
+
76
+ | Field | Type | Description |
77
+ |-------|------|-------------|
78
+ | `id` | string | Unique identifier (used in CLI `--collection`) |
79
+ | `label` | string | Display name in UI |
80
+ | `sourceSize` | object | `{ width, height }` — dimensions templates are authored at |
81
+ | `borderRadius` | number | Border radius for preview frames (px) |
82
+ | `templates` | array | Source files: `{ src, name, label }` |
83
+ | `exportSizes` | array | Size groups: `{ platform?, sizes: [{ name, label, width, height }] }` |
84
+ | `outputs` | array | Post-render actions (optional) |
85
+ | `customExport` | object | Custom size defaults for UI (optional) |
86
+
87
+ ### Output Types
88
+
89
+ | Type | Config | Description |
90
+ |------|--------|-------------|
91
+ | `xcode` | `{ "type": "xcode", "path": "..." }` | Render icon and write to Xcode asset catalog |
92
+ | `copy-source` | `{ "type": "copy-source", "format": "svg" }` | Copy source files to export directory |
93
+
94
+ ### Example Collections
95
+
96
+ **Screenshots** (many templates × many device sizes):
97
+ ```json
98
+ {
99
+ "id": "screenshots",
100
+ "label": "App Store Screenshots",
101
+ "sourceSize": { "width": 440, "height": 956 },
102
+ "borderRadius": 4,
103
+ "templates": [
104
+ { "src": "src/screenshots/01-hero.html", "name": "01-hero", "label": "Hero" },
105
+ { "src": "src/screenshots/02-features.html", "name": "02-features", "label": "Features" }
106
+ ],
107
+ "exportSizes": [
108
+ {
109
+ "platform": "App Store",
110
+ "sizes": [
111
+ { "name": "iphone-6.9", "label": "iPhone 6.9\"", "width": 1320, "height": 2868 },
112
+ { "name": "iphone-6.7", "label": "iPhone 6.7\"", "width": 1290, "height": 2796 }
113
+ ]
114
+ }
115
+ ]
116
+ }
117
+ ```
118
+
119
+ **App Icon** (1 template × many sizes + Xcode):
120
+ ```json
121
+ {
122
+ "id": "icon",
123
+ "label": "App Icon",
124
+ "sourceSize": { "width": 1024, "height": 1024 },
125
+ "borderRadius": 224,
126
+ "templates": [
127
+ { "src": "src/icon.html", "name": "icon", "label": "App Icon" }
128
+ ],
129
+ "exportSizes": [
130
+ {
131
+ "platform": "Apple",
132
+ "sizes": [
133
+ { "name": "1024", "label": "1024px", "width": 1024, "height": 1024 },
134
+ { "name": "180", "label": "180px", "width": 180, "height": 180 }
135
+ ]
136
+ }
137
+ ],
138
+ "outputs": [{ "type": "xcode", "path": "../MyApp/Assets.xcassets/AppIcon.appiconset" }]
139
+ }
140
+ ```
141
+
142
+ **Icon Explorations** (multiple concept variants):
143
+ ```json
144
+ {
145
+ "id": "icon-explorations",
146
+ "label": "Icon Explorations",
147
+ "sourceSize": { "width": 1024, "height": 1024 },
148
+ "borderRadius": 224,
149
+ "templates": [
150
+ { "src": "src/icons/concept-a.html", "name": "concept-a", "label": "Concept A" },
151
+ { "src": "src/icons/concept-b.html", "name": "concept-b", "label": "Concept B" }
152
+ ],
153
+ "exportSizes": [
154
+ { "sizes": [{ "name": "1024", "label": "1024px", "width": 1024, "height": 1024 }] }
155
+ ]
156
+ }
157
+ ```
158
+
159
+ **Logo** (SVG variants + source copy):
160
+ ```json
161
+ {
162
+ "id": "logo",
163
+ "label": "Logo",
164
+ "sourceSize": { "width": 940, "height": 940 },
165
+ "templates": [
166
+ { "src": "src/logo.svg", "name": "logo", "label": "Logo" },
167
+ { "src": "src/logo-dark.svg", "name": "logo-dark", "label": "Dark" }
168
+ ],
169
+ "exportSizes": [
170
+ { "sizes": [
171
+ { "name": "1024", "label": "1024px", "width": 1024, "height": 1024 },
172
+ { "name": "512", "label": "512px", "width": 512, "height": 512 }
173
+ ] }
174
+ ],
175
+ "outputs": [{ "type": "copy-source", "format": "svg" }]
176
+ }
177
+ ```
178
+
179
+ **OG Images** (social cards):
180
+ ```json
181
+ {
182
+ "id": "og-images",
183
+ "label": "Social Cards",
184
+ "sourceSize": { "width": 1200, "height": 630 },
185
+ "templates": [
186
+ { "src": "src/og/default.html", "name": "default", "label": "Default OG" }
187
+ ],
188
+ "exportSizes": [
189
+ { "sizes": [{ "name": "og", "label": "OG Image", "width": 1200, "height": 630 }] }
190
+ ]
191
+ }
192
+ ```
193
+
194
+ ## CLI Reference
195
+
196
+ ### render command flags
197
+
198
+ | Flag | Description |
199
+ |------|-------------|
200
+ | `--collection <id>` | Render only the collection with this ID |
201
+ | `--template <name>` | Render only the template with this name |
202
+ | `--size <name>` | Use a named export size from manifest |
203
+ | `--platform <name>` | Render only sizes for this platform |
204
+ | `--all` | Export at every size defined in the manifest |
205
+ | `--force` | Re-render all assets even if unchanged |
206
+ | `-o, --output <dir>` | Output directory (default: `./exports`) |
207
+ | `--json` | Output results as JSON |
208
+ | `-q, --quiet` | Suppress progress logs |
209
+
210
+ Flags compose naturally:
211
+ - `--collection screenshots --template 01-hero --size iphone-6.9` → single template, single size
212
+ - `--collection screenshots --template 01-hero --all` → one template, all sizes
213
+ - `--collection screenshots --size iphone-6.9` → all templates, one size
214
+ - `--collection screenshots --platform "App Store"` → all templates, all App Store sizes
215
+
216
+ ### Output structure
217
+
218
+ `exports/{collection}/{size}/{template}.png`
219
+
220
+ ```
221
+ exports/
222
+ screenshots/
223
+ iphone-6.9/
224
+ 01-hero.png
225
+ 02-features.png
226
+ iphone-6.7/
227
+ 01-hero.png
228
+ icon/
229
+ 1024/
230
+ icon.png
231
+ logo/
232
+ svg/
233
+ logo.svg
234
+ 1024/
235
+ logo.png
236
+ ```
237
+
238
+ ## Creating New Screenshot HTML Files
239
+
240
+ Each screenshot is a standalone HTML file at fixed dimensions. Key rules:
241
+
242
+ 1. Set `width` and `height` on the body to match `sourceSize` in the manifest
243
+ 2. Set `overflow: hidden` on the body
244
+ 3. Reference compiled Tailwind CSS via `<link rel="stylesheet" href="../dist/styles.css" />`
245
+ 4. All paths are relative to the project root
246
+ 5. Put shared assets (images, logos, icons) in `publicDir` (default: `public/`)
247
+
248
+ Example template:
249
+
250
+ ```html
251
+ <!DOCTYPE html>
252
+ <html lang="en">
253
+ <head>
254
+ <meta charset="UTF-8" />
255
+ <meta name="viewport" content="width=440" />
256
+ <link rel="stylesheet" href="../dist/styles.css" />
257
+ </head>
258
+ <body class="m-0 p-0">
259
+ <div class="screenshot bg-white flex flex-col items-center">
260
+ <!-- Your screenshot content here -->
261
+ </div>
262
+ </body>
263
+ </html>
264
+ ```
265
+
266
+ After creating the file, add it to the `templates` array in the relevant collection in `manifest.json`.
267
+
268
+ ## Adding a New Collection
269
+
270
+ Add a new object to the `collections` array in `manifest.json`. Each collection needs a unique `id`, a `sourceSize`, `templates`, and `exportSizes`.
271
+
272
+ ## Common Export Sizes
273
+
274
+ | Platform | Label | Width | Height |
275
+ |----------|-------|-------|--------|
276
+ | App Store | iPhone 6.9" | 1320 | 2868 |
277
+ | App Store | iPhone 6.7" | 1290 | 2796 |
278
+ | App Store | iPhone 6.5" | 1284 | 2778 |
279
+ | App Store | iPhone 6.1" | 1179 | 2556 |
280
+ | App Store | iPad 12.9" | 2048 | 2732 |
281
+ | Play Store | Phone | 1080 | 1920 |
282
+ | Play Store | Phone (tall) | 1080 | 2400 |
283
+ | Product Hunt | Gallery | 1270 | 760 |
284
+ | Web | OG Image | 1200 | 630 |
285
+ | Mac App Store | Retina | 2880 | 1800 |
286
+
287
+ ## Incremental Builds (manifest.lock)
288
+
289
+ The `render` command maintains a `manifest.lock` file with SHA256 checksums of source files. On subsequent renders, unchanged assets are skipped automatically. Use `--force` to re-render everything.
290
+
291
+ Note: only source HTML/SVG files are checksummed. Changes to referenced assets (images in publicDir, compiled CSS) will not trigger re-renders — use `--force` when those change.
292
+
293
+ ## File Structure Convention
294
+
295
+ ```
296
+ project/
297
+ manifest.json
298
+ manifest.lock # Auto-generated, add to .gitignore
299
+ public/ # Shared assets (images, logos, icons, photos)
300
+ logo-round.png
301
+ social/
302
+ youtube.svg
303
+ screenshots/ # Real app screenshots for use in templates
304
+ 01.png
305
+ src/
306
+ styles.css # Tailwind input
307
+ icon.html # App icon template
308
+ icons/ # Icon concept explorations
309
+ concept-a.html
310
+ concept-b.html
311
+ logo.svg # Vector logo template
312
+ screenshots/
313
+ 01-hero.html
314
+ 02-features.html
315
+ og/ # OG image templates
316
+ default.html
317
+ dist/
318
+ styles.css # Compiled Tailwind
319
+ exports/ # Rendered output (add to .gitignore)
320
+ ```
321
+
322
+ ---
323
+
324
+ ## Screenshot Design Best Practices
325
+
326
+ These guidelines are distilled from high-converting App Store listings. Follow them when creating screenshot HTML files.
327
+
328
+ ### Copywriting
329
+
330
+ - **Headlines: 3-6 words max**, large and bold. Every word must earn its place.
331
+ - **Lead with the benefit**, not the feature name. "Got Recipes?" not "Recipe Import Feature". "Save from anywhere" not "Multi-platform Import Support".
332
+ - **Use action words**: Save, Track, Cook, Get, Try, Discover, Create, Find.
333
+ - **First screenshot** = elevator pitch headline. This is the only one most users see.
334
+ - **Last screenshot** = CTA with social proof (reviews, ratings, badges).
335
+ - **Highlight the key word** in each headline with a colored background or different color.
336
+
337
+ ### Visual Hierarchy
338
+
339
+ First 1-2 screenshots should use large hero graphics with oversized headlines. The goal is to stop the scroll in the App Store.
340
+
341
+ **Oversized headline pattern** (44-86px):
342
+ ```html
343
+ <div class="text-[86px] font-black leading-[0.9] tracking-[-0.04em]">Got</div>
344
+ <div class="inline-block bg-brand-black text-white text-[86px] font-black px-[16px] pt-[6px] pb-[12px] rounded-[16px] mt-[4px]">Recipes?</div>
345
+ ```
346
+
347
+ **Highlighted keyword pattern** — wrap key words with a colored background pill:
348
+ ```html
349
+ <h1 class="text-[44px] font-extrabold leading-[1.18] tracking-[-0.03em]">
350
+ Save recipes from <span class="inline-block bg-brand-green text-white px-[10px] pt-[3px] pb-[5px] rounded-[10px]">anywhere</span>
351
+ </h1>
352
+ ```
353
+
354
+ ### Layout Patterns
355
+
356
+ Use a mix of these layouts across your 6-10 screenshots. Variety keeps users scrolling.
357
+
358
+ #### 1. Hero (Screenshot 1)
359
+ Oversized headline + logo + large background graphic bleeding off the edges.
360
+ ```html
361
+ <!-- Headline at top -->
362
+ <div class="relative z-10 pt-[28px] px-[24px]">
363
+ <div class="text-[86px] font-black">Got</div>
364
+ <div class="inline-block bg-brand-black text-white text-[86px] font-black px-[16px] rounded-[16px]">Recipes?</div>
365
+ </div>
366
+ <!-- Logo and rating centered -->
367
+ <div class="relative z-10 mt-[44px] flex flex-col items-center">
368
+ <img src="../../public/logo-round.png" width="64" height="64" />
369
+ <img src="../../public/rating.svg" width="365" height="191" class="mt-[8px]" />
370
+ </div>
371
+ <!-- Large image bleeding off bottom-right edge -->
372
+ <div class="absolute z-0" style="bottom: -350px; right: -176px; width: 792px; height: 792px;">
373
+ <img src="../../public/meal.svg" class="w-full h-full object-contain" />
374
+ </div>
375
+ ```
376
+
377
+ #### 2. Dual-Phone (Before/After or Feature Comparison)
378
+ Two phone mockups side by side with an arrow or VS indicator between them. Great for showing "messy website → clean recipe" transformations.
379
+
380
+ #### 3. Orbital (Integrations / Multi-Platform)
381
+ Center your app icon with platform logos on concentric orbital rings:
382
+ ```html
383
+ <div class="orbital-container" style="position: relative; width: 380px; height: 380px;">
384
+ <!-- Concentric ring borders -->
385
+ <div style="position: absolute; border-radius: 50%; border: 1px solid rgba(128,128,128,0.13); width: 240px; height: 240px; top: 70px; left: 70px;"></div>
386
+ <div style="position: absolute; border-radius: 50%; border: 1px solid rgba(128,128,128,0.13); width: 340px; height: 340px; top: 20px; left: 20px;"></div>
387
+ <!-- Center app icon -->
388
+ <div style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);">
389
+ <img src="../../public/logo-round.png" width="104" height="104" style="border-radius: 50%; box-shadow: 0 6px 20px rgba(0,0,0,0.18);" />
390
+ </div>
391
+ <!-- Platform icons at various positions on rings -->
392
+ <div style="position: absolute; top: 52px; left: 216px; opacity: 0.85;">
393
+ <img src="../../public/social/youtube.svg" width="68" height="68" style="border-radius: 50%;" />
394
+ </div>
395
+ </div>
396
+ ```
397
+
398
+ #### 4. Feature Showcase
399
+ Headline + phone mockup showing a real app screenshot.
400
+ ```html
401
+ <h1 class="text-[44px] font-extrabold tracking-[-0.03em] text-center">
402
+ Just the <span class="inline-block bg-brand-green text-white px-[10px] rounded-[10px]">recipe</span>
403
+ </h1>
404
+ <div class="phone phone-340">
405
+ <div class="phone-screen">
406
+ <img src="../../public/screenshots/05.png" style="width: 100%; height: 100%; object-fit: cover;" />
407
+ </div>
408
+ </div>
409
+ ```
410
+
411
+ #### 5. Review Carousel (Social Proof)
412
+ Staggered review cards with alternating left/right offset:
413
+ ```html
414
+ <div class="pl-5 pr-12">
415
+ <div style="background: white; border-radius: 18px; padding: 14px 18px; box-shadow: 0 4px 24px rgba(0,0,0,0.08);">
416
+ <div style="display: flex; justify-content: space-between; margin-bottom: 4px;">
417
+ <p style="font-size: 16px; font-weight: 800;">Username</p>
418
+ <div style="display: flex; gap: 1px;">
419
+ <svg viewBox="0 0 24 24" fill="#F2C94C" width="16" height="16"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
420
+ </div>
421
+ </div>
422
+ <p style="font-size: 16px; color: #4B5563;">"Their actual review text here."</p>
423
+ </div>
424
+ </div>
425
+ ```
426
+
427
+ #### 6. CTA (Final Screenshot)
428
+ Social proof badges + lifestyle photo fading at bottom:
429
+ ```html
430
+ <h1 class="text-[42px] font-extrabold tracking-[-0.03em]">
431
+ Time to cook, <span class="inline-block bg-brand-green text-white px-[10px] rounded-[10px]">chef</span>
432
+ </h1>
433
+ <!-- Badge pills -->
434
+ <div class="flex flex-wrap gap-2.5 justify-center">
435
+ <div style="display: inline-flex; align-items: center; gap: 10px; background: rgba(255,255,255,0.85); backdrop-filter: blur(12px); border: 1.5px solid rgba(0,0,0,0.06); border-radius: 100px; padding: 10px 20px 10px 14px;">
436
+ <span style="font-size: 16px; font-weight: 700;">No Ads</span>
437
+ </div>
438
+ </div>
439
+ <!-- Lifestyle photo with gradient fade -->
440
+ <div style="position: absolute; bottom: -80px; left: 0; right: 0; height: 320px;">
441
+ <div style="position: absolute; top: 0; left: 0; right: 0; height: 180px; background: linear-gradient(180deg, #FFFFFF 0%, rgba(255,255,255,0) 100%); z-index: 1;"></div>
442
+ <img src="../../public/kitchen-light.jpg" style="width: 100%; height: 100%; object-fit: cover;" />
443
+ </div>
444
+ ```
445
+
446
+ ### Typography
447
+
448
+ **Google Fonts** — add to the `<head>` of each HTML file:
449
+ ```html
450
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap" rel="stylesheet">
451
+ ```
452
+
453
+ **Recommended pairings:**
454
+ - **Inter** (body) + **Fraunces** (display) — modern + editorial
455
+ - **DM Sans** (body) + **DM Serif Display** (headlines) — clean + elegant
456
+ - **Plus Jakarta Sans** (body) + **Playfair Display** (headlines) — geometric + classic
457
+ - **Outfit** (body) + **Cal Sans** (display) — startup-y + bold
458
+
459
+ **iOS-native feel** — use the system font stack:
460
+ ```css
461
+ font-family: -apple-system, BlinkMacSystemFont, "SF Pro Display", system-ui, sans-serif;
462
+ ```
463
+
464
+ ### Icon and Asset Resources
465
+
466
+ | Source | URL | Use For |
467
+ |--------|-----|---------|
468
+ | **Lucide Icons** | https://lucide.dev | Clean UI icons (MIT licensed) |
469
+ | **Heroicons** | https://heroicons.com | UI icons by Tailwind team (MIT) |
470
+ | **Simple Icons** | https://simpleicons.org | Brand/platform logos (YouTube, Instagram, etc.) |
471
+ | **SVG Repo** | https://www.svgrepo.com | Decorative elements, arrows, squiggles |
472
+ | **Unsplash** | https://unsplash.com | Lifestyle photography for backgrounds |
473
+ | **Pexels** | https://www.pexels.com | Free stock photography |
474
+
475
+ ### Example Prompts
476
+
477
+ **Full screenshot set:**
478
+ ```
479
+ Now we want to make beautiful screenshots for this app. Install the open-assets skill
480
+ from https://github.com/parra-inc/open-assets. Look at the marketing doc and
481
+ demographics. Design 8 high-converting App Store screenshots that catch your eye as
482
+ you scroll. Use bold headlines with highlighted keywords, phone mockups with real app
483
+ screenshots, and close with reviews + a CTA. Export for iPhone 6.7" and 6.9".
484
+ ```
485
+
486
+ **Single screenshot iteration:**
487
+ ```
488
+ Update the hero screenshot (01-hero.html) to use a bigger headline at 86px with a
489
+ colored background on the key word. Add the app rating below the logo. Make the
490
+ background food photo bleed off the bottom-right edge for visual impact.
491
+ ```
492
+
493
+ **Adding a new platform:**
494
+ ```
495
+ Add Play Store screenshot sizes to the manifest. Use 1080x2400 as the export size
496
+ under a "Play Store" platform group. The screenshots can share the same templates.
497
+ ```