appshot-cli 0.8.7 → 0.9.1

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.
Files changed (65) hide show
  1. package/README.md +784 -15
  2. package/dist/cli.js +24 -5
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/build.d.ts.map +1 -1
  5. package/dist/commands/build.js +16 -2
  6. package/dist/commands/build.js.map +1 -1
  7. package/dist/commands/export.d.ts +3 -0
  8. package/dist/commands/export.d.ts.map +1 -0
  9. package/dist/commands/export.js +382 -0
  10. package/dist/commands/export.js.map +1 -0
  11. package/dist/commands/order.d.ts +3 -0
  12. package/dist/commands/order.d.ts.map +1 -0
  13. package/dist/commands/order.js +321 -0
  14. package/dist/commands/order.js.map +1 -0
  15. package/dist/commands/preset.d.ts +5 -0
  16. package/dist/commands/preset.d.ts.map +1 -0
  17. package/dist/commands/preset.js +191 -0
  18. package/dist/commands/preset.js.map +1 -0
  19. package/dist/commands/quickstart.d.ts +3 -0
  20. package/dist/commands/quickstart.d.ts.map +1 -0
  21. package/dist/commands/quickstart.js +326 -0
  22. package/dist/commands/quickstart.js.map +1 -0
  23. package/dist/commands/style.d.ts.map +1 -1
  24. package/dist/commands/style.js +98 -0
  25. package/dist/commands/style.js.map +1 -1
  26. package/dist/commands/template.d.ts +3 -0
  27. package/dist/commands/template.d.ts.map +1 -0
  28. package/dist/commands/template.js +399 -0
  29. package/dist/commands/template.js.map +1 -0
  30. package/dist/core/compose.d.ts +16 -0
  31. package/dist/core/compose.d.ts.map +1 -1
  32. package/dist/core/compose.js +342 -83
  33. package/dist/core/compose.js.map +1 -1
  34. package/dist/services/doctor.js +1 -1
  35. package/dist/services/export-validator.d.ts +23 -0
  36. package/dist/services/export-validator.d.ts.map +1 -0
  37. package/dist/services/export-validator.js +209 -0
  38. package/dist/services/export-validator.js.map +1 -0
  39. package/dist/services/fastlane-config-generator.d.ts +17 -0
  40. package/dist/services/fastlane-config-generator.d.ts.map +1 -0
  41. package/dist/services/fastlane-config-generator.js +343 -0
  42. package/dist/services/fastlane-config-generator.js.map +1 -0
  43. package/dist/services/fastlane-language-mapper.d.ts +33 -0
  44. package/dist/services/fastlane-language-mapper.d.ts.map +1 -0
  45. package/dist/services/fastlane-language-mapper.js +167 -0
  46. package/dist/services/fastlane-language-mapper.js.map +1 -0
  47. package/dist/services/screenshot-order.d.ts +41 -0
  48. package/dist/services/screenshot-order.d.ts.map +1 -0
  49. package/dist/services/screenshot-order.js +211 -0
  50. package/dist/services/screenshot-order.js.map +1 -0
  51. package/dist/services/screenshot-organizer.d.ts +44 -0
  52. package/dist/services/screenshot-organizer.d.ts.map +1 -0
  53. package/dist/services/screenshot-organizer.js +234 -0
  54. package/dist/services/screenshot-organizer.js.map +1 -0
  55. package/dist/templates/registry.d.ts +73 -0
  56. package/dist/templates/registry.d.ts.map +1 -0
  57. package/dist/templates/registry.js +724 -0
  58. package/dist/templates/registry.js.map +1 -0
  59. package/dist/types.d.ts +15 -0
  60. package/dist/types.d.ts.map +1 -1
  61. package/dist/utils/validation.d.ts +36 -0
  62. package/dist/utils/validation.d.ts.map +1 -0
  63. package/dist/utils/validation.js +143 -0
  64. package/dist/utils/validation.js.map +1 -0
  65. package/package.json +3 -2
package/README.md CHANGED
@@ -2,19 +2,45 @@
2
2
 
3
3
  > **AI-First CLI for App Store Screenshots** - Generate beautiful, localized screenshots with device frames, gradients, and captions.
4
4
 
