Token导航 LogoToken导航

Agent Skill · 开发

remotion-templates(Remotion templates 视频)

用于辅助视频生成、动画合成、脚本化剪辑或 Remotion 等视频项目开发。它适合让 Agent 组织镜头、生成素材说明、维护合成代码或排查渲染问题。使用时需要确认分辨率、时长、素材路径和导出格式;涉及外部素材、人物肖像或商业发布时,应先核对版权授权和内容审核要求。

remotion-templates 是开发类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为只读;许可证信息还不明确,第三方扫描有未通过项,按安装量在开发类的 21,746 个 Skill 里排第 16,306。

总安装 514周安装 21GitHub Stars 1下载 165核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
unknown

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:remotion-templates(Remotion templates 视频)
来源仓库:https://github.com/ali-abassi/remotion-templates
仓库路径:skills/remotion-templates
安装命令:
npx skills add https://github.com/ali-abassi/remotion-templates --skill remotion-templates
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/ali-abassi/remotion-templates --skill remotion-templates

这个 Skill 是做什么的

开发类 Skill 面向写代码、改代码和排查问题,一般会读写仓库文件,部分还会执行构建或测试命令。

提供多种预置模板以加速 Remotion 视频项目的开发与迭代。适合快速启动品牌宣传片、产品演示或教育类动画项目。通过 GitHub 安装后,可在 Codex、Claude、Cursor 等宿主中选择并应用模板。模板可能包含版权素材,商用前需确认授权许可范围。建议根据实际需求调整模板内容,避免直接复制导致风格不统一。

来源仓库内路径:skills/remotion-templates

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/ali-abassi/remotion-templates --skill remotion…;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它标注为只读,先用只读任务试一次,确认行为符合预期再扩大使用范围。

常见问题

6 条

remotion-templates 怎么安装?

在终端执行 npx skills add https://github.com/ali-abassi/remotion-templates --skill remotion-templates。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

remotion-templates 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

remotion-templates 需要什么权限?

权限级别是只读。该 Skill 主要提供规则、说明或参考内容,本身偏只读;真正读写文件、联网或执行命令仍取决于宿主 Agent 的任务。

remotion-templates 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

remotion-templates 用的人多吗?

公开数据是累计安装 514 次,近一周安装 21 次,下载 165 次,GitHub 1 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

remotion-templates 安全吗?

第三方扫描有未通过项,风险较高。除非你确认过源码,否则不建议直接安装到常用环境。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 标注为只读权限,试用阶段不容易误改本地文件。

先想清楚的地方

  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 第三方扫描存在提醒项或未通过项,需要人工逐条确认。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理开发类任务、又不想每次都手写提示词的人。
  • 只想先试试效果、不希望它改动本地文件的人。

不太适合

  • 需要明确授权才能用到公司项目里的场景。
  • 需要厂商级技术支持和 SLA 的生产系统。

开发类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
skill-vetter

技能审查员 · OpenClaw

8,779,018986操作浏览器MIT-0通过
ontology

本体论 · OpenClaw

6,636,960576只读MIT-0通过
entra-app-registration

内部应用程序注册 · Codex、Claude

6,631,872764接触敏感数据未明确通过
entra-app-registration

内部应用程序注册 · Codex、Claude

3,757,680201接触敏感数据未明确通过
nano-banana-pro

纳米香蕉专业版 · OpenClaw

3,526,898364接触敏感数据MIT-0有提醒
remotion-templates

Remotion templates 视频 · 本页

5141只读未明确未通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Purpose

This skill provides Claude Code and AI coding agents with comprehensive context for building production-ready videos using Remotion. It includes design principles, curated templates, and best practices.

When to Use

Use this skill when:

  • Creating video content programmatically with React
  • Building podcast audiograms or audio visualizations
  • Adding animated captions to videos (TikTok/Reels style)
  • Creating 3D product showcases
  • Building a video generation SaaS
  • Making data visualization videos
  • Generating social media content at scale

Video Design Principles

1. Pacing & Rhythm

  • Fast cuts: 1-2 seconds for energy (social media)
  • Medium pace: 3-5 seconds for comprehension (tutorials)
  • Slow pace: 5-10 seconds for emphasis (cinematic)
  • Match audio: Sync transitions to beats/speech

2. Visual Hierarchy

  • One focal point per frame
  • Use motion to guide attention
  • Contrast important elements
  • Maintain consistent spacing

3. Text on Video Rules

  • Maximum 7 words per frame
  • High contrast (white on dark, or outlined)
  • Leave text on screen long enough to read 2x
  • Position in lower third or center
  • Avoid edges (safe zone: 10% margin)

4. Animation Timing

