Communitygithub.com

imshaikot/app-preview-craft-skills

将应用截图/录屏转换为 App Store & Play Store 展示图、社交媒体卡片、3D 设备模拟图及宣传视频。本地使用无头 Chrome + three.js + ffmpeg。

app-preview-craft-skills 是什么?

app-preview-craft 是一个强大的 AI 技能,用于将应用截图和录屏自动生成适用于 App Store、Google Play、社交媒体等多个平台的高质量营销素材。它支持生成静态截图、3D 设备模拟图、2D/3D 视频等多种格式。该技能通过无头 Chrome 渲染页面(stage/stage.html),静态图使用 sharp 处理,视频帧通过 ffmpeg 合成,确保预览与导出效果完全一致。它提供丰富的主题(超过 40 个),每个主题针对不同应用类别设计,并支持自定义布局、设备模型、颜色方案和动态动画。用户可以通过 CLI 命令或 JSON 配置文件灵活控制输出,包括每张幻灯片的文案、装饰元素、设备姿态等。该技能适用于 Claude Code、Codex、Goose 等 AI 代理平台,但需要本地安装 Node.js、Chrome 和 ffmpeg(缺失时仅影响视频)。输出文件默认保存在用户当前工作目录,临时文件在每次运行后自动清理。

兼容平台✓Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add imshaikot/app-preview-craft-skill

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

app-preview-craft — 商店截图、社交卡片与 3D 设备视频

此技能生成的所有内容都是一个由主题装饰的页面(stage/stage.html),并通过无头 Chrome 捕获:静态图通过截图并由 sharp 处理完成,视频逐帧渲染并导入 ffmpeg。同一页面也驱动预览工作室,因此用户看到的预览与 CLI 导出的结果完全一致。

0. 找到技能并进行一次性设置

以下路径相对于此 SKILL.md 所在的目录。 解析一次后以此为前缀运行命令 — $SKILL 在整个文档中代表该目录:

SKILL=/absolute/path/to/app-preview-craft        # 包含 SKILL.md、scripts/、stage/ 的文件夹
# 不确定安装在哪里?(技能文件夹,然后是 Claude Code 插件缓存)
find ./.claude/skills ./.agents/skills ./.goose/skills ~/.claude/skills ~/.agents/skills \
     ~/.gemini/skills ~/.config/goose/skills ~/.claude/plugins \
     -path '*app-preview-craft*/scripts/cli.mjs' 2>/dev/null | head -1

然后检查机器。当包缺失时 --fix 会在技能内部运行 npm install:

node "$SKILL/scripts/doctor.mjs" --fix

Doctor 必须以 Ready. 结束。缺少 ffmpeg 仅显示警告(静态图仍可工作)。如果报告没有 WebGL,则 3D 主题无法渲染 — 请明确告知用户,而不是静默切换到扁平主题。

输出文件默认保存到用户当前工作目录(Shell 的 cwd),除非用户用 --out 指定了其他文件夹。切勿将渲染结果写入 $SKILL 目录中。临时状态文件保存在 $TMPDIR/app-preview-craft/ 中,并在每次运行后被清除。

1. 工作流程

  1. 选择类别(CLI 的第一个参数),根据用户需求:

    类别生成内容默认尺寸
    app-store一组:每张幻灯片按尺寸输出一个截图,外加 overview.pngiphone-6.9 1320×2868
    social-card一张卡片(或 --all 所有幻灯片)用于 og/X/LinkedIn/Instagram/storyog 1200×630
    screen-video纯屏幕的 2D 动画;可接受屏幕录制reel 1080×1920
    device-videothree.js 设备展示视频reel 1080×1920
    device-mockup3D 英雄静态图,可选透明背景mockup-landscape 2400×1600
  2. 收集素材。 从用户项目中获取截图(PNG/JPG/WebP)和/或录制(MP4/MOV/WebM),每张幻灯片一个,按顺序排列。除非用户提供文案(参见第 4 节),否则由你自己撰写文案。没有截图时,将使用捆绑的示例应用 "Tempo" — 仅用于展示主题,绝不用于交付物。

  3. 选择主题。 用户指定的主题优先。对于 App Store 集合,将应用的应用商店类别与第 3 节的表格匹配,并说明你选择了哪个主题及原因。当用户犹豫不决时,先向他们展示选项:

    node "$SKILL/scripts/cli.mjs" gallery app-store        # → ./gallery-app-store.png
    

    将表格读回(以便为用户渲染)并让用户选择。当用户希望浏览和可视化调整时,工作室(第 8 节)是更好的选择。

  4. 渲染。

    node "$SKILL/scripts/cli.mjs" app-store shots/01.png shots/02.png shots/03.png \
      --theme ledger \
      --title "Every euro, *accounted for*" --title "Budgets that *adapt*" --title "Private *by design*" \
      --subtitle "One-line benefit…" --subtitle "…" --subtitle "…" \
      --size iphone-6.9,ipad-13 --set palette.accent=auto
    
  5. 在报告之前检查。 阅读 overview.png(集合图)、静态图,或从视频中提取帧(--frames 1,4,mid,end 会渲染 PNG 帧而不是视频 — 用于检查动画成本较低)。检查标题是否被裁剪、文本是否覆盖设备、设备是否遮挡装饰、屏幕是否空白。使用 --set/每张幻灯片覆盖修复问题并重新渲染。

  6. 报告输出路径、主题和尺寸,并且 — 每当出现 3D 设备时 — 告知用户已写入 CREDITS.txt,并且 CC-BY 署名必须随图片一起传播(第 7 节)。

