
Media Composition
- 95 installs
- 325 repo stars
- Updated August 2, 2026
- athola/claude-night-market
Stitch multiple GIF or video clips into one tutorial-style composite using a manifest and FFmpeg layouts.
About
media-composition is an agent skill for solo builders who already have separate GIF or video segments and need one polished tutorial file. It reads a manifest, checks that each referenced asset exists and matches expectations, then runs FFmpeg to stack, grid, concatenate, or overlay clips with documented commands for vertical tutorials, side-by-side comparisons, and PiP demos. The flow is deliberately procedural—TodoWrite checkpoints and verification after encode—so agents do not skip validation or leave broken composites. It targets content-heavy workflows: terminal plus browser walkthroughs, comparison reels, and stitched screencasts without hand-editing filter graphs every time. Install it when you are assembling multi-part media from generated or captured pieces rather than authoring a single clip from scratch, and pair it with gif-generation when clips must be created first.
- Four-step workflow: parse manifest, validate component outputs, run FFmpeg composition, verify combined file
- Layout modes: vertical stack, horizontal stack, sequential concat, 2×2 grid, picture-in-picture, optional background col
- Manifest-driven composition with schema validation before encoding
- Documents concrete FFmpeg command patterns for each layout option
- Depends on scry:gif-generation for upstream clip assets
Media Composition by the numbers
- 95 all-time installs (skills.sh)
- Ranked #796 of 1,335 Generative Media skills by installs in the Skillselion catalog
- Security screen: LOW risk (skills.sh audit)
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/athola/claude-night-market --skill media-compositionAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 95 |
|---|---|
| repo stars | ★ 325 |
| Security audit | 3 / 3 scanners passed |
| Last updated | August 2, 2026 |
| Repository | athola/claude-night-market ↗ |
What it does
Stitch multiple GIF or video clips into one tutorial-style composite using a manifest and FFmpeg layouts.
Files
Table of Contents
- Overview
- Prerequisites
- Required TodoWrite Items
- Manifest Format
- Manifest Schema
- Step-by-Step Process
- FFmpeg Composition Commands
- Layout Options
- Example Compositions
- Exit Criteria
Media Composition Skill
Combine multiple media assets (GIFs, videos, images) into composite outputs for detailed tutorials and documentation.
When To Use
- Combining multiple media outputs into compositions
- Creating composite demos from terminal and browser recordings
When NOT To Use
- Single-format output that does not need composition
- Simple terminal recordings - use scry:vhs-recording directly
Overview
This skill orchestrates the combination of separately generated media assets into unified outputs. It reads manifest files that define components and their composition rules, validates all inputs exist, and executes FFmpeg commands to produce the final composite media.
Prerequisites
The following tools must be available on PATH before using this skill:
ffmpeg: media composition and encodingyq: YAML manifest parsing
Run ffmpeg -version and yq --version to verify availability.
Required TodoWrite Items
- Parse composition manifest file
- Validate all component outputs exist
- Determine composition layout and parameters
- Execute FFmpeg composition command
- Verify combined output file created
- Report composition metrics (file size, dimensions)Manifest Format
Manifests define the components to combine and how to arrange them:
# Example manifest: tutorials/mcp.manifest.yaml
name: mcp
title: "MCP Server Integration"
components:
- type: tape
source: mcp.tape
output: assets/gifs/mcp-terminal.gif
- type: playwright
source: browser/mcp-browser.spec.ts
output: assets/gifs/mcp-browser.gif
requires:
- "skrills serve"
combine:
output: assets/gifs/mcp-combined.gif
layout: vertical
options:
padding: 10
background: "#1a1a2e"Manifest Schema
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Identifier for the composition |
title | string | No | Human-readable title |
components | array | Yes | List of media components to combine |
components[].type | string | Yes | Source type: tape, playwright, static |
components[].source | string | Yes | Path to source file |
components[].output | string | Yes | Path to generated output |
components[].requires | array | No | Commands to run before generation |
combine.output | string | Yes | Path for combined output |
combine.layout | string | Yes | Layout mode (see table below) |
combine.options | object | No | Layout-specific options |
Step-by-Step Process
1. Parse Manifest File
# Read and validate manifest structure
yq eval '.' manifest.yaml
# Extract component outputs
yq eval '.components[].output' manifest.yaml2. Validate Component Outputs
# Check all required files exist
for output in $(yq eval '.components[].output' manifest.yaml); do
if [[ ! -f "$output" ]]; then
echo "ERROR: Missing component: $output"
exit 1
fi
done3. Execute FFmpeg Composition
Based on the layout specified in the manifest, execute the appropriate FFmpeg command.
4. Verify Combined Output
# Verify output exists and has content
if [[ -f "$output" && -s "$output" ]]; then
echo "Composition successful: $output"
ls -lh "$output"
else
echo "ERROR: Composition failed"
exit 1
fiFFmpeg Composition Commands
Vertical Stacking
Stack GIFs/videos top to bottom:
ffmpeg -i top.gif -i bottom.gif \
-filter_complex "[0:v][1:v]vstack=inputs=2" \
-y output.gifWith padding between:
ffmpeg -i top.gif -i bottom.gif \
-filter_complex "[0:v]pad=iw:ih+10:0:0:color=black[top];[top][1:v]vstack=inputs=2" \
-y output.gifHorizontal Stacking
Stack GIFs/videos side by side:
ffmpeg -i left.gif -i right.gif \
-filter_complex "[0:v][1:v]hstack=inputs=2" \
-y output.gifSequential Concatenation
Play GIFs/videos one after another:
# Create concat list file
cat > concat_list.txt << EOF
file 'first.gif'
file 'second.gif'
file 'third.gif'
EOF
# Concatenate
ffmpeg -f concat -safe 0 -i concat_list.txt \
-y output.gifGrid Layout (2x2)
ffmpeg -i tl.gif -i tr.gif -i bl.gif -i br.gif \
-filter_complex "[0:v][1:v]hstack=inputs=2[top];[2:v][3:v]hstack=inputs=2[bottom];[top][bottom]vstack=inputs=2" \
-y output.gifWith Background Color
ffmpeg -i top.gif -i bottom.gif \
-filter_complex "color=c=#1a1a2e:s=800x600[bg];[bg][0:v]overlay=0:0[tmp];[tmp][1:v]overlay=0:300" \
-y output.gifLayout Options
| Layout | Description | Options |
|---|---|---|
vertical | Stack top to bottom | padding, background, align |
horizontal | Stack left to right | padding, background, align |
sequential | Play in order | transition, duration |
grid | N x M grid arrangement | rows, cols, padding |
overlay | Layer on top of each other | position, opacity |
pip | Picture-in-picture | corner, scale, margin |
Layout Option Details
| Option | Type | Default | Description |
|---|---|---|---|
padding | int | 0 | Pixels between components |
background | string | "black" | Background color (hex or name) |
align | string | "center" | Alignment: left, center, right |
transition | string | "none" | Transition type: fade, wipe, none |
scale | float | 0.25 | Scale factor for PiP |
corner | string | "br" | PiP corner: tl, tr, bl, br |
Example Compositions
Terminal and Browser Tutorial
name: plugin-demo
components:
- type: tape
source: demo.tape
output: terminal.gif
- type: playwright
source: browser.spec.ts
output: browser.gif
combine:
output: demo-combined.gif
layout: vertical
options:
padding: 5
background: "#0d1117"Side-by-Side Comparison
name: before-after
components:
- type: static
source: before.gif
output: before.gif
- type: static
source: after.gif
output: after.gif
combine:
output: comparison.gif
layout: horizontal
options:
padding: 10Picture-in-Picture
name: pip-demo
components:
- type: tape
source: main.tape
output: main.gif
- type: playwright
source: overlay.spec.ts
output: overlay.gif
combine:
output: pip-demo.gif
layout: pip
options:
corner: br
scale: 0.3
margin: 20Exit Criteria
- [ ] Manifest file parsed successfully
- [ ] All component outputs validated as existing
- [ ] FFmpeg composition command executed without errors
- [ ] Combined output file exists and has non-zero size
- [ ] Output dimensions and duration logged
- [ ] Temporary files cleaned up
Related skills
FAQ
Is Media Composition safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.