@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 +40 -6
- package/bin/open-assets.mjs +20 -0
- package/package.json +5 -1
- package/skills/open-assets/SKILL.md +497 -0
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
|
-
##
|
|
7
|
+
## Installation
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
#
|
|
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
|
|
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
|
-
|
|
49
|
-
skill
|
|
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.
|
package/bin/open-assets.mjs
CHANGED
|
@@ -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.
|
|
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
|
+
```
|