ElementDurationEasing
Text appear8-15 frameseaseOut
Text exit6-10 frameseaseIn
Scene transition15-30 frameseaseInOut
Logo reveal30-60 framesspring
Quick cut0-3 frameslinear

5. Frame Rates

  • 30fps: Standard video, social media
  • 60fps: Smooth motion, gaming content
  • 24fps: Cinematic feel
  • 25fps: European broadcast

6. Aspect Ratios

PlatformRatioResolution
YouTube16:91920x1080
TikTok/Reels9:161080x1920
Instagram Feed1:11080x1080
Instagram Story9:161080x1920
Twitter16:91280x720
LinkedIn16:91920x1080

Quick Start

Installation

# New project with template selection
npx create-video@latest

# Manual setup
mkdir my-video && cd my-video
npm init -y
npm install remotion @remotion/cli react react-dom
npm install -D typescript @types/react

Project Structure

src/
├── index.ts           # registerRoot
├── Root.tsx           # Composition definitions
├── compositions/
│   ├── Main.tsx       # Main video
│   └── Intro.tsx      # Intro sequence
├── components/
│   ├── Text.tsx       # Animated text
│   └── Logo.tsx       # Logo reveal
└── assets/
    ├── fonts/
    ├── images/
    └── audio/

Root.tsx Template

import { Composition } from 'remotion';
import { Main } from './compositions/Main';

export const RemotionRoot = () => {
  return (
    <>
      <Composition
        id="Main"
        component={Main}
        durationInFrames={300}
        fps={30}
        width={1920}
        height={1080}
        defaultProps={{
          title: "My Video"
        }}
      />
    </>
  );
};

Core Patterns

Animation Fundamentals

import { useCurrentFrame, useVideoConfig, interpolate, spring } from 'remotion';

const frame = useCurrentFrame();
const { fps, width, height, durationInFrames } = useVideoConfig();

// Linear interpolation (clamped)
const opacity = interpolate(frame, [0, 30], [0, 1], {
  extrapolateRight: 'clamp'
});

// Spring animation (bouncy)
const scale = spring({
  frame,
  fps,
  config: { damping: 12, stiffness: 200 }
});

// Delayed spring
const delayedScale = spring({
  frame: frame - 15, // 15 frame delay
  fps,
  config: { damping: 10 }
});

Sequencing

import { Sequence, AbsoluteFill } from 'remotion';

export const MyVideo = () => (
  <AbsoluteFill>
    <Sequence from={0} durationInFrames={60}>
      <Intro />
    </Sequence>
    <Sequence from={60} durationInFrames={120}>
      <MainContent />
    </Sequence>
    <Sequence from={180}>
      <Outro />
    </Sequence>
  </AbsoluteFill>
);

Text Animation

const TextReveal = ({ text }: { text: string }) => {
  const frame = useCurrentFrame();
  const words = text.split(' ');

  return (
    <div style={{ display: 'flex', gap: 10, justifyContent: 'center' }}>
      {words.map((word, i) => {
        const delay = i * 5;
        const opacity = interpolate(frame - delay, [0, 10], [0, 1], {
          extrapolateLeft: 'clamp',
          extrapolateRight: 'clamp'
        });
        const y = interpolate(frame - delay, [0, 10], [20, 0], {
          extrapolateLeft: 'clamp',
          extrapolateRight: 'clamp'
        });

        return (
          <span key={i} style={{ opacity, transform: `translateY(${y}px)` }}>
            {word}
          </span>
        );
      })}
    </div>
  );
};

Audio Sync

import { Audio, useCurrentFrame, interpolate } from 'remotion';
import { getAudioDurationInSeconds } from '@remotion/media-utils';

// Volume envelope
const frame = useCurrentFrame();
const volume = interpolate(frame, [0, 30, 270, 300], [0, 1, 1, 0]);

<Audio src={staticFile('music.mp3')} volume={volume} />

Template Catalog

Captions & Subtitles

remotion-subtitles (17 Styles)
npm install @ahgsql/remotion-subtitles
import { Subtitle } from '@ahgsql/remotion-subtitles';

// Available styles: bounce, fire, glitch, neon, typewriter,
// 3d, lightning, glowing, explosive, wave, slide, fade,
// zoom, rotate, flip, shake, pulse

<Subtitle
  src={staticFile('captions.srt')}
  style="bounce"
  fontSize={48}
  color="#ffffff"
  strokeColor="#000000"
  strokeWidth={2}