5
+ 🌐 https://appshot.sh
6
+
5
7
  [![CI](https://github.com/chrisvanbuskirk/appshot/actions/workflows/ci.yml/badge.svg)](https://github.com/chrisvanbuskirk/appshot/actions/workflows/ci.yml)
6
8
  [![npm version](https://badge.fury.io/js/appshot-cli.svg)](https://www.npmjs.com/package/appshot-cli)
7
9
  [![npm downloads](https://img.shields.io/npm/dm/appshot-cli.svg)](https://www.npmjs.com/package/appshot-cli)
8
10
  [![Node.js Version](https://img.shields.io/node/v/appshot-cli.svg)](https://nodejs.org)
9
11
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
10
12
 
11
- 🆕 **Version 0.8.6** - **Background Images** - Replace gradients with custom static images, auto-detection, and dimension validation!
12
-
13
- > ⚠️ **NEW in v0.8.6**: Use custom background images instead of gradients! Auto-detects `background.png` in device folders, supports multiple fit modes, and validates dimensions against App Store specs.
14
-
15
- > ⚠️ **BREAKING CHANGE in v0.4.0**: Output structure now always uses language subdirectories.
16
- > Single language builds now output to `final/device/lang/` instead of `final/device/`.
17
- > Run `appshot migrate --output-structure` to update existing projects.
13
+ 🆕 **Version 0.9.1** - **Fastlane Export Integration & Screenshot Ordering**
14
+ - **Export Command**: New `appshot export` command for seamless Fastlane integration
15
+ - **Screenshot Ordering**: New `appshot order` command to control App Store screenshot sequence
16
+ - **Order Flag**: Export with `--order` to add numeric prefixes (01_, 02_, etc.)
17
+ - **Smart Ordering**: Handles existing prefixes, prevents double-prefixing
18
+ - **Auto-Detection**: Automatically detects languages from your screenshots
19
+ - **Language Mapping**: Smart mapping to Fastlane-compatible language codes (en → en-US, etc.)
20
+ - **Device Filtering**: Export specific devices with `--devices iphone,ipad`
21
+ - **Validation**: Pre-export validation with warnings and clear error messages
22
+ - **Configuration Generation**: Auto-generate Deliverfile and Fastfile with `--generate-config`
23
+ - **Flexible Output**: Choose between symlinks (default) or file copying with `--copy`
24
+ - **iPad Pro Support**: Automatic IPAD_PRO_3GEN_129_ prefix for proper Fastlane recognition
25
+ - **Dry Run Mode**: Preview export operations with `--dry-run`
26
+
27
+ **Version 0.9.0** - **Professional Template System & Enhanced Positioning**
28
+ - **Quick Start**: New `appshot quickstart` command for instant setup with templates
29
+ - **Templates**: 8 professional templates (modern, minimal, bold, elegant, showcase, playful, corporate, nerdy)
30
+ - **One Command Setup**: Apply complete visual styles with `appshot template <name>`
31
+ - **Smart Defaults**: Each template includes optimized settings for all devices
32
+ - **Caption Integration**: Templates can include captions directly with `--caption`
33
+ - **Vertical Alignment**: Pin caption text to top or center within the caption box
34
+ - **Side Margins**: Control caption box width with `sideMargin` (unified wrapping calculation)
35
+ - **Outer Margins**: Add spacing with `marginTop`/`marginBottom` for better visual balance
36
+ - **Apple Watch Fix**: Resolved positioning bug allowing proper framePosition control
37
+ - **Exact Width Parity**: Caption wrapping now identical between preview and final render
38
+ - **Template Samples Overhaul**: Local-only gallery with consolidated generator. Run `npm run samples` to regenerate all 8 presets across iPhone, iPad, Watch, and Mac. Gallery assets now live under `template-samples/gallery/` and the samples page matches the appshot.sh look (including ASCII header).
39
+
40
+ > Note on layout changes (0.9.0): This release refines caption placement rules.
41
+ > - Overlay captions are anchored by the bottom of the entire caption box (padding/border included), and `0` values are respected.
42
+ > - Above/Below captions enforce a minimum optical clearance from the device and stay fully on‑canvas. In pathological cases where device + caption don’t fit, the engine adapts placement so order is preserved.
43
+ > - Visual results may differ compared to 0.8.x when captions were near device edges. Adjust `marginTop` (below) / `marginBottom` (above) or `frameScale`/`framePosition` for fine‑tuning.
18
44
 
19
45
  ## 📖 Table of Contents
20
46
 
@@ -24,14 +50,17 @@
24
50
  - [Prerequisites](#prerequisites)
25
51
  - [Installation](#installation)
26
52
  - [Your First Screenshot](#your-first-screenshot)
53
+ - [Claude Code Integration](#-claude-code-integration)
27
54
  - [Core Concepts](#-core-concepts)
28
55
  - [Visual Customization](#-visual-customization)
29
56
  - [Gradient System](#gradient-system)
30
57
  - [Font System](#font-system)
31
58
  - [Device Frames](#device-frames)
32
59
  - [Caption System](#caption-system)
60
+ - [Style System Guide](#style-system-guide)
33
61
  - [Localization & Translation](#-localization--translation)
34
62
  - [Device Support](#-device-support)
63
+ - [Fastlane Integration](#-fastlane-integration)
35
64
  - [Command Reference](#-command-reference)
36
65
  - [Configuration Reference](#️-configuration-reference)
37
66
  - [Agent & Automation Guide](#-agent--automation-guide)
@@ -45,6 +74,8 @@
45
74
 
46
75
  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.
47
76
 
77
+ **NEW in v0.9.0**: One-line preset commands! Generate professional screenshots instantly with `appshot preset bold --caption "Amazing App" --devices iphone,watch`
78
+
48
79
  ### Key Differentiators
49
80
 
50
81
  - 🤖 **Agent-First Design** - JSON outputs, predictable commands, no interactive prompts in automation mode
@@ -97,9 +128,28 @@ appshot --version
97
128
 
98
129
  > **Note**: The package is called `appshot-cli` on NPM, but the command is `appshot`
99
130
 
100
- ### Your First Screenshot
131
+ ### Your First Screenshot - Two Ways
132
+
133
+ #### Option 1: Quick Start with Templates (NEW! 🎨)
101
134
 
102
- Create App Store-ready screenshots in 5 simple steps:
135
+ The fastest way to get professional screenshots:
136
+
137
+ ```bash
138
+ # One command interactive setup
139
+ appshot quickstart
140
+
141
+ # Or apply a specific template
142
+ appshot template modern --caption "Your Amazing App"
143
+
144
+ # Build your screenshots
145
+ appshot build
146
+
147
+ # ✨ Professional screenshots ready in seconds!
148
+ ```
149
+
150
+ #### Option 2: Traditional Step-by-Step
151
+
152
+ Full control over every aspect:
103
153
 
104
154
  ```bash
105
155
  # 1. Initialize your project
@@ -166,6 +216,82 @@ final/
166
216
  └── dashboard.png # 2048×2732 iPad Pro screenshot
167
217
  ```
168
218
 
219
+ ## 🤖 Claude Code Integration
220
+
221
+ Appshot includes comprehensive [Claude Code](https://claude.ai/code) slash commands for AI-assisted screenshot generation. See the [complete commands documentation](./commands/README.md) for detailed examples and workflows.
222
+
223
+ ### Available Commands
224
+
225
+ Appshot provides specialized commands for different tasks:
226
+
227
+ - `/appshot-init` - Initialize and configure new projects
228
+ - `/appshot-preset` - One-line preset commands for instant screenshots
229
+ - `/appshot-style` - Apply gradients, fonts, and visual styling
230
+ - `/appshot-caption` - Manage captions and translations
231
+ - `/appshot-build` - Build screenshots with troubleshooting
232
+ - `/appshot-config` - Complete configuration reference
233
+ - `/appshot-quick` - Quick reference for common tasks
234
+
235
+ ### Quick Installation
236
+
237
+ ```bash
238
+ # If you have AppShot source code
239
+ cd appshot
240
+ ./commands/install.sh
241
+
242
+ # If installed via npm
243
+ cd node_modules/appshot-cli
244
+ ./commands/install.sh
245
+
246
+ # Manual installation
247
+ mkdir -p ~/.claude/commands
248
+ ln -sf "$(pwd)/commands"/*.md ~/.claude/commands/
249
+ ```
250
+
251
+ ### How It Works
252
+
253
+ When you use a command like `/appshot-style ocean iphone` in Claude Code:
254
+
255
+ 1. Claude receives complete documentation for that specific task
256
+ 2. All necessary configurations and examples are provided inline
257
+ 3. No need to search documentation or run help commands
258
+ 4. Claude can immediately execute the appropriate AppShot CLI commands
259
+
260
+ ### Example Conversation
261
+
262
+ ```
263
+ User: I need to add Apple Watch support to my existing iPhone project
264
+
265
+ Claude: I'll help you add Apple Watch to your project. Let me use /appshot-config
266
+ to show you the exact configuration needed.
267
+
268
+ Add this to your .appshot/config.json under "devices":
269
+
270
+ "watch": {
271
+ "input": "./screenshots/watch",
272
+ "resolution": "410x502",
273
+ "autoFrame": true
274
+ }
275
+
276
+ Note: Apple Watch has special caption handling - uses 2-line wrapping
277
+ and smaller font size (36px max) for the smaller screen.
278
+ ```
279
+
280
+ ### Features for AI Agents
281
+
282
+ - **Self-Contained**: Each command includes all necessary information
283
+ - **No Lookups Required**: Commands work without external documentation
284
+ - **Agent-Friendly**: Non-interactive commands for full automation
285
+ - **Complete Examples**: Real-world configurations and workflows
286
+ - **Troubleshooting**: Built-in solutions for common issues
287
+
288
+ ### Learn More
289
+
290
+ For complete documentation, examples, and advanced workflows, see:
291
+ - 📚 [Commands Documentation](./commands/README.md) - Full guide with examples
292
+ - 📁 [Commands Directory](./commands/) - Individual command files
293
+ - 🛠️ [Installation Script](./commands/install.sh) - Automated setup
294
+
169
295
  ## 📘 Core Concepts
170
296
 
171
297
  ### Project Structure
@@ -246,6 +372,132 @@ All settings are stored in `.appshot/config.json`:
246
372
 
247
373
  ## 🎨 Visual Customization
248
374
 
375
+ ### Template System (NEW! 🚀)
376
+
377
+ Appshot now includes professional screenshot templates that configure everything with a single command. Each template includes carefully designed backgrounds, device positioning, caption styling, and device-specific optimizations.
378
+
379
+ #### Quick Start with Templates
380
+
381
+ ```bash
382
+ # Interactive template selection
383
+ appshot quickstart
384
+
385
+ # Apply a specific template
386
+ appshot template modern
387
+
388
+ # Apply template with caption
389
+ appshot template minimal --caption "Beautiful & Simple"
390
+
391
+ # Preview template settings
392
+ appshot template --preview bold
393
+
394
+ # List all templates
395
+ appshot template --list
396
+ ```
397
+
398
+ #### Available Templates
399
+
400
+ 📸 **[View Template Gallery](./template-samples/index.html)** - See visual examples of all templates
401
+
402
+ | Template | Description | Best For |
403
+ |----------|-------------|----------|
404
+ | **modern** | Vibrant gradient with floating device and clean captions | Most apps, eye-catching |
405
+ | **minimal** | Soft pastel background with elegant typography | Clean, simple apps |
406
+ | **bold** | Dark dramatic gradient with overlay captions | Gaming, entertainment |
407
+ | **elegant** | Sophisticated monochrome design | Professional, business |
408
+ | **showcase** | Auto-detects custom backgrounds, partial frames | Apps with branded assets |
409
+ | **playful** | Bright, fun gradients | Games, kids apps |
410
+ | **corporate** | Clean, professional look | Business, productivity |
411
+ | **nerdy** | JetBrains Mono typography with OSS grid background | Developer tools |
412
+
413
+ ![Template Gallery](./template-samples/gallery/template-gallery.png)
414
+
415
+ ##### Rebuild the Gallery Locally
416
+
417
+ ```bash
418
+ # From repo root
419
+ npm run samples
420
+ ```
421
+
422
+ This generates:
423
+ - Device samples: `template-samples/{iphone|ipad|watch|mac}/<template>-<device>.png`
424
+ - Gallery cards: `template-samples/gallery/*-sample.png`
425
+ - Combined image: `template-samples/gallery/template-gallery.png`
426
+
427
+ #### Template Features
428
+
429
+ Each template automatically configures:
430
+ - **Background**: Gradient colors and direction or image settings
431
+ - **Device Scale**: Optimal size for visual balance (70-110%)
432
+ - **Device Position**: Top, center, bottom, or custom percentage
433
+ - **Caption Style**: Font, size, color, and position
434
+ - **Caption Background**: Optional semi-transparent background with padding
435
+ - **Caption Border**: Optional border with customizable radius
436
+ - **Partial Frames**: Modern look with cut-off device bottoms
437
+ - **Device Overrides**: Optimized settings for watch, iPad, etc.
438
+
439
+ #### Template Examples
440
+
441
+ ```bash
442
+ # Modern Template - Perfect for most apps
443
+ appshot template modern
444
+ # → Vibrant diagonal gradient (#667eea → #764ba2 → #f093fb)
445
+ # → 85% device scale, centered
446
+ # → White captions with dark semi-transparent background
447
+
448
+ # Minimal Template - Clean and simple
449
+ appshot template minimal
450
+ # → Soft pastel gradient (#ffecd2 → #fcb69f)
451
+ # → 75% device scale, lower position
452
+ # → Dark text on light background
453
+
454
+ # Bold Template - Make a statement
455
+ appshot template bold
456
+ # → Dark gradient (#0f0c29 → #302b63 → #24243e)
457
+ # → 110% device scale with partial frame
458
+ # → Large overlay captions with border
459
+
460
+ # Showcase Template - Feature your backgrounds
461
+ appshot template showcase
462
+ # → Auto-detects background.png in device folders
463
+ # → 90% scale with 25% partial frame
464
+ # → Glass-morphism caption effect
465
+ ```
466
+
467
+ #### Customizing Templates
468
+
469
+ Templates provide a starting point that you can further customize:
470
+
471
+ ```bash
472
+ # 1. Apply a template
473
+ appshot template modern
474
+
475
+ # 2. Fine-tune specific settings
476
+ appshot style --device iphone # Adjust positioning
477
+ appshot fonts --set "Poppins Bold" # Change font
478
+ appshot caption --device iphone # Update captions
479
+
480
+ # 3. Build with your customizations
481
+ appshot build
482
+ ```
483
+
484
+ #### Creating Consistent Screenshots
485
+
486
+ Templates ensure consistency across all your screenshots:
487
+
488
+ ```json
489
+ // After applying a template, all devices share:
490
+ {
491
+ "background": { /* Same gradient/image */ },
492
+ "caption": { /* Same font and styling */ },
493
+ "devices": {
494
+ "iphone": { /* Optimized for iPhone */ },
495
+ "ipad": { /* Optimized for iPad */ },
496
+ "watch": { /* Special watch handling */ }
497
+ }
498
+ }
499
+ ```
500
+
249
501
  ### Gradient System
250
502
 
251
503
  Appshot includes 24+ professional gradient presets organized by category:
@@ -289,7 +541,7 @@ appshot gradients --sample
289
541
  }
290
542
  ```
291
543
 
292
- ### Background System (NEW in v0.8.6)
544
+ ### Background System
293
545
 
294
546
  Replace gradients with custom static background images for a unique, branded look. Appshot supports automatic detection, multiple formats, and intelligent scaling.
295
547
 
@@ -592,6 +844,79 @@ Create modern App Store screenshots with cut-off device frames:
592
844
  }
593
845
  ```
594
846
 
847
+ #### Frame Positioning System
848
+
849
+ **Important**: The `framePosition` value (0-100) behaves differently depending on your caption positioning mode.
850
+
851
+ ##### Relative vs Absolute Positioning
852
+
853
+ When using `captionPosition: "above"` or `"below"`:
854
+ - **Frame positioning is RELATIVE to the remaining space** after accounting for the caption
855
+ - `framePosition: 0` = Top of available space (immediately after/before caption)
856
+ - `framePosition: 50` = Center of remaining space
857
+ - `framePosition: 100` = Bottom of available space
858
+
859
+ When using `captionPosition: "overlay"`:
860
+ - **Frame positioning is ABSOLUTE to the entire canvas**
861
+ - `framePosition: 0` = Top of canvas (pixel 0)
862
+ - `framePosition: 50` = Center of entire canvas
863
+ - `framePosition: 100` = Bottom of canvas
864
+
865
+ ##### Visual Examples
866
+
867
+ ```json
868
+ // Example 1: Caption above with framePosition: 0
869
+ {
870
+ "devices": {
871
+ "iphone": {
872
+ "captionPosition": "above",
873
+ "framePosition": 0 // Device starts right after caption
874
+ }
875
+ }
876
+ }
877
+ // Result: [Caption] then [Device at top of remaining space]
878
+
879
+ // Example 2: Caption overlay with framePosition: 0
880
+ {
881
+ "devices": {
882
+ "iphone": {
883
+ "captionPosition": "overlay",
884
+ "framePosition": 0 // Device at absolute top
885
+ }
886
+ }
887
+ }
888
+ // Result: [Device at canvas top] with [Caption overlaid at bottom]
889
+ ```
890
+
891
+ ##### The Math Behind Positioning
892
+
893
+ For **"above" mode**, the device position is calculated as:
894
+ ```
895
+ deviceTop = topMargin + captionHeight + (availableSpace * framePosition/100)
896
+ where availableSpace = canvasHeight - topMargin - captionHeight - bottomMargin - deviceHeight
897
+ ```
898
+
899
+ For **"overlay" mode**, the device position is calculated as:
900
+ ```
901
+ deviceTop = availableSpace * (framePosition/100)
902
+ where availableSpace = canvasHeight - bottomMargin - deviceHeight
903
+ ```
904
+
905
+ ##### Practical Implications
906
+
907
+ 1. **Same framePosition, Different Results**: A `framePosition: 0` will place the device at different absolute positions:
908
+ - With `above` caption: Device starts after the caption (e.g., at pixel 198)
909
+ - With `overlay` caption: Device starts at the top (pixel 0)
910
+
911
+ 2. **Caption Height Affects Layout**: In `above`/`below` modes, varying caption lengths change the available space, affecting all frame positions. Use `overlay` mode for consistent device positioning across screenshots with different caption lengths.
912
+
913
+ 3. **Best Practices**:
914
+ - Use `above`/`below` for guaranteed caption-device separation
915
+ - Use `overlay` for consistent device positioning across all screenshots
916
+ - Set fixed caption heights (`minHeight`/`maxHeight`) for uniform layouts
917
+
918
+ 📚 **[Visual Preset Showcase](./positioning-guide/preset-showcase.html)** - Interactive visual guide showing all available preset templates and their styles
919
+
595
920
  ### Caption System
596
921
 
597
922
  #### Dynamic Caption Box
@@ -634,7 +959,7 @@ appshot style --device iphone
634
959
  }
635
960
  ```
636
961
 
637
- #### Caption Styling (New in v0.7.0)
962
+ #### Caption Styling (Enhanced in v0.8.7)
638
963
 
639
964
  Create professional captions with customizable backgrounds and borders:
640
965
 
@@ -650,7 +975,7 @@ Create professional captions with customizable backgrounds and borders:
650
975
  "border": {
651
976
  "color": "#FFFFFF", // Border color (hex)
652
977
  "width": 2, // Border thickness (1-10)
653
- "radius": 12 // Rounded corners (0-30)
978
+ "radius": 12 // Rounded corners (0-30); used for background too
654
979
  }
655
980
  }
656
981
  }
@@ -661,6 +986,8 @@ Create professional captions with customizable backgrounds and borders:
661
986
  - **Flexible positioning** - Works with above, below, and overlay positions
662
987
  - **Device-specific overrides** - Customize styling per device type
663
988
  - **Professional appearance** - Rounded corners and padding for polished look
989
+ - **Vertical anchoring (NEW)** - Align caption text to top or center of the box
990
+ - **Unified side margins (NEW)** - Control caption box width with `caption.background.sideMargin`
664
991
 
665
992
  **Interactive Configuration:**
666
993
  ```bash
@@ -669,6 +996,8 @@ appshot style --device iphone
669
996
  # → Choose caption position (above/below/overlay)
670
997
  # → Configure background color and opacity
671
998
  # → Set border color, width, and radius
999
+ # → Set vertical alignment (top/center)
1000
+ # → Set side margin, min/max height, max lines
672
1001
  ```
673
1002
 
674
1003
  **Examples:**
@@ -698,12 +1027,44 @@ appshot style --device iphone
698
1027
  "background": {
699
1028
  "color": "#FF5733",
700
1029
  "opacity": 0.6,
701
- "padding": 25
1030
+ "padding": 25,
1031
+ "sideMargin": 24
1032
+ }
1033
+ }
1034
+ }
1035
+ ```
1036
+
1037
+ #### Fixed vs Adaptive Caption Height
1038
+
1039
+ ```json
1040
+ {
1041
+ "caption": {
1042
+ "position": "above",
1043
+ "box": {
1044
+ "autoSize": false, // Fixed height banner
1045
+ "minHeight": 320,
1046
+ "maxHeight": 320,
1047
+ "verticalAlign": "top" // Pin text to top of banner
702
1048
  }
703
1049
  }
704
1050
  }
705
1051
  ```
706
1052
 
1053
+ - Set `autoSize: true` plus `minHeight`/`maxHeight` clamps for adaptive banners.
1054
+ - Use `verticalAlign: 'top'` to avoid recenters when height changes.
1055
+
1056
+ ### Preset Templates Guide
1057
+
1058
+ An interactive showcase of all available preset templates is available at `positioning-guide/preset-showcase.html`.
1059
+
1060
+ - Visual preview of all 7 professional templates (modern, minimal, bold, elegant, showcase, playful, corporate)
1061
+ - Side-by-side comparison across iPhone, iPad, Mac, and Watch devices
1062
+ - Shows gradient backgrounds, device positioning, and caption styles
1063
+ - Helps you choose the perfect template for your app's style
1064
+ - One-line command examples for each preset
1065
+
1066
+ Open the file in a browser to explore all available templates before applying them via `appshot preset` or `appshot template`.
1067
+
707
1068
  #### Caption Autocomplete
708
1069
 
709
1070
  The caption command includes intelligent autocomplete:
@@ -857,8 +1218,416 @@ appshot validate --strict
857
1218
  appshot validate --fix
858
1219
  ```
859
1220
 
1221
+ ## 🚀 Fastlane Integration
1222
+
1223
+ Appshot seamlessly integrates with [Fastlane](https://docs.fastlane.tools/) for uploading screenshots to App Store Connect. The `export` command reorganizes your Appshot-generated screenshots into Fastlane's expected directory structure.
1224
+
1225
+ ### Overview
1226
+
1227
+ Appshot and Fastlane work together but remain separate tools:
1228
+ - **Appshot**: Generates beautiful screenshots with frames, gradients, and captions
1229
+ - **Fastlane**: Uploads screenshots to App Store Connect
1230
+
1231
+ ### Quick Start
1232
+
1233
+ ```bash
1234
+ # 1. Generate screenshots with Appshot
1235
+ appshot build --preset iphone-6-9,ipad-13
1236
+
1237
+ # 2. Export for Fastlane (auto-detects languages)
1238
+ appshot export
1239
+
1240
+ # 3. Upload with Fastlane
1241
+ cd fastlane && fastlane deliver
1242
+ ```
1243
+
1244
+ ### Export Command
1245
+
1246
+ The `appshot export` command bridges Appshot and Fastlane:
1247
+
1248
+ ```bash
1249
+ # Basic export (auto-detects languages, creates symlinks)
1250
+ appshot export
1251
+
1252
+ # Export specific devices only
1253
+ appshot export --devices iphone,ipad
1254
+
1255
+ # Copy files instead of symlinks (for CI/CD)
1256
+ appshot export --copy --clean
1257
+
1258
+ # Generate Fastlane configuration
1259
+ appshot export --generate-config
1260
+
1261
+ # Preview without creating files
1262
+ appshot export --dry-run
1263
+
1264
+ # Custom paths
1265
+ appshot export --source ./my-screenshots --output ./upload
1266
+ ```
1267
+
1268
+ ### Language Mapping
1269
+
1270
+ Appshot automatically maps language codes to Fastlane format:
1271
+ - `en` → `en-US`
1272
+ - `es` → `es-ES`
1273
+ - `fr` → `fr-FR`
1274
+ - `de` → `de-DE`
1275
+ - `zh` → `zh-Hans`
1276
+ - `pt` → `pt-PT`
1277
+ - [and 20+ more mappings]
1278
+
1279
+ Custom mappings via `.appshot/export-config.json`:
1280
+ ```json
1281
+ {
1282
+ "languageMappings": {
1283
+ "en": "en-GB",
1284
+ "custom": "x-special"
1285
+ }
1286
+ }
1287
+ ```
1288
+
1289
+ ### Directory Structure
1290
+
1291
+ **Appshot Output** (source):
1292
+ ```
1293
+ final/
1294
+ ├── iphone/
1295
+ │ ├── en/
1296
+ │ │ ├── home.png
1297
+ │ │ └── features.png
1298
+ │ └── es/
1299
+ │ └── home.png
1300
+ └── ipad/
1301
+ └── en/
1302
+ └── home.png
1303
+ ```
1304
+
1305
+ **Fastlane Structure** (after export):
1306
+ ```
1307
+ fastlane/screenshots/
1308
+ ├── en-US/
1309
+ │ ├── iphone/
1310
+ │ │ ├── home.png
1311
+ │ │ └── features.png
1312
+ │ └── ipad/
1313
+ │ └── IPAD_PRO_3GEN_129_home.png # Auto-renamed
1314
+ └── es-ES/
1315
+ └── iphone/
1316
+ └── home.png
1317
+ ```
1318
+
1319
+ ### Special Handling
1320
+
1321
+ #### iPad Pro Naming
1322
+ iPad Pro 12.9" (3rd gen) screenshots are automatically renamed with the `IPAD_PRO_3GEN_129_` prefix for proper Fastlane recognition.
1323
+
1324
+ #### Symlinks vs Copying
1325
+ - **Default**: Creates symlinks (saves disk space, instant)
1326
+ - **CI/CD**: Use `--copy` for portable archives
1327
+ - **Clean**: Use `--clean` to remove old exports before creating new ones
1328
+
1329
+ ### Screenshot Ordering (NEW! v0.9.1)
1330
+
1331
+ > **📌 Important Discovery**: Fastlane uploads screenshots in alphabetical order by filename. Without explicit ordering, your carefully arranged screenshots may appear in the wrong sequence on the App Store!
1332
+
1333
+ #### The Order Problem
1334
+ When exporting screenshots for Fastlane, the alphabetical ordering can disrupt your intended flow:
1335
+ - ❌ Without ordering: `bluesky.png`, `cast.png`, `home.png`, `media.png`, `updates.png`
1336
+ - ✅ With ordering: `01_home.png`, `02_updates.png`, `03_cast.png`, `04_media.png`, `05_bluesky.png`
1337
+
1338
+ #### Managing Screenshot Order
1339
+
1340
+ ```bash
1341
+ # Set order interactively for each device
1342
+ appshot order --device iphone
1343
+ appshot order --device ipad
1344
+ appshot order --device watch
1345
+
1346
+ # Export with numeric prefixes
1347
+ appshot export --order --copy --clean
1348
+
1349
+ # View current order
1350
+ appshot order --show
1351
+ ```
1352
+
1353
+ The order configuration is saved in `.appshot/screenshot-order.json` and intelligently handles:
1354
+ - Files with existing numeric prefixes (prevents double-prefixing like `01_01_home.png`)
1355
+ - Mixed naming conventions in your source files
1356
+ - New screenshots added after initial ordering
1357
+
1358
+ #### Quick Order Setup
1359
+
1360
+ Create a standard order configuration:
1361
+ ```bash
1362
+ cat > .appshot/screenshot-order.json << 'EOF'
1363
+ {
1364
+ "version": "1.0",
1365
+ "orders": {
1366
+ "iphone": ["home.png", "features.png", "search.png", "profile.png", "settings.png"],
1367
+ "ipad": ["home.png", "features.png", "search.png", "profile.png", "settings.png"],
1368
+ "watch": ["home.png", "features.png", "profile.png"]
1369
+ }
1370
+ }
1371
+ EOF
1372
+ ```
1373
+
1374
+ ### Fastlane Gotchas & Solutions
1375
+
1376
+ > **🔍 Key Discoveries from Real-World Integration**
1377
+
1378
+ #### 1. Nested Directory Limitations
1379
+ **Problem**: Fastlane's `deliver` command struggles with nested device directories inside language folders.
1380
+
1381
+ **Solution**: Appshot v0.9.1+ automatically flattens the structure during export:
1382
+ ```bash
1383
+ # Appshot structure (nested):
1384
+ final/iphone/en/home.png →
1385
+
1386
+ # Fastlane structure (flattened):
1387
+ fastlane/screenshots/en-US/iphone/home.png
1388
+ ```
1389
+
1390
+ #### 2. Device-Specific Prefixes
1391
+ **Discovery**: Some devices require specific filename prefixes for Fastlane to recognize them correctly.
1392
+
1393
+ **Handled Automatically**:
1394
+ - iPad Pro 12.9" (3rd gen) → `IPAD_PRO_3GEN_129_` prefix
1395
+ - iPad Pro 11" → `IPAD_PRO_11_` prefix
1396
+
1397
+ #### 3. Upload Staging Approach
1398
+ For complex projects with many screenshots, use the staging approach in your Fastfile:
1399
+
1400
+ ```ruby
1401
+ lane :upload_screenshots_staged do
1402
+ # Flattens nested structures for Fastlane compatibility
1403
+ # Handles device prefixes automatically
1404
+ # See full implementation in Fastlane export --generate-config
1405
+ end
1406
+ ```
1407
+
1408
+ #### 4. API Key Configuration
1409
+ **Important**: Never commit your `api_key.json` to version control!
1410
+
1411
+ ```bash
1412
+ # Use the template
1413
+ cp fastlane/api_key.json.template fastlane/api_key.json
1414
+ # Edit with your credentials
1415
+ # Add to .gitignore (done automatically by export --generate-config)
1416
+ ```
1417
+
1418
+ ### Complete Workflow Example
1419
+
1420
+ ```bash
1421
+ # 1. Initialize Appshot project
1422
+ appshot init
1423
+
1424
+ # 2. Add your raw screenshots
1425
+ # Place them in screenshots/iphone/home.png, etc.
1426
+
1427
+ # 3. Generate styled screenshots
1428
+ appshot build --preset iphone-6-9,ipad-13 --langs en,es,fr
1429
+
1430
+ # 4. Export for Fastlane with config generation
1431
+ appshot export --generate-config
1432
+
1433
+ # 5. Configure Fastlane (one-time setup)
1434
+ cd fastlane
1435
+ # Edit Deliverfile with your App Store Connect credentials
1436
+ # app_identifier "com.example.myapp"
1437
+ # username "your@email.com"
1438
+
1439
+ # 6. Upload to App Store Connect
1440
+ fastlane deliver --skip_metadata --skip_app_version_update
1441
+
1442
+ # 7. For updates, just rebuild and re-export
1443
+ appshot build --preset iphone-6-9,ipad-13
1444
+ appshot export --clean
1445
+ cd fastlane && fastlane deliver
1446
+ ```
1447
+
1448
+ ### CI/CD Integration
1449
+
1450
+ ```yaml
1451
+ # GitHub Actions Example
1452
+ - name: Generate Screenshots
1453
+ run: |
1454
+ npm install -g appshot-cli
1455
+ appshot build --preset iphone-6-9,ipad-13
1456
+
1457
+ - name: Export for Fastlane
1458
+ run: appshot export --copy --clean
1459
+
1460
+ - name: Upload to App Store
1461
+ env:
1462
+ APP_STORE_CONNECT_API_KEY: ${{ secrets.ASC_API_KEY }}
1463
+ run: |
1464
+ cd fastlane
1465
+ fastlane deliver --api_key_path api_key.json
1466
+ ```
1467
+
1468
+ ### Validation
1469
+
1470
+ The export command includes comprehensive validation:
1471
+ - Checks for valid output directory permissions
1472
+ - Validates language codes against Fastlane's supported set
1473
+ - Warns about missing screenshots for requested devices
1474
+ - Suggests App Store required presets if missing
1475
+
1476
+ ```bash
1477
+ # Preview and validate
1478
+ appshot export --dry-run --verbose
1479
+
1480
+ # Check what would be exported
1481
+ appshot export --dry-run --json | jq
1482
+ ```
1483
+
1484
+ ### Generated Fastlane Files
1485
+
1486
+ With `--generate-config`, Appshot creates:
1487
+ - **Deliverfile**: Screenshot configuration
1488
+ - **Fastfile**: Upload lanes
1489
+ - **README.md**: Instructions
1490
+ - **.gitignore**: Excludes screenshots
1491
+
1492
+ Example generated Deliverfile:
1493
+ ```ruby
1494
+ # Generated by Appshot
1495
+ screenshots_path "./screenshots"
1496
+ languages ["en-US", "es-ES", "fr-FR"]
1497
+ skip_binary_upload true
1498
+ skip_metadata true
1499
+ overwrite_screenshots true
1500
+ ```
1501
+
1502
+ ### Tips
1503
+
1504
+ 1. **Language Detection**: Let Appshot auto-detect languages from your screenshots
1505
+ 2. **Device Filtering**: Export only what you need with `--devices`
1506
+ 3. **Dry Run First**: Always preview with `--dry-run` before actual export
1507
+ 4. **Validation**: Run `appshot validate` before export to ensure compliance
1508
+ 5. **Incremental Updates**: Use `--clean` to ensure fresh exports
1509
+
860
1510
  ## 📝 Command Reference
861
1511
 
1512
+ ### `appshot quickstart` (NEW!)
1513
+
1514
+ Get started with App Store screenshots in seconds with interactive setup.
1515
+
1516
+ ```bash
1517
+ appshot quickstart [options]
1518
+ ```
1519
+
1520
+ **Options:**
1521
+ - `--template <id>` - Template to use (default: modern)
1522
+ - `--caption <text>` - Main caption for screenshots
1523
+ - `--no-interactive` - Skip interactive prompts
1524
+ - `--force` - Overwrite existing configuration
1525
+
1526
+ **What it does:**
1527
+ 1. Creates project structure
1528
+ 2. Applies professional template
1529
+ 3. Sets up example captions
1530
+ 4. Shows next steps
1531
+
1532
+ **Examples:**
1533
+ ```bash
1534
+ # Interactive setup
1535
+ appshot quickstart
1536
+
1537
+ # Quick setup with template
1538
+ appshot quickstart --template minimal --caption "My App"
1539
+
1540
+ # Non-interactive
1541
+ appshot quickstart --template bold --no-interactive
1542
+ ```
1543
+
1544
+ ### `appshot template` (NEW!)
1545
+
1546
+ Apply professional screenshot templates for instant visual styling.
1547
+
1548
+ ```bash
1549
+ appshot template [template] [options]
1550
+ ```
1551
+
1552
+ **Arguments:**
1553
+ - `[template]` - Template ID (modern, minimal, bold, elegant, showcase, playful, corporate)
1554
+
1555
+ **Options:**
1556
+ - `--list` - List all available templates
1557
+ - `--preview <id>` - Preview template configuration
1558
+ - `--caption <text>` - Add caption to all screenshots
1559
+ - `--device <name>` - Apply to specific device only
1560
+ - `--no-backup` - Skip config backup
1561
+ - `--dry-run` - Preview without applying
1562
+
1563
+ **Examples:**
1564
+ ```bash
1565
+ # List templates
1566
+ appshot template --list
1567
+
1568
+ # Apply template
1569
+ appshot template modern
1570
+
1571
+ # With caption
1572
+ appshot template minimal --caption "Beautiful App"
1573
+
1574
+ # Preview settings
1575
+ appshot template --preview bold
1576
+
1577
+ # Device-specific
1578
+ appshot template elegant --device iphone
1579
+ ```
1580
+
1581
+ ### `appshot preset` (NEW!)
1582
+
1583
+ Ultra-simple one-line commands to generate App Store screenshots with professional templates.
1584
+
1585
+ ```bash
1586
+ appshot preset <preset-name> [options]
1587
+ ```
1588
+
1589
+ **Arguments:**
1590
+ - `<preset-name>` - Template to use (modern, bold, minimal, elegant, showcase, playful, corporate)
1591
+
1592
+ **Options:**
1593
+ - `-c, --caption <text>` - Add caption to all screenshots
1594
+ - `-d, --devices <list>` - Comma-separated device list
1595
+ - `-l, --langs <list>` - Comma-separated language codes
1596
+ - `-o, --output <path>` - Output directory (default: ./final)
1597
+ - `--dry-run` - Preview without building
1598
+ - `-v, --verbose` - Show detailed output
1599
+
1600
+ **Examples:**
1601
+ ```bash
1602
+ # Quick professional screenshots
1603
+ appshot preset modern --caption "Amazing Features"
1604
+
1605
+ # Multiple devices
1606
+ appshot preset bold --devices iphone,ipad,watch
1607
+
1608
+ # Multiple languages
1609
+ appshot preset minimal --langs en,es,fr,de
1610
+
1611
+ # Custom output
1612
+ appshot preset elegant --output ./marketing/screenshots
1613
+
1614
+ # Preview mode
1615
+ appshot preset corporate --dry-run
1616
+
1617
+ # Full example
1618
+ appshot preset showcase \
1619
+ --caption "Summer Sale!" \
1620
+ --devices iphone,ipad \
1621
+ --langs en,es,fr \
1622
+ --output ./app-store-assets
1623
+ ```
1624
+
1625
+ **What it does:**
1626
+ 1. Applies professional template (gradient, positioning, styling)
1627
+ 2. Adds caption to first screenshot if provided
1628
+ 3. Builds screenshots for specified devices and languages
1629
+ 4. All in one command - perfect for CI/CD!
1630
+
862
1631
  ### `appshot build`
863
1632
 
864
1633
  Generate final screenshots with frames, gradients, and captions.
@@ -2202,10 +2971,10 @@ For security vulnerabilities, please see [SECURITY.md](SECURITY.md).
2202
2971
  ### NPM Package
2203
2972
 
2204
2973
  - 📦 [appshot-cli on NPM](https://www.npmjs.com/package/appshot-cli)
2205
- - 🔄 Latest version: 0.8.6
2974
+ - 🔄 Latest version: 0.9.0
2206
2975
 
2207
2976
  ---
2208
2977
 
2209
2978
  <div align="center">
2210
2979
  Built with ❤️ for developers and AI agents who automate everything.
2211
- </div>
2980
+ </div>