Communitygithub.com

beachyphotoandfilm-arch/video-skills

为每个 Reel 设计独特的 Instagram 封面,符合您的品牌风格。它能理解 Reel 内容,撰写简短吸引眼球的标题,从您标记的照片库中选取一张照片,按照现有封面的布局进行设计,并在手机尺寸的网格视图中进行预览。所有渲染在本地完成,绝不使用 AI 图像生成。可由排期技能在 Reel 排期前调用。触发词:“make covers”、“reel covers”、“cover photo for this reel”、“design the IG covers”。

video-skills 是什么?

该技能为每个 Instagram Reel 自动生成独一无二的封面,严格遵循您的品牌风格和设计规则。它首先分析 Reel 的脚本、标题和文字卡片,确定其核心承诺,然后根据钩子类型规则撰写 3-4 个候选标题。接着,该技能会调用 `pick.py` 脚本,根据主题词从本地照片库中筛选照片,并确保最近 9 个封面未使用过该照片。之后,它会根据所选照片的构图(空白区域、焦点)自动(或提供明确的布局参数)将标题和可选的副标题放置在安全区域内,避开 Instagram 网格上的 Reel 图标。技能支持在封面中添加箭头、内嵌图像或头像等额外元素。整个流程在本地使用 Puppeteer 进行渲染,生成 1080x1920 分辨率的高质量 JPG 封面,同时生成完整的封面预览图和手机网格尺寸的预览图。用户确认后,技能会将最终封面文件复制到指定文件夹,更新封面日志以确保唯一性规则(如不重复使用照片、布局和钩子类型)。该技能主要针对 Instagram 网格设计进行优化,但生成的封面文件也可以作为 YouTube Shorts 或 TikTok 的视频缩略图使用。它包含一个详细的品牌配置表(颜色、字体、照片库路径等),强烈建议基于您最新的封面进行参考,以保持风格的一致性。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/beachyphotoandfilm-arch/video-skills/tree/HEAD/skills/reel-covers

在你喜欢的 AI 中提问

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

文档

Reel 封面

每个 Reel 都有其专属封面。它使用您的真实照片和真实字体构建,并将文字保持在 Instagram 个人资料网格显示的区域之内。

配置:在此设置您的品牌

首次运行前编辑一次。

设置位置默认值
强调色scripts/cover.html 中的 --brand#3b82f6
标题字体scripts/cover.html 中的 --display-fontAnton (免费,Google Fonts)
副标题字体scripts/cover.html 中的 .subMontserrat Bold (免费)
默认副标题您的封面例如 "from a Home Cook",或留空
照片文件夹library.json 中的 photos_dir<PATH_TO_YOUR_COVER_PHOTOS>
Canva 照片文件夹 (可选)library.json 中的 canva_folder<YOUR_CANVA_FOLDER_ID>
Canva 封面母版文档 (可选)您当前风格的参考<YOUR_CANVA_COVER_MASTER_DOC_ID>
Canva 草稿设计 (可选)用于从 Canva 导出照片<YOUR_CANVA_SCRATCH_DESIGN_ID>
封面日志pick.py 的 COVER_LOG 环境变量项目根目录下的 drafts/social/cover-log.json
完成封面的存放位置步骤 8<YOUR_VIDEO_FOLDER>/<Video> YYYY-MM-DD/Covers/
禁用词hooks.md 规则您的列表 (例如旧的优惠名称)

专为 Instagram 设计。 封面可以作为普通 IG + TikTok + Shorts 帖子的视频缩略图(例如 Metricool 的 videoThumbnailUrl)。仅 Instagram 网格对设计至关重要。切勿替换帖子已有的封面。

切勿使用 AI 生成图片。 背景是您的照片,布局复制自您的封面。代码仅负责排列它们。

默认品牌风格 (可根据喜好更改)

