appshot-cli 0.3.0 β 0.4.0
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 +1250 -706
- package/dist/cli.js +5 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +11 -4
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/fonts.d.ts +3 -0
- package/dist/commands/fonts.d.ts.map +1 -0
- package/dist/commands/fonts.js +384 -0
- package/dist/commands/fonts.js.map +1 -0
- package/dist/commands/migrate.d.ts +3 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +123 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/style.d.ts.map +1 -1
- package/dist/commands/style.js +92 -1
- package/dist/commands/style.js.map +1 -1
- package/dist/core/compose.d.ts +4 -0
- package/dist/core/compose.d.ts.map +1 -1
- package/dist/core/compose.js +102 -9
- package/dist/core/compose.js.map +1 -1
- package/dist/services/fonts.d.ts +71 -0
- package/dist/services/fonts.d.ts.map +1 -0
- package/dist/services/fonts.js +314 -0
- package/dist/services/fonts.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/language.d.ts +32 -0
- package/dist/utils/language.d.ts.map +1 -0
- package/dist/utils/language.js +103 -0
- package/dist/utils/language.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,1013 +1,1557 @@
|
|
|
1
1
|
# Appshot πΈ
|
|
2
2
|
|
|
3
|
-
>
|
|
4
|
-
|
|
5
|
-
Generate beautiful, App Store-ready screenshots with device frames, gradients, and captions.
|
|
3
|
+
> **AI-First CLI for App Store Screenshots** - Generate beautiful, localized screenshots with device frames, gradients, and captions.
|
|
6
4
|
|
|
7
5
|
[](https://github.com/chrisvanbuskirk/appshot/actions/workflows/ci.yml)
|
|
8
6
|
[](https://www.npmjs.com/package/appshot-cli)
|
|
9
7
|
[](https://opensource.org/licenses/MIT)
|
|
10
8
|
|
|
11
|
-
|
|
9
|
+
π **Version 0.4.0** - Language-aware output directories, comprehensive font system, and system locale detection!
|
|
10
|
+
|
|
11
|
+
> β οΈ **BREAKING CHANGE in v0.4.0**: Output structure now always uses language subdirectories.
|
|
12
|
+
> Single language builds now output to `final/device/lang/` instead of `final/device/`.
|
|
13
|
+
> Run `appshot migrate --output-structure` to update existing projects.
|
|
14
|
+
|
|
15
|
+
## π Table of Contents
|
|
16
|
+
|
|
17
|
+
- [Why Appshot?](#-why-appshot)
|
|
18
|
+
- [Features](#-features)
|
|
19
|
+
- [Quick Start](#-quick-start)
|
|
20
|
+
- [Prerequisites](#prerequisites)
|
|
21
|
+
- [Installation](#installation)
|
|
22
|
+
- [Your First Screenshot](#your-first-screenshot)
|
|
23
|
+
- [Core Concepts](#-core-concepts)
|
|
24
|
+
- [Visual Customization](#-visual-customization)
|
|
25
|
+
- [Gradient System](#gradient-system)
|
|
26
|
+
- [Font System](#font-system)
|
|
27
|
+
- [Device Frames](#device-frames)
|
|
28
|
+
- [Caption System](#caption-system)
|
|
29
|
+
- [Localization & Translation](#-localization--translation)
|
|
30
|
+
- [Device Support](#-device-support)
|
|
31
|
+
- [Command Reference](#-command-reference)
|
|
32
|
+
- [Configuration Reference](#οΈ-configuration-reference)
|
|
33
|
+
- [Agent & Automation Guide](#-agent--automation-guide)
|
|
34
|
+
- [Recipes & Examples](#-recipes--examples)
|
|
35
|
+
- [Troubleshooting](#-troubleshooting)
|
|
36
|
+
- [Development](#-development)
|
|
37
|
+
- [Roadmap](#-roadmap)
|
|
38
|
+
- [License & Support](#-license--support)
|
|
39
|
+
|
|
40
|
+
## π Why Appshot?
|
|
41
|
+
|
|
42
|
+
Appshot is the only **agent-first CLI tool** designed for automated App Store screenshot generation. Built for LLM agents, CI/CD pipelines, and developers who value automation over GUIs.
|
|
43
|
+
|
|
44
|
+
### Key Differentiators
|
|
45
|
+
|
|
46
|
+
- π€ **Agent-First Design** - JSON outputs, predictable commands, no interactive prompts in automation mode
|
|
47
|
+
- π― **Smart Automation** - Auto-detects orientation, selects appropriate frames, handles batch operations
|
|
48
|
+
- π **AI-Powered Localization** - Translate captions in real-time using GPT-4o, GPT-5, o1, and o3 models
|
|
49
|
+
- π **App Store Compliant** - Built-in validation for all official Apple App Store specifications
|
|
50
|
+
- β‘ **Fast & Parallel** - Process hundreds of screenshots with configurable concurrency
|
|
51
|
+
- π οΈ **Pure CLI** - No web UI, no GUI, just predictable commands perfect for automation
|
|
52
|
+
|
|
53
|
+
## β¨ Features
|
|
12
54
|
|
|
13
55
|
- πΌοΈ **Smart Frames** - Automatically detects portrait/landscape and selects appropriate device frame
|
|
14
|
-
- π¨ **
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
- π **Orientation Detection** - Intelligently handles both portrait and landscape
|
|
21
|
-
- β‘ **
|
|
22
|
-
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
56
|
+
- π¨ **Gradient Presets** - 24+ beautiful gradients with visual preview and easy application
|
|
57
|
+
- π€ **Font System** - 50+ font mappings, direct font setting, interactive selection, and system detection
|
|
58
|
+
- βοΈ **Dynamic Captions** - Smart text wrapping, auto-sizing, and multi-line support
|
|
59
|
+
- π **AI Translation** - Real-time and batch translation using OpenAI's latest models
|
|
60
|
+
- π± **Multi-Device** - iPhone, iPad, Mac, Apple TV, Vision Pro, and Apple Watch support
|
|
61
|
+
- π **App Store Specs** - All official resolutions with validation and presets
|
|
62
|
+
- π **Orientation Detection** - Intelligently handles both portrait and landscape
|
|
63
|
+
- β‘ **Parallel Processing** - Configurable concurrency for large batches
|
|
64
|
+
- π **Caption Autocomplete** - Intelligent suggestions with fuzzy search and learning
|
|
65
|
+
|
|
66
|
+
## π Quick Start
|
|
67
|
+
|
|
68
|
+
### Prerequisites
|
|
69
|
+
|
|
70
|
+
- **Node.js 16+** - Required for ESM modules
|
|
71
|
+
- **npm** or **yarn** - Package manager
|
|
72
|
+
- **Operating System** - macOS, Linux, or Windows
|
|
73
|
+
- **Optional**: OpenAI API key for translation features
|
|
26
74
|
|
|
27
75
|
### Installation
|
|
28
76
|
|
|
29
77
|
```bash
|
|
78
|
+
# Install globally via npm
|
|
30
79
|
npm install -g appshot-cli
|
|
80
|
+
|
|
81
|
+
# Or with yarn
|
|
82
|
+
yarn global add appshot-cli
|
|
83
|
+
|
|
84
|
+
# Verify installation
|
|
85
|
+
appshot --version
|
|
31
86
|
```
|
|
32
87
|
|
|
33
|
-
> **Note**: The package is called `appshot-cli` on NPM, but the command is
|
|
88
|
+
> **Note**: The package is called `appshot-cli` on NPM, but the command is `appshot`
|
|
34
89
|
|
|
35
|
-
###
|
|
90
|
+
### Your First Screenshot
|
|
91
|
+
|
|
92
|
+
Create App Store-ready screenshots in 5 simple steps:
|
|
36
93
|
|
|
37
94
|
```bash
|
|
95
|
+
# 1. Initialize your project
|
|
38
96
|
appshot init
|
|
39
|
-
```
|
|
40
97
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
- `.appshot/captions/` - Device-specific caption files
|
|
44
|
-
- `screenshots/` - Directory structure for your screenshots
|
|
98
|
+
# 2. Add your screenshots
|
|
99
|
+
cp ~/Desktop/screenshots/*.png screenshots/iphone/
|
|
45
100
|
|
|
46
|
-
|
|
101
|
+
# 3. Add captions interactively
|
|
102
|
+
appshot caption --device iphone
|
|
47
103
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
βββ mac/
|
|
54
|
-
βββ watch/
|
|
55
|
-
```
|
|
104
|
+
# 4. Apply a gradient preset
|
|
105
|
+
appshot gradients --apply ocean
|
|
106
|
+
|
|
107
|
+
# 5. Build final screenshots
|
|
108
|
+
appshot build
|
|
56
109
|
|
|
57
|
-
|
|
110
|
+
# β¨ Output ready in final/ directory!
|
|
111
|
+
```
|
|
58
112
|
|
|
59
|
-
|
|
113
|
+
### Example Output Structure
|
|
60
114
|
|
|
61
|
-
```
|
|
62
|
-
|
|
115
|
+
```
|
|
116
|
+
final/
|
|
117
|
+
βββ iphone/
|
|
118
|
+
β βββ en/ # Language subdirectory (always created)
|
|
119
|
+
β βββ home.png # 1284Γ2778 with frame, gradient, and caption
|
|
120
|
+
β βββ features.png
|
|
121
|
+
β βββ settings.png
|
|
122
|
+
βββ ipad/
|
|
123
|
+
βββ en/ # Language subdirectory
|
|
124
|
+
βββ dashboard.png # 2048Γ2732 iPad Pro screenshot
|
|
63
125
|
```
|
|
64
126
|
|
|
65
|
-
|
|
66
|
-
- π **Autocomplete** - Smart suggestions as you type
|
|
67
|
-
- π **Frequency tracking** - Most-used captions appear first
|
|
68
|
-
- π― **Device-specific** - Suggestions tailored to device type
|
|
69
|
-
- β¨οΈ **Keyboard shortcuts** - Tab to complete, arrows to navigate
|
|
127
|
+
## π Core Concepts
|
|
70
128
|
|
|
71
|
-
###
|
|
129
|
+
### Project Structure
|
|
72
130
|
|
|
73
|
-
|
|
131
|
+
Appshot uses a simple, predictable directory structure:
|
|
74
132
|
|
|
75
|
-
```
|
|
76
|
-
|
|
133
|
+
```
|
|
134
|
+
your-project/
|
|
135
|
+
βββ .appshot/
|
|
136
|
+
β βββ config.json # Main configuration
|
|
137
|
+
β βββ captions/ # Device-specific captions
|
|
138
|
+
β β βββ iphone.json
|
|
139
|
+
β β βββ ipad.json
|
|
140
|
+
β βββ caption-history.json # Autocomplete history
|
|
141
|
+
βββ screenshots/ # Original screenshots
|
|
142
|
+
β βββ iphone/
|
|
143
|
+
β βββ ipad/
|
|
144
|
+
β βββ mac/
|
|
145
|
+
βββ frames/ # Device frames (auto-downloaded)
|
|
146
|
+
βββ final/ # Generated output
|
|
77
147
|
```
|
|
78
148
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
## Configuration
|
|
149
|
+
### Configuration Overview
|
|
82
150
|
|
|
83
|
-
|
|
151
|
+
All settings are stored in `.appshot/config.json`:
|
|
84
152
|
|
|
85
153
|
```json
|
|
86
154
|
{
|
|
87
155
|
"output": "./final",
|
|
88
|
-
"frames": "./frames",
|
|
89
156
|
"gradient": {
|
|
90
|
-
"colors": ["#
|
|
91
|
-
"direction": "
|
|
157
|
+
"colors": ["#0077BE", "#33CCCC"],
|
|
158
|
+
"direction": "diagonal"
|
|
92
159
|
},
|
|
93
160
|
"caption": {
|
|
94
161
|
"font": "SF Pro",
|
|
95
162
|
"fontsize": 64,
|
|
96
163
|
"color": "#FFFFFF",
|
|
97
|
-
"
|
|
98
|
-
"paddingTop": 100
|
|
164
|
+
"position": "above"
|
|
99
165
|
},
|
|
100
166
|
"devices": {
|
|
101
167
|
"iphone": {
|
|
102
|
-
"input": "./screenshots/iphone",
|
|
103
168
|
"resolution": "1284x2778",
|
|
104
|
-
"autoFrame": true
|
|
105
|
-
"preferredFrame": "iphone-15-pro-max"
|
|
169
|
+
"autoFrame": true
|
|
106
170
|
}
|
|
107
171
|
}
|
|
108
172
|
}
|
|
109
173
|
```
|
|
110
174
|
|
|
111
|
-
###
|
|
175
|
+
### Workflow
|
|
176
|
+
|
|
177
|
+
1. **Capture** - Take screenshots from simulator/device or design tool
|
|
178
|
+
2. **Configure** - Set up gradients, fonts, and device settings
|
|
179
|
+
3. **Caption** - Add marketing text with optional AI translation
|
|
180
|
+
4. **Build** - Generate final App Store-ready screenshots
|
|
181
|
+
5. **Validate** - Ensure compliance with App Store requirements
|
|
112
182
|
|
|
113
|
-
|
|
114
|
-
- **direction**: `top-bottom`, `bottom-top`, `left-right`, `right-left`, `diagonal`
|
|
183
|
+
## π¨ Visual Customization
|
|
115
184
|
|
|
116
|
-
|
|
185
|
+
### Gradient System
|
|
117
186
|
|
|
118
|
-
|
|
187
|
+
Appshot includes 24+ professional gradient presets organized by category:
|
|
188
|
+
|
|
189
|
+
#### Browse & Apply Gradients
|
|
119
190
|
|
|
120
191
|
```bash
|
|
121
|
-
#
|
|
192
|
+
# View all gradients with color preview
|
|
122
193
|
appshot gradients
|
|
123
194
|
|
|
124
|
-
# Apply a
|
|
195
|
+
# Apply a gradient to your project
|
|
125
196
|
appshot gradients --apply sunset
|
|
126
197
|
|
|
127
|
-
# Interactive selection
|
|
198
|
+
# Interactive selection
|
|
128
199
|
appshot gradients select
|
|
129
200
|
|
|
130
201
|
# Generate preview image
|
|
131
202
|
appshot gradients --preview ocean
|
|
132
203
|
|
|
133
|
-
# Create
|
|
204
|
+
# Create sample gallery
|
|
134
205
|
appshot gradients --sample
|
|
135
206
|
```
|
|
136
207
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
**Warm Gradients** π₯
|
|
140
|
-
- **sunset** - Warm orange to pink (#FF5733 β #FFC300)
|
|
141
|
-
- **autumn** - Fall foliage colors (#D2691E β #FF4500)
|
|
142
|
-
- **golden** - Rich golden tones (#FFD700 β #FFA500)
|
|
143
|
-
- **coral** - Soft coral reef (#FF6B6B β #FFE66D)
|
|
144
|
-
|
|
145
|
-
**Cool Gradients** βοΈ
|
|
146
|
-
- **ocean** - Deep blue waves (#0077BE β #33CCCC)
|
|
147
|
-
- **arctic** - Icy blue frost (#E0F7FA β #81D4FA)
|
|
148
|
-
- **mint** - Fresh mint green (#00C9A7 β #00F5FF)
|
|
149
|
-
- **twilight** - Evening sky (#667EEA β #764BA2)
|
|
150
|
-
|
|
151
|
-
**Vibrant Gradients** π¨
|
|
152
|
-
- **neon** - Electric glow (#FF006E β #8338EC β #3A86FF)
|
|
153
|
-
- **tropical** - Paradise colors (#FE6B8B β #FF8E53)
|
|
154
|
-
- **rainbow** - Full spectrum (#FF0000 β #FF7F00 β #FFFF00 β #00FF00 β #0000FF β #8B00FF)
|
|
155
|
-
- **vivid** - Bold and bright (#F72585 β #7209B7 β #3A0CA3)
|
|
156
|
-
|
|
157
|
-
**Subtle Gradients** ποΈ
|
|
158
|
-
- **pastel** - Soft blend (#E8D8F5 β #D6E6FF)
|
|
159
|
-
- **lavender** - Gentle purple (#E6E6FA β #DDA0DD)
|
|
160
|
-
- **peach** - Soft peach tones (#FFDAB9 β #FFE4E1)
|
|
161
|
-
- **sky** - Clear day (#87CEEB β #E0F6FF)
|
|
162
|
-
|
|
163
|
-
**Monochrome Gradients** β«βͺ
|
|
164
|
-
- **noir** - Deep black (#000000 β #434343)
|
|
165
|
-
- **silver** - Metallic shine (#C0C0C0 β #F5F5F5)
|
|
166
|
-
- **charcoal** - Dark grey (#36454F β #708090)
|
|
167
|
-
- **pearl** - Soft white (#F8F8FF β #FFFFFF)
|
|
168
|
-
|
|
169
|
-
**Brand-Inspired Gradients** π’
|
|
170
|
-
- **instagram** - Brand colors (#833AB4 β #FD1D1D β #FCB045)
|
|
171
|
-
- **spotify** - Green energy (#1DB954 β #191414)
|
|
172
|
-
- **twitter** - Blue bird (#1DA1F2 β #14171A)
|
|
173
|
-
- **slack** - Workspace hues (#4A154B β #36C5F0 β #2EB67D)
|
|
174
|
-
|
|
175
|
-
### Caption Options
|
|
176
|
-
|
|
177
|
-
- **font**: Font family name
|
|
178
|
-
- **fontsize**: Size in pixels
|
|
179
|
-
- **color**: Hex color code
|
|
180
|
-
- **align**: `left`, `center`, `right`
|
|
181
|
-
- **paddingTop**: Space from top in pixels
|
|
182
|
-
- **paddingBottom**: Space from bottom in pixels
|
|
183
|
-
- **position**: `above` (above device frame) or `overlay` (on gradient)
|
|
184
|
-
- **box**: Caption box configuration (see Dynamic Caption Box section)
|
|
185
|
-
|
|
186
|
-
### Device Options
|
|
187
|
-
|
|
188
|
-
- **input**: Directory containing screenshots
|
|
189
|
-
- **resolution**: Output resolution (use App Store specs or custom)
|
|
190
|
-
- **autoFrame**: Enable automatic frame selection based on screenshot orientation (default: true)
|
|
191
|
-
- **preferredFrame**: Preferred frame name from the registry (optional)
|
|
192
|
-
- **partialFrame**: Cut off bottom portion of frame for dynamic look (default: false)
|
|
193
|
-
- **frameOffset**: Percentage to cut off when partialFrame is true (default: 25)
|
|
194
|
-
|
|
195
|
-
## Commands
|
|
196
|
-
|
|
197
|
-
### `appshot init`
|
|
198
|
-
Initialize a new appshot project with scaffolding.
|
|
208
|
+
#### Gradient Categories
|
|
199
209
|
|
|
200
|
-
|
|
201
|
-
-
|
|
210
|
+
- **π₯ Warm**: sunset, autumn, golden, coral
|
|
211
|
+
- **βοΈ Cool**: ocean, arctic, mint, twilight
|
|
212
|
+
- **π¨ Vibrant**: neon, tropical, rainbow, vivid
|
|
213
|
+
- **ποΈ Subtle**: pastel, lavender, peach, sky
|
|
214
|
+
- **β«βͺ Monochrome**: noir, silver, charcoal, pearl
|
|
215
|
+
- **π’ Brand**: instagram, spotify, twitter, slack
|
|
202
216
|
|
|
203
|
-
|
|
204
|
-
Interactively add or edit captions for screenshots with intelligent autocomplete and AI-powered translation.
|
|
217
|
+
#### Custom Gradients
|
|
205
218
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
219
|
+
```json
|
|
220
|
+
{
|
|
221
|
+
"gradient": {
|
|
222
|
+
"colors": ["#FF5733", "#FFC300", "#FF1493"],
|
|
223
|
+
"direction": "diagonal" // top-bottom, left-right, diagonal
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
```
|
|
213
227
|
|
|
214
|
-
|
|
215
|
-
- `--device <name>` - Device name (required)
|
|
216
|
-
- `--lang <code>` - Primary language code (default: en)
|
|
217
|
-
- `--translate` - Enable AI-powered real-time translation
|
|
218
|
-
- `--langs <codes>` - Target languages for translation (comma-separated)
|
|
219
|
-
- `--model <name>` - OpenAI model to use (default: gpt-4o-mini)
|
|
228
|
+
### Font System
|
|
220
229
|
|
|
221
|
-
|
|
222
|
-
```bash
|
|
223
|
-
# Add captions with instant translation to Spanish and French
|
|
224
|
-
appshot caption --device iphone --translate --langs es,fr
|
|
230
|
+
Version 0.4.0 introduces comprehensive font management with intelligent fallbacks.
|
|
225
231
|
|
|
226
|
-
|
|
227
|
-
appshot caption --device iphone --translate --langs zh-CN,ja --model gpt-5
|
|
228
|
-
```
|
|
232
|
+
#### Font Commands
|
|
229
233
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
- **Enter** - Select current suggestion
|
|
234
|
-
- **Esc** - Dismiss suggestions
|
|
234
|
+
```bash
|
|
235
|
+
# Browse recommended fonts
|
|
236
|
+
appshot fonts
|
|
235
237
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
Options:
|
|
240
|
-
- `--list` - List all available gradient presets (default)
|
|
241
|
-
- `--category <name>` - Filter by category (warm, cool, vibrant, subtle, monochrome, brand)
|
|
242
|
-
- `--preview <id>` - Generate preview image for a specific gradient
|
|
243
|
-
- `--sample` - Generate sample images for all gradients with HTML preview
|
|
244
|
-
- `--apply <id>` - Apply gradient preset to current project
|
|
245
|
-
|
|
246
|
-
Subcommands:
|
|
247
|
-
- `select` - Interactive gradient selection with visual preview
|
|
248
|
-
|
|
249
|
-
Features:
|
|
250
|
-
- **24+ Beautiful Presets** - Curated collection of professional gradients
|
|
251
|
-
- **6 Categories** - Warm, Cool, Vibrant, Subtle, Monochrome, Brand-inspired
|
|
252
|
-
- **Visual Preview** - See color blocks in terminal with ANSI approximation
|
|
253
|
-
- **Sample Generation** - Create PNG samples of all gradients
|
|
254
|
-
- **HTML Preview Page** - Browse all gradients in your browser
|
|
255
|
-
- **Quick Apply** - Instantly update project configuration
|
|
256
|
-
- **Direction Support** - All gradient directions (top-bottom, diagonal, etc.)
|
|
257
|
-
|
|
258
|
-
Example usage:
|
|
259
|
-
```bash
|
|
260
|
-
# Browse all gradients with color previews
|
|
261
|
-
appshot gradients
|
|
238
|
+
# Set font directly (NEW in v0.4.0)
|
|
239
|
+
appshot fonts --set "Montserrat"
|
|
262
240
|
|
|
263
|
-
#
|
|
264
|
-
appshot
|
|
241
|
+
# Interactive font selection (NEW in v0.4.0)
|
|
242
|
+
appshot fonts --select
|
|
265
243
|
|
|
266
|
-
#
|
|
267
|
-
appshot
|
|
244
|
+
# Set device-specific font (NEW in v0.4.0)
|
|
245
|
+
appshot fonts --set "SF Pro" --device iphone
|
|
268
246
|
|
|
269
|
-
#
|
|
270
|
-
appshot
|
|
247
|
+
# List ALL system fonts
|
|
248
|
+
appshot fonts --all
|
|
271
249
|
|
|
272
|
-
#
|
|
273
|
-
appshot
|
|
250
|
+
# Validate a font
|
|
251
|
+
appshot fonts --validate "SF Pro"
|
|
274
252
|
|
|
275
|
-
#
|
|
276
|
-
appshot
|
|
277
|
-
# Then open gradient-samples/preview.html in your browser
|
|
253
|
+
# Get JSON output for automation
|
|
254
|
+
appshot fonts --json
|
|
278
255
|
```
|
|
279
256
|
|
|
280
|
-
####
|
|
257
|
+
#### Font Setting Methods
|
|
281
258
|
|
|
282
|
-
|
|
283
|
-
- Visual color blocks showing the gradient colors
|
|
284
|
-
- Name and description
|
|
285
|
-
- Category grouping
|
|
286
|
-
- Gradient ID for applying
|
|
259
|
+
You have three ways to set fonts:
|
|
287
260
|
|
|
288
|
-
|
|
261
|
+
1. **Direct Command** (Fastest):
|
|
289
262
|
```bash
|
|
290
|
-
appshot
|
|
291
|
-
|
|
263
|
+
appshot fonts --set "Helvetica"
|
|
264
|
+
appshot fonts --set "SF Pro" --device iphone
|
|
292
265
|
```
|
|
293
266
|
|
|
294
|
-
|
|
267
|
+
2. **Interactive Selection**:
|
|
295
268
|
```bash
|
|
296
|
-
appshot
|
|
297
|
-
|
|
269
|
+
appshot fonts --select
|
|
270
|
+
appshot style --device iphone # Also includes font selection
|
|
298
271
|
```
|
|
299
272
|
|
|
300
|
-
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
# Use arrow keys to navigate, Enter to apply, Esc to cancel
|
|
273
|
+
3. **Manual Configuration**:
|
|
274
|
+
```json
|
|
275
|
+
{
|
|
276
|
+
"caption": {
|
|
277
|
+
"font": "Montserrat", // Global default
|
|
278
|
+
"fontsize": 64
|
|
279
|
+
},
|
|
280
|
+
"devices": {
|
|
281
|
+
"iphone": {
|
|
282
|
+
"captionFont": "SF Pro" // Device override
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
314
286
|
```
|
|
315
287
|
|
|
316
|
-
|
|
317
|
-
Configure device positioning and caption styling interactively.
|
|
318
|
-
|
|
319
|
-
Options:
|
|
320
|
-
- `--device <name>` - Device name (iphone, ipad, mac, watch)
|
|
321
|
-
- `--reset` - Reset device styling to defaults (removes all custom settings)
|
|
322
|
-
|
|
323
|
-
Features:
|
|
324
|
-
- **Auto frame selection** - Enable/disable automatic frame selection based on screenshot dimensions
|
|
325
|
-
- **Preferred frame** - Choose specific device frame when auto selection is disabled
|
|
326
|
-
- **Partial frames** - Toggle on/off and adjust cut-off percentage (15%-50%)
|
|
327
|
-
- **Frame positioning** - Top, center, bottom, or custom positioning (0-100%)
|
|
328
|
-
- **Frame scaling** - Control device size (75%-130% or custom)
|
|
329
|
-
- **Caption customization** - Device-specific size, position, and box behavior
|
|
330
|
-
- **Caption box** - Auto-sizing, max lines, line height adjustments
|
|
331
|
-
- **Interactive prompts** - Step-by-step configuration with visual descriptions
|
|
332
|
-
|
|
333
|
-
### `appshot build`
|
|
334
|
-
Generate final screenshots with frames, gradients, and captions.
|
|
335
|
-
|
|
336
|
-
Options:
|
|
337
|
-
- `--devices <list>` - Comma-separated device list
|
|
338
|
-
- `--preset <ids>` - Use specific App Store presets (e.g., iphone-6-9,ipad-13)
|
|
339
|
-
- `--config <file>` - Use specific config file (default: .appshot/config.json)
|
|
340
|
-
- `--langs <list>` - Comma-separated language codes
|
|
341
|
-
- `--preview` - Generate low-res previews
|
|
342
|
-
- `--concurrency <n>` - Parallel processing limit
|
|
343
|
-
- `--no-frame` - Skip device frames
|
|
344
|
-
- `--no-gradient` - Skip gradient backgrounds
|
|
345
|
-
- `--no-caption` - Skip captions
|
|
288
|
+
#### Intelligent Fallbacks
|
|
346
289
|
|
|
347
|
-
|
|
348
|
-
Display device specifications and resolutions.
|
|
290
|
+
Every font automatically includes appropriate fallback chains:
|
|
349
291
|
|
|
350
|
-
|
|
351
|
-
|
|
292
|
+
- **SF Pro** β `system-ui, -apple-system, Helvetica, Arial, sans-serif`
|
|
293
|
+
- **Custom Serif** β `'Custom Serif', Georgia, Times New Roman, serif`
|
|
294
|
+
- **Code Font** β `'Code Font', Monaco, Consolas, monospace`
|
|
352
295
|
|
|
353
|
-
|
|
354
|
-
- `--all` - Remove all generated files including .appshot/ directory
|
|
355
|
-
- `--history` - Clear caption autocomplete history
|
|
356
|
-
- `--keep-history` - Preserve caption history when using --all
|
|
357
|
-
- `--yes` - Skip confirmation prompt
|
|
296
|
+
#### System Font Detection
|
|
358
297
|
|
|
359
|
-
|
|
360
|
-
-
|
|
361
|
-
-
|
|
298
|
+
- **macOS**: Uses `system_profiler` for complete font list
|
|
299
|
+
- **Linux**: Uses `fc-list` for fontconfig fonts
|
|
300
|
+
- **Windows**: PowerShell queries font registry
|
|
362
301
|
|
|
363
|
-
###
|
|
364
|
-
Validate project configuration and assets.
|
|
302
|
+
### Device Frames
|
|
365
303
|
|
|
366
|
-
|
|
367
|
-
- `--fix` - Attempt to fix issues automatically
|
|
304
|
+
#### Smart Frame Selection
|
|
368
305
|
|
|
369
|
-
|
|
370
|
-
Manage App Store screenshot presets for all official resolutions.
|
|
306
|
+
Appshot automatically detects screenshot orientation and selects the appropriate frame:
|
|
371
307
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
308
|
+
```json
|
|
309
|
+
{
|
|
310
|
+
"devices": {
|
|
311
|
+
"iphone": {
|
|
312
|
+
"autoFrame": true, // Auto-detect orientation
|
|
313
|
+
"preferredFrame": "iphone-16-pro-max-portrait" // Override
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
```
|
|
378
318
|
|
|
379
|
-
|
|
380
|
-
Validate screenshots against App Store requirements.
|
|
319
|
+
#### Partial Frames
|
|
381
320
|
|
|
382
|
-
|
|
383
|
-
- `--strict` - Validate against required presets only
|
|
384
|
-
- `--fix` - Suggest fixes for invalid screenshots
|
|
321
|
+
Create modern App Store screenshots with cut-off device frames:
|
|
385
322
|
|
|
386
|
-
|
|
387
|
-
|
|
323
|
+
```json
|
|
324
|
+
{
|
|
325
|
+
"devices": {
|
|
326
|
+
"iphone": {
|
|
327
|
+
"partialFrame": true,
|
|
328
|
+
"frameOffset": 25, // Cut 25% from bottom
|
|
329
|
+
"framePosition": 40, // Position at 40% from top
|
|
330
|
+
"frameScale": 0.85 // Scale to 85%
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
```
|
|
388
335
|
|
|
389
|
-
|
|
390
|
-
- `--langs <codes>` - Target languages (comma-separated, required)
|
|
391
|
-
- `--device <name>` - Specific device or all devices
|
|
392
|
-
- `--model <name>` - OpenAI model to use (default: gpt-4o-mini)
|
|
393
|
-
- `--source <lang>` - Source language (default: en)
|
|
394
|
-
- `--review` - Review translations before saving
|
|
395
|
-
- `--overwrite` - Overwrite existing translations
|
|
336
|
+
### Caption System
|
|
396
337
|
|
|
397
|
-
|
|
398
|
-
- **GPT-4o models**: gpt-4o, gpt-4o-mini (using max_tokens)
|
|
399
|
-
- **GPT-5 models**: gpt-5, gpt-5-mini, gpt-5-nano (using max_completion_tokens)
|
|
400
|
-
- **o1 models**: o1, o1-mini (reasoning models)
|
|
401
|
-
- **o3 models**: o3, o3-mini (latest reasoning models)
|
|
338
|
+
#### Dynamic Caption Box
|
|
402
339
|
|
|
403
|
-
|
|
404
|
-
```bash
|
|
405
|
-
# Translate all captions to Spanish, French, and German
|
|
406
|
-
appshot localize --langs es,fr,de
|
|
340
|
+
Intelligent caption rendering that adapts to content:
|
|
407
341
|
|
|
408
|
-
|
|
409
|
-
|
|
342
|
+
```json
|
|
343
|
+
{
|
|
344
|
+
"caption": {
|
|
345
|
+
"position": "above", // above or overlay
|
|
346
|
+
"box": {
|
|
347
|
+
"autoSize": true, // Dynamic height
|
|
348
|
+
"maxLines": 3, // Line limit
|
|
349
|
+
"lineHeight": 1.4, // Line spacing
|
|
350
|
+
"minHeight": 100,
|
|
351
|
+
"maxHeight": 500
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
```
|
|
410
356
|
|
|
411
|
-
|
|
412
|
-
appshot localize --langs zh-CN,zh-TW --model gpt-5
|
|
357
|
+
#### Caption Autocomplete
|
|
413
358
|
|
|
414
|
-
|
|
415
|
-
appshot localize --langs es,fr --overwrite
|
|
416
|
-
```
|
|
359
|
+
The caption command includes intelligent autocomplete:
|
|
417
360
|
|
|
418
|
-
Setup:
|
|
419
361
|
```bash
|
|
420
|
-
|
|
421
|
-
|
|
362
|
+
appshot caption --device iphone
|
|
363
|
+
# Features:
|
|
364
|
+
# - Fuzzy search
|
|
365
|
+
# - Frequency tracking
|
|
366
|
+
# - Device-specific suggestions
|
|
367
|
+
# - Pattern detection
|
|
422
368
|
```
|
|
423
369
|
|
|
424
|
-
|
|
370
|
+
Keyboard shortcuts:
|
|
371
|
+
- **Tab** - Complete suggestion
|
|
372
|
+
- **ββ** - Navigate suggestions
|
|
373
|
+
- **Enter** - Select
|
|
374
|
+
- **Esc** - Dismiss
|
|
375
|
+
|
|
376
|
+
## π Localization & Translation
|
|
377
|
+
|
|
378
|
+
### AI-Powered Translation
|
|
425
379
|
|
|
426
|
-
Appshot
|
|
380
|
+
Appshot integrates with OpenAI for instant caption translation.
|
|
427
381
|
|
|
428
|
-
|
|
382
|
+
#### Setup
|
|
429
383
|
|
|
430
|
-
First, set your OpenAI API key:
|
|
431
384
|
```bash
|
|
432
385
|
export OPENAI_API_KEY="your-api-key-here"
|
|
433
386
|
```
|
|
434
387
|
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
Translate captions instantly as you type them:
|
|
388
|
+
#### Real-Time Translation
|
|
438
389
|
|
|
439
390
|
```bash
|
|
440
|
-
#
|
|
441
|
-
appshot caption --device iphone --translate --langs es,fr
|
|
442
|
-
|
|
443
|
-
# Use a specific model for higher quality
|
|
444
|
-
appshot caption --device iphone --translate --langs zh-CN,ja --model gpt-5
|
|
445
|
-
```
|
|
391
|
+
# Translate as you type
|
|
392
|
+
appshot caption --device iphone --translate --langs es,fr,de
|
|
446
393
|
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
394
|
+
# Output:
|
|
395
|
+
# ? home.png: Welcome to the future
|
|
396
|
+
# es: Bienvenido al futuro
|
|
397
|
+
# fr: Bienvenue dans le futur
|
|
398
|
+
# de: Willkommen in der Zukunft
|
|
452
399
|
```
|
|
453
400
|
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
Translate all existing captions at once:
|
|
401
|
+
#### Batch Translation
|
|
457
402
|
|
|
458
403
|
```bash
|
|
459
|
-
# Translate all captions
|
|
404
|
+
# Translate all existing captions
|
|
460
405
|
appshot localize --langs es,fr,de,ja,zh-CN
|
|
461
406
|
|
|
462
|
-
#
|
|
407
|
+
# Device-specific translation
|
|
463
408
|
appshot localize --device iphone --langs es,fr
|
|
464
409
|
|
|
465
|
-
#
|
|
466
|
-
appshot localize --langs es,fr --review
|
|
467
|
-
|
|
468
|
-
# Use GPT-5 for best quality
|
|
410
|
+
# Use premium model
|
|
469
411
|
appshot localize --langs ja,ko --model gpt-5
|
|
412
|
+
|
|
413
|
+
# Review before saving
|
|
414
|
+
appshot localize --langs es --review
|
|
470
415
|
```
|
|
471
416
|
|
|
472
417
|
### Supported Models
|
|
473
418
|
|
|
474
|
-
|
|
419
|
+
| Model Series | Best For | Parameter | Temperature |
|
|
420
|
+
|-------------|----------|-----------|-------------|
|
|
421
|
+
| **GPT-4o** | Fast, cost-effective | `max_tokens` | 0.3 |
|
|
422
|
+
| **GPT-5** | High-quality, nuanced | `max_completion_tokens` | 1.0 |
|
|
423
|
+
| **o1** | Deep reasoning | `max_completion_tokens` | 1.0 |
|
|
424
|
+
| **o3** | State-of-the-art | `max_completion_tokens` | 1.0 |
|
|
475
425
|
|
|
476
|
-
|
|
477
|
-
- **Models**: `gpt-4o`, `gpt-4o-mini`, `gpt-4-turbo`
|
|
478
|
-
- **Best for**: Fast, cost-effective translations
|
|
479
|
-
- **Parameter**: Uses `max_tokens`
|
|
480
|
-
- **Temperature**: Configurable (default 0.3)
|
|
426
|
+
### Supported Languages
|
|
481
427
|
|
|
482
|
-
|
|
483
|
-
- **
|
|
484
|
-
- **
|
|
485
|
-
- **
|
|
486
|
-
- **
|
|
428
|
+
25+ languages including:
|
|
429
|
+
- **European**: es, fr, de, it, pt, nl, sv, no, da, fi, pl, ru
|
|
430
|
+
- **Asian**: ja, ko, zh-CN, zh-TW, hi, th, vi, id, ms
|
|
431
|
+
- **Middle Eastern**: ar, he, tr
|
|
432
|
+
- **Variants**: pt-BR
|
|
487
433
|
|
|
488
|
-
|
|
489
|
-
- **Models**: `o1`, `o1-mini`
|
|
490
|
-
- **Best for**: Complex marketing copy with cultural adaptation
|
|
491
|
-
- **Parameter**: Uses `max_completion_tokens`
|
|
492
|
-
- **Temperature**: Fixed at 1.0
|
|
434
|
+
### Multi-Language Workflow
|
|
493
435
|
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
- **Parameter**: Uses `max_completion_tokens`
|
|
498
|
-
- **Temperature**: Fixed at 1.0
|
|
436
|
+
```bash
|
|
437
|
+
# 1. Add captions with translation
|
|
438
|
+
appshot caption --device iphone --translate --langs es,fr
|
|
499
439
|
|
|
500
|
-
|
|
440
|
+
# 2. Build localized screenshots
|
|
441
|
+
appshot build --langs en,es,fr
|
|
501
442
|
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
443
|
+
# Output structure (always uses language subdirectories):
|
|
444
|
+
# final/
|
|
445
|
+
# iphone/
|
|
446
|
+
# en/
|
|
447
|
+
# es/
|
|
448
|
+
# fr/
|
|
449
|
+
```
|
|
507
450
|
|
|
508
|
-
|
|
451
|
+
## π± Device Support
|
|
509
452
|
|
|
510
|
-
|
|
511
|
-
Translations are cached to avoid duplicate API calls. If you translate the same caption again, it returns instantly without using API credits.
|
|
453
|
+
### Apple Devices
|
|
512
454
|
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
455
|
+
| Device | Orientations | Frame Variants | Special Features |
|
|
456
|
+
|--------|-------------|----------------|------------------|
|
|
457
|
+
| **iPhone** | Portrait, Landscape | 15+ models | Notch/Dynamic Island support |
|
|
458
|
+
| **iPad** | Portrait, Landscape | 10+ models | Multiple sizes |
|
|
459
|
+
| **Mac** | Landscape | 4 resolutions | 16:10 aspect ratio |
|
|
460
|
+
| **Apple Watch** | Portrait | 5 sizes | Band cropping |
|
|
461
|
+
| **Apple TV** | Landscape | HD, 4K | TV frame |
|
|
462
|
+
| **Vision Pro** | Landscape | 3840Γ2160 | Spatial computing |
|
|
519
463
|
|
|
520
|
-
|
|
521
|
-
- Graceful fallback if API is unavailable
|
|
522
|
-
- Clear error messages for rate limits
|
|
523
|
-
- Automatic retry with delays for batch operations
|
|
524
|
-
- Continues with other translations if one fails
|
|
464
|
+
### App Store Specifications
|
|
525
465
|
|
|
526
|
-
|
|
466
|
+
#### Required Resolutions
|
|
527
467
|
|
|
528
|
-
|
|
468
|
+
**iPhone** (choose one):
|
|
469
|
+
- 6.9" Display: 1290Γ2796 (iPhone 16/15 Pro Max)
|
|
470
|
+
- 6.5" Display: 1284Γ2778 (iPhone 14 Plus)
|
|
529
471
|
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
"defaultModel": "gpt-5",
|
|
533
|
-
"temperature": 0.3,
|
|
534
|
-
"cache": true,
|
|
535
|
-
"systemPrompt": "You are translating premium app marketing text. Keep it impactful and concise."
|
|
536
|
-
}
|
|
537
|
-
```
|
|
472
|
+
**iPad**:
|
|
473
|
+
- 13" Display: 2064Γ2752 or 2048Γ2732
|
|
538
474
|
|
|
539
|
-
|
|
475
|
+
**Mac**:
|
|
476
|
+
- 16:10 aspect: 2880Γ1800, 2560Γ1600, 1440Γ900, or 1280Γ800
|
|
540
477
|
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
3. **Batch operations** are more efficient than real-time for large projects
|
|
544
|
-
4. **Review mode** lets you verify before committing translations
|
|
478
|
+
**Apple Watch**:
|
|
479
|
+
- Must use same size across all localizations
|
|
545
480
|
|
|
546
|
-
|
|
481
|
+
#### Preset Management
|
|
547
482
|
|
|
548
483
|
```bash
|
|
549
|
-
#
|
|
550
|
-
appshot
|
|
551
|
-
|
|
552
|
-
# 2. Add screenshots
|
|
553
|
-
cp ~/Desktop/screenshots/*.png screenshots/iphone/
|
|
484
|
+
# View all presets
|
|
485
|
+
appshot presets
|
|
554
486
|
|
|
555
|
-
#
|
|
556
|
-
appshot
|
|
487
|
+
# Show required only
|
|
488
|
+
appshot presets --required
|
|
557
489
|
|
|
558
|
-
#
|
|
559
|
-
appshot
|
|
490
|
+
# Generate config for specific presets
|
|
491
|
+
appshot presets --generate iphone-6-9,ipad-13
|
|
560
492
|
|
|
561
|
-
#
|
|
562
|
-
|
|
563
|
-
# iphone/
|
|
564
|
-
# en/
|
|
565
|
-
# home.png
|
|
566
|
-
# es/
|
|
567
|
-
# home.png
|
|
568
|
-
# fr/
|
|
569
|
-
# home.png
|
|
570
|
-
# de/
|
|
571
|
-
# home.png
|
|
493
|
+
# Build with presets
|
|
494
|
+
appshot build --preset iphone-6-9,ipad-13
|
|
572
495
|
```
|
|
573
496
|
|
|
574
|
-
|
|
497
|
+
### Validation
|
|
575
498
|
|
|
576
|
-
|
|
499
|
+
```bash
|
|
500
|
+
# Validate against App Store requirements
|
|
501
|
+
appshot validate
|
|
577
502
|
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
"es": "Organiza tu vida",
|
|
584
|
-
"de": "Organisieren Sie Ihr Leben",
|
|
585
|
-
"ja": "δΊΊηγζ΄ηγγ"
|
|
586
|
-
}
|
|
587
|
-
}
|
|
503
|
+
# Strict mode (required presets only)
|
|
504
|
+
appshot validate --strict
|
|
505
|
+
|
|
506
|
+
# Get fix suggestions
|
|
507
|
+
appshot validate --fix
|
|
588
508
|
```
|
|
589
509
|
|
|
590
|
-
|
|
510
|
+
## π Command Reference
|
|
511
|
+
|
|
512
|
+
### `appshot build`
|
|
513
|
+
|
|
514
|
+
Generate final screenshots with frames, gradients, and captions.
|
|
591
515
|
|
|
592
516
|
```bash
|
|
593
|
-
appshot build
|
|
517
|
+
appshot build [options]
|
|
594
518
|
```
|
|
595
519
|
|
|
596
|
-
|
|
520
|
+
**Options:**
|
|
521
|
+
- `--devices <list>` - Comma-separated device list (default: all)
|
|
522
|
+
- `--preset <ids>` - Use App Store presets (e.g., `iphone-6-9,ipad-13`)
|
|
523
|
+
- `--config <file>` - Custom config file (default: `.appshot/config.json`)
|
|
524
|
+
- `--langs <list>` - Build for specific languages (if not specified, auto-detects)
|
|
525
|
+
- `--preview` - Generate low-res previews
|
|
526
|
+
- `--concurrency <n>` - Parallel processing limit (default: 5)
|
|
527
|
+
- `--no-frame` - Skip device frames
|
|
528
|
+
- `--no-gradient` - Skip gradient backgrounds
|
|
529
|
+
- `--no-caption` - Skip captions
|
|
597
530
|
|
|
598
|
-
|
|
531
|
+
**Language Detection:**
|
|
532
|
+
When `--langs` is not specified, appshot automatically determines languages in this order:
|
|
533
|
+
1. Languages found in caption files (if using multi-language captions)
|
|
534
|
+
2. `defaultLanguage` setting in config.json
|
|
535
|
+
3. System locale (e.g., `fr` for French systems)
|
|
536
|
+
4. Fallback to `en`
|
|
599
537
|
|
|
538
|
+
**Examples:**
|
|
600
539
|
```bash
|
|
601
|
-
#
|
|
602
|
-
appshot
|
|
540
|
+
# Build all devices
|
|
541
|
+
appshot build
|
|
603
542
|
|
|
604
|
-
#
|
|
605
|
-
appshot
|
|
543
|
+
# Specific devices and languages
|
|
544
|
+
appshot build --devices iphone,ipad --langs en,fr,es
|
|
606
545
|
|
|
607
|
-
#
|
|
608
|
-
appshot
|
|
609
|
-
```
|
|
546
|
+
# Use App Store presets
|
|
547
|
+
appshot build --preset iphone-6-9-portrait,ipad-13-landscape
|
|
610
548
|
|
|
611
|
-
|
|
549
|
+
# Preview mode
|
|
550
|
+
appshot build --preview --devices iphone
|
|
551
|
+
```
|
|
612
552
|
|
|
613
|
-
**
|
|
614
|
-
-
|
|
615
|
-
-
|
|
553
|
+
**Exit Codes:**
|
|
554
|
+
- `0` - Success
|
|
555
|
+
- `1` - Configuration error
|
|
556
|
+
- `2` - Missing screenshots
|
|
557
|
+
- `3` - Processing error
|
|
616
558
|
|
|
617
|
-
|
|
618
|
-
- **13" Display**: 2064Γ2752 or 2048Γ2732
|
|
559
|
+
### `appshot caption`
|
|
619
560
|
|
|
620
|
-
|
|
621
|
-
- **16:10 aspect ratio**: 2880Γ1800, 2560Γ1600, 1440Γ900, or 1280Γ800
|
|
561
|
+
Add or edit captions with autocomplete and AI translation.
|
|
622
562
|
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
- **Series 9/8/7**: 396Γ484
|
|
563
|
+
```bash
|
|
564
|
+
appshot caption --device <name> [options]
|
|
565
|
+
```
|
|
627
566
|
|
|
628
|
-
|
|
567
|
+
**Options:**
|
|
568
|
+
- `--device <name>` - Device name (required)
|
|
569
|
+
- `--lang <code>` - Primary language (default: en)
|
|
570
|
+
- `--translate` - Enable real-time AI translation
|
|
571
|
+
- `--langs <codes>` - Target languages for translation
|
|
572
|
+
- `--model <name>` - OpenAI model (default: gpt-4o-mini)
|
|
629
573
|
|
|
574
|
+
**Examples:**
|
|
630
575
|
```bash
|
|
631
|
-
#
|
|
632
|
-
appshot
|
|
576
|
+
# Basic caption entry
|
|
577
|
+
appshot caption --device iphone
|
|
633
578
|
|
|
634
|
-
#
|
|
635
|
-
appshot
|
|
636
|
-
```
|
|
579
|
+
# With translation
|
|
580
|
+
appshot caption --device iphone --translate --langs es,fr,de
|
|
637
581
|
|
|
638
|
-
|
|
582
|
+
# Custom model
|
|
583
|
+
appshot caption --device ipad --translate --langs ja --model gpt-5
|
|
584
|
+
```
|
|
639
585
|
|
|
640
|
-
|
|
586
|
+
### `appshot check`
|
|
641
587
|
|
|
642
|
-
|
|
588
|
+
Validate project configuration and assets.
|
|
643
589
|
|
|
644
590
|
```bash
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
cd appshot
|
|
591
|
+
appshot check [options]
|
|
592
|
+
```
|
|
648
593
|
|
|
649
|
-
|
|
650
|
-
|
|
594
|
+
**Options:**
|
|
595
|
+
- `--fix` - Attempt automatic fixes
|
|
651
596
|
|
|
652
|
-
|
|
653
|
-
|
|
597
|
+
**Checks:**
|
|
598
|
+
- Configuration file validity
|
|
599
|
+
- Screenshot presence
|
|
600
|
+
- Frame availability
|
|
601
|
+
- Directory structure
|
|
602
|
+
- Caption files
|
|
654
603
|
|
|
655
|
-
|
|
656
|
-
npm test
|
|
604
|
+
### `appshot clean`
|
|
657
605
|
|
|
658
|
-
|
|
659
|
-
|
|
606
|
+
Remove generated files and temporary data.
|
|
607
|
+
|
|
608
|
+
```bash
|
|
609
|
+
appshot clean [options]
|
|
660
610
|
```
|
|
661
611
|
|
|
662
|
-
|
|
612
|
+
**Options:**
|
|
613
|
+
- `--all` - Remove all generated files including `.appshot/`
|
|
614
|
+
- `--history` - Clear caption autocomplete history
|
|
615
|
+
- `--keep-history` - Preserve history when using `--all`
|
|
616
|
+
- `--yes` - Skip confirmation prompt
|
|
663
617
|
|
|
664
|
-
|
|
618
|
+
**Examples:**
|
|
619
|
+
```bash
|
|
620
|
+
# Clean output only
|
|
621
|
+
appshot clean
|
|
665
622
|
|
|
666
|
-
|
|
623
|
+
# Full reset
|
|
624
|
+
appshot clean --all --yes
|
|
667
625
|
|
|
668
|
-
|
|
626
|
+
# Clear history
|
|
627
|
+
appshot clean --history
|
|
628
|
+
```
|
|
669
629
|
|
|
670
|
-
|
|
630
|
+
### `appshot fonts`
|
|
671
631
|
|
|
672
|
-
|
|
632
|
+
Browse, validate, and set fonts for captions.
|
|
673
633
|
|
|
674
|
-
|
|
634
|
+
```bash
|
|
635
|
+
appshot fonts [options]
|
|
636
|
+
```
|
|
675
637
|
|
|
676
|
-
|
|
638
|
+
**Options:**
|
|
639
|
+
- `--all` - List all system fonts
|
|
640
|
+
- `--recommended` - Show recommended fonts only (default)
|
|
641
|
+
- `--validate <name>` - Check if font is available
|
|
642
|
+
- `--set <name>` - Set the caption font
|
|
643
|
+
- `--select` - Interactive font selection
|
|
644
|
+
- `--device <name>` - Target specific device (with --set or --select)
|
|
645
|
+
- `--json` - Output as JSON
|
|
677
646
|
|
|
678
|
-
|
|
647
|
+
**Examples:**
|
|
648
|
+
```bash
|
|
649
|
+
# Browse recommended fonts
|
|
650
|
+
appshot fonts
|
|
679
651
|
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
- **Mac screenshots** always use landscape frames
|
|
683
|
-
- **Watch screenshots** always use portrait frames
|
|
652
|
+
# Set global font directly
|
|
653
|
+
appshot fonts --set "Montserrat"
|
|
684
654
|
|
|
685
|
-
|
|
655
|
+
# Interactive font selection
|
|
656
|
+
appshot fonts --select
|
|
686
657
|
|
|
687
|
-
|
|
658
|
+
# Set device-specific font
|
|
659
|
+
appshot fonts --set "SF Pro" --device iphone
|
|
688
660
|
|
|
689
|
-
|
|
661
|
+
# Validate before setting
|
|
662
|
+
appshot fonts --validate "My Font" && appshot fonts --set "My Font"
|
|
690
663
|
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
"frameOffset": 25 // Cut off bottom 25%
|
|
697
|
-
}
|
|
698
|
-
}
|
|
699
|
-
}
|
|
664
|
+
# List all system fonts
|
|
665
|
+
appshot fonts --all
|
|
666
|
+
|
|
667
|
+
# JSON output for automation
|
|
668
|
+
appshot fonts --json > fonts.json
|
|
700
669
|
```
|
|
701
670
|
|
|
702
|
-
###
|
|
671
|
+
### `appshot gradients`
|
|
703
672
|
|
|
704
|
-
|
|
673
|
+
Manage gradient presets.
|
|
705
674
|
|
|
706
|
-
```
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
"position": "above", // or "overlay"
|
|
710
|
-
"paddingTop": 120,
|
|
711
|
-
"paddingBottom": 80
|
|
712
|
-
}
|
|
713
|
-
}
|
|
675
|
+
```bash
|
|
676
|
+
appshot gradients [options]
|
|
677
|
+
appshot gradients select
|
|
714
678
|
```
|
|
715
679
|
|
|
716
|
-
|
|
680
|
+
**Options:**
|
|
681
|
+
- `--list` - List all presets (default)
|
|
682
|
+
- `--category <name>` - Filter by category
|
|
683
|
+
- `--preview <id>` - Generate preview image
|
|
684
|
+
- `--sample` - Generate all samples with HTML
|
|
685
|
+
- `--apply <id>` - Apply preset to project
|
|
686
|
+
|
|
687
|
+
**Examples:**
|
|
688
|
+
```bash
|
|
689
|
+
# Browse all
|
|
690
|
+
appshot gradients
|
|
717
691
|
|
|
718
|
-
|
|
692
|
+
# Apply preset
|
|
693
|
+
appshot gradients --apply ocean
|
|
719
694
|
|
|
720
|
-
|
|
695
|
+
# Interactive selection
|
|
696
|
+
appshot gradients select
|
|
721
697
|
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
- Device frame position
|
|
726
|
-
- Available space constraints
|
|
727
|
-
3. **Smart Positioning** - Caption space adjusts to device placement:
|
|
728
|
-
- Device at **top** β Minimal caption space (15% of screen)
|
|
729
|
-
- Device at **center** β Balanced caption space
|
|
730
|
-
- Device at **bottom** β Maximum caption space (up to 50% of screen)
|
|
698
|
+
# Generate samples
|
|
699
|
+
appshot gradients --sample
|
|
700
|
+
```
|
|
731
701
|
|
|
732
|
-
|
|
702
|
+
### `appshot init`
|
|
733
703
|
|
|
734
|
-
|
|
704
|
+
Initialize new project with scaffolding.
|
|
735
705
|
|
|
736
|
-
```
|
|
737
|
-
|
|
738
|
-
"caption": {
|
|
739
|
-
"fontsize": 64,
|
|
740
|
-
"box": {
|
|
741
|
-
"autoSize": true, // Auto-size height based on content
|
|
742
|
-
"maxLines": 3, // Maximum lines before truncation
|
|
743
|
-
"lineHeight": 1.4, // Line spacing (1.2-1.8)
|
|
744
|
-
"minHeight": 100, // Minimum caption area height
|
|
745
|
-
"maxHeight": 500 // Maximum caption area height
|
|
746
|
-
}
|
|
747
|
-
}
|
|
748
|
-
}
|
|
706
|
+
```bash
|
|
707
|
+
appshot init [options]
|
|
749
708
|
```
|
|
750
709
|
|
|
751
|
-
|
|
710
|
+
**Options:**
|
|
711
|
+
- `--force` - Overwrite existing files
|
|
752
712
|
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
"maxLines": 2, // Watch limited to 2 lines
|
|
766
|
-
"lineHeight": 1.3 // Tighter spacing
|
|
767
|
-
}
|
|
768
|
-
}
|
|
769
|
-
}
|
|
770
|
-
}
|
|
713
|
+
**Creates:**
|
|
714
|
+
- `.appshot/config.json`
|
|
715
|
+
- `.appshot/captions/`
|
|
716
|
+
- `screenshots/` directories
|
|
717
|
+
- Default configuration
|
|
718
|
+
|
|
719
|
+
### `appshot migrate`
|
|
720
|
+
|
|
721
|
+
Migrate project structure to latest version.
|
|
722
|
+
|
|
723
|
+
```bash
|
|
724
|
+
appshot migrate [options]
|
|
771
725
|
```
|
|
772
726
|
|
|
773
|
-
|
|
727
|
+
**Options:**
|
|
728
|
+
- `--output-structure` - Migrate to language subdirectory structure
|
|
729
|
+
- `--dry-run` - Preview changes without making them
|
|
730
|
+
- `--lang <code>` - Language to use for migration (default: system language)
|
|
774
731
|
|
|
775
|
-
**
|
|
776
|
-
|
|
777
|
-
|
|
732
|
+
**Examples:**
|
|
733
|
+
```bash
|
|
734
|
+
# Migrate existing screenshots to language subdirectories
|
|
735
|
+
appshot migrate --output-structure
|
|
778
736
|
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
- `framePosition: "center"` β Caption gets ~700px height
|
|
782
|
-
- `framePosition: "bottom"` β Caption gets ~1400px height
|
|
737
|
+
# Preview migration without changes
|
|
738
|
+
appshot migrate --output-structure --dry-run
|
|
783
739
|
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
- Test with `appshot build --preview` to quickly iterate
|
|
788
|
-
- Adjust `lineHeight` for visual balance (1.4 recommended)
|
|
740
|
+
# Specify target language
|
|
741
|
+
appshot migrate --output-structure --lang fr
|
|
742
|
+
```
|
|
789
743
|
|
|
790
|
-
###
|
|
744
|
+
### `appshot localize`
|
|
791
745
|
|
|
792
|
-
|
|
746
|
+
Batch translate all captions using AI.
|
|
793
747
|
|
|
794
|
-
```
|
|
795
|
-
|
|
748
|
+
```bash
|
|
749
|
+
appshot localize --langs <codes> [options]
|
|
750
|
+
```
|
|
751
|
+
|
|
752
|
+
**Options:**
|
|
753
|
+
- `--langs <codes>` - Target languages (required)
|
|
754
|
+
- `--device <name>` - Specific device only
|
|
755
|
+
- `--model <name>` - OpenAI model (default: gpt-4o-mini)
|
|
756
|
+
- `--source <lang>` - Source language (default: en)
|
|
757
|
+
- `--review` - Review before saving
|
|
758
|
+
- `--overwrite` - Replace existing translations
|
|
759
|
+
|
|
760
|
+
**Examples:**
|
|
761
|
+
```bash
|
|
762
|
+
# Translate all
|
|
763
|
+
appshot localize --langs es,fr,de
|
|
764
|
+
|
|
765
|
+
# Device-specific
|
|
766
|
+
appshot localize --device iphone --langs ja,ko
|
|
767
|
+
|
|
768
|
+
# Premium model with review
|
|
769
|
+
appshot localize --langs zh-CN --model gpt-5 --review
|
|
770
|
+
```
|
|
771
|
+
|
|
772
|
+
### `appshot presets`
|
|
773
|
+
|
|
774
|
+
Manage App Store screenshot presets.
|
|
775
|
+
|
|
776
|
+
```bash
|
|
777
|
+
appshot presets [options]
|
|
778
|
+
```
|
|
779
|
+
|
|
780
|
+
**Options:**
|
|
781
|
+
- `--list` - List all presets (default)
|
|
782
|
+
- `--required` - Show required only
|
|
783
|
+
- `--generate <ids>` - Generate config for presets
|
|
784
|
+
- `--category <type>` - Filter by device type
|
|
785
|
+
- `--output <file>` - Output file for config
|
|
786
|
+
|
|
787
|
+
**Examples:**
|
|
788
|
+
```bash
|
|
789
|
+
# View all
|
|
790
|
+
appshot presets
|
|
791
|
+
|
|
792
|
+
# Required only
|
|
793
|
+
appshot presets --required
|
|
794
|
+
|
|
795
|
+
# Generate config
|
|
796
|
+
appshot presets --generate iphone-6-9,ipad-13
|
|
797
|
+
```
|
|
798
|
+
|
|
799
|
+
### `appshot specs`
|
|
800
|
+
|
|
801
|
+
Display device specifications.
|
|
802
|
+
|
|
803
|
+
```bash
|
|
804
|
+
appshot specs [options]
|
|
805
|
+
```
|
|
806
|
+
|
|
807
|
+
**Options:**
|
|
808
|
+
- `--device <name>` - Filter by device
|
|
809
|
+
- `--json` - Output as JSON
|
|
810
|
+
|
|
811
|
+
**Shows:**
|
|
812
|
+
- Supported resolutions
|
|
813
|
+
- Frame availability
|
|
814
|
+
- Orientation support
|
|
815
|
+
- App Store requirements
|
|
816
|
+
|
|
817
|
+
### `appshot style`
|
|
818
|
+
|
|
819
|
+
Configure device styling interactively.
|
|
820
|
+
|
|
821
|
+
```bash
|
|
822
|
+
appshot style --device <name> [options]
|
|
823
|
+
```
|
|
824
|
+
|
|
825
|
+
**Options:**
|
|
826
|
+
- `--device <name>` - Device name (required)
|
|
827
|
+
- `--reset` - Reset to defaults
|
|
828
|
+
|
|
829
|
+
**Configures:**
|
|
830
|
+
- Font selection
|
|
831
|
+
- Frame settings
|
|
832
|
+
- Partial frames
|
|
833
|
+
- Frame positioning
|
|
834
|
+
- Frame scaling
|
|
835
|
+
- Caption settings
|
|
836
|
+
|
|
837
|
+
**Examples:**
|
|
838
|
+
```bash
|
|
839
|
+
# Configure iPhone
|
|
840
|
+
appshot style --device iphone
|
|
841
|
+
|
|
842
|
+
# Reset to defaults
|
|
843
|
+
appshot style --device iphone --reset
|
|
844
|
+
```
|
|
845
|
+
|
|
846
|
+
### `appshot validate`
|
|
847
|
+
|
|
848
|
+
Validate screenshots against App Store requirements.
|
|
849
|
+
|
|
850
|
+
```bash
|
|
851
|
+
appshot validate [options]
|
|
852
|
+
```
|
|
853
|
+
|
|
854
|
+
**Options:**
|
|
855
|
+
- `--strict` - Validate required presets only
|
|
856
|
+
- `--fix` - Show fix suggestions
|
|
857
|
+
|
|
858
|
+
**Validates:**
|
|
859
|
+
- Resolution compliance
|
|
860
|
+
- Aspect ratios
|
|
861
|
+
- Required presets
|
|
862
|
+
- File formats
|
|
863
|
+
|
|
864
|
+
## βοΈ Configuration Reference
|
|
865
|
+
|
|
866
|
+
### Complete Schema
|
|
867
|
+
|
|
868
|
+
```json
|
|
869
|
+
{
|
|
870
|
+
"output": "./final", // Output directory
|
|
871
|
+
"frames": "./frames", // Frame directory
|
|
872
|
+
"defaultLanguage": "en", // Default language for builds (optional)
|
|
873
|
+
"gradient": {
|
|
874
|
+
"colors": ["#hex1", "#hex2"],
|
|
875
|
+
"direction": "top-bottom" // or diagonal, left-right
|
|
876
|
+
},
|
|
877
|
+
"caption": {
|
|
878
|
+
"font": "Font Name",
|
|
879
|
+
"fontsize": 64, // Pixels
|
|
880
|
+
"color": "#FFFFFF",
|
|
881
|
+
"align": "center", // left, center, right
|
|
882
|
+
"position": "above", // above, overlay
|
|
883
|
+
"paddingTop": 100,
|
|
884
|
+
"paddingBottom": 60,
|
|
885
|
+
"box": {
|
|
886
|
+
"autoSize": true, // Dynamic height
|
|
887
|
+
"maxLines": 3,
|
|
888
|
+
"lineHeight": 1.4,
|
|
889
|
+
"minHeight": 100,
|
|
890
|
+
"maxHeight": 500
|
|
891
|
+
}
|
|
892
|
+
},
|
|
796
893
|
"devices": {
|
|
797
894
|
"iphone": {
|
|
798
|
-
"
|
|
799
|
-
"
|
|
800
|
-
"
|
|
801
|
-
"
|
|
802
|
-
"
|
|
803
|
-
"
|
|
804
|
-
"
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
895
|
+
"input": "./screenshots/iphone",
|
|
896
|
+
"resolution": "1284x2778",
|
|
897
|
+
"autoFrame": true,
|
|
898
|
+
"preferredFrame": "frame-name",
|
|
899
|
+
"partialFrame": false,
|
|
900
|
+
"frameOffset": 25, // Percentage
|
|
901
|
+
"framePosition": "center", // or top, bottom, 0-100
|
|
902
|
+
"frameScale": 0.9, // 0.5-2.0
|
|
903
|
+
"captionFont": "Override",
|
|
904
|
+
"captionSize": 72,
|
|
905
|
+
"captionPosition": "above",
|
|
906
|
+
"captionBox": {
|
|
907
|
+
"autoSize": false,
|
|
908
|
+
"minHeight": 320,
|
|
909
|
+
"maxHeight": 320
|
|
808
910
|
}
|
|
809
|
-
},
|
|
810
|
-
"watch": {
|
|
811
|
-
"framePosition": "bottom", // Position at bottom
|
|
812
|
-
"frameScale": 1.3, // Make watch larger
|
|
813
|
-
"partialFrame": true, // Cut off band
|
|
814
|
-
"frameOffset": 30 // Cut 30% from bottom
|
|
815
911
|
}
|
|
816
912
|
}
|
|
817
913
|
}
|
|
818
914
|
```
|
|
819
915
|
|
|
820
|
-
###
|
|
916
|
+
### Device Configuration
|
|
821
917
|
|
|
822
|
-
|
|
918
|
+
Each device can override global settings:
|
|
823
919
|
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
920
|
+
```json
|
|
921
|
+
{
|
|
922
|
+
"devices": {
|
|
923
|
+
"iphone": {
|
|
924
|
+
// Required
|
|
925
|
+
"input": "./screenshots/iphone",
|
|
926
|
+
"resolution": "1284x2778",
|
|
927
|
+
|
|
928
|
+
// Frame options
|
|
929
|
+
"autoFrame": true,
|
|
930
|
+
"preferredFrame": "iphone-16-pro-max-portrait",
|
|
931
|
+
"partialFrame": true,
|
|
932
|
+
"frameOffset": 25,
|
|
933
|
+
"framePosition": 40,
|
|
934
|
+
"frameScale": 0.85,
|
|
935
|
+
|
|
936
|
+
// Caption overrides
|
|
937
|
+
"captionFont": "SF Pro",
|
|
938
|
+
"captionSize": 64,
|
|
939
|
+
"captionPosition": "above",
|
|
940
|
+
"captionBox": {
|
|
941
|
+
"autoSize": false,
|
|
942
|
+
"minHeight": 320,
|
|
943
|
+
"maxHeight": 320,
|
|
944
|
+
"maxLines": 3
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
```
|
|
830
950
|
|
|
831
|
-
|
|
951
|
+
### Fixed Layout Configuration
|
|
832
952
|
|
|
833
|
-
|
|
953
|
+
For consistent screenshots regardless of caption length:
|
|
834
954
|
|
|
835
955
|
```json
|
|
836
956
|
{
|
|
837
957
|
"devices": {
|
|
838
958
|
"iphone": {
|
|
839
|
-
"autoFrame": false,
|
|
840
|
-
"preferredFrame": "iphone-16-pro-max-portrait",
|
|
841
|
-
"frameScale": 0.85,
|
|
842
|
-
"framePosition": 40,
|
|
959
|
+
"autoFrame": false,
|
|
960
|
+
"preferredFrame": "iphone-16-pro-max-portrait",
|
|
961
|
+
"frameScale": 0.85,
|
|
962
|
+
"framePosition": 40,
|
|
843
963
|
"captionBox": {
|
|
844
|
-
"autoSize": false,
|
|
845
|
-
"minHeight": 320,
|
|
846
|
-
"maxHeight": 320
|
|
964
|
+
"autoSize": false, // Critical
|
|
965
|
+
"minHeight": 320, // Fixed height
|
|
966
|
+
"maxHeight": 320 // Same as min
|
|
847
967
|
}
|
|
848
968
|
}
|
|
849
969
|
}
|
|
850
970
|
}
|
|
851
971
|
```
|
|
852
972
|
|
|
853
|
-
|
|
973
|
+
## π€ Agent & Automation Guide
|
|
974
|
+
|
|
975
|
+
### Design Principles
|
|
976
|
+
|
|
977
|
+
Appshot is built for automation:
|
|
978
|
+
|
|
979
|
+
1. **Predictable** - Consistent commands and outputs
|
|
980
|
+
2. **Scriptable** - JSON configs, exit codes, no GUI
|
|
981
|
+
3. **Composable** - Unix philosophy, pipe-friendly
|
|
982
|
+
4. **Fast** - Parallel processing, no overhead
|
|
983
|
+
|
|
984
|
+
### JSON Output Mode
|
|
985
|
+
|
|
986
|
+
Most commands support JSON output for parsing:
|
|
987
|
+
|
|
988
|
+
```bash
|
|
989
|
+
# Device specs as JSON
|
|
990
|
+
appshot specs --json
|
|
991
|
+
|
|
992
|
+
# Font list as JSON
|
|
993
|
+
appshot fonts --json
|
|
994
|
+
|
|
995
|
+
# Preset data as JSON
|
|
996
|
+
appshot presets --json
|
|
997
|
+
|
|
998
|
+
# Validation results as JSON
|
|
999
|
+
appshot validate --json
|
|
1000
|
+
```
|
|
1001
|
+
|
|
1002
|
+
### Exit Codes
|
|
1003
|
+
|
|
1004
|
+
| Code | Meaning | Commands |
|
|
1005
|
+
|------|---------|----------|
|
|
1006
|
+
| 0 | Success | All |
|
|
1007
|
+
| 1 | Configuration error | build, check |
|
|
1008
|
+
| 2 | Missing files | build, validate |
|
|
1009
|
+
| 3 | Processing error | build |
|
|
1010
|
+
| 4 | Invalid input | All |
|
|
1011
|
+
| 5 | API error | localize, caption |
|
|
1012
|
+
|
|
1013
|
+
### Batch Operations
|
|
1014
|
+
|
|
1015
|
+
```bash
|
|
1016
|
+
# Process multiple devices
|
|
1017
|
+
appshot build --devices iphone,ipad,mac
|
|
1018
|
+
|
|
1019
|
+
# Multiple languages
|
|
1020
|
+
appshot build --langs en,es,fr,de,ja
|
|
1021
|
+
|
|
1022
|
+
# Parallel processing
|
|
1023
|
+
appshot build --concurrency 10
|
|
1024
|
+
```
|
|
1025
|
+
|
|
1026
|
+
### CI/CD Integration
|
|
1027
|
+
|
|
1028
|
+
#### GitHub Actions
|
|
1029
|
+
|
|
1030
|
+
```yaml
|
|
1031
|
+
name: Generate Screenshots
|
|
1032
|
+
on: [push]
|
|
1033
|
+
|
|
1034
|
+
jobs:
|
|
1035
|
+
screenshots:
|
|
1036
|
+
runs-on: macos-latest
|
|
1037
|
+
steps:
|
|
1038
|
+
- uses: actions/checkout@v2
|
|
1039
|
+
|
|
1040
|
+
- name: Setup Node
|
|
1041
|
+
uses: actions/setup-node@v2
|
|
1042
|
+
with:
|
|
1043
|
+
node-version: '18'
|
|
1044
|
+
|
|
1045
|
+
- name: Install Appshot
|
|
1046
|
+
run: npm install -g appshot-cli
|
|
1047
|
+
|
|
1048
|
+
- name: Generate Screenshots
|
|
1049
|
+
run: |
|
|
1050
|
+
appshot init --force
|
|
1051
|
+
appshot gradients --apply ocean
|
|
1052
|
+
appshot build --preset iphone-6-9,ipad-13
|
|
1053
|
+
|
|
1054
|
+
- name: Upload Artifacts
|
|
1055
|
+
uses: actions/upload-artifact@v2
|
|
1056
|
+
with:
|
|
1057
|
+
name: screenshots
|
|
1058
|
+
path: final/
|
|
1059
|
+
```
|
|
1060
|
+
|
|
1061
|
+
#### Shell Script Automation
|
|
1062
|
+
|
|
1063
|
+
```bash
|
|
1064
|
+
#!/bin/bash
|
|
1065
|
+
set -e
|
|
1066
|
+
|
|
1067
|
+
# Configure
|
|
1068
|
+
cat > .appshot/config.json << EOF
|
|
1069
|
+
{
|
|
1070
|
+
"gradient": {"colors": ["#FF5733", "#FFC300"]},
|
|
1071
|
+
"devices": {
|
|
1072
|
+
"iphone": {"resolution": "1284x2778"}
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
EOF
|
|
1076
|
+
|
|
1077
|
+
# Add captions programmatically
|
|
1078
|
+
echo '{"home.png": "Welcome"}' > .appshot/captions/iphone.json
|
|
1079
|
+
|
|
1080
|
+
# Build
|
|
1081
|
+
appshot build --devices iphone
|
|
1082
|
+
|
|
1083
|
+
# Validate
|
|
1084
|
+
appshot validate --strict || exit 1
|
|
1085
|
+
```
|
|
1086
|
+
|
|
1087
|
+
### MCP Integration
|
|
854
1088
|
|
|
855
|
-
|
|
856
|
-
- Use with `preferredFrame` to specify exact device frame
|
|
857
|
-
- Ensures consistent frame across all screenshots
|
|
1089
|
+
Works with Model Context Protocol tools:
|
|
858
1090
|
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
1091
|
+
```bash
|
|
1092
|
+
# MCP captures screenshot
|
|
1093
|
+
mcp-screenshot capture --output ./screenshots/iphone/home.png
|
|
862
1094
|
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
1095
|
+
# Appshot processes
|
|
1096
|
+
appshot build --devices iphone --no-interactive
|
|
1097
|
+
```
|
|
866
1098
|
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
1099
|
+
### Python Automation
|
|
1100
|
+
|
|
1101
|
+
```python
|
|
1102
|
+
import subprocess
|
|
1103
|
+
import json
|
|
1104
|
+
|
|
1105
|
+
def generate_screenshots(device, captions):
|
|
1106
|
+
# Configure
|
|
1107
|
+
config = {
|
|
1108
|
+
"gradient": {"colors": ["#0077BE", "#33CCCC"]},
|
|
1109
|
+
"devices": {
|
|
1110
|
+
device: {"resolution": "1284x2778"}
|
|
1111
|
+
}
|
|
1112
|
+
}
|
|
1113
|
+
|
|
1114
|
+
with open('.appshot/config.json', 'w') as f:
|
|
1115
|
+
json.dump(config, f)
|
|
1116
|
+
|
|
1117
|
+
# Add captions
|
|
1118
|
+
with open(f'.appshot/captions/{device}.json', 'w') as f:
|
|
1119
|
+
json.dump(captions, f)
|
|
1120
|
+
|
|
1121
|
+
# Build
|
|
1122
|
+
result = subprocess.run(
|
|
1123
|
+
['appshot', 'build', '--devices', device],
|
|
1124
|
+
capture_output=True,
|
|
1125
|
+
text=True
|
|
1126
|
+
)
|
|
1127
|
+
|
|
1128
|
+
return result.returncode == 0
|
|
1129
|
+
|
|
1130
|
+
# Usage
|
|
1131
|
+
captions = {
|
|
1132
|
+
"home.png": "Your Dashboard",
|
|
1133
|
+
"settings.png": "Customize Everything"
|
|
1134
|
+
}
|
|
1135
|
+
generate_screenshots("iphone", captions)
|
|
1136
|
+
```
|
|
1137
|
+
|
|
1138
|
+
### Node.js Automation
|
|
1139
|
+
|
|
1140
|
+
```javascript
|
|
1141
|
+
import { exec } from 'child_process';
|
|
1142
|
+
import { writeFileSync } from 'fs';
|
|
1143
|
+
|
|
1144
|
+
async function generateScreenshots() {
|
|
1145
|
+
// 1. Initialize
|
|
1146
|
+
await execPromise('appshot init --force');
|
|
1147
|
+
|
|
1148
|
+
// 2. Configure
|
|
1149
|
+
const config = {
|
|
1150
|
+
gradient: { colors: ['#FF5733', '#FFC300'] },
|
|
1151
|
+
caption: { font: 'SF Pro', fontsize: 64 }
|
|
1152
|
+
};
|
|
1153
|
+
writeFileSync('.appshot/config.json', JSON.stringify(config));
|
|
1154
|
+
|
|
1155
|
+
// 3. Add captions
|
|
1156
|
+
const captions = {
|
|
1157
|
+
'home.png': {
|
|
1158
|
+
en: 'Welcome',
|
|
1159
|
+
es: 'Bienvenido',
|
|
1160
|
+
fr: 'Bienvenue'
|
|
1161
|
+
}
|
|
1162
|
+
};
|
|
1163
|
+
writeFileSync('.appshot/captions/iphone.json', JSON.stringify(captions));
|
|
1164
|
+
|
|
1165
|
+
// 4. Build with multiple languages
|
|
1166
|
+
await execPromise('appshot build --langs en,es,fr');
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
function execPromise(cmd) {
|
|
1170
|
+
return new Promise((resolve, reject) => {
|
|
1171
|
+
exec(cmd, (error, stdout) => {
|
|
1172
|
+
if (error) reject(error);
|
|
1173
|
+
else resolve(stdout);
|
|
1174
|
+
});
|
|
1175
|
+
});
|
|
1176
|
+
}
|
|
1177
|
+
```
|
|
870
1178
|
|
|
871
|
-
|
|
872
|
-
- Both MUST be set to same value
|
|
873
|
-
- Creates fixed caption area regardless of text length
|
|
1179
|
+
## π― Recipes & Examples
|
|
874
1180
|
|
|
875
|
-
|
|
1181
|
+
### App Store Submission Workflow
|
|
1182
|
+
|
|
1183
|
+
```bash
|
|
1184
|
+
# 1. Initialize project
|
|
1185
|
+
appshot init
|
|
1186
|
+
|
|
1187
|
+
# 2. Configure for App Store
|
|
1188
|
+
appshot presets --generate iphone-6-9,ipad-13 > .appshot/config.json
|
|
1189
|
+
|
|
1190
|
+
# 3. Add screenshots
|
|
1191
|
+
cp simulator/*.png screenshots/iphone/
|
|
1192
|
+
|
|
1193
|
+
# 4. Add captions with translation
|
|
1194
|
+
export OPENAI_API_KEY="sk-..."
|
|
1195
|
+
appshot caption --device iphone --translate --langs es,fr,de,ja,zh-CN
|
|
1196
|
+
|
|
1197
|
+
# 5. Apply premium gradient
|
|
1198
|
+
appshot gradients --apply twilight
|
|
1199
|
+
|
|
1200
|
+
# 6. Configure styling
|
|
1201
|
+
appshot style --device iphone
|
|
1202
|
+
|
|
1203
|
+
# 7. Build all localizations
|
|
1204
|
+
appshot build --preset iphone-6-9,ipad-13 --langs en,es,fr,de,ja,zh-CN
|
|
1205
|
+
|
|
1206
|
+
# 8. Validate
|
|
1207
|
+
appshot validate --strict
|
|
1208
|
+
|
|
1209
|
+
# 9. Output ready in final/
|
|
1210
|
+
```
|
|
1211
|
+
|
|
1212
|
+
### Consistent Marketing Screenshots
|
|
1213
|
+
|
|
1214
|
+
For identical device positioning across all screenshots:
|
|
876
1215
|
|
|
877
1216
|
```json
|
|
878
1217
|
{
|
|
879
|
-
"gradient": {
|
|
880
|
-
"colors": ["#FF5733", "#FFC300"],
|
|
881
|
-
"direction": "top-bottom"
|
|
882
|
-
},
|
|
883
|
-
"caption": {
|
|
884
|
-
"fontsize": 64,
|
|
885
|
-
"color": "#FFFFFF",
|
|
886
|
-
"align": "center",
|
|
887
|
-
"paddingTop": 100
|
|
888
|
-
},
|
|
889
1218
|
"devices": {
|
|
890
1219
|
"iphone": {
|
|
891
|
-
"input": "./screenshots/iphone",
|
|
892
1220
|
"resolution": "1284x2778",
|
|
893
1221
|
"autoFrame": false,
|
|
894
1222
|
"preferredFrame": "iphone-16-pro-max-portrait",
|
|
1223
|
+
"frameScale": 0.85,
|
|
1224
|
+
"framePosition": 40,
|
|
1225
|
+
"partialFrame": true,
|
|
1226
|
+
"frameOffset": 25,
|
|
895
1227
|
"captionBox": {
|
|
896
1228
|
"autoSize": false,
|
|
897
1229
|
"minHeight": 320,
|
|
898
1230
|
"maxHeight": 320,
|
|
899
1231
|
"maxLines": 3
|
|
900
|
-
}
|
|
901
|
-
"frameScale": 0.85,
|
|
902
|
-
"framePosition": 40
|
|
1232
|
+
}
|
|
903
1233
|
}
|
|
904
1234
|
}
|
|
905
1235
|
}
|
|
906
1236
|
```
|
|
907
1237
|
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
1238
|
+
### Brand Guidelines Compliance
|
|
1239
|
+
|
|
1240
|
+
```json
|
|
1241
|
+
{
|
|
1242
|
+
"gradient": {
|
|
1243
|
+
"colors": ["#BrandColor1", "#BrandColor2"],
|
|
1244
|
+
"direction": "diagonal"
|
|
1245
|
+
},
|
|
1246
|
+
"caption": {
|
|
1247
|
+
"font": "Brand Font Name",
|
|
1248
|
+
"fontsize": 72,
|
|
1249
|
+
"color": "#BrandTextColor",
|
|
1250
|
+
"align": "center"
|
|
1251
|
+
}
|
|
1252
|
+
}
|
|
1253
|
+
```
|
|
1254
|
+
|
|
1255
|
+
### Multi-Device Campaign
|
|
1256
|
+
|
|
1257
|
+
```bash
|
|
1258
|
+
# Configure each device
|
|
1259
|
+
appshot style --device iphone
|
|
1260
|
+
appshot style --device ipad
|
|
1261
|
+
appshot style --device mac
|
|
1262
|
+
|
|
1263
|
+
# Build all at once
|
|
1264
|
+
appshot build --devices iphone,ipad,mac --langs en,es,fr
|
|
1265
|
+
|
|
1266
|
+
# Output structure (language subdirectories):
|
|
1267
|
+
# final/
|
|
1268
|
+
# iphone/
|
|
1269
|
+
# en/ es/ fr/
|
|
1270
|
+
# ipad/
|
|
1271
|
+
# en/ es/ fr/
|
|
1272
|
+
# mac/
|
|
1273
|
+
# en/ es/ fr/
|
|
1274
|
+
```
|
|
1275
|
+
|
|
1276
|
+
### A/B Testing Different Styles
|
|
914
1277
|
|
|
915
|
-
|
|
1278
|
+
```bash
|
|
1279
|
+
# Version A - Ocean gradient
|
|
1280
|
+
appshot gradients --apply ocean
|
|
1281
|
+
appshot build --devices iphone --output final-ocean
|
|
916
1282
|
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
3. **Frame Position** - Set vertical position (top, center, bottom, or 0-100%)
|
|
921
|
-
4. **Frame Scale** - Adjust device size
|
|
922
|
-
5. **Caption Settings** - Customize text size, position, and box behavior
|
|
1283
|
+
# Version B - Sunset gradient
|
|
1284
|
+
appshot gradients --apply sunset
|
|
1285
|
+
appshot build --devices iphone --output final-sunset
|
|
923
1286
|
|
|
924
|
-
|
|
1287
|
+
# Version C - Monochrome
|
|
1288
|
+
appshot gradients --apply noir
|
|
1289
|
+
appshot build --devices iphone --output final-noir
|
|
1290
|
+
```
|
|
1291
|
+
|
|
1292
|
+
## π§ Troubleshooting
|
|
1293
|
+
|
|
1294
|
+
### Common Issues
|
|
1295
|
+
|
|
1296
|
+
#### Screenshots Not Found
|
|
925
1297
|
|
|
926
|
-
To reset a device to default settings:
|
|
927
1298
|
```bash
|
|
928
|
-
|
|
1299
|
+
# Check path configuration
|
|
1300
|
+
appshot check
|
|
1301
|
+
|
|
1302
|
+
# Verify screenshot location
|
|
1303
|
+
ls screenshots/iphone/
|
|
1304
|
+
|
|
1305
|
+
# Fix: Update config
|
|
1306
|
+
{
|
|
1307
|
+
"devices": {
|
|
1308
|
+
"iphone": {
|
|
1309
|
+
"input": "./correct/path/to/screenshots"
|
|
1310
|
+
}
|
|
1311
|
+
}
|
|
1312
|
+
}
|
|
929
1313
|
```
|
|
930
1314
|
|
|
931
|
-
|
|
1315
|
+
#### Font Not Rendering
|
|
932
1316
|
|
|
933
|
-
|
|
1317
|
+
```bash
|
|
1318
|
+
# 1. Validate font availability
|
|
1319
|
+
appshot fonts --validate "Font Name"
|
|
934
1320
|
|
|
935
|
-
|
|
1321
|
+
# 2. Use fallback font
|
|
1322
|
+
appshot fonts --recommended
|
|
936
1323
|
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
1324
|
+
# 3. Set web-safe font
|
|
1325
|
+
{
|
|
1326
|
+
"caption": {
|
|
1327
|
+
"font": "Arial" // Always works
|
|
1328
|
+
}
|
|
1329
|
+
}
|
|
1330
|
+
```
|
|
942
1331
|
|
|
943
|
-
|
|
1332
|
+
#### Translation Not Working
|
|
944
1333
|
|
|
945
|
-
|
|
1334
|
+
```bash
|
|
1335
|
+
# Check API key
|
|
1336
|
+
echo $OPENAI_API_KEY
|
|
1337
|
+
|
|
1338
|
+
# Test with different model
|
|
1339
|
+
appshot caption --device iphone --translate --model gpt-4o-mini
|
|
1340
|
+
|
|
1341
|
+
# Check rate limits
|
|
1342
|
+
# Wait 60 seconds between large batches
|
|
1343
|
+
```
|
|
1344
|
+
|
|
1345
|
+
#### Blurry Output
|
|
946
1346
|
|
|
947
1347
|
```bash
|
|
948
|
-
#
|
|
949
|
-
|
|
1348
|
+
# Ensure high-res input
|
|
1349
|
+
# Minimum: 1242x2208 for iPhone
|
|
950
1350
|
|
|
951
|
-
#
|
|
1351
|
+
# Check scaling
|
|
1352
|
+
{
|
|
1353
|
+
"devices": {
|
|
1354
|
+
"iphone": {
|
|
1355
|
+
"frameScale": 1.0 // No scaling
|
|
1356
|
+
}
|
|
1357
|
+
}
|
|
1358
|
+
}
|
|
1359
|
+
```
|
|
1360
|
+
|
|
1361
|
+
#### Memory Issues with Large Batches
|
|
1362
|
+
|
|
1363
|
+
```bash
|
|
1364
|
+
# Reduce concurrency
|
|
1365
|
+
appshot build --concurrency 2
|
|
1366
|
+
|
|
1367
|
+
# Process in batches
|
|
952
1368
|
appshot build --devices iphone
|
|
1369
|
+
appshot build --devices ipad
|
|
953
1370
|
```
|
|
954
1371
|
|
|
955
|
-
###
|
|
1372
|
+
### Performance Tips
|
|
956
1373
|
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
1374
|
+
1. **Use appropriate concurrency**
|
|
1375
|
+
```bash
|
|
1376
|
+
# For 8GB RAM
|
|
1377
|
+
appshot build --concurrency 3
|
|
1378
|
+
|
|
1379
|
+
# For 16GB+ RAM
|
|
1380
|
+
appshot build --concurrency 8
|
|
1381
|
+
```
|
|
1382
|
+
|
|
1383
|
+
2. **Optimize images before processing**
|
|
1384
|
+
```bash
|
|
1385
|
+
# Use imagemagick to optimize
|
|
1386
|
+
mogrify -quality 95 screenshots/iphone/*.png
|
|
1387
|
+
```
|
|
1388
|
+
|
|
1389
|
+
3. **Cache translations**
|
|
1390
|
+
- Translations are automatically cached
|
|
1391
|
+
- Reuse improves speed and reduces costs
|
|
1392
|
+
|
|
1393
|
+
4. **Use preview mode for testing**
|
|
1394
|
+
```bash
|
|
1395
|
+
appshot build --preview
|
|
1396
|
+
```
|
|
1397
|
+
|
|
1398
|
+
### Error Messages
|
|
1399
|
+
|
|
1400
|
+
| Error | Cause | Solution |
|
|
1401
|
+
|-------|-------|----------|
|
|
1402
|
+
| `Frame not found` | Missing frame file | Run `appshot check --fix` |
|
|
1403
|
+
| `Invalid resolution` | Wrong dimensions | Check with `appshot validate` |
|
|
1404
|
+
| `Font validation failed` | Font not available | Use `appshot fonts` to find alternatives |
|
|
1405
|
+
| `API rate limit` | Too many requests | Add delays or reduce batch size |
|
|
1406
|
+
| `Out of memory` | Large images | Reduce concurrency or image size |
|
|
1407
|
+
|
|
1408
|
+
## π§βπ» Development
|
|
1409
|
+
|
|
1410
|
+
### Building from Source
|
|
1411
|
+
|
|
1412
|
+
```bash
|
|
1413
|
+
# Clone repository
|
|
1414
|
+
git clone https://github.com/chrisvanbuskirk/appshot.git
|
|
1415
|
+
cd appshot
|
|
1416
|
+
|
|
1417
|
+
# Install dependencies
|
|
1418
|
+
npm install
|
|
1419
|
+
|
|
1420
|
+
# Build TypeScript
|
|
1421
|
+
npm run build
|
|
1422
|
+
|
|
1423
|
+
# Run tests
|
|
1424
|
+
npm test
|
|
1425
|
+
|
|
1426
|
+
# Link for local development
|
|
1427
|
+
npm link
|
|
1428
|
+
|
|
1429
|
+
# Run in development mode
|
|
1430
|
+
npm run dev -- build --devices iphone
|
|
1431
|
+
```
|
|
1432
|
+
|
|
1433
|
+
### Project Structure
|
|
1434
|
+
|
|
1435
|
+
```
|
|
1436
|
+
appshot/
|
|
1437
|
+
βββ src/
|
|
1438
|
+
β βββ cli.ts # Entry point
|
|
1439
|
+
β βββ commands/ # Command implementations
|
|
1440
|
+
β βββ core/ # Core functionality
|
|
1441
|
+
β βββ services/ # Services (fonts, translation)
|
|
1442
|
+
β βββ types.ts # TypeScript definitions
|
|
1443
|
+
βββ tests/ # Test files
|
|
1444
|
+
βββ frames/ # Device frame images
|
|
1445
|
+
βββ examples/ # Example projects
|
|
979
1446
|
```
|
|
980
1447
|
|
|
981
|
-
###
|
|
1448
|
+
### Testing
|
|
1449
|
+
|
|
1450
|
+
Appshot includes comprehensive test coverage with unit tests, integration tests, and CI/CD validation.
|
|
1451
|
+
|
|
1452
|
+
#### Test Suites
|
|
1453
|
+
|
|
1454
|
+
- **Unit Tests** (50+ test files)
|
|
1455
|
+
- Device detection and frame selection
|
|
1456
|
+
- Gradient rendering and presets
|
|
1457
|
+
- Font validation and fallbacks
|
|
1458
|
+
- Caption positioning and text wrapping
|
|
1459
|
+
- Multi-language support
|
|
1460
|
+
- App Store specifications validation
|
|
982
1461
|
|
|
983
|
-
- **
|
|
984
|
-
-
|
|
985
|
-
-
|
|
986
|
-
-
|
|
987
|
-
-
|
|
1462
|
+
- **Integration Tests** (`tests/integration/`)
|
|
1463
|
+
- Full CLI command testing
|
|
1464
|
+
- End-to-end workflow validation
|
|
1465
|
+
- Multi-platform compatibility
|
|
1466
|
+
- Error handling scenarios
|
|
1467
|
+
|
|
1468
|
+
- **CI/CD Testing**
|
|
1469
|
+
- Automated testing on every PR
|
|
1470
|
+
- Multi-OS testing (Ubuntu, macOS, Windows)
|
|
1471
|
+
- Multi-Node version testing (18.x, 20.x, 22.x)
|
|
1472
|
+
- Visual validation workflows
|
|
1473
|
+
- Screenshot artifact generation
|
|
1474
|
+
|
|
1475
|
+
```bash
|
|
1476
|
+
# Run all tests
|
|
1477
|
+
npm test
|
|
1478
|
+
|
|
1479
|
+
# Run specific test
|
|
1480
|
+
npm test -- fonts.test.ts
|
|
1481
|
+
|
|
1482
|
+
# Run integration tests
|
|
1483
|
+
npm test -- tests/integration/cli-integration.test.ts
|
|
1484
|
+
|
|
1485
|
+
# Watch mode
|
|
1486
|
+
npm run test:watch
|
|
1487
|
+
|
|
1488
|
+
# Run with coverage
|
|
1489
|
+
npm run test:coverage
|
|
1490
|
+
```
|
|
988
1491
|
|
|
989
|
-
|
|
1492
|
+
### Contributing
|
|
990
1493
|
|
|
991
|
-
|
|
992
|
-
|
|
1494
|
+
We welcome contributions! Please:
|
|
1495
|
+
|
|
1496
|
+
1. Fork the repository
|
|
1497
|
+
2. Create a feature branch
|
|
1498
|
+
3. Add tests for new features
|
|
1499
|
+
4. Ensure all tests pass
|
|
1500
|
+
5. Submit a pull request
|
|
1501
|
+
|
|
1502
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
|
|
1503
|
+
|
|
1504
|
+
## πΊοΈ Roadmap
|
|
1505
|
+
|
|
1506
|
+
### Completed β
|
|
1507
|
+
- [x] Official App Store specifications
|
|
1508
|
+
- [x] Caption positioning (above/overlay)
|
|
993
1509
|
- [x] Partial frame support
|
|
994
1510
|
- [x] Intelligent caption autocomplete
|
|
995
1511
|
- [x] Apple Watch optimizations
|
|
996
1512
|
- [x] Gradient presets system (24+ gradients)
|
|
997
|
-
- [x]
|
|
998
|
-
- [
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
- [ ]
|
|
1002
|
-
- [ ]
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
- [ ]
|
|
1006
|
-
- [ ]
|
|
1007
|
-
- [ ]
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
- [
|
|
1012
|
-
- [
|
|
1013
|
-
|
|
1513
|
+
- [x] AI-Powered Translations (GPT-4o, GPT-5, o1, o3)
|
|
1514
|
+
- [x] Comprehensive Font System (v0.4.0)
|
|
1515
|
+
|
|
1516
|
+
### In Progress π§
|
|
1517
|
+
- [ ] MCP Integration Guide
|
|
1518
|
+
- [ ] Agent API Mode
|
|
1519
|
+
|
|
1520
|
+
### Planned π
|
|
1521
|
+
- [ ] Android Device Support (Google Play Store)
|
|
1522
|
+
- [ ] Batch Config Files
|
|
1523
|
+
- [ ] Screenshot Validation API
|
|
1524
|
+
- [ ] Auto-Caption Generation
|
|
1525
|
+
- [ ] Smart Frame Detection
|
|
1526
|
+
- [ ] Pipeline Mode
|
|
1527
|
+
- [ ] WebP/AVIF Support
|
|
1528
|
+
- [ ] Differential Builds
|
|
1529
|
+
|
|
1530
|
+
## π License & Support
|
|
1531
|
+
|
|
1532
|
+
### License
|
|
1533
|
+
|
|
1534
|
+
MIT Β© Chris Van Buskirk
|
|
1535
|
+
|
|
1536
|
+
### Support
|
|
1537
|
+
|
|
1538
|
+
- π [Report Issues](https://github.com/chrisvanbuskirk/appshot/issues)
|
|
1539
|
+
- π‘ [Request Features](https://github.com/chrisvanbuskirk/appshot/issues/new?labels=enhancement)
|
|
1540
|
+
- π [Documentation Wiki](https://github.com/chrisvanbuskirk/appshot/wiki)
|
|
1541
|
+
- π¬ [Discussions](https://github.com/chrisvanbuskirk/appshot/discussions)
|
|
1542
|
+
|
|
1543
|
+
### Security
|
|
1544
|
+
|
|
1545
|
+
For security vulnerabilities, please see [SECURITY.md](SECURITY.md).
|
|
1546
|
+
|
|
1547
|
+
### NPM Package
|
|
1548
|
+
|
|
1549
|
+
- π¦ [appshot-cli on NPM](https://www.npmjs.com/package/appshot-cli)
|
|
1550
|
+
- π Latest version: 0.4.0
|
|
1551
|
+
- β¬οΈ Weekly downloads: 
|
|
1552
|
+
|
|
1553
|
+
---
|
|
1554
|
+
|
|
1555
|
+
<div align="center">
|
|
1556
|
+
Built with β€οΈ for developers and AI agents who automate everything.
|
|
1557
|
+
</div>
|