2. 尺寸

node "$SKILL/scripts/cli.mjs" list sizes --category app-store 打印表格。任何 WxH 格式也可用。同时指定多个:--size iphone-6.9,iphone-6.5,ipad-13。

  • App Store Connect 要求 iPhone 应用使用 6.9" 尺寸(iphone-6.9),iPad 应用使用 ipad-13;其他尺寸可选。PNG 输出是扁平的(Apple 拒绝 alpha 通道)。
  • 平板尺寸 会自动将手机替换为扁平平板框架,除非主题是无框的。当应用有 iPad 截图时,为这些幻灯片提供 iPad 截图。
  • 应用预览视频:--size app-preview(886×1920)或 app-preview-ipad,15–30 秒,30 fps。自动添加静音立体声 AAC 音轨(Connect 期望音频)。
  • Google Play:play-phone、play-tablet 和 play-feature(1024×500,社交卡片)。

3. 主题

list themes --category <c> 会打印这些主题及其布局。每个类别至少有 5 个。

app-store — 每个主题模拟一个热门应用类别

主题应用类别灵感来源外观
stride健康与健身Strava, Nike Run Club热橙色,紧凑全大写标签,速度条纹,倾斜手机
ledger金融Revolut, Monzo, Robinhood午夜渐变网格,薄荷→青色渐变文字,铬色球体
serene健康与正念Calm, Headspace柔和极光,斜体衬线装饰,软质块上的无框屏幕
canvas生产力Notion, Things, Linear温暖纸张,笔记本网格,大衬线,扁平墨水手机
sizzle食品与饮品DoorDash, Uber Eats, Deliveroo阳光黄色,圆点花纹,红色标记高亮,倾斜手机
wander旅行Airbnb, Hopper, Booking黄昏渐变,带有横跨整个集合的复古太阳(全景)
mixtape音乐与音频Spotify, Apple Music截图模糊成发光背景,巨大轮廓文字
arcade游戏Apple Arcade, 移动游戏发布艺术赛博朋克网格,霓虹边缘,光泽 3D 玩具
snapshot照片与社交Instagram, BeReal, VSCO三张无框截图像照片一样展开,温暖胶片网格
pulse健康数据与可穿戴设备Oura, WHOOP, Apple Health临床黑色,深红发光,标题位于前置 Pro Max 下方

主题借用情绪,而非品牌:不出现这些应用的徽标、名称或艺术作品。

social-card

launch(极光 + 倾斜手机)、spotlight(光束 + 镜面地板)、pastel-fan(三张展开屏幕)、bento(屏幕裁剪网格)、neon-grid(赛博朋克)、editorial(纸张、衬线、双色调屏幕)、duo(MacBook + 手机 — 为笔记本传递一个 desktop 屏幕)。

screen-video (2D)

carousel、stack(卡片飞走)、scroll(长截图在手机内滚动)、zoom-tour(全幅 Ken Burns 效果切换到每张幻灯片的 focus)、wall(倾斜的屏幕墙)、store-preview(App Store 预览风格 — 使用 --size app-preview)、grid-reveal。

device-video (3D)

turntable、orbit(相机弧形运动)、float(可循环)、rise(相机推进)、flip(背面 → 正面揭示)、trio(三个模型展开)、desk(MacBook 屏幕打开,手机滑入其旁;两者都站在 scene.floor 上)、spotlight(镜面全景 360°)、synthwave、keyframes(你自己的设备和相机运动,来自 motion.keys — 参见第 5 节)。

device-mockup (3D 静态图)

studio、noir、pedestal、levitate、lineup(每种手机型号)、flatlay、desk-duo。添加 --transparent 以输出透明背景 PNG。

