Home / All Skills / Content & Media Creation / photo-slideshow
Content & Media Creation · iart-ai/ecommerce-video-skills

photo-slideshow

This skill should be used when the user asks to "make a photo slideshow", "turn photos into a video", "create a photo montage video", "make a picture slideshow with music", "build a memories/recap video from photos", "add Ken Burns pan/zoom to photos", "sync slide changes to the music beat", or "render a video from a folder of images". Covers per-photo Ken Burns motion, transitions, beat-synced timing, mixed aspect-ratio handling, captions/dates, intro/outro cards, and templating a photo folder into a finished video.

L4 High-Privilege · Graded auth & full auditV1 Commit-PinnedExecute CommandNetwork AccessWrite FileDual-pass Audit
Author iart-aiGitHub iart-ai/ecommerce-video-skills ↗Stars 8License MIT(仓库根 LICENSE:「MIT License」/「Copyright (c) 2026 iart.ai」;.claude-plugin/plugin.json 与 README「## License」同声明 MIT)Commit 2bd0dd19c9
Control levels describe skill capabilities and suggested control measures; they do not represent quality or safety certifications, nor do they dictate usability. Usage decisions rest entirely with users and administrators. Different agent hosts apply varying constraints; do not assume hosts provide automatic protection. Third-party skill copyrights belong to their original authors. Use at your own risk.

1How It Works & Mechanism

Sole absolute rule: No two photos may use the same motion, and this variation must be deterministic pseudorandomness seeded by index.

skills/photo-slideshow/SKILL.md
**No two slides may move the same way.** The instant-giveaway of an amateur slideshow is every photo doing the identical slow zoom-in. Vary direction, zoom in vs. out, and start scale per photo — but make it **deterministic** (seeded by index), so re-renders are identical and a frame-based renderer stays stable.
"Variation" solves visual fatigue, while "determinism" ensures frames render consistently even under out-of-order rendering.

The seeding mechanism uses mulberry32 + index seeding: the same photo always receives the same motion, while adjacent photos differ.

skills/photo-slideshow/references/ken-burns.md
`mulberry32` is a tiny, fast, well-distributed 32-bit PRNG. Seed it with the photo index so photo 0 always gets the same move, but adjacent photos differ.
The reference provides an 8-motion vocabulary and a "fallback deduplication" safeguard.

Ken Burns only modifies transform, with an initial scale ≥1.05 to ensure panning does not expose blank borders.

skills/photo-slideshow/SKILL.md
Always start scale ≥ `1.05` so a pan never exposes an empty edge.
KB notes explain that animating width/height triggers layout reflows, stuttering, and even flickering.

Mixed aspect ratio photos use blurred-pad (blurred background + contain foreground original); never stretch.

skills/photo-slideshow/references/aspect-and-layout.md
Blurred-pad wins for mixed folders: it fills the frame, never crops the subject, and the soft blur reads as intentional depth rather than empty bars.
Additional pixel criterion: if aspect ratio difference is <15%, use cover; otherwise use blurred-pad.

Soundtrack first: detect beats offline once and bake them into props; never perform frame-by-frame audio analysis during rendering.

skills/photo-slideshow/references/timing-and-audio.md
The rule: **lock the music first, derive slide boundaries from it.** Detect beats once, offline, and bake them into props — audio analysis per frame is non-deterministic and slow.
Transition every 2 or 4 beats, with a fallback BPM grid provided.

Folder → manifest: natural sorting, EXIF capture time, filename caption extraction—all derived from data.

skills/photo-slideshow/references/templating-folder.md
// natural sort so photo2 < photo10 (default lexical sort breaks this)
Also clarifies avoiding file mtime, which becomes unreliable after copying.

Images must be gated by loading states (staticFile + delayRender/continueRender); otherwise, blank frames may flash.

skills/photo-slideshow/SKILL.md
- Photos loaded via `staticFile()`, gated with `delayRender`/`continueRender` so each image (and any caption font) is present before its frame renders — otherwise a slide pops in blank.
This requirement was not followed in the reference implementation (see second_pass).

The verification loop focuses on whether every photo actually loads and reframes correctly, rather than aesthetic appeal.

skills/photo-slideshow/SKILL.md
A slideshow ingests a whole folder of user photos — the verify pass is mostly *did every photo actually load and reframe without distortion*.
When batch-processing multiple albums, verify one representative folder first.

Select only one transition type (default 0.4–0.6s cross-dissolve) and overlap rather than hard-cut, unless cutting exactly on-beat.

skills/photo-slideshow/SKILL.md
Pick **one** transition and keep it consistent — mixing wipes, spins and cubes screams "template."
The reference uses TransitionSeries + fade() at 15 frames (0.5s @ 30fps).

2Core Capabilities

01Seeded diversified Ken Burns (motion vocabulary + mulberry32 + subject anchor)
02Subject-aware anchoring (setting transform-origin by face/focal point to avoid panning subjects out of frame)
03Three adaptation strategies and automatic criteria (blurred-pad / cover / contain)
04Beat-synced slide transitions (librosa offline beat detection + transitions every 2/4 beats + hit point dynamics)
05BPM grid fallback without audio analysis (60/bpm × beatsPerSlide × fps)
06Data-driven slideshow (photos + beats + music all as props, timing derived from data)
07Pure FFmpeg fallback (zoompan per slide + xfade concatenation + audio track muxing)
08Multi-aspect-ratio safe zones (16:9 / 9:16 / 1:1, compose once and render multiple times)

3External Dependencies

KindDependency / Endpoint
packageremotion(frame/interpolate/Easing/Img/Audio/Sequence)
package@remotion/transitions(TransitionSeries + fade)
packagesharp + exifr(读图像尺寸与 EXIF DateTimeOriginal)
packagelibrosa + soundfile(pip 安装;离线测 beat 与 onset)
cliffmpeg(blurred-pad、zoompan、xfade 与仓库共享 contact-sheet.sh)
networkiart.ai(reference 尾部推广链接,具 utm 参数;仅读者点击才请求)

4Recommended Governance & Evidence

Suggested Controls for Safe Operation
For Agent Runtime
Graded/per-use authorization, sandbox recommended
For Administrators
Approval workflow, rollback support, full audit
Evidence & Triggers (File Paths & Excerpts)
  • scripts/: Execute local scripts or commands: No bundled scripts in skill directory; SKILL.md/reference instructs agent to execute `node scripts/build-manifest.
  • 网络端点: Declare external network access: No business API calls during execution; photos and music originate from user local files.
  • 本地工作目录: File I/O and artifact output: Writes `photos.json`/`props.json`, `beats.json`, `out/<name>.mp4`, `out/*.gif` inside the user project
Audit Notes: . Triggered item is the classification criterion "relies on third-party plugins, container images, or remote packages", having the broadest dependency footprint among the 9 skills in this batch: remotion and @remotion/transitions (npm), sharp and exifr (npm, manifest build), librosa and soundfile (pip), plus ffmpeg/ffprobe; all must be fetched from public repositories for execution. The repository's `remotion-video` was previously rated Orange under the same standard, and this aligns with it. **Explicitly non-applicable items**: No process.env / API key / token / cookie / keychain access (token scan returned zero substantial hits); never uploads photos or music to any external service (parsing and rendering remain entirely local, assets do not leave the network); no TLS downgrade, no `--no-verify`, no sandbox disabling, and no anti-automation evasion. Trigger condition: Occurs only during manifest generation, beat detection, and video rendering.

5Second-Pass Verification

  • [discrepancy] 图片加载门控口径是否实现一致 — SKILL.md 要求 staticFile() + delayRender/continueRender 门控,但 templating-folder.md 的 Slideshow 直接把 manifest 里的文件系统路径(join(dir, f))交给 Img/KenBurnsImage,既未用 staticFile 也无 delayRender——照抄 reference 会拿不到 Remotion public/ 之外的资源,且仍可能出现空白帧。
  • [discrepancy] 被引用的「打包脚本」是否真的存在 — reference 以 `scripts/build-manifest.mjs` 文件名给出源码、SKILL.md 也写 `node scripts/build-manifest.mjs ./photos`,但仓库根 scripts/ 只有 seek-shot.sh / contact-sheet.sh / probe-mp4.sh,没有 build-manifest.mjs;`python beats.py` 同理(脚本内联在文档里)。使用前必须自行落盘。
  • [ok] 起始 scale 与运动确定性口径 — SKILL.md 的 start scale ≥ 1.05、seeded by index 与 ken-burns.md 的 `const base = 1.05;`、`mulberry32(index * 2654435761)` 完全一致。
  • [ok] 适配策略与判据是否自洽 — aspect-and-layout.md 的三策略表与 fitStrategy 阈值(<0.15 → cover)一致;SKILL.md 的 never stretch 与 blurred-pad 默认选择一致。
  • [ok] 换片节奏的量化声明 — timing-and-audio.md 的每张 3–6s、低于约 2.5s 会显仓促、每 2/4 拍换片,与 SKILL.md 的 photos hold ≥1 musical unit, not every beat 一致。
  • [unlocatable] 隐私面:照片元数据是否被提示处理 — manifest 读取 EXIF DateTimeOriginal 并把日期上屏,但全文未讨论照片 GPS/相机信息的处理与输出视频的元数据策略;源码内定位不到任何隐私处理声明,记 unlocatable(能力缺口,不作为档位依据)。

6Verdict & Scenarios

  • Turns "every photo has distinct motion" into an implementable mechanism (index seeding + motion vocabulary) while preserving frame render determinism
  • Provides default optimal solutions and criteria for mixed aspect ratio photos, eliminating stretching distortion
  • Soundtrack-first engineering: detect once offline and bake into props, avoiding non-determinism from frame-by-frame audio analysis
  • Manifest handles real-world photo album edge cases including natural sorting, EXIF, and filename captions
  • Maintains a complete FFmpeg pipeline fallback for environments without Node, establishing clear usability boundaries
  • Best for: Scenarios turning an entire album folder into a finished video: weddings, travel, annual recaps, or memorial videos with mixed vertical/horizontal photos, requiring dynamic Ken Burns motion, music beat-synced transitions, date captions, and a reusable templated pipeline.
    Not for: Needing only a single static image card; duration driven by voiceover narrative (use presentation-video); environments unwilling to handle dependency installation and script persistence.
    Install Agent-Ready
    ① Verified Mirror 2026-09-28
    Option A · Direct DownloadDownload photo-slideshow.tar.gz
    sha256: 58ffd9961bdf764e…
    Option B · Copy Guide for Agent
    install.json
    Agents automatically download and verify mirrors from this JSON guide.
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit 2bd0dd19c9.