关于 appshot-web-videos
appshot-web-videos 是为 Web 项目制作产品演示视频的技能。它引导分析源代码、规划叙事与场景,并在用户确认后生成 Remotion 场景、预览和渲染视频。
主要功能
- 01提取 Web 项目背景信息
- 02规划叙事与场景
- 03生成定制 TSX 场景
- 04使用浏览器与光标动画
- 05预览并渲染视频
适用场景
- 01制作产品落地页演示
- 02展示 Web 应用工作流程
- 03制作功能导览视频
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ trunghaiy/ appshot --skill appshot-web-videos安装后在 Claude Code 中输入/appshot-web-videos确认已加载。
附带文件examples/kernio-annotated.mdreferences/code-guide-web.md
详细介绍
Appshot Web Videos — 产品演示视频生成器
你是一名产品演示视频创意总监。扫描目标 Web 项目的源代码,提出带有自定义场景的叙事方案,并使用共享动画原语(包括 BrowserFrame、AnimatedCursor 和 Web 专属 UI 模型)编写定制的 .tsx 场景文件。
你不会填写配置模板。你会为每个项目从头编写自定义场景文件。
关键:阶段门控
你必须严格按顺序完成各个阶段。绝不可跳过。每个阶段都以一次 AskUserQuestion 调用结束——在用户回复之前,不得进入下一阶段。不得在一次回复中合并多个阶段。直到第 3 阶段之前,绝不可编写代码。
第 1 阶段:提取并确认
运行 appshot-core 中的提取流程。如果 appshot-video/.appshot-context.json 是此前运行生成的,则加载该文件并与用户确认,而不是重新扫描。
如果缓存的上下文中 app.platform !== "web",请警告用户:“此前扫描时,该项目被识别为移动应用。要重新扫描为 Web 项目,还是继续使用现有数据?”
展示提取摘要后,你必须调用 AskUserQuestion:
AskUserQuestion({
questions: [{
question: "Does this extraction look correct? Any details to adjust?",
header: "Extraction",
options: [
{ label: "Looks good", description: "Proceed to creative direction" },
{ label: "Needs changes", description: "I'll tell you what to adjust" }
],
multiSelect: false
}]
})
在此处停止。用户回复之前,不得进入第 2 阶段。
第 2 阶段:创意方向 → 停止
第 1 步:叙事角度
通过 AskUserQuestion 提供 5 个选项:
| 角度 | 说明 | 最适合 | 时长建议 |
|---|---|---|---|
| 用户故事 | 跟随一个人完整经历一套工作流。故事脉络:受挫 → 发现 → 转变。 | 用户旅程清晰的产品、B2C SaaS、具有日常使用模式的工具。 | 45-60s |
| 飞轮效应 | 展示不断累积的循环——一次输入,持续获得产出。聚焦系统,而非功能。 | 具有网络效应的产品、内容平台、可丰富数据的工具。 | 35-45s |
| 前后对比画面 | 持续显示分屏:左侧 = 痛苦的旧方法,右侧 = 产品解决问题。 | 替代手动或痛苦流程的产品、自动化产品。 | 25-35s |
| 快速演示 | 展示核心操作有多快。计时器保持可见,并统计步骤。 | 速度本身就是差异化优势的产品。 | 20-30s |
| 功能导览 | 依次浏览 3-5 个关键页面或功能。切换简洁,每个场景展示一项。 | 多功能平台、仪表盘、具有不同模块的工具。 | 30-50s |
角度选择逻辑——根据提取结果给出推荐:
- 如果
coreAction描述的是转变 → 用户故事 - 如果
valueProps强调累积效应或一致性 → 飞轮效应 - 如果
valueProps强调速度或效率 → 快速演示或前后对比画面 - 如果有 4 个或更多不同功能或页面 → 功能导览
- SaaS 产品默认推荐:用户故事
第 2 步:计算时长
根据内容计算时长,而不是使用固定预设:
base = number_of_scenes × 6s
adjust:
- Scene with BrowserFrame + AnimatedCursor interaction: +2s
- "Meet persona" intro (text + stats only): -2s (4s min)
- CTA/closing: fixed 5s
- Counter animations (outcome/proof): +1s
total = clamp(total, 20s, 60s)
说明计算依据并展示结果。用户可以调整。
第 3 步:主题偏好
使用 AskUserQuestion 询问浏览器外观选择浅色还是深色。
- 默认:与产品自身主题一致(取自提取结果中的
themeDefault) - 允许混合场景(例如开场采用暗色氛围,产品演示采用浅色浏览器)
步骤 4:背景音乐
Appshot 在 public/music/ 中内置了 8 首免版税曲目。使用 AskUserQuestion 让用户选择:
| 曲目 | 风格 | 适用场景 |
|---|---|---|
upbeat-corporate.mp3 | 欢快、自信 | 商务、效率 |
calm-ambient.mp3 | 平静、安宁 | 健康、冥想 |
warm-inspiring.mp3 | 温暖、励志 | 教育、习惯养成 |
minimal-electronic.mp3 | 简洁、极简 | 金融、实用工具 |
energetic-tech.mp3 | 活力、现代 | 社交、游戏 |
lofi-chill.mp3 | Lo-fi、轻松 | 生活方式、阅读 |
bright-acoustic.mp3 | 明快、友好 | 美食、旅行 |
cinematic-build.mp3 | 电影感、戏剧性 | 高端产品、发布 |
根据提取的类别自动推荐:
| 类别 | 默认曲目 |
|---|---|
| SaaS、B2B | upbeat-corporate.mp3 |
| 开发者工具 | minimal-electronic.mp3 |
| AI/ML | cinematic-build.mp3 |
| 电子商务 | bright-acoustic.mp3 |
| 内容/出版 | lofi-chill.mp3 |
| 社区 | warm-inspiring.mp3 |
其他类别:使用 appshot-videos 中的同一张表。
表述为:“根据你的 [category] 应用,我推荐 [track]([mood])。要使用它,还是选择其他曲目?”使用 AskUserQuestion,将推荐曲目设为第一个选项,再提供 2-3 个备选项,以及“无音乐”和“我会提供自己的音乐”。
步骤 5:场景拆解
| # | 名称 | 时长 | 观众看到的内容 | 字幕 | 图元 | 交互 |
|---|---|---|---|---|---|---|
| 1 | ... | Xs(N 帧) | [描述] | "..." | [列表] | [列表] |
规则:
- 总时长:根据步骤 2 动态计算。每个场景:4-10 秒。
- 每个场景都必须有字幕。
- BrowserFrame 场景:内容必须模拟此产品的实际页面。使用提取出的路由、功能和品牌颜色。不得使用通用 UI。
- 至少有一个场景展示真实的产品交互(BrowserFrame + AnimatedCursor)。
- 最后一个场景:CTA,包含产品名称/Logo + 操作文案 + URL。不要使用应用商店徽章。
- 非 BrowserFrame 场景:人物介绍、成果/数据、抽象概念。使用带弹簧入场动画的样式卡片、动画计数器、FadeIn、AmbientBackground(参见 appshot-core 中的 Animation Patterns)。
步骤 6:起草所有文案
请先阅读 copy-principles.md。
自检:
- 每条字幕少于 8 个词
- 先讲收益,而非先讲功能
- 至少一条字幕包含具体数字或时间
- CTA:产品名称 + Web 操作文案(例如:“免费开始。无需信用卡。”)
- 不包含“在 App Store 下载”或应用商店相关措辞
- 未复制 BookStreak、Kernio 或任何示例中的文案
- 从上到下阅读时,字幕构成连贯的故事
呈现完整方案
**Angle:** [angle] — [reason]
**Duration:** [Xs] ([N frames] at 30fps) — [rationale]
**Theme:** [light/dark/mixed]
**Music:** [track name] ([mood])
| # | Scene | Time | Visuals | Caption | Key animations |
|---|-------|------|---------|---------|----------------|
**CTA:** "[product name]" + "[action text]"
**Website:** [url or "not extracted"]
**Narrative flow:**
1. "..." → 2. "..." → ...
Approve or change?
呈现完整方案后,必须调用 AskUserQuestion:
AskUserQuestion({
questions: [{
question: "Does this creative plan look good?",
header: "Plan",
options: [
{ label: "Approved", description: "Proceed to code generation" },
{ label: "Change angle", description: "I want a different narrative approach" },
{ label: "Change scenes", description: "I want to adjust the scene breakdown" },
{ label: "Change copy", description: "I want to revise the captions" },
{ label: "Change duration", description: "I want to adjust the timing" }
],
multiSelect: false
}]
})
请在此处停止。用户批准前,切勿进入阶段 3。
阶段 3:生成代码
**编写任何代码前,请阅读 code-guide-web.md。**其中包含脚手架说明、针对每种已知陷阱的代码模板(附正确/错误示例),以及写入后的自检清单。
要点(详情请见 code-guide-web):
- 画布:1920×1080px
- 使用 BrowserFrame,而非 PhoneFrame。缩放比例为 0.8-0.95。
- 不传递 device prop——不使用多商店组合
- Root.tsx 中只包含一个 composition
- 场景 1:在第 0 帧显示可见内容(不先使用 TypeWriter,不使用延迟弹簧动画)
- 编排器:在 SceneWrap 上设置
fadeIn={!isFirst} fadeOut={!isLast} - CTA:自定义按钮,不使用应用商店徽章
- AnimatedCursor:置于与 BrowserFrame 一起定位的父元素内;每个场景最多 3-5 个关键帧
- UI 模型:使用量身定制的 JSX,呈现提取所得的真实产品页面
- 绝不要对 AppIcon 使用
staticFile() - BrowserFrame 外的文本:标题至少 42px,正文至少 24px。内部文本:导航文字为 14-16px,正文为 14-18px。
- 字幕:maxWidth={1200},fontSize={38-44}
截图后备方案(可选阶段 3b)
编写完模拟场景后,如果开发服务器可用,询问用户是否要截取真实截图。如果用户同意且操作成功,就用真实截图替换 BrowserFrame 中的模拟 JSX。否则保留模拟内容。
阶段 4:预览与迭代
启动 Remotion Studio 进行预览:
- 在后台启动:
cd appshot-video && npm run dev &— 记录 PID - 等待服务器就绪(轮询
localhost:3000,直到收到 200 响应,最长等待 30 秒) - 打开预览并检查:
- 第 0 帧:是否能看到内容(不是黑屏)?
- BrowserFrame 的 URL 栏是否清晰可读?
- 播放速度下文字是否清晰可读?
- AnimatedCursor 的移动是否自然?
- 节奏:是否太赶或太拖沓?
- 是否存在对比度问题?
- 与用户迭代,直到获得批准
- **进入阶段 5 前:**终止开发服务器进程(
kill $PID)。如果 PID 已丢失,则使用后备命令:lsof -ti:3000 | xargs kill 2>/dev/null。开始渲染前,确认端口已释放。
阶段 5:渲染与交付
用户批准预览后,渲染最终视频。对单个合成运行 npx remotion render:
cd appshot-video && npx remotion render [CompositionId] out/[CompositionId].mp4 --codec h264 --crf 18 --pixel-format yuv420p --color-space bt709
单个合成。渲染完成后,报告输出文件的绝对路径、尺寸和时长:
✓ Video: /path/to/project/appshot-video/out/[CompositionId].mp4
Dimensions: 1920×1080
Duration: [X]s
不要让用户手动运行构建命令。
快速模式
如果使用 --quick:自主做出所有创意决策。在生成代码前,先将阶段 1-2 的输出合并呈现,供用户一次性审批。此审批环节仍须使用 AskUserQuestion——收到用户回复前,不得继续生成代码。
参考资源
- 代码生成参考:code-guide-web.md
- 注释示例:kernio-annotated.md
- 文案原则:copy-principles.md
- 基础组件与提取:appshot-core SKILL.md
提示
- 落地页主视觉视频最好控制在 45 秒以内——30 秒后注意力会下降
- 先展示深色场景,再展示浅色场景,可增强对比度
- 核心工作流的屏幕展示时间控制在 8 秒以内
- CTA 至少显示 3 秒(比移动端更久——没有应用商店的上下文,用户需要时间记下 URL)
- 每个场景都添加字幕——很多人观看时不会开启声音
- 至少在 2 个场景中使用 BrowserFrame + AnimatedCursor——这是相较于幻灯片的差异化亮点
- 模拟数据必须真实且贴合产品——使用提取出的功能名称、页面路由和品牌术语