仅参考您母版文档中最新的封面。 您已淘汰的旧风格不计入在内。

  • 一张明亮、中性的照片,包含您和一个相关道具(笔记本电脑、相机、手机、产品),文字所在位置为纯色背景。
  • 标题使用白色展示字体,始终全大写,居中,2 或 3 行,字号相对较小。
  • 可选的副标题使用 Montserrat Bold 字体,正常大小写。
  • 默认:无阴影、无轮廓、无文字后的色带或暗化处理、无强调色文字。
  • 无标签、无斜体字、无手写体或草书字体、无大数字或系列布局。
  • 唯一的额外元素:偶尔使用一个纯色强调手绘箭头。
  • Reel 图标下方不放任何内容:Instagram 的网格将图标放置在每个磁贴的右上角。如果任何内容位于 x > 760 且 y < 540 的区域,render.mjs 会发出警告。

标题规则、钩子类型和标签在 hooks.md 中。编写标题前请先阅读它。

文件

文件说明
scripts/cover.html唯一布局:标题 + 可选副标题,以及 arrow / inset / avatar 等额外元素。品牌配置位于顶部。
scripts/render.mjs渲染 1080x1920 的 JPG 图片 + 两种预览图,并对超出安全区域的文字或大于 8MB 的文件发出警告。
scripts/pick.py根据主题筛选照片,阻止使用最近 9 张用过的照片,并打印最近的布局和钩子类型。
library.json每张照片及其标签(姿势、道具、空白区域位置、焦点)。附带一个示例;请构建您自己的。
封面日志 (COVER_LOG)已发布的所有封面记录。这是保持封面唯一性的关键。
photos_dir您的高分辨率照片(仅限本地,请勿加入 git 仓库)。

scripts/ 需要 puppeteer-core(在 scripts/ 中执行 npm i puppeteer-core,或将 scripts/node_modules 符号链接到另一个技能的安装目录)、Google Chrome 和 ffmpeg。render.mjs 指向 macOS 默认的 Chrome 路径;如果您的路径不同,请更改 executablePath。

运行流程

1. 了解 Reel。 您需要每个 Reel 的文字记录、标题和开头文字卡片。确定 Reel 的核心承诺。

2. 标题。 选择一个与上一个封面不同的钩子类型(pick.py 会打印出来)。编写 3 到 4 个选项,每个 3 到 8 个词,然后选出最强的一个。它不能逐字重复开头文字卡片的内容。

3. 照片。

python3 .claude/skills/reel-covers/scripts/pick.py "<主题词>" --space top

然后 查看前 3 或 4 张 后再选择(使用 ffmpeg 创建联系表)。道具要与主题匹配:邮件、系统或网站相关用笔记本电脑;设备或产品相关用相机或产品;销售和心态相关用您正在说话的照片。对于客户案例,使用客户的嵌入图或头像(需获得许可)。

4. 布局。 不要与上一个封面的布局相同(参见 pick.py)。将文字放在照片的空白区域(space),设置 focus 以确保面部清晰,并设置 y 使文字块位于 300 到 1250 之间。

5. 渲染。

OUT="<work>/covers" node .claude/skills/reel-covers/scripts/render.mjs covers.json
{"covers":[{"id":"3-the-exact-close","img":"<PATH_TO_YOUR_COVER_PHOTOS>/<file>.jpg",
  "data":{"head":"the exact close I use on sales calls","sub":"from a Home Cook","y":560,"headroom":280}}],
 "history":["<最近几个已发布封面的文件名,最新的在前>"]}

将 ~ 扩展为实际路径;render.mjs 不会自动扩展。非零退出码表示存在警告,请在分享前修复。

6. 先自行检查。 打开 _proof.png 和 _grid-phone.png:

  • 标题在网格预览图(130px 宽)中是否可读?如果不可读,请减少字数。
  • 在完整封面和网格裁剪图中,面部是否都没有被文字遮挡?
  • 在网格中与其他封面相比,它看起来是否不同(照片、布局、文字位置),但又明显属于同一套?

7. 门控。 向用户展示 _grid-phone.png 和 _proof.png,以及每个标题及其一个备选标题。询问:"这些封面能吸引人滑动吗?" 根据要求更换照片或文字并重新渲染。这只需几秒钟。

