remotion by 0xaxiom/appfactory
npx skills add https://github.com/0xaxiom/appfactory --skill remotionApp Factory 包含一个集成的 Remotion 视频管道,用于生成已构建应用程序的演示视频。
demo-video/ 目录中的文件/factory video 命令demo-video/
├── src/
│ ├── index.ts # Remotion 入口点
│ ├── Root.tsx # 合成注册表
│ ├── compositions/
│ │ └── AppFactoryDemo.tsx # 主演示视频 (10秒, 1920x1080)
│ └── components/
│ ├── Title.tsx # 动画标题
│ ├── BulletPoints.tsx # 交错显示要点
│ ├── VerificationBadge.tsx # PASS 徽章
│ └── Footer.tsx # UTC 时间戳
├── remotion.config.ts # Remotion 配置
└── package.json # 依赖项 (Remotion v4.x)
// 正确:所有动画都使用 useCurrentFrame()
const frame = useCurrentFrame();
const opacity = interpolate(frame, [0, 30], [0, 1], {
extrapolateRight: 'clamp',
});
// 禁止:CSS 动画/过渡
// 切勿使用:animation:, transition:, @keyframes
App Factory includes an integrated Remotion video pipeline for generating demo videos of built applications.
demo-video/ directory/factory video commanddemo-video/
├── src/
│ ├── index.ts # Remotion entry point
│ ├── Root.tsx # Composition registry
│ ├── compositions/
│ │ └── AppFactoryDemo.tsx # Main demo video (10s, 1920x1080)
│ └── components/
│ ├── Title.tsx # Animated title
│ ├── BulletPoints.tsx # Staggered highlights
│ ├── VerificationBadge.tsx # PASS badge
│ └── Footer.tsx # UTC timestamp
├── remotion.config.ts # Remotion configuration
└── package.json # Dependencies (Remotion v4.x)
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
// 始终使用外推钳位
const value = interpolate(frame, [0, 60], [0, 100], {
extrapolateLeft: 'clamp',
extrapolateRight: 'clamp',
});
// 使用 spring() 实现基于物理的动画
const springValue = spring({
fps,
frame,
config: { damping: 200, stiffness: 100 },
durationInFrames: 40,
});
new Date()timeZone: 'UTC'Math.random() 或非确定性值// 所有合成必须遵循此模式
export const MyComposition: React.FC<Props> = (props) => {
const frame = useCurrentFrame();
const { fps, width, height, durationInFrames } = useVideoConfig();
return (
<AbsoluteFill style={{ backgroundColor: '#000' }}>
{/* 序列化内容 */}
<Sequence from={0} durationInFrames={60}>
<Scene1 />
</Sequence>
<Sequence from={60} durationInFrames={60}>
<Scene2 />
</Sequence>
</AbsoluteFill>
);
};
status: "PASS" 的 RUN_CERTIFICATE.jsonpost-run-certificate-video.mjsdemo/out/<slug>.mp4# 基本用法
node scripts/render-demo-video.mjs --cwd ./my-app --slug my-app
# 使用自定义要点
node scripts/render-demo-video.mjs \
--cwd ./my-app \
--slug my-app \
--title "My Amazing App" \
--highlights '["Feature 1", "Feature 2", "Feature 3"]'
interface AppFactoryDemoProps {
title: string; // 应用名称
slug: string; // URL 安全标识符
verifiedUrl: string; // 通过健康检查的本地主机 URL
timestamp: string; // ISO 8601 时间戳 (UTC)
highlights: string[]; // 4-6 个要点
certificateHash: string; // RUN_CERTIFICATE.json 的 SHA256 哈希值
}
# 在 Remotion Studio 中预览
cd demo-video && npm run studio
# 渲染特定合成
npx remotion render src/index.ts AppFactoryDemo output.mp4
# 检查 TypeScript 错误
npx tsc --noEmit
const fadeIn = interpolate(frame, [0, 30], [0, 1], {
extrapolateRight: 'clamp',
});
const fadeOut = interpolate(frame, [duration - 30, duration], [1, 0], {
extrapolateLeft: 'clamp',
extrapolateRight: 'clamp',
});
const opacity = fadeIn * fadeOut;
items.map((item, index) => {
const delay = index * 10; // 每个之间间隔 10 帧
const itemOpacity = interpolate(
frame,
[delay, delay + 20],
[0, 1],
{ extrapolateLeft: 'clamp', extrapolateRight: 'clamp' }
);
return <Item key={index} style={{ opacity: itemOpacity }} />;
});
const scaleSpring = spring({
fps,
frame: frame - startFrame,
config: { damping: 80, stiffness: 200 },
});
const scale = interpolate(scaleSpring, [0, 1], [0.8, 1]);
| 代码 | 含义 | 解决方案 |
|---|---|---|
| FAC-006 | 视频渲染失败 | 检查 Remotion 日志,确认已安装 ffmpeg |
| FAC-007 | 证书缺失 | 先运行本地运行验证 |
| FAC-008 | 属性验证失败 | 检查属性类型是否与模式匹配 |
每周安装量
7
代码仓库
GitHub 星标数
122
首次出现
2026年2月11日
安全审计
安装于
gemini-cli7
codex7
cursor7
opencode7
github-copilot7
claude-code7
// CORRECT: Use useCurrentFrame() for all animations
const frame = useCurrentFrame();
const opacity = interpolate(frame, [0, 30], [0, 1], {
extrapolateRight: 'clamp',
});
// FORBIDDEN: CSS animations/transitions
// Never use: animation:, transition:, @keyframes
// ALWAYS use extrapolation clamping
const value = interpolate(frame, [0, 60], [0, 100], {
extrapolateLeft: 'clamp',
extrapolateRight: 'clamp',
});
// Use spring() for physics-based animations
const springValue = spring({
fps,
frame,
config: { damping: 200, stiffness: 100 },
durationInFrames: 40,
});
new Date()timeZone: 'UTC' for all date formattingMath.random() or non-deterministic values// All compositions must follow this pattern
export const MyComposition: React.FC<Props> = (props) => {
const frame = useCurrentFrame();
const { fps, width, height, durationInFrames } = useVideoConfig();
return (
<AbsoluteFill style={{ backgroundColor: '#000' }}>
{/* Sequenced content */}
<Sequence from={0} durationInFrames={60}>
<Scene1 />
</Sequence>
<Sequence from={60} durationInFrames={60}>
<Scene2 />
</Sequence>
</AbsoluteFill>
);
};
RUN_CERTIFICATE.json created with status: "PASS"post-run-certificate-video.mjsdemo/out/<slug>.mp4# Basic usage
node scripts/render-demo-video.mjs --cwd ./my-app --slug my-app
# With custom highlights
node scripts/render-demo-video.mjs \
--cwd ./my-app \
--slug my-app \
--title "My Amazing App" \
--highlights '["Feature 1", "Feature 2", "Feature 3"]'
interface AppFactoryDemoProps {
title: string; // App name
slug: string; // URL-safe identifier
verifiedUrl: string; // Localhost URL that passed health check
timestamp: string; // ISO 8601 timestamp (UTC)
highlights: string[]; // 4-6 bullet points
certificateHash: string; // SHA256 of RUN_CERTIFICATE.json
}
# Preview in Remotion Studio
cd demo-video && npm run studio
# Render specific composition
npx remotion render src/index.ts AppFactoryDemo output.mp4
# Check for TypeScript errors
npx tsc --noEmit
const fadeIn = interpolate(frame, [0, 30], [0, 1], {
extrapolateRight: 'clamp',
});
const fadeOut = interpolate(frame, [duration - 30, duration], [1, 0], {
extrapolateLeft: 'clamp',
extrapolateRight: 'clamp',
});
const opacity = fadeIn * fadeOut;
items.map((item, index) => {
const delay = index * 10; // 10 frames between each
const itemOpacity = interpolate(
frame,
[delay, delay + 20],
[0, 1],
{ extrapolateLeft: 'clamp', extrapolateRight: 'clamp' }
);
return <Item key={index} style={{ opacity: itemOpacity }} />;
});
const scaleSpring = spring({
fps,
frame: frame - startFrame,
config: { damping: 80, stiffness: 200 },
});
const scale = interpolate(scaleSpring, [0, 1], [0.8, 1]);
| Code | Meaning | Resolution |
|---|---|---|
| FAC-006 | Video render failed | Check Remotion logs, verify ffmpeg installed |
| FAC-007 | Certificate missing | Run Local Run Proof first |
| FAC-008 | Props validation failed | Check prop types match schema |
Weekly Installs
7
Repository
GitHub Stars
122
First Seen
Feb 11, 2026
Security Audits
Installed on
gemini-cli7
codex7
cursor7
opencode7
github-copilot7
claude-code7
AI新闻播客制作技能:实时新闻转对话式播客脚本与音频生成
1,200 周安装