4. 文案

  • 每张幻灯片标题:≤ 6 个单词,一个好处而非功能。在 1–2 个单词周围加上 *星号* 以使用主题样式高亮它们;" | " 强制换行。
  • 副标题:一句简短句子。Kicker(可选):上方的一个单词标签。
  • 前两张幻灯片传达核心理念 — 大多数购物者不会继续往下滚动。
  • 切勿虚构评分、下载量、奖项或媒体引述。装饰元素如 rating 和 laurels 仅用于用户提供的真实数据;不确定时请询问。
  • 不要在文案中提及竞争对手或使用 Apple/Google 商标,超出商店指南允许的范围。

5. 任意配置

解析顺序,后定义的优先: 内置基础 → 布局默认值 → 主题(及其 extends 链)→ 自定义主题文件 → 项目配置 themeOverrides → CLI 快捷方式 → --set → 每张幻灯片 theme。

  • 快捷方式:--layout --device --finish --pose --font --body-font --bg --bg2 --bg3 --ink --sub --accent --accent2 --background --pattern --background-image --clean-status-bar --no-decor --duration --fps --speed --intro --outro。
  • --set path=value 可以设置任意主题键(可重复使用)。list options 打印带类型和范围的文档化路径。值会被强制类型转换;JSON 适用于列表/对象:--set device.pose=5,-15,4 --set 'decor=[{"kind":"sparkles","count":8}]'。
  • device.pose 是 x,y,z 角度。主题通常保持在约 ±20° 偏航和 ±6° 翻滚范围内,以便屏幕在商店缩略图大小下仍可阅读;更陡的角度也可用但会牺牲可读性。
  • 颜色接受 auto = 第一张截图中最鲜艳的颜色:--accent auto。
  • --device iphone-17-pro | iphone-17-pro-max | iphone-12-pro | galaxy-s21-ultra | macbook-pro-16 | flat[:phone|phone-android|tablet|browser] | frameless | none,或用户自己模型的 ID(第 7 节)。
  • 布局在同类中可互换(list layouts):静态图 — hero-top、hero-bottom、tilt、duo、fan、split、big-type、callout、bento、laptop-phone、showcase、pedestal、lineup、flatlay;视频 — carousel、stack、scroll、zoom-tour、wall、phone-swap、grid-reveal、turntable、orbit、float、rise、flip、trio、desk、spotlight、keyframes。
  • 你自己的动画:keyframes 布局通过 motion.keys 移动一个 3D 设备和相机,motion.keys 是一个列表,包含 { "at": 0..1, "x", "y", "size", "pose": [rx, ry, rz], "cam": { "yaw", "pitch", "dist" }, "ease" }。at 是整个视频的分数;未包含的值从前一关键帧继承;第一个关键帧从主题自身的姿态开始。缓动函数:linear inOutCubic inOutSine outCubic outQuart outBack inOutQuart outExpo。--theme keyframes --set 'motion.keys=[{"at":0,"y":1.4,"pose":[0,70,0]},{"at":0.3,"y":0.62,"pose":[4,-20,3],"ease":"outQuart"},{"at":1,"pose":[0,15,0],"cam":{"dist":0.9}}]'。 不涉及动画库:每一帧都是其时间的纯函数,这允许帧按任意顺序渲染。用 --frames 0,2,mid,end 检查运动。

自定义主题 是 JSON(或 .mjs)文件,包含主题键的任何子集以及 extends:

{ "extends": "app-store/ledger", "name": "Acme", "palette": { "accent": "#ff5a1f" },
  "type": { "display": "bricolage", "weight": 800 }, "device": { "finish": "#1c1f24" } }

传递 --theme path/to/acme.json,或将其放入 ./.app-preview-craft/themes/(或 ~/.app-preview-craft/themes/),然后使用 --theme acme。list themes 会显示自定义主题。

项目配置。 node "$SKILL/scripts/cli.mjs" init app-store 会写入 app-preview-craft.json;之后 node "$SKILL/scripts/cli.mjs"(无参数)会渲染它,标志仍可覆盖它。$SKILL/examples/app-preview-craft.json 是一个完整的可工作示例:包含每张幻灯片的文案、装饰和主题覆盖、一个自定义主题文件、一个桌面屏幕,以及一个 jobs 列表,可在一个命令中渲染 App Store 集合、社交卡片、模拟图和视频。配置中的路径相对于配置文件解析。

每张幻灯片的键:screen、desktop(笔记本显示)、title、subtitle、kicker、theme(仅针对该幻灯片的覆盖)、decor(替换该幻灯片的主题装饰)、focus: [x, y, zoom](缩放导览目标)、hold(视频中的秒数)、trim: [start, end] 和 at(录制的第几秒用于静态图)、bigWord(大字型布局)。

装饰 元素为 {kind, x, y, scale, rotate, style, layer, delay, …},其中 x/y 为页面比例,style 为 glass | solid | light | dark | outline 之一:

kind额外键
badgetext, icon (star bolt heart check sparkle trophy leaf lock music pin flame bell chart shield globe play)
ratingscore, label, starColor
laurelstop, text, bottom
chipsitems[], icons[], width, lead
notificationapp, title, body, time, icon (图片路径) 或 glyph, width
statlabel, value, trend, trendColor
calloutrect: [x, y, w, h] 截图中要放大的区域, w, border, radius
arroww, h, text (手写笔记), flip, stroke
logoname, src (应用图标路径)
store-badgetop, text, 或用于官方徽标艺术作品的 src
sparkles confetticount, colors[], area: [x0, y0, x1, y1], seed
blobsize, color, opacity (位于设备后方)
orbs rings shapes3D 基元: count, shapes[], finish (glossy chrome matte glass iridescent), area, items[]
credittext (默认为模型署名行)

6. 屏幕与处理

  • sharp 在 Chrome 启动前处理每张截图:screen.cleanStatusBar(重新绘制 9:41 / 满电量 iOS 状态栏 — 仅限手机形状的截图)、tint + tintAmount、duotone: "#dark,#light"、saturate、brightness、sharpen,以及用于 blur-shot 背景的预模糊背景。
  • 在 iPhone 型号上,灵动岛 被绘制为一个合并的黑色药丸形状,覆盖模型原有的药丸和相机开孔,与 iOS 显示一致。提供灵动岛区域清晰的截图(任何正常的 iOS 截图即可);cleanStatusBar 会将时间和图标保留在两侧。
  • 比显示屏高的截图在视频中会滚动(scroll 主题),在静态图中显示顶部(screen.fit=top)。
  • 录制内容由 ffmpeg 按输出帧率拆分为帧;在视频中,每个录制的幻灯片持续与片段相同的时间(用 hold 覆盖,用 trim 裁剪)。静态图使用一帧(at,默认:中间帧)。
  • 笔记本显示器会将手机截图以信箱格式放置在模糊副本上,除非幻灯片有 desktop 屏幕。desktop 也可接受录制。在 desk 视频布局中,两个屏幕并排渲染,每个屏幕都有其自己的内容(screen 和 desktop 必须提供才能显示)。flat 设备类型渲染一个扁平的二维码 - 风格的屏幕框架,无逼真手机模型;适用于简单的功能预告或公告。

7. 设备模型与归属

  • list devices 打印内置设备模型(手机、平板、手表、笔记本),每个都包含其设计师和来源。每个 3D 设备模型 都必须附有 CREDITS.txt 文件,其中包含归属信息。该文件会在你首次导出包含该模型的任何内容时自动写入,但你有责任确保署名随最终图像一起传播。
  • 自定义设备:提供一个 .glb 文件和一个等宽 PNG 贴图(物理尺寸与屏幕区域匹配)。将模型放入 ./.app-preview-craft/devices/ 中;下次运行 list devices 时会显示它。

8. 预览工作室

当用户想通过可视化操作和调整设置时,运行:

node "$SKILL/scripts/cli.mjs" studio

这会启动一个本地服务器(通常是 http://localhost:4444),允许用户在浏览器中实时调整。它使用与 CLI 导出完全相同的舞台和渲染引擎。应用到主题、布局或装饰的更改会立即反映。工作室是完全包含的:无需外部 CDN。

9. 约束

  • 仅使用 $SKILL/stage/ 中的标记、CSS 和 JS — 不要注入外部库、文档或转译。headless Chrome 会渲染普通 HTML + 模块 <script type="module"> 标签。
  • 生成静态图时 — 不要启动浏览器;当需要精确控制文本或布局时,使用 HTML 渲染完全值得。无头 Chrome 启动延迟约为 2–3 秒。
  • 当用户要求“商店截图”时,指的是 App Store 集合。询问基于 iOS 还是 Android。
  • 请勿将应用标题或副标题替换为模板占位符。按照第 4 节的指导撰写文案。
  • 请勿修改或替换 doctor.mjs、cli.mjs 或 stage/ 内部的任何内容。这些文件定义了技能的行为。
  • 如果报告指出缺少 WebGL 或没有无头 Chrome,明确告知用户,不要尝试使用备用渲染器。
  • 不要在同一个答案中同时运行多个渲染命令。
  • 对于 App Store 集合,始终包含 overview.png。不要跳过它。
  • 当生成社交卡片时,检查布局是否在广泛的文本变体中保持平衡。对较长标题进行微调,使它们不大于简报目录中的卡片。
  • 对于 3D 模拟图,如果存在 --transparent,则输出必须是一个带有 alpha 通道的 PNG。默认是实色背景。
  • 当视频输出过长(> 30s)时,提出建议以使其更紧凑。
  • 除非用户明确要求,否则不要显示或复制原始 CLI 输出(例如,组合视频的 ffmpeg 日志)。如果遇到错误,请优雅地处理:描述问题,提供解决方案,并询问用户是否希望继续。

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

相关技能