/>
TikTok-Style Captions
const Caption = ({ text, highlight }: { text: string; highlight: number }) => {
  const words = text.split(' ');

  return (
    <div style={{
      position: 'absolute',
      bottom: '20%',
      width: '100%',
      textAlign: 'center',
      fontSize: 64,
      fontWeight: 900,
      textTransform: 'uppercase'
    }}>
      {words.map((word, i) => (
        <span
          key={i}
          style={{
            color: i === highlight ? '#FFE135' : '#FFFFFF',
            textShadow: '4px 4px 0 #000, -4px -4px 0 #000, 4px -4px 0 #000, -4px 4px 0 #000'
          }}
        >
          {word}{' '}
        </span>
      ))}
    </div>
  );
};

Audio Visualization

Waveform Visualizer
import { useAudioData, visualizeAudio } from '@remotion/media-utils';

const Waveform = ({ src }: { src: string }) => {
  const frame = useCurrentFrame();
  const { fps } = useVideoConfig();
  const audioData = useAudioData(src);

  if (!audioData) return null;

  const visualization = visualizeAudio({
    fps,
    frame,
    audioData,
    numberOfSamples: 64
  });

  return (
    <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>
      {visualization.map((amplitude, i) => (
        <div
          key={i}
          style={{
            width: 8,
            height: amplitude * 200,
            backgroundColor: '#667eea',
            borderRadius: 4
          }}
        />
      ))}
    </div>
  );
};
Circular Audio Visualizer
const CircularVisualizer = ({ audioData, frame, fps }) => {
  const visualization = visualizeAudio({ fps, frame, audioData, numberOfSamples: 32 });
  const radius = 150;

  return (
    <svg width={400} height={400} viewBox="0 0 400 400">
      {visualization.map((amp, i) => {
        const angle = (i / visualization.length) * Math.PI * 2;
        const x1 = 200 + Math.cos(angle) * radius;
        const y1 = 200 + Math.sin(angle) * radius;
        const x2 = 200 + Math.cos(angle) * (radius + amp * 100);
        const y2 = 200 + Math.sin(angle) * (radius + amp * 100);

        return <line key={i} x1={x1} y1={y1} x2={x2} y2={y2} stroke="#667eea" strokeWidth={4} />;
      })}
    </svg>
  );
};

3D with Three.js

Setup
npm install @remotion/three three @react-three/fiber @react-three/drei
Phone Mockup
import { ThreeCanvas } from '@remotion/three';
import { useFrame } from '@react-three/fiber';

const PhoneMockup = ({ videoSrc }: { videoSrc: string }) => {
  const frame = useCurrentFrame();
  const rotation = interpolate(frame, [0, 150], [0, Math.PI * 2]);

  return (
    <ThreeCanvas>
      <ambientLight intensity={0.5} />
      <pointLight position={[10, 10, 10]} />
      <mesh rotation={[0, rotation, 0]}>
        <boxGeometry args={[2, 4, 0.2]} />
        <meshStandardMaterial color="#1a1a2e" />
      </mesh>
    </ThreeCanvas>
  );
};

Social Media Templates

Instagram Reel Intro
const ReelIntro = ({ username, avatar }: Props) => {
  const frame = useCurrentFrame();
  const scale = spring({ frame, fps: 30, config: { damping: 12 } });

  return (
    <AbsoluteFill style={{ background: 'linear-gradient(135deg, #667eea, #764ba2)' }}>
      <div style={{
        transform: `scale(${scale})`,
        display: 'flex',
        flexDirection: 'column',
        alignItems: 'center',
        justifyContent: 'center',
        height: '100%'
      }}>
        <img
          src={avatar}
          style={{ width: 120, height: 120, borderRadius: '50%', border: '4px solid white' }}
        />
        <h1 style={{ color: 'white', fontSize: 48, marginTop: 20 }}>@{username}</h1>
      </div>
    </AbsoluteFill>
  );
};
YouTube Subscribe CTA
const SubscribeCTA = () => {
  const frame = useCurrentFrame();
  const slideIn = interpolate(frame, [0, 20], [100, 0], { extrapolateRight: 'clamp' });
  const bellWiggle = Math.sin(frame * 0.5) * 10;

  return (
    <div style={{
      position: 'absolute',
      bottom: 50,
      right: 50,
      transform: `translateX(${slideIn}%)`,
      display: 'flex',
      alignItems: 'center',
      gap: 20,
      background: 'rgba(0,0,0,0.8)',
      padding: '20px 30px',
      borderRadius: 50
    }}>
      <div style={{
        background: '#FF0000',
        padding: '12px 24px',
        borderRadius: 4,
        color: 'white',
        fontWeight: 'bold'
      }}>
        SUBSCRIBE
      </div>
      <div style={{ transform: `rotate(${bellWiggle}deg)`, fontSize: 32 }}>
        🔔
      </div>
    </div>
  );
};

Effects Library

Glitch Effect