8. 批准后:

  • 将每个 JPG 复制到 <YOUR_VIDEO_FOLDER>/<Video> YYYY-MM-DD/Covers/,命名为类似 Reel 的名称(例如 3. the exact close.jpg)。
  • 在封面日志中为每个封面添加一条记录: {"date":"YYYY-MM-DD","video":"<video-slug>","reel":"3. the exact close","photo":"<file>","layout":"stack","hook_type":"how","head":"the exact close I use on sales calls","file":"<Covers 文件夹中 jpg 文件的绝对路径>"}
  • 将这些文件交给您的排期步骤,由该步骤上传每个文件并将其附加到 Instagram 帖子。

唯一性规则

  • 最近 9 个封面使用过的照片不得再次使用。pick.py 强制执行此规则。
  • 连续两次不得使用相同的布局或钩子类型。
  • 轮换副标题:无副标题、居中副标题、或右偏移并倾斜的副标题(subdx、subrot)。
  • 根据照片改变文字位置(顶部、中间、左对齐或右对齐)。不要总是居中在顶部。
  • 如果照片库资源紧张(近期所有好照片都已使用),请说明情况并建议进行新的拍摄,而不是打破规则。

布局经验

  • 9:16 裁剪会把人脸位置抬高。 大多数照片是 2:3 比例。缩放到 1920 高时,会裁掉两侧而非顶部,因此原始照片中看起来位置较低的面部会位于 y 600 到 800 左右。最常见的错误是文字压在拍摄对象的头发上。 在检查任何其他内容之前,请先仔细查看每张预览图。
  • 使用 headroom 修复,而不是缩小文字。 "headroom": 150-350 会将照片向下推,并在拍摄对象上方拉伸纯色背景区域。在纯色工作室背景上是不可见的。不要在复杂的户外背景(树木和天空会使背景模糊)上使用。
  • 标题大小: 自动:4 个词或以下为 104px,更长时为 84px,会缩小以适应 3 行。
  • 如果副标题会碰到头部,则放弃使用它。 它只是纹理,不是信息。
  • 放置文字时要考虑 Reel 图标: 要么将文字块起始位置设为 y 560 或更低(用 headroom 向下推照片以避开头部),要么保持在高位并使用 align: left, right: 320。在整批封面中混合使用这两种方法。
  • 3:4 网格裁剪图会隐藏 y 240 以上的所有内容。将文字起始位置保持在 280 或更低(render.mjs 会发出警告)。

添加照片

从本地文件夹添加: 使用 md5 检查 photos_dir 中是否有重复,将文件复制为 <name>-<k>__local<MMDD>.jpg,然后添加标签。

从 Canva 添加 (可选)。 Canva 不会直接从上传文件夹下载图片。一个可行的方案是使用一个仅用于导出的草稿设计:

  1. 对 <YOUR_CANVA_FOLDER_ID> 执行 list-folder-items,并将资源 id 与 library.json 中的进行比对(在每个文件名中 __ 后保留 id)。
  2. 使用 open_transaction 对 <YOUR_CANVA_SCRATCH_DESIGN_ID> 执行 read-design,然后为每张新照片调用一次 edit-design 并附带 add_page(2400x3600,标题 = 资源 id)。读取新的页面 id,然后为每个页面调用一次 insert_fill(整页,top 0, left 0)。执行 commit。
  3. 以 PDF 格式 导出设计,export_quality: pro,然后运行 pdfimages -j -f <第一页> -l <最后一页> -p all.pdf ex/img。PDF 会原样嵌入原始 JPEG。JPG 导出也可以,但会为每个页面提供一个 URL。
  4. 将每张图片保存为 <名称>__<assetid>.jpg 到 photos_dir 中。多张照片可能共享同一个 Canva 名称,因此 id 用于区分它们。然后添加标签。

如果同一张照片上传了两次,保留一份并将其标记为 ok,另一份标记为 "ok": false, "note": "duplicate of N",否则不重复规则可能会选择同一张图片两次。

通过查看每张新文件,在 library.json 中为其添加标签:

{"file":"photo_-13.jpg","pose":"smiling at laptop","props":["laptop","desk"],"topics":["email","follow","systems","website"],
 "cap":false,"space":["top"],"focus":"50% 55%","ok":true}

space 是文字可以放置而不触及面部的区域。将模糊、过暗或角度不好的照片标记为 "ok":false,而不是删除它们。

相关

  • video-reels:开头文字卡片,封面标题不得重复其内容。
  • 排期技能 (可选):上传封面并排期 Reel。

Individual skills in this repo

This repo contains 7 individual skills — each has its own dedicated page.

beachyphotoandfilm-arch/video-skills

Sync camera footage to a separate lapel or field-recorder track (e.g. Tascam DR-10L and similar) and lay it up in DaVinci Resolve. Stitches the recorder's split files, finds each clip's exact place in the audio by matching words then waveforms, cuts one lapel slice per clip so every later skill works unchanged, checks for clipping, and builds a synced timeline in a new Resolve project. Trigger on "sync the lapel", "sync my audio", "line up the recorder", "I used a lav", or any shoot with a separate audio folder (live talks, events, workshops). Run it before paper-edit or video-reels.

beachyphotoandfilm-arch/video-skills

Turn raw talking-head footage into an assembled rough cut inside DaVinci Resolve. Pulls the clips off your footage drive, transcribes them locally, removes failed takes, restarts, asides and dead air, then creates a new Resolve project with two paper-edit timelines ready for your fine trim. Trigger on "paper edit", "cut my raw footage", "make a rough cut", "clean up this video", or when the user points at a folder of raw camera files for a YouTube video.

beachyphotoandfilm-arch/video-skills

Render finished reels out of DaVinci Resolve, write captions in the creator's voice, attach a custom Instagram cover from reel-covers, and schedule them to Instagram, TikTok and YouTube Shorts through Metricool. Handles the Drive upload hop, collision checks against the existing calendar, and cleanup. Trigger on "schedule the reels", "post these", "put these on the calendar", or after reels are approved.

beachyphotoandfilm-arch/video-skills

Build animated brand overlays (motion graphics) for a talking-head video, timed to the speaker's exact words, plus a DaVinci Resolve import file. House style is in-scene type (text beside and behind the speaker's head) plus diagrams. Transcribes the rough cut locally, picks the moments, renders transparent .mov clips, and writes an FCPXML that drops every clip onto the timeline already in position. Trigger on "make animations for this video", "add overlays/motion graphics", "animate this", "b-roll graphics for my YouTube video", or when the user shares a rough cut and asks for graphics.

beachyphotoandfilm-arch/video-skills

Cut vertical Instagram reels out of a long-form talking-head video, hook first. Picks the strongest standalone moments from the transcript, opens each reel on its punchiest line, builds vertical timelines in DaVinci Resolve framed on the speaker's face with the LUT applied, and finishes them: a hook (a held text card, or a word-by-word "build" hook with punch-in) and burned-look captions on V3; this-or-that reels get product graphics and a comment-keyword CTA card. You trim and render, nothing to import. Trigger on "make reels", "clip this for Instagram", "cut some verticals", or after a YouTube video is cut.

beachyphotoandfilm-arch/video-skills

Design YouTube thumbnails and titles for a talking-head video. Pulls graded full-res frames out of the raw footage, renders brand-styled variants in two proven layouts, and proofs them at phone size where the click actually gets decided. Trigger on "make thumbnails", "thumbnail for this video", "title and thumbnail", or after a video is cut.

beachyphotoandfilm-arch/video-skills

Run the whole YouTube video pipeline end to end, one stage at a time, stopping for the creator's approval at every gate. Paper edit, punch-ins, reels, reel covers, scheduling the reels, overlays, thumbnail and title, then scheduling the long-form video, all through Metricool. Keeps state per video so you can stop anywhere and pick up later. Trigger on "/youtube", "let's do the whole video", "run the video pipeline", "continue the <name> video", or when handed raw footage for a YouTube video.

相关技能