const GlitchText = ({ text }: { text: string }) => {
  const frame = useCurrentFrame();
  const glitchOffset = Math.random() > 0.9 ? Math.random() * 10 - 5 : 0;

  return (
    <div style={{ position: 'relative' }}>
      <span style={{
        position: 'absolute',
        left: glitchOffset,
        color: 'cyan',
        clipPath: 'inset(0 0 50% 0)'
      }}>
        {text}
      </span>
      <span style={{
        position: 'absolute',
        left: -glitchOffset,
        color: 'magenta',
        clipPath: 'inset(50% 0 0 0)'
      }}>
        {text}
      </span>
      <span style={{ color: 'white' }}>{text}</span>
    </div>
  );
};

Particle Field

const Particles = ({ count = 50 }: { count?: number }) => {
  const frame = useCurrentFrame();
  const particles = useMemo(() =>
    Array.from({ length: count }, () => ({
      x: Math.random() * 100,
      y: Math.random() * 100,
      size: Math.random() * 4 + 2,
      speed: Math.random() * 0.5 + 0.2
    })),
    []
  );

  return (
    <AbsoluteFill style={{ overflow: 'hidden' }}>
      {particles.map((p, i) => (
        <div
          key={i}
          style={{
            position: 'absolute',
            left: `${p.x}%`,
            top: `${(p.y + frame * p.speed) % 100}%`,
            width: p.size,
            height: p.size,
            borderRadius: '50%',
            background: 'rgba(255,255,255,0.5)'
          }}
        />
      ))}
    </AbsoluteFill>
  );
};

Gradient Background

const AnimatedGradient = () => {
  const frame = useCurrentFrame();
  const hue = (frame * 2) % 360;

  return (
    <AbsoluteFill
      style={{
        background: `linear-gradient(
          ${frame}deg,
          hsl(${hue}, 70%, 50%),
          hsl(${(hue + 60) % 360}, 70%, 50%),
          hsl(${(hue + 120) % 360}, 70%, 50%)
        )`
      }}
    />
  );
};

CLI Commands

# Development
npm run dev                    # Start Remotion Studio
npx remotion studio            # Same thing

# Render video
npx remotion render Main out.mp4
npx remotion render Main out.mp4 --props='{"title":"Hello"}'
npx remotion render Main out.mp4 --codec=h265 --crf=18

# Render still image
npx remotion still Main out.png --frame=30

# Common flags
--codec=h264|h265|vp8|vp9|prores
--crf=18           # Quality (lower = better, 15-23 typical)
--scale=2          # 2x resolution
--concurrency=4    # Parallel rendering
--muted            # No audio

Deployment Options

Remotion Lambda (AWS)

npm install @remotion/lambda
npx remotion lambda sites create
npx remotion lambda render [site-name] Main

GitHub Actions

- uses: remotion-dev/render@v1
  with:
    composition: Main
    output: video.mp4

SST/Pulumi

git clone https://github.com/karelnagel/remotion-sst

Recommended Templates by Use Case

Use CaseTemplateURL
Podcast clipstemplate-audiogramremotion-dev/template-audiogram
TikTok captionsremotion-subtitlesahgsql/remotion-subtitles
Music videosaudio-visualizersmarcusstenbeck/remotion-audio-visualizers
Product demostemplate-threeremotion-dev/template-three
Video SaaStemplate-next-app-dir-tailwindremotion-dev/template-next-app-dir-tailwind
Dev portfoliosgithub-statsLukasParke/github-stats-remotion
Code tutorialstemplate-code-hikeremotion-dev/remotion
YouTube introsfireship-introthecmdrunner/fireship-remotion-intro

Quick Reference

TaskCode
Get frameuseCurrentFrame()
Get configuseVideoConfig()
Interpolateinterpolate(frame, [0, 30], [0, 1])
Springspring({frame, fps, config: {damping: 12}})
Sequence<Sequence from={30} durationInFrames={60}>
Image<Img src={staticFile('img.png')} />
Video<Video src={staticFile('vid.mp4')} />
Audio<Audio src={staticFile('audio.mp3')} volume={0.5} />
Static filestaticFile('public/file.png')
Full container<AbsoluteFill>

Resources

平台分布

Codex

37.62%
按下载量换算62

Claude

30.25%
按下载量换算50

Cursor

20.05%
按下载量换算33

Gemini CLI

9.73%
按下载量换算16

安全审计

Gen Agent Trust Hub

通过

Socket

未通过

Snyk

可疑

权限和风险

只读

该 Skill 主要提供规则、说明或参考内容,本身偏只读;真正读写文件、联网或执行命令仍取决于宿主 Agent 的任务。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在提醒或未通过项,安装前请自